Postfixを運用していると必ず出会う「リレー」という概念。「RELAY ACCESS DENIED」のエラーに悩まされた経験はないでしょうか。リレーには受け入れる側とする側の2方向があり、それぞれ設定するパラメータが異なります。
この記事では、Postfixのリレー設定(mynetworks・relay_domains・relayhost)の違いを図解で整理し、オープンリレー対策やSASL認証設定まで実務で必要な知識を網羅します。qmailからの移行構成例も取り上げます。
この記事のポイント
- mynetworks = 認証なしでリレーを許可するIPの範囲(信頼するネットワーク)
- relay_domains = 外部からのリレーを許可する宛先ドメイン(バックアップMX等)
- relayhost = メールを送り出す中継サーバー(スマートホスト)
- リレーには「受け入れる」と「する」の2方向がある — これを理解すれば設定で迷わない
コピペ用 main.cf テンプレート(リレー設定編)
以下は本記事で解説するリレー関連パラメータをまとめた設定テンプレートです。環境に合わせてIPアドレスやドメイン名を置き換えて、main.cfにそのまま貼り付けできます。
##################################################
#リレー受け入れ設定(誰からの中継依頼を許可するか)
##################################################
#--- mynetworks ---
#認証なしでリレーを無条件に許可するIPアドレスの範囲
#ここに含まれるIPからは認証なしでメール送信できる
#明示的にIP/サブネットで指定するのが最も安全(推奨)
#同一サーバー上のqmailやアプリからの送信はここで許可する
mynetworks = 127.0.0.0/8, 192.168.1.0/24
#--- mynetworks_style ---
#mynetworksを省略した場合に自動決定される範囲
#host = 自分自身(127.0.0.1)のみ(最も安全)
#subnet = 同一サブネット
#class = 同一IPクラス(絶対に使わないこと!オープンリレーになる)
#mynetworksを明示的に指定する場合、この設定は無視される
mynetworks_style = host
#--- relay_domains ---
#mynetworksに含まれない外部からのリレーを許可する宛先ドメイン
#バックアップMXとして動作させる場合に設定する
#Postfix 3.0以降のデフォルトは空(外部リレーを受け付けない)
#不要であれば空のままにすること
relay_domains =
#--- smtpd_relay_restrictions ---
#リレーの許可/拒否を判定する制限ルール(Postfix 2.10以降で必須)
#上から順に評価され、最初にマッチしたルールで決定する
#permit_mynetworks: mynetworksに含まれるIPを許可
#permit_sasl_authenticated: SASL認証済みクライアントを許可
#defer_unauth_destination: それ以外の外部ドメイン宛てを拒否
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
##################################################
#リレー送出設定(どこ経由でメールを外部に送るか)
##################################################
#--- relayhost ---
#メールを直接配送せず中継サーバー経由で送り出す設定
#[ホスト名] = MXルックアップせず直接接続(推奨)
#ホスト名のみ = MXレコードを引いて接続
#空 = 宛先ドメインのMXレコードに従って直接配送(デフォルト)
#ISPがポート25をブロックしている場合はここにISPのSMTPサーバーを指定
relayhost = [smtp.isp.example.com]:587
##################################################
#SASL認証設定(relayhost使用時に中継サーバーへ認証する)
##################################################
#--- smtp_sasl_auth_enable ---
#リレー先サーバーへのSASL認証を有効にする
#relayhostを使用する場合はほぼ必須
smtp_sasl_auth_enable = yes
#--- smtp_sasl_password_maps ---
#リレー先サーバーのユーザー名・パスワードを記載したファイル
#ファイル形式: [smtp.isp.example.com]:587 username:password
#作成後は postmap /etc/postfix/sasl_passwd を実行すること
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
#--- smtp_sasl_security_options ---
#SASL認証で使用するメカニズムの制限
#noanonymous = 匿名認証を無効にする(必須)
smtp_sasl_security_options = noanonymous
#--- smtp_tls_security_level ---
#リレー先サーバーとの通信でTLSを使用するレベル
#may = TLSが使えれば使う(互換性重視)
#encrypt = TLSを強制する(セキュリティ重視)
smtp_tls_security_level = encrypt
使い方:
1. 上記をコピーしてmain.cfに貼り付け
2. mynetworksのIPアドレスを自環境に合わせて変更
3. relayhostをISPや中継サーバーのアドレスに変更(不要なら空に)
4. postfix check で構文チェック → systemctl reload postfix で反映
そもそもリレーとは
メールの「リレー」とは、自分宛てではないメールを受け取って、別のサーバーに転送することです。
【直接配送】
送信者 → 自分のメールサーバー → 相手のメールサーバー(直接)
【リレー配送】
送信者 → 自分のメールサーバー → 中継サーバー → 相手のメールサーバー
↑
ここがリレー
郵便に例えると、「この手紙、代わりに出しておいて」と頼む行為がリレーです。近所のポストに出すのは「直接配送」、知り合いに「ついでに出しておいて」と頼むのが「リレー」にあたります。
かつてインターネット黎明期には、どのサーバーも善意でリレーを引き受けていました。しかし、これを悪用してスパムの踏み台にされる被害が急増し、現在ではリレーを厳格に制限するのが常識となっています。
リレーの方向は2種類ある
Postfixの設定を理解するうえで最も重要なのは、リレーには「受け入れる側」と「する側」の2方向があることです。
【リレーを受け入れる】 【リレーをする】
他のサーバー・クライアント 自分の Postfix
↓ ↓
Postfix → 中継サーバー or 直接配送
(中継を引き受ける) (外に送り出す)
- 受け入れる:他のサーバーやクライアントから「このメールを転送して」という依頼を受ける
- する:受け取ったメールを中継サーバー経由で外部に送り出す
この2方向を混同すると、「mynetworksを設定したのにメールが外に出ない」「relayhostを書いたのにリレーが拒否される」といった混乱が生じます。
リレーを受け入れる設定
「誰からのリレー依頼を受け付けるか」を制御する設定です。
mynetworks ─ 信頼するネットワーク
指定したIPアドレスからのリレーを認証なしで無条件に許可します。
#明示的にIP/サブネットで指定(推奨)
mynetworks = 127.0.0.0/8, 192.168.1.0/24
#スタイル指定(mynetworks未指定時の自動決定)
mynetworks_style = host #ローカルホストのみ(最も安全)
mynetworks_style = subnet #同一サブネット
警告:
mynetworks_style = classは絶対に使わないこと。クラスA/B/Cネットワーク全体をリレー許可してしまい、オープンリレーになります。
典型的な使用場面:
qmail(192.168.1.10)→ Postfix
↑
mynetworks に含まれるので認証なしで受け付ける
同一サーバー上のアプリケーション(Webアプリ、cronジョブ等)からメールを送信する場合も、127.0.0.0/8がmynetworksに含まれていれば認証なしで送信できます。
relay_domains ─ リレー先ドメインの制御
外部クライアントからのメールを、どのドメイン宛てならリレーするかを制御します。mynetworksに含まれない外部からのリレーを特定ドメイン向けに許可したい場合に使います。
#デフォルト(Postfix 3.0以降は空 = 外部リレーを受け付けない)
relay_domains =
#バックアップMXとして機能する場合
relay_domains = partner.example.com
典型的な使用場面:
外部MTA → Postfix → partner.example.com
↑
relay_domains に含まれるドメイン宛てのみ中継する
relay_domainsは「宛先ドメイン」で判定するため、送信元のIPアドレスに関係なくリレーを許可します。バックアップMXサーバーとして動作させたい場合に使いますが、不要であれば空のままにしておくのが安全です。
受け入れ制御の全体像(フローチャート)
外部からSMTP接続があった場合、Postfixは以下の順序でリレー可否を判定します。
外部からの接続
↓
① mynetworks に含まれる IP か? → YES → 無条件で許可
↓ NO
② SASL 認証(ID/パスワード)済みか? → YES → 許可
↓ NO
③ 宛先が relay_domains に含まれるか? → YES → 許可
↓ NO
④ 宛先が自ドメイン(mydestination/virtual)か? → YES → 受信として処理
↓ NO
⑤ 拒否(RELAY ACCESS DENIED)
このフローはsmtpd_relay_restrictionsの設定で制御されます。④は厳密にはリレーではなく「ローカル配送」ですが、理解のために含めています。
リレーをする設定
「受け取ったメールをどこに送り出すか」を制御する設定です。
relayhost ─ メールの送り出し先
メールを直接配送せず、指定した中継サーバー経由で送り出す設定です。
#ISP経由で送信
relayhost = [smtp.isp.example.com]
#MXルックアップを使用([]なし)
relayhost = isp.example.com
#ポート指定(SUBMISSION ポート)
relayhost = [smtp.isp.example.com]:587
#空(デフォルト)= DNSのMXレコードに従って直接配送
relayhost =
[]あり・なしの違い
| 記法 | 動作 |
|---|---|
[smtp.isp.example.com] |
MXルックアップせず直接接続 |
isp.example.com |
MXレコードを引いて接続 |
| 空 | 宛先ドメインのMXを引いて直接配送 |
ほとんどの場合、中継サーバーは[]で囲んで直接接続するのが適切です。[]がないと、そのドメインのMXレコードを検索して別のサーバーに接続してしまう可能性があります。
relayhost あり・なしの配送経路の違い
【relayhost なし(直接配送)】
Postfix → DNS で MX 検索 → 相手のメールサーバーへ直接
【relayhost あり】
Postfix → relayhost(中継サーバー)→ 相手のメールサーバー
relayhostを使う典型的な理由:
- ISPがポート25をブロックしている(OP25B対策)
- 送信元IPの評判(レピュテーション)が低い場合に実績あるサーバー経由で送る
- 社内のメールを一元的に管理サーバーに集約する
- VPSやクラウド環境で逆引き(PTR)が設定できない場合
実務で押さえるべき4つの注意点
1. オープンリレーの危険性とチェック方法
オープンリレーとは、誰でも自由にリレーできてしまう状態のサーバーです。スパム送信の踏み台にされ、IPアドレスがブラックリストに登録される原因になります。
設定後は必ず外部からテストしましょう。
#外部のサーバーからtelnetでリレーテスト
telnet mail.example.jp 25
EHLO test.example.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
正しく設定されていれば 454 4.7.1 <[email protected]>: Relay access denied が返ります。
2. SASL認証の設定(relayhost使用時)
relayhostで中継サーバーを指定した場合、ほぼ必ずSASL認証(ユーザー名・パスワード)が必要です。
パスワードファイルの作成:
#パスワードファイルを作成
echo "[smtp.isp.example.com]:587 username:password" > /etc/postfix/sasl_passwd
#権限を制限(パスワードが含まれるため)
chmod 600 /etc/postfix/sasl_passwd
#ハッシュDBを生成(Postfixが読み取る形式)
postmap /etc/postfix/sasl_passwd
3. smtpd_relay_restrictionsの設定順序
Postfix 2.10以降、smtpd_relay_restrictionsが導入されました。このパラメータが未設定だと警告が出ます。
#推奨設定(上から順に評価)
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
設定順序の意味:
– permit_mynetworks → 信頼するIPからは即座に許可
– permit_sasl_authenticated → 認証済みユーザーを許可
– defer_unauth_destination → 上記以外の外部宛てを拒否(一時エラー)
reject_unauth_destination(永続拒否)ではなくdefer_unauth_destination(一時拒否)を使うことで、設定ミスでメールを永久に失うリスクを低減できます。
4. ログでリレー拒否を確認する方法
リレーが拒否された場合、/var/log/maillog(または/var/log/mail.log)に記録されます。
#リレー拒否のログを検索
grep "Relay access denied" /var/log/maillog
#最近のSMTP接続ログを確認
grep "smtpd" /var/log/maillog | tail -20
拒否されている場合、送信元IPがmynetworksに含まれているか、SASL認証が正しく動作しているかを確認してください。
設定の確認コマンド
#現在の設定値を確認
postconf mynetworks
postconf relay_domains
postconf relayhost
postconf smtpd_relay_restrictions
#main.cf の構文チェック
postfix check
#swaksでリレーテスト(外部ドメイン宛てに送信を試みる)
swaks --to [email protected] --from [email protected] --server mail.example.jp
#maillogでリレー拒否を確認
grep "Relay access denied" /var/log/maillog
まとめ
2方向のまとめ表
| 方向 | 設定項目 | 役割 |
|---|---|---|
| 受け入れる | mynetworks |
このIPからのリレーを無条件で許可 |
| 受け入れる | relay_domains |
このドメイン宛てのリレーを許可 |
| 受け入れる | SASL認証 | 認証済みクライアントのリレーを許可 |
| する | relayhost |
メールをここ経由で送り出す |
qmail → Postfix 構成の整理図
qmail(192.168.1.10)
↓ リレー依頼
Postfix
├─ mynetworks = 192.168.1.0/24 → qmail からの受け入れ ✅
└─ relayhost = [smtp.isp.example.com]:587 → ISP 経由で送り出す ✅
↓
ISP のスマートホスト
↓
相手のメールサーバー
この構成ではPostfixは「qmailからリレーを受け入れ、ISP経由でリレーをする」両方の役割を担っています。
ベストプラクティス
mynetworksは明示的にIP/サブネットで指定し、mynetworks_styleに頼らないrelay_domainsは不要なら空にしておく(Postfix 3.0以降のデフォルトで安全)relayhostはポート番号まで含めて[]で囲む([smtp.example.com]:587)- 設定変更後は必ず
postfix checkで構文チェック → 外部からリレーテスト smtpd_relay_restrictionsを明示的に設定し、defer_unauth_destinationで安全側に倒す
シリーズ次回予告: 次回は「Postfix TLS設定」── 暗号化通信の設定とLet’s Encryptの連携方法を解説します。


コメント