せっかくVPS持っているのでメールサーバー構築したいと思います
メールサーバーを自前で構築すれば独自ドメインからメールを送信、受信することができます
ConoHa VPS にメールサーバーを構築する下準備
前提条件:
- OS: ConoHa VPS Ubuntu 20.04
- Webサーバー: Nginx(Let’s Encrypt で SSL 証明書を取得済み)
- 使用するドメイン: go-pro-world.net
- 送受信するためのプロトコル: SMTP, IMAP
- セキュリティ対策: SPF, DKIM, DMARCなど
1.必要なポートを開放する
ファイアウォールの設定や開いているポートを確認するコマンドは、使用しているファイアウォールの種類によって異なります
ufw(Uncomplicated Firewall)を使用している場合
Ubuntu などで ufw を使っている場合は、以下のコマンドで確認できます
sudo ufw status verbose
- Status: active ならファイアウォールが有効
VPSのファイアウォール(UFW)を設定
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp # SMTP over TLS(送信)
sudo ufw allow 465/tcp # SMTPS(SSL通信)
sudo ufw allow 993/tcp # IMAPS(SSL通信)
sudo ufw reload
ConoHa の管理画面でもポート開放が必要
- ConoHa の「ファイアウォール設定」で 25 ,587, 465, 993を開放
- ConoHa VPSのセキュリティグループにはメールグループがあるのでそれを設定して開放します
ネームサーバーを確認
ネームサーバーの設定を確認してください。
whois go-pro-world.net | grep "Name Server"
#使用中のネームサーバーを確認
Name Server: A.CONOHA-DNS.COM
Name Server: B.CONOHA-DNS.ORG
Name Server: a.conoha-dns.com
Name Server: b.conoha-dns.org
もし ConoHa などのサービスになっている場合、そちらでDNS設定をする必要があります
2.ConoHa VPS でDNS各レコードの追加
mail.go-pro-world.net のAレコードを追加
- ConoHaのコントロールパネル にログインする
- 左側のメニューから「DNS」 を開く
- ドメインリストから go-pro-world.net を選択
- 編集ボタン(右上の鉛筆アイコン)を押す
- Aレコードを追加:
- タイプ: A
(通常)
- 名称: mail
- TTL: 3600(デフォルトでOK)
- 値: 163.44.123.190
- タイプ: A
MXレコードを追加
- MXレコードを追加:
- タイプ: MX
- 名称: @
- 値: 10 mail.go-pro-world.net.
→ 10 は優先度(小さいほど優先される)mail.go-pro-world.net. は実際のメールサーバー - TTL: 3600(デフォルトでOK)
- 「保存」ボタンを押す
DNSが反映されたら、以下のコマンドで正しく設定されているか確認できます
反映されるまで数時間かかるかと思います
dig MX go-pro-world.net +short
# 10 mail.go-pro-world.net.
dig A mail.go-pro-world.net +short
# XXX.XXX.XXX.XXX
逆引きホスト(PTRレコード)の設定方法
- ConoHaの管理画面で設定:
- ConoHaのVPS管理画面のサーバーを選択してVPS設定タブを開く
- 逆引きDNS(PTR)の設定の編集ボタンをクリック
- IPアドレス に対して mail.go-pro-world.net を設定する
- 設定後、以下のコマンドでIPアドレスを入力すれば、PTRレコードが正しく設定されているか確認できます
dig -x XXX.XXX.XXX.XXX +short
正しく設定されていれば mail.go-pro-world.net などのホスト名が表示されます
まずはこれで最低限のレコード設定やポート開放を設定しました
次はさらにSSL証明書の取得などを解説したいと思います。
3.「mail.go-pro-world.net」用の証明書を取得する
次にメールサーバーにSSL認証の設定をするために、mailサブドメイン用の証明書を取得します
自分はすでにWebサイトでSSL証明書を取得しているのでそれに追加する形でmail用の証明書を取得します
Webサイト用の証明書を取得する方法は以下の記事を参考にしてください
mail.go-pro-world.net 専用の証明書を取得する
既存の証明書に mail.go-pro-world.net を追加する方法が簡単です
sudo certbot certonly --standalone -d go-pro-world.net -d www.go-pro-world.net -d mail.go-pro-world.net
しかし、nginxなどでWEBサーバーを使っている方は以下のようなエラーが出てしまうと思います
Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server).
Please stop the program in question and then try again.
エラーの原因は ポート80(HTTP)が既に他のプロセス(Nginx など)によって使用されている ためです
Certbot の –standalone モードは、ポート80を一時的に使用するため、既存のWebサーバーが動いているとエラーになります
もしNginxが稼働しているなら、–webroot を使用して証明書を追加します
Certbotを –webroot で実行
sudo certbot certonly --webroot -w /var/www/html -d go-pro-world.net -d www.go-pro-world.net -d mail.go-pro-world.net
※ /var/www/html は、Webサイトのドキュメントルートに変更してください。
ドキュメントルートとは、Webサーバーが公開するコンテンツが置かれるフォルダのことです
つまり、Webサイトのトップページ (index.html など) が配置されるディレクトリです
ドキュメントルートの確認方法
使用しているWebサーバーがNginxなので、設定ファイルを確認すればわかります
1. 設定ファイルを確認
以下のコマンドで、設定ファイルを開きます。
sudo nano /etc/nginx/sites-available/wordpress
最後のwordpressは人によって違うと思います
または、次のコマンドで grep
を使って直接探せます
grep -r "root" /etc/nginx/sites-available/
2. root ディレクティブを探す
設定ファイルの中に以下のような行があります
root /var/www/html;
この root に指定されているパスがドキュメントルートです。
certbot の –webroot オプションは、指定したフォルダに一時的な認証用ファイルを作成し、それをLet’s Encryptが確認することで証明書を発行する仕組みです
そのため、正しいドキュメントルートを設定しないと認証に失敗します
well-known/acme-challengeを失敗してしまう場合
自分もあったのですが、これは、/.well-known/acme-challenge/ディレクトリが正しく設定されていない場合に発生します
Webrootの設定を確認
- /.well-known/acme-challenge/ に対してHTTPリクエストが成功するように、Webサーバーに対応する設定が必要です
もしNginxを使用している場合、以下のような設定を追加して、/.well-known/acme-challengeにアクセスできるようにします
Nginxの設定例
server {
listen 80;
listen [::]:80;
server_name go-pro-world.net www.go-pro-world.net;
# Let's Encrypt の認証用ディレクトリ
location /.well-known/acme-challenge/ {
root /var/www/wordpress;
}
# HTTPアクセスはHTTPSへリダイレクト
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name go-pro-world.net www.go-pro-world.net;
root /var/www/wordpress;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/go-pro-world.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/go-pro-world.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# Let's Encrypt の認証用ディレクトリ(HTTPS経由でもアクセス可能にする)
location /.well-known/acme-challenge/ {
root /var/www/wordpress;
}
}
サーバーの設定を変更したらサーバーの再起動します
sudo nginx -t # 設定にエラーがないか事前にチェック
sudo systemctl reload nginx
上記のDNS設定とWebサーバー設定を確認した後、再度Certbotを実行してみてください
sudo certbot certonly --webroot -w /var/www/html -d go-pro-world.net -d www.go-pro-world.net -d mail.go-pro-world.net
以下のようなメッセージが表示されたら完了です
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for mail.go-pro-world.net
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.go-pro-world.net/fullchain.pem
Key is saved at: /etc/letsencrypt/live/mail.go-pro-world.net/privkey.pem
This certificate expires on 2025-06-26.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
成功すると、以下に証明書と秘密鍵が配置されます:
- 証明書: /etc/letsencrypt/live/mail.go-pro-world.net/fullchain.pem
- 秘密鍵: /etc/letsencrypt/live/mail.go-pro-world.net/privkey.pem
4. 証明書の自動更新を設定
Let’s Encrypt の証明書は90日間有効なので、自動更新が重要です
sudo crontab -e
以下のような行を追加(毎日深夜3時に更新チェック)
0 3 * * * /usr/bin/certbot renew --quiet
–quietオプションは以下のメリットがあります
- 成功時のログやメッセージを表示しない
- エラーが発生した場合のみ出力
- スクリプトやcronからの実行に最適(ログが煩雑にならない)
以上でVPSでメールサーバを構築する下準備ができました
次回以降でメール送信できるようにさらに進めていきます
コメント