OP25B対策Part1 Linuxルータでポート変換(非推奨)でOP25Bされている環境で、ポート25をポート587に変換して送る方法を書きました。
これはかなり強引で非推奨な実験的環境です。
ということで、より一般的で推奨できるOP25B対策は、LAN内にメールサーバを立てて、プロバイダもしくはレンタルしてるメールサーバに丸投げする方法です。
LAN内の送信ポート変更できないソフト,機器はこのLAN内のメールサーバに送信メールを投げます。
イメージとしては以下のような感じです。
上段がプロバイダのメールサーバを経由させる方法、下段がレンタルしてるメールサーバを経由させる方法です。
プロバイダのメールサーバを使うにしろ、別のレンタルしているメールサーバを使うにしろ、どちらの方法でも sendmail の設定は変わりません。(設定としては(Linux)LogwatchのログメールをGmailに送りたいに書いている内容と似ています。)
今回使った sendmail は 8.13.8 で、CentOS5.6上で動かしています。
また、プロバイダはNTT-MEの wakwak を使っています。
まず、以下のようにsendmail.mcを編集します。(sendmail.mcでは dnl がコメントアウト)
# vi /etc/mail/sendmail.mc
dnl define(`SMART_HOST', `smtp.your.provider')dnl の下に以下を追加。
define(`SMART_HOST', `[am.wakwak.com]') dnl 丸投げするメールサーバを指定。プロバイダのメールサーバに丸投げ。 [ ]の意味ついては後ほど。これを指定しない場合kの値のMXレコードにアクセスする。
define(`ESMTP_MAILER_ARGS', `TCP $h 587') dnl 宛先を587ポートにする設定
define(`RELAY_MAILER_ARGS', `TCP $h 587') dnl 宛先を587ポートにする設定
FEATURE(authinfo, DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`authinfo') dnl SMTP認証で使うファイルの指定。
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') dnl SMTP認証の認証方式
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') dnl SMTP認証の認証方式
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
↓ コメントアウトする。自信以外からのアクセスも許可。これをしないとLAN内の別端末からのメール受け取れない
dnl ####DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
sendmail.mcで設定が書き終わったら、以下コマンドで実際の設定ファイル sendmail.cf を作成します。
m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sendmailをリロードもしくは、再起動します。
service sendmail reload
OR
service sendmail restart
自身宛かどうか
sendmailでは、/etc/mail/local-host-names に設定してあるドメイン名が送られてきたメールのドメイン名と一致すれば自分のサーバ宛と判断し保存します。
それ以外は外部の MTA に転送します。なので、OP25B対策での専用サーバではこのファイル内に設定はしません。
転送制限設定
sendamilでは、/etc/mail/access.db ファイルで、メールを受け入れるかどうかのアクセス制御をしています。
以下のようにファイルを編集し、LAN内の他の端末からのメールを受け入れるようにします。
RELAYは許可、REJECTは拒否、OK(もしくは無指定時)は自身宛と判断し保存します。
# vi /etc/mail/access
Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY
# ↓192.168.0から始まるIPアドレスのホストからのメールリレーを認める
Connect:192.168.0 RELAY
# ↓10.0.1.1のIPアドレスのホストからのメールリレーを認めない
Connect:10.0.1.1 REJECT
# ↓10.0.1.2のIPアドレスのホストからは自身宛と判断し、宛先が/etc/mail/local-host-namesにあれば保存、なければ受信拒否。
Connect:10.0.1.2 OK
以下コマンドで、/etc/mail/accessから、設定ファイル(/etc/mail/access.db)を作成します。
このコマンドで設定ファイルを作成した場合、sendmailを再起動させることなく即時反映ができるようです。
(もし、インターネット側からこのsendmailサーバにメールが届くようにFWやNATで設定しているのであれば、スパムの踏み台にされる可能性がありますので、/etc/mail/access の設定を慎重にしましょう)
SMTP AUTH設定
このsendmailサーバが、プロバイダ、レンタル等丸投げにするメールサーバとのSMTP認証できるように設定を行います。
/etc/mail/authinfo に以下のように設定を書きます。
# vi /etc/mail/authinfo
AuthInfo:am.wakwak.com "U:user" "P:passwd" "M:DIGEST-MD5 CRAM-MD5 LOGIN PLAIN"
(Uは認証に使うメールアドレスの@より前、Pはパスワードを入れ、Mで認証方式を設定します)
上記では、認証方式を DIGEST-MD5 CRAM-MD5 LOGIN PLAIN の4つに設定してますが、送信メールサーバがどの認証に対応しているかは、telnetでわかります。
220 am.wakwak.com ESMTP Sendmail 8.14.3/8.14.3/2011-11-15; Sat, 3 Dec 2011 20:40:19 +0900 (JST)
ehlo localhost ←このコマンドを入力すると、↓のように各種情報でてくる。
250-am.wakwak.com Hello xxxxxx.ppp.wakwak.ne.jp [xxx.xxx.xxx.xxx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 20971520
250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN ←対応しているSMTP認証方式がこれでわかる。
250-DELIVERBY
250 HELP
quit ←認証方式わかったのでオサラバ
221 2.0.0 am.wakwak.com closing connection
ホストとの接続が切断されました。
authinfoファイルが作成できたらauthinfo.dbファイルを作成します。
makemapコマンドでsendmail用のデータベースマップを作成できます。る
makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo
これで、設定は終了です。
後は、LAN内の送信したい端末のSMTPサーバ欄に、このsendmailサーバのアドレスを入れてやります。
クライアント~sendmailサーバ間はポートは25でOKですし、SMTP認証も掛ける必要はありません。
(クライアント~sendmailサーバ間のポートも587にしたいときは DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea') を書きます。“a”はESMTPでの認証を必須とする指定、“E”はETRNコマンドを禁止する指定です。MPT認証を有効しに、クライアント側でその設定しないと、530 5.7.0 Authentication required になってしまいます。)
クライアントからメールを送信して、/var/log/maillog に以下のように正常に終わった旨が残り、相手先に届いていればOKです。
Dec 3 20:51:09 localhost sendmail[3088]: pB3Bp8NU003088: from=
, size=334, class=0, nrcpts=1, msgid=<20111203205107.6FA1.CA40460F@hogepiyo.info>, proto=ESMTP, daemon=MTA, relay=[192.168.0.9] Dec 3 20:51:09 localhost sendmail[3090]: pB3Bp8NU003088: to=
, delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=120334, relay=am.wakwak.com. [211.9.230.130], dsn=2.0.0, stat=Sent (pB3BpAYN018000 Message accepted for delivery)
今回はまった点はMXレコード
さて、今回ハマった点が、丸投げ先のメールサーバの指定です。
当初、丸投げするメールサーバを以下のように指定していました。
define(`SMART_HOST', `am.wakwak.com')
しかし、この設定では、メールキューにメールがずっと残ったままで、/var/log/maillog に以下のようなログが出ていました。
Dec 3 18:21:43 localhost sendmail[2319]: pB39LhqT002319: from=
, size=382, class=0, nrcpts=1, msgid=<20111203182143.6F69.B01E2D28@am.wakwak.com>, proto=ESMTP, daemon=MTA, relay=[192.168.0.11] Dec 3 18:22:43 localhost sendmail[2326]: pB39LhqT002319: to=
, delay=00:01:00, xdelay=00:01:00, mailer=relay, pri=120382, relay=am.mds.wakwak.com. [211.9.230.163], dsn=4.0.0, stat=Deferred: Connection timed out with am.mds.wakwak.com.
Connection timed out しているようです。
なんで? と思いました。ポートをサブミッションポートを使わず、25で送るようにしたら、タイムアウトすることはなくなったんですが、以下のようなエラーメールが帰ってきます。
----- The following addresses had permanent fatal errors -----
(reason: 550 5.7.1
... Relaying denied) ----- Transcript of session follows -----
... while talking to am.mds.wakwak.com.:
>>> DATA
<<< 550 5.7.1
... Relaying denied 550 5.1.1
... User unknown <<< 503 5.0.0 Need RCPT (recipient)
このメールログと、エラーメールでふと気付いたのが、am.mds.wakwak.com につなぎに行っていることでした。
丸投げ先のプロバイダのメールサーバは am.wakwak.com です。
じゃぁ am.mds.wakwak.com ってなんだ?と思って思いついたのがMXレコードです。
案の定 nslookup で確認したら、am.mds.wakwak.com は am.wakwak.com のMXレコードの値でした。
> nsloolup
> set type=MX
> am.wakwak.com
権限のない回答:
am.wakwak.com MX preference = 10, mail exchanger = am.mds.wakwak.com
↑MXレコードのサーバ名
> set type=A
> am.wakwak.com
権限のない回答:
名前: am.wakwak.com
Address: 211.9.230.130
↑AレコードのサーバのIP
つまり、本来 am.wakwak.com(211.9.230.130)に接続しないといけないのに、sendmailは am.wakwak.com のMXレコードである am.mds.wakwak.com を見に行っていたわけです。
では、どうすれば DNS のMXレコードを引かずに、Aレコードを参照するようになるかというのは、UNIX/SendMail - 1円切手のメモに書いてるようにホスト名を [ ] でくくることが必要みたいでした。
define(`SMART_HOST', `am.wakwak.com')
↓ [ ] でくくる
define(`SMART_HOST', `[am.wakwak.com]')
define(`SMART_HOST', `[10.0.0.1]') dnl ←IPで指定したい場合も [ ] でくくる
sendmailの設定はなかなかクセが強いので、苦労しました。
ただ、前回は設定の意味もよくわかっていないままでしたが、今回はだいぶsendmailの挙動について理解できるようになりました。
なお、Postfixでの方法もOP25B対策Part2 メールサーバを構築し別メールサーバに全転送【Postfix編】で書いています。
参考:
sendmailですべてのメールを中継サーバーのSubmission portに送る
◇sendmail.mcの編集と設定◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
◇受信/転送に関する設定◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
◇サブミッションポートの設定◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
sendmailをSMTPクライアントにしてWAKWAKからメール送信する。 - hosonya blog