この記事はこんな人向けです
- 前回の記事でVPS初期設定が完了した方
- 自分のドメインでメールの送受信をしたい方
- メールサーバーの仕組みをひと通り理解したい方
環境は Ubuntu on シンクラウドVPS、ドメインは
sa-3.meを例に進めます。
はじめに:構成の概要
今回構築するメールサーバーの構成は以下のとおりです。
| 項目 | 内容 |
|---|---|
| MTAソフトウェア | OpenSMTPD |
| 受信ポート | 25番(TLS対応) |
| 送信ポート | 587番(STARTTLS + SMTP AUTH必須) |
| TLS証明書 | Let’s Encrypt(Nginxと共用) |
| DKIM署名 | filter-dkimsign(セレクター: mail) |
| メール保存形式 |
Maildir(~/Maildir/) |
メール認証まわり(SPF・DKIM・DMARC)も合わせて設定するため、Gmailなど主要なサービスにもきちんと届くメールサーバーが完成します。
1. OpenSMTPDのインストール
sudo apt update && sudo apt install opensmtpd
インストール中に以下の設定項目が対話的に表示されます。
| 項目 | 設定値 | 説明 |
|---|---|---|
| System mail name |
sa-3.me |
メールのドメイン名です。外部に公開するドメインを設定します。 |
| Root and postmaster mail recipient |
sasami |
root・postmaster宛のシステムメールを受け取る一般ユーザーを指定します。 |
2. /etc/mailname の作成
デフォルトではホスト名(x162-43-79-10 など)がメールアドレスのドメインとして使われてしまいます。/etc/mailname を作成して正しいドメインを指定します。
# メールドメインとして使用するドメイン名を書き込みます
echo "sa-3.me" | sudo tee /etc/mailname
⚠️ この設定がないと
From: sasami@x162-43-79-10のような不正なアドレスになり、Gmailなどに拒否されます。
3. SMTP認証用シークレットファイルの作成
587番ポートで認証付き送信を受け付けるため、ユーザーとパスワードの対応ファイルを作成します。
# シークレットファイル用のディレクトリを作成します
sudo mkdir -p /etc/smtpd
# パスワードを暗号化します(入力内容はターミナルに表示されません)
sudo smtpctl encrypt
# シークレットファイルを作成します
# シングルクォートで囲むことで、シェルが $ を変数として解釈するのを防ぎます
echo 'sasami <暗号化されたハッシュ文字列>' | sudo tee /etc/smtpd/secrets
# パーミッションを設定します(rootとopensmtpdグループのみ読み取り可能にします)
sudo chmod 640 /etc/smtpd/secrets
sudo chown root:opensmtpd /etc/smtpd/secrets
⚠️
smtpctl encryptの出力には$が含まれます。echo時にダブルクォートで囲むとシェルが変数として解釈してしまうため、必ずシングルクォートで囲んでください。
4. DKIM署名フィルターのインストール
OpenSMTPD専用のDKIM署名フィルターをインストールします。OpenDKIMよりもシンプルで、OpenSMTPDと直接連携できます。
sudo apt install opensmtpd-filter-dkimsign
4-1. DKIM鍵ペアの生成
# 鍵の保存用ディレクトリを作成します
sudo mkdir -p /etc/opendkim/keys/sa-3.me
# RSA鍵ペアを生成します(-s でセレクター名を指定します)
sudo opendkim-genkey -D /etc/opendkim/keys/sa-3.me/ -d sa-3.me -s mail
# 秘密鍵の所有者をopensmtpdユーザーに変更します
sudo chown opensmtpd:opensmtpd /etc/opendkim/keys/sa-3.me/mail.private
sudo chmod 640 /etc/opendkim/keys/sa-3.me/mail.private
4-2. DNSに登録する公開鍵の確認
# このファイルの内容をDNSのTXTレコードに登録します
sudo cat /etc/opendkim/keys/sa-3.me/mail.txt
⚠️
mail.private(秘密鍵)は絶対に公開しないでください。mail.txt(公開鍵)はDNSに公開するために生成されたものです。
5. smtpd.conf の設定
/etc/smtpd.conf を以下の内容に書き換えます。
sudo nano /etc/smtpd.conf
#-----------------------------------------------
# テーブル定義
# エイリアステーブルと認証用シークレットテーブルを読み込みます。
#-----------------------------------------------
table aliases file:/etc/aliases
table secrets file:/etc/smtpd/secrets
#-----------------------------------------------
# PKI(TLS証明書)設定
# Let's Encryptの証明書と秘密鍵を指定します。
#-----------------------------------------------
pki sa-3.me cert "/etc/letsencrypt/live/sa-3.me/fullchain.pem"
pki sa-3.me key "/etc/letsencrypt/live/sa-3.me/privkey.pem"
#-----------------------------------------------
# DKIMフィルター設定
# 送信メールにDKIM署名を付与します。
# selectorはDNSに登録したもの(mail)と一致させます。
#-----------------------------------------------
filter "dkimsign" proc-exec "filter-dkimsign -d sa-3.me -s mail -k /etc/opendkim/keys/sa-3.me/mail.private"
#-----------------------------------------------
# リスナー設定
# 25番ポート:外部からのメール受信用(TLS対応)
# 587番ポート:認証付き送信用(STARTTLS必須・SMTP AUTH必須)
#-----------------------------------------------
listen on 0.0.0.0 port 25 tls pki sa-3.me
listen on 0.0.0.0 port 587 tls-require pki sa-3.me auth <secrets>
#-----------------------------------------------
# アクション定義
# local:ローカルユーザーのMaildirに配送します。
# relay:DKIMフィルターを通してから外部へ直接配送します。
#-----------------------------------------------
action "local" maildir alias <aliases>
action "relay" relay filter "dkimsign"
#-----------------------------------------------
# マッチルール(上から順に評価されます)
# 1. sa-3.me宛のメールはローカル配送します。
# 2. 認証済みユーザーからの送信は外部にリレーします。
#-----------------------------------------------
match from any for domain "sa-3.me" action "local"
match auth from any for any action "relay"
設定の構文チェックと再起動
# 構文チェックを行います(エラーがなければ "configuration OK" と表示されます)
sudo smtpd -n
# OpenSMTPDを再起動します
sudo systemctl restart opensmtpd
# 動作状態を確認します
sudo systemctl status opensmtpd
6. DNSレコードの設定
XserverのDNS管理パネルで以下のレコードを追加します。メール配送の信頼性を高めるために、4種類すべて設定することを強くおすすめします。
6-1. MXレコード(メール受信用)
| ホスト名 | 種別 | 内容 | TTL | 優先度 |
|---|---|---|---|---|
sa-3.me |
MX |
sa-3.me |
3600 | 10 |
MXレコードは、外部のメールサーバーが「このドメイン宛のメールをどこに送ればいいか」を調べるためのレコードです。既存のAレコード(
sa-3.me → VPSのIP)を指しているため、追加のAレコードは不要です。
6-2. SPFレコード(送信ドメイン認証)
| ホスト名 | 種別 | 内容 | TTL |
|---|---|---|---|
sa-3.me |
TXT |
v=spf1 ip4:VPSのIPアドレス -all |
3600 |
SPFは「このドメインから送信できるIPアドレス」を宣言するレコードです。
-allは指定したIP以外からの送信をすべて拒否することを意味します。
6-3. DKIMレコード(電子署名)
| ホスト名 | 種別 | 内容 | TTL |
|---|---|---|---|
mail._domainkey.sa-3.me |
TXT |
v=DKIM1; h=sha256; k=rsa; p=<公開鍵> |
3600 |
<公開鍵> の部分は、手順4-2で確認した mail.txt の内容から p= 以降の値を使用します。
DKIMは送信メールに電子署名を付与し、受信側がその署名をDNSの公開鍵で検証する仕組みです。メールが改ざんされていないことを証明します。
6-4. DMARCレコード(認証ポリシー)
| ホスト名 | 種別 | 内容 | TTL |
|---|---|---|---|
_dmarc.sa-3.me |
TXT |
v=DMARC1; p=quarantine; rua=mailto:sasami@sa-3.me |
3600 |
DMARCはSPF・DKIMの結果をもとに「認証失敗したメールをどう扱うか」のポリシーを宣言します。
p=quarantineは迷惑メールフォルダに隔離することを意味します。運用が安定したらp=reject(完全拒否)への変更を検討してください。
DNS反映確認コマンド
# MXレコードを確認します
dig MX sa-3.me @8.8.8.8
# SPFレコードを確認します
dig TXT sa-3.me @8.8.8.8
# DKIMレコードを確認します
dig TXT mail._domainkey.sa-3.me @8.8.8.8
# DMARCレコードを確認します
dig TXT _dmarc.sa-3.me @8.8.8.8
7. ファイアウォール設定
7-1. シンVPSパケットフィルター
VPSパネルの「パケットフィルター設定」から以下のポートを開放します。
| ポート | プロトコル | 用途 |
|---|---|---|
| 25 | TCP | 外部からのメール受信(SMTP) |
| 587 | TCP | 認証付きメール送信(Submission) |
7-2. Ubuntu の ufw設定
# 25番ポートを開放します(外部からのメール受信用)
sudo ufw allow 25/tcp comment 'メール受信'
# 587番ポートを開放します(認証付き送信用)
sudo ufw allow 587/tcp comment '認証付き送信'
# 設定を確認します
sudo ufw status
8. 動作確認
送信テスト
# 外部アドレス宛にテストメールを送信します
echo "テストメールです" | sendmail your-address@gmail.com
# ログを確認します(直近20件を表示します)
sudo journalctl -u opensmtpd -n 20 --no-pager
成功時はログに以下のように表示されます。
result="Ok" stat="250 2.0.0 OK"
受信テスト
外部アドレスから sasami@sa-3.me 宛にメールを送り、以下で受信を確認します。
# 新着メールの一覧を確認します
ls -la ~/Maildir/new/
# メールの内容を表示します(<ファイル名>は上のlsで確認したものを使います)
cat ~/Maildir/new/<ファイル名>
# 受信をリアルタイムで監視します(3秒ごとに更新されます)
watch -n 3 'ls -la ~/Maildir/new/'
まとめ
これでシンクラウドVPS上にOpenSMTPDを使ったメールサーバーが構築できました。構成をまとめると以下のとおりです。
| 項目 | 内容 |
|---|---|
| MTAソフトウェア | OpenSMTPD |
| 受信ポート | 25番(TLS対応) |
| 送信ポート | 587番(STARTTLS + SMTP AUTH必須) |
| TLS証明書 | Let’s Encrypt(Nginxと共用) |
| DKIM署名 | filter-dkimsign(セレクター: mail) |
| メール保存形式 |
Maildir(~/Maildir/) |
| SPF |
v=spf1 ip4:VPSのIP -all |
| DMARC |
p=quarantine(運用安定後に p=reject 推奨) |
設定のポイントをおさらいします。
-
/etc/mailnameの作成を忘れずに:これがないとホスト名がドメインになってしまいます -
シークレットファイルの
echoはシングルクォートで:$を含むハッシュ値がシェルに解釈されます - DNSの4レコード(MX・SPF・DKIM・DMARC)をすべて設定する:どれか欠けると迷惑メール判定されやすくなります
- コントロールパネルとufwの両方でポート開放する:前回の記事と同様、両方の設定が必要です