Postfixリレー設定の完全ガイド ─ 受け入れる側とする側の違いを図解で解説

雑記

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の連携方法を解説します。

コメント

タイトルとURLをコピーしました