更新 2020/07/18 フォールバックリレーについて
下記の図式が示す構成において、Postfix( localhost )を経由してメール送信した際の考察と、
上位SMTPメールサーバへメールをリレーさせるための設定方法について
[SMTPserver( B.domain.tld )]---[SMTPserver( A.domain.tld )]---[※Postfix(-sendmail)]---[Clientマシン]
※ホスト名を仮に、postfix.local.tld としておき、Clientマシンから名前解決できるようにしておく。
下記情報を踏まえたうえで、さらにSTARTTLSでリレー先SMTPサーバに接続したい場合や、
複数のリレー先を用意しておいて、バックアップとして用いたい場合は、次のページを参照
http://akira-arets.blogspot.jp/2016/02/postfix-relay-starttls.html
■Postfixに、relayhost の設定は行わない場合の動作テスト
その場合は、メールのあて先へ直接届けられる。(main.cfに書かれた下記のコメント参照)
# The relayhost parameter specifies the default host to send mail to<実験>
# when no entry is matched in the optional transport(5) table. When
# no relayhost is given, mail is routed directly to the destination.
1、Postfixローカルにおいてsendmailコマンドで、someone@A.domain.tld へメールを送ることができた。
(ただし、gooleのgmailのアカウントへ送信すると、spamメールとして扱われた。)
外部のメールサーバ(A.domain.tld)は、「自身が管理するメールボックス宛のメール」を受け取った。
2、ClientマシンからPostfixへSMTPで、root@postfix.local.tld 宛メールを送ることはできた。
Postfix(postfix.local.tld)は、自分が管理しているメールボックス宛メールを受け取った。
/var/spool/mail/root に送達されたメールを確認できた。
3、ClientマシンからPostfixへSMTPで、someone@A.domain.tld 宛メールを送信しようとすると、失敗した。
このとき、次のエラーがPostfixで発生した。
postfix/smtpd[7218]: NOQUEUE: reject:(略)Relay access deniedリレーを要する送信アクセスは初期設定では受け付けないわけだ。
■Postfix( local )に、relayhost の設定を行った
Postfix(10.10.10.10)が上位のメールサーバ(A.domain.tld)へリレーできるように設定を行った。
下記のようにして、Clientマシンが属するネットワークアドレス(192.168.0.0/16)を記述した。
Postfix自身のアドレス(10.10.10.10/32と127.0.0.0/8)もしくはネットワークアドレスも含むようにすること。
(間違えると、Postfixは起動しなくなる。)
# vim main.cf
(略)
mynetworks = 10.10.10.10/32, 127.0.0.0/8, 192.168.0.0/16
(略)
relayhost = A.domain.tld:587 (←サブミッションポートを使用するのでポートを指定した)
(略)
以上、リレーを許可する設定を行った後に、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。
すると、ClientマシンのMUAでは、エラーは発生しなかったが、
しかし、Postfixのログ、/var/log/maillog を確認 すると、次のエラーが発生して送信に失敗していた。
Postfixは、relayhostとして設定した A.domain.tld:587 へ接続を試みたが、認証に失敗したようだ。
(host A.domain.tld[xxx.xxx.xxx.xxx] said: 530 AUTH first (#5.5.1)
そこで、 relayhost である A.domain.tld:587 へ接続するための認証情報を設定した。
・認証情報を作成した。
次のようにして認証情報を適当な名前のファイルに挿入した。(複数追加可能)
# echo "A.domain.tld:587 account:password" > /etc/postfix/relay_password
作成したファイルをハッシュ化した。
(後で示すように、このファイルを指定するときhashを指定する必要がある。)
# postmap /etc/postfix/relay_password
# ls relay_password.db
relay_password.db
作成したデータベースが正常かを確かめた。
データベースに対して、クエリーを発行し認証情報が記録されているか確認をした。
# postmap -q A.domain.tld:587 /etc/postfix/relay_password
account:password
・main.cf に認証のための設定を追加した。
(エディタでもよいが、ここでは専用のコマンドで設定を行った。)
上記で作成した認証情報データベースを登録した。
# postconf -e smtp_sasl_password_maps=hash:/etc/postfix/relay_password
念のために確認すると、確かに、main.cf に次の設定を見つけられた。# postconf -e smtp_sasl_auth_enable=yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
# postconf -e smtp_sasl_security_options=noanonymous
■上位SMTPサーバへリレーさせる動作テストを行なった
ここまで設定して、service postfix restart を行ってから、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。
これで、上位サーバへリレーされるはずだと期待したが、
Postfixにおいて、次のエラーが発生して、送信に失敗した。
(SASL authentication failed; cannot authenticate to server A.domain.tld[xxx.xxx.xxx.xxx]: no mechanism available)
warning: SASL authentication failure: No worthy mechs found
googleで調べると、
上位SMTPサーバの種類によっては、さらにパッケージの導入が必要であるらしいことがわかった。
■プレインで認証するSMTPサーバにリレーするために必要なパッケージをインストールした
PLAINで認証情報が交換されるSMTP上位サーバとの通信のために必要なパッケージを追加した。
# yum install cyrus-sasl-plain
Name : cyrus-sasl-plain
Arch : x86_64
Version : 2.1.23
Release : 15.el6_6.2
Size : 31 k
Repo : updates
Summary : PLAIN and LOGIN authentication support for Cyrus SASL
URL : http://asg.web.cmu.edu/sasl/sasl-library.html
License : BSD
Description : The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
: PLAIN and LOGIN authentication schemes.
そうして、さらに動作テストを行った。
■結果
ClientのMUAからPostfixへSMTPで送信したメールは、
このPostfixによってさらに上位にあるSMTPサーバーへリレーされて、
冒頭の図式に挙げた、A.domain.tldや、B.domain.tldのメールボックスに到達した。
■結果(Gmaiのメールボックス宛メールの場合)
ただし、gmailのメールボックスに到達したメールはspam判定された。(到達はしていた)
到達したメールのヘッダーには次の二種類のタグがつけられていた。
Received-SPF: none (google.com: 送信元メールアドレス does not designate permitted sender hosts) client-ip=PostfixのグローバルIPv4アドレス
Authentication-Results: mx.google.com;
spf=none (google.com: 送信元メールアドレス does not designate permitted sender hosts) smtp.mail=送信元メールアドレス
これは、送信メール(のエンベロープ)に指定された送信元メールアドレスに含まれるドメイン A.domain.tld に対して、
GmailがSPFレコードを検索しようとしたところ、該当するレコードが見つからなかったというエラーである。
上記エラーログには、次のように示されている。
送信元メールアドレス(のドメインA.domain.tld)は、送信用ホストを指定していないという旨である。
送信元メールアドレス does not designate permitted sender hosts
SPFレコードは、メールの送信元ドメインが使用する送信元IPアドレスを予め登録しておくために利用される。
これによって、メールに記載された送信元ドメインと、送信元IPアドレスの関連付けがなされる。
関連付けがSPFレコードによって見つけられなければ、SPAMメールとして判断される場合がある。
回避するには、A.domain.tldにSPFレコードを設定し、
最初に通過したSMTPサーバであるPostfixのグローバルIPv4アドレスを登録する必要があると思われる。
◆フォールバック用SMTPサーバーの登録もしておいたほうが良い。
smtp_fallback_relay = smtp.another-domain.tld:587
これついても同様に、対応するSMTP認証情報を登録しておくこと。
万が一、メインSMTPサーバーとの間に問題が発生しても、フォールバックSMTPサーバーを通じて配送が行われる。
<参考>
・SMTP fallback relay
< https://wiki.zimbra.com/wiki/Smtp_fallback_relay > 2016年2月15日
・Kurztipp: postfix – SASL authentication failure: No worthy mechs found
< http://www.stankowic-development.net/?p=5317 > 2015年5月5日
・SMTP-AUTHを使って上位メールサーバへ転送する
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix25.htm > 2015年5月5日
・上位メールサーバへ一律転送するメールサーバ
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix2.htm > 2015年5月5日
・Outgoing SMTP Authentication
< https://wiki.zimbra.com/wiki/Outgoing_SMTP_Authentication > 2015年5月5日
・Postfix SASL Howto
< http://www.postfix.org/SASL_README.html#client_sasl_policy > 2015年5月5日
・Postfixで、GMAIL経由でメールを送る(OP25B対策)
< http://blog.f13.jp/post/25843286280/postfix-gmail-op25b > 2015年5月5日
・Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)
< http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_%28SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth%29 > 2015年5月5日
・SASL authentication failure: No worthy mechs foundAdd Star
< http://d.hatena.ne.jp/machua/20120301/1330625122 > 2015年5月5日