3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

OP25B対策Part2 メールサーバを構築し別メールサーバに全転送【sendmail編】

OP25B対策Part1 Linuxルータでポート変換(非推奨)OP25Bされている環境で、ポート25をポート587に変換して送る方法を書きました。

これはかなり強引で非推奨な実験的環境です。

ということで、より一般的で推奨できるOP25B対策は、LAN内にメールサーバを立てて、プロバイダもしくはレンタルしてるメールサーバに丸投げする方法です。

LAN内の送信ポート変更できないソフト,機器はこのLAN内のメールサーバに送信メールを投げます。

イメージとしては以下のような感じです。

上段がプロバイダのメールサーバを経由させる方法、下段がレンタルしてるメールサーバを経由させる方法です。

プロバイダのメールサーバを使うにしろ、別のレンタルしているメールサーバを使うにしろ、どちらの方法でも sendmail の設定は変わりません。(設定としては(Linux)LogwatchのログメールをGmailに送りたいに書いている内容と似ています。)

今回使った sendmail は 8.13.8 で、CentOS5.6上で動かしています。

また、プロバイダはNTT-MEwakwak を使っています。

まず、以下のように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を再起動させることなく即時反映ができるようです。

makemap hash /etc/mail/access.db < /etc/mail/access

(もし、インターネット側からこの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でわかります。

%gt;telnet am.wakwak.com 587

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

OP25B(Outbound Port 25 Blocking)対策 - CentOSで自宅サーバー構築

SMTP/POP3 プロトコルエラー応答一覧