タグ:SMTP ( 7 ) タグの人気記事
sendmailのメールキューを確認、削除する方法
sendmailでメールキューを確認するには mailq コマンドで出来るようです。

# mailq
/var/spool/mqueue (2 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
pB1NdWZh000853 5462 Fri Dec 2 08:50 MAILER-DAEMON
(Deferred: Connection timed out with smtp.hoge.jp.)
admin@hoge.jp
pB1NdWZk000853 6910 Fri Dec 2 08:50 MAILER-DAEMON
(Deferred: Connection timed out with smtp.hoge.jp.)
admin@hoge.jp
Total requests: 2



メールキューに溜まっているメールは /var/spool/mqueue にファイルとして存在するようです。

# ls /var/spool/mqueue
pB1NdWZh000853 pB1NdWZk000853


ファイル名とメールのQ-IDは一致しているようです。
このファイルを直接消してやればいいようです。
キュー全体を消したいときは、/var/spool/mqueue の中身をすべて消せばいいようです。

# rm -f /var/spool/mqueue/*


参考:
Linux:sendmailのメールキューを削除するには? KAKIMASS
[PR]
by Jehoshaphat | 2013-04-03 23:15 | サーバがらみ | Trackback | Comments(0)
Postfixのメールキューを確認、削除する方法
sendmailのメールキューを確認、削除する方法のPostfix版メモです。

postqueue -p コマンドで確認できます。(mailqコマンドも使えます。表示内容は一緒みたいです)

# postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
DAE7FA053F 864 Tue Dec 6 08:56:02 sourcemail@sourcedomain.com
(connect to mailsv.hoge.jp[xxx.xxx.xxx.xxx]:25: Connection timed out)
dstmail@dstdomain.com

44098A0541 852 Tue Dec 6 08:56:13 sourcemail@sourcedomain.com
(connect to vlmx00.secure.ne.jp[122.200.253.200]:25: Connection timed out)
dstmail@dstdomain.com

-- 3 Kbytes in 3 Requests.

# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
DAE7FA053F 864 Tue Dec 6 08:56:02 sourcemail@sourcedomain.com
(connect to mailsv.hoge.jp[xxx.xxx.xxx.xxx]:25: Connection timed out)
dstmail@dstdomain.com

44098A0541 852 Tue Dec 6 08:56:13 sourcemail@sourcedomain.com
(connect to vlmx00.secure.ne.jp[122.200.253.200]:25: Connection timed out)
dstmail@dstdomain.com
dstmail@dstdomain.com

-- 3 Kbytes in 3 Requests.


特定のメールキューを削除するには、以下のようにします。

#postsuper -d キューID


すべてのメールキューを削除するには以下のようにします。

#postsuper -d ALL


ちなみに、キューに溜まったメールを強制再送するには以下のようにします。

# postfix flush


参考:
postfix関連のコマンド - 社長ブログ
[PR]
by Jehoshaphat | 2013-04-03 23:15 | サーバがらみ | Trackback | Comments(0)
OP25B対策Part2 メールサーバを構築し別メールサーバに全転送【Postfix編】
OP25B対策Part1 Linuxルータでポート変換(非推奨)での別解決策として書いたOP25B対策Part2 メールサーバを構築し別メールサーバに全転送【sendmail編】のPostfix編です。

CentOS6でOP25B対策の送信専用メールサーバをたてようかと思ったんですが、CentOS6ではpostfixがデフォルトのSMTPサーバになったようなので、今回はpostfixで挑戦して見ました。

ということで、Postfixの設定です。

設定ファイルは /etc/postfix/main.cf になります。
sendmailとは違い、よりUnixライクな設定の記述になっています。

Viエディタで設定をしていきます。

# vi /etc/postfix/main.cf


ホスト名、ドメイン名
ホスト名というかFQDNSを指定します。適当で構わないようです。

myhostname = mailsv.hoge.3ryu


ドメイン名を指定します。デフォルトでは、$myhostname から最初の要素をひいたものになるので、指定しなくていいかもしれません。

mydomain = hoge.3ryu


mailコマンド等送信元ドメインを指定しない場合に、ドメイン部分を何にするか決める設定です。
デフォルトは、myhostname の値が使われるようです。

myorigin = $myhostname



自身宛かどうか
宛先メールアドレスのドメイン名が以下の設定合うなら自身宛と判断し、保存します。
sendmailで言うところの /etc/mail/local-host-names と同じ設定です。

mydestination = $myhostname, localhost.$mydomain, localhost



メール受け入れ設定
送られてきたメールを受け入れるか否かのアクセス制御を行います。
デフォルトは、localhost となっており、postfixがあるサーバ自身からのメールしか受け付けません。
以下のように localhost を all にすることで、すべてのホストからの受信を受け入れるようにします。

inet_interfaces = all

細かい転送制限は、次の項目で設定します。

転送制限設定
送られてきたメールを転送するかどうかのアクセス制御を行います。
デフォルトは、値が subnet になっており、このメールサーバと同じIPサブネット内のSMTPクライアントからのメールを転送するようです。
sendamilの、/etc/mail/access.db と同じ意味ですね。

mynetworks_style = subnet (デフォルト: サブネットワークを許可)
mynetworks_style = host (ローカルマシンのみを許可)
mynetworks_style = class (ローカルマシンと同じIPクラスA/B/Cに属するクライアントからのアクセスを許可。あまり好ましくない)

上記 mynetworks_style の設定よりも細かい設定をしたい場合は、mynetworks にて設定します。
("mynetworks"の設定をすると、"mynetworks_style" の設定そのものが無効になってしまう)

mynetworks = 127.0.0.0/8 (ローカルマシンのみを許可)
mynetworks = 127.0.0.0/8 168.100.189.2/32 (ローカルマシンと168.100.189.2の端末のみ許可)
mynetworks = 127.0.0.0/8 192.168.1.0/24 (ローカルマシンと192.168.1.0/24の端末のみ許可).
(区切りは、空白 カンマ が使える)

mynetworksは外部ファイルを指定することもできるようなので、送信元になるサブネットが多い場合は、外部ファイルで指定したほうがいいかもしれません。


転送丸投げ先設定
デフォルトではsendmailと同じように、Postfixはメールの宛先のMTAに直接配送しようとします。
今回は、プロバイダのメールサーバを経由させたいので、そのメールサーバに丸投げするようにします。
sendmailの define(`SMART_HOST', `[丸投げ先サーバ名') と同じ設定です。

relayhost = [am.wakwak.com]:587

sendmailと同じように転送先メールサーバ名に [ ] をつけるとDNS MX検索は行いません。通常は[]でくくっておきます。
また、ポート名もここで指定できるようです。(ポート名を明示しなければ 25 になります)


SMTP認証設定
上記の設定で、プロバイダSMTPサーバに丸投げするわけですが、たいていはSMTP認証が必要なので、ここで認証をするという設定してやります。

/etc/postfix/main.cf ファイルの最終行へ以下を追加
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
smtp_sasl_security_options = noanonymous
#↓認証方式を設定。プロバイダのSMTPサーバがどの認証に対応してるかはtelnetで確認。
smtp_sasl_mechanism_filter = DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN


これで、main.cfの設定は終わりです。

/etc/postfix/authinfo に認証情報を設定します。

# echo [SMTPサーバー名]:587 ユーザー名:パスワード > /etc/postfix/authinfo
# chmod 640 /etc/postfix/authinfo ←root以外参照できないようにパーミッション変更
# postmap /etc/postfix/authinfo ←authinfo.dbが作成される

(セキュリティのためauthinfoは root しかアクセスできないようパーミション変更することが望ましいかもしれません。)

main.cf を編集したら、postfixを再読み込みします。

/etc/rc.d/init.d/postfix reload



さて、これで届くはずと思いきや、届きません。
キューを見ると以下のようになっています。

# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
AF109A0536 939 Tue Dec 6 13:09:38 hoge@hoge.com
(SASL authentication failed; cannot authenticate to server am.wakwak.com[211.9.230.130]: no mechanism available)
hoge@hoge.com

-- 1 Kbytes in 1 Request.

サーバとのSMTP認証のメカニズムがあっていないようです。
結構悩んだんですが、Labs Zsrv Net - Postfixで、GMAIL経由でメールを送る(OP25B対策)「Postfix」の設定で、ヒントが。。
結局認証種類別のcyrus-saslモジュールが入ってなかったことが原因でした。
当初以下の2つしか入っていませんでした。

# rpm -qa | grep cyrus
cyrus-sasl-2.1.23-8.el6.i686
cyrus-sasl-lib-2.1.23-8.el6.i686

plainと、md5用のモジュールをインストールします。

# yum install cyrus-sasl-plain
# yum install cyrus-sasl-md5


これで、postfixを service postfix restart したらちゃんと送れるようになりました。
やはり、sendmailよりかは設定しやすいですね。


参考:
Postfix 基本設定 公式ドキュメントの日本語訳です。まずは一読する価値アリです。
◇Postfixについて◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆ sendmailの時もお世話になりました。非常にわかりやすく説明されています。
Postfix から Gmail 経由でメールを送る linux.matchy.net: ~Linuxで遊ぼう!~
Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth) - maruko2 Note.
OP25B対策(Outbound Port 25 Blocking対策)
OP25B(Outbound Port 25 Blocking)対策 - Fedoraで自宅サーバー構築
Postfixの小技
Postfix で、Gmail にメールをリレーする - 私の二次記憶
[PR]
by Jehoshaphat | 2013-04-01 23:10 | 豆知識 | Trackback | Comments(0)
OP25B対策Part2 メールサーバを構築し別メールサーバに全転送【sendmail編】
OP25B対策Part1 Linuxルータでポート変換(非推奨)でOP25Bされている環境で、ポート25をポート587に変換して送る方法を書きました。
これはかなり強引で非推奨な実験的環境です。


ということで、より一般的で推奨できるOP25B対策は、LAN内にメールサーバを立てて、プロバイダもしくはレンタルしてるメールサーバに丸投げする方法です。
LAN内の送信ポート変更できないソフト,機器はこのLAN内のメールサーバに送信メールを投げます。

イメージとしては以下のような感じです。
上段がプロバイダのメールサーバを経由させる方法、下段がレンタルしてるメールサーバを経由させる方法です。
e0091163_2344727.jpg


プロバイダのメールサーバを使うにしろ、別のレンタルしているメールサーバを使うにしろ、どちらの方法でも 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を再起動させることなく即時反映ができるようです。

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=<hoge@hogepiyo.info>, 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=<third.rate.pg@gmail.com>, 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=<hoge@hogepiyo.info>, 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=<third.rate.pg@gmail.com>, 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 -----
<third.rate.pg@gmail.com>
(reason: 550 5.7.1 <third.rate.pg@gmail.com>... Relaying denied)

----- Transcript of session follows -----
... while talking to am.mds.wakwak.com.:
>>> DATA
<<< 550 5.7.1 <third.rate.pg@gmail.com>... Relaying denied
550 5.1.1 <third.rate.pg@gmail.com>... 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 プロトコルエラー応答一覧
[PR]
by Jehoshaphat | 2013-04-01 23:04 | ネットワーク | Trackback | Comments(0)
OP25B対策Part1 Linuxルータでポート変換(非推奨)
会社のインターネット用プロバイダが、今まで固定IP使ってたんですが、経費削減で動的IPに変更させられました。
このプロバイダでは、固定IP以外からはOP25B(Outbound Port 25 Blocking)されています。
(OP25Bについては、OCN|OCN迷惑メール対策:,WAKWAK - Outbound Port25 Blocking等参考。)

で、会社のメインのメールはプロバイダとは別のレンタルサーバを使っています。
クライアントのメーラはサブミッションポート(587)を使うように設定しなおせばいいんですが、問題は各種サーバはPCの監視ソフト、スキャンメールができる複合機で、送信ポートが設定できないものがあるということです。

ということで、送信ポートが設定できないソフトや機械でどうやってレンタルメールサーバに送るか検討してみました。

一つはルータでのポート変換を行うという強引策と、もうひとつは自社にメールサーバを立てるという方法です。


Linuxルータでポート変換

これはかなり強引な方法で、送信先ポートが25になっているのをルータで587に変換してしまうという方法です。
レンタルサーバ上のメールサーバがSMTP認証がなくても使えるので、クライアントからメールサーバ宛のパケットの送信先ポートを変換してしまいます。

手持ちのインターネットゲートウェイに使っているルータが、送信先ポート変換ができなさそうだったので、ゲートウェルータとLANとの間にLinuxルータを置いてみました。
で、iptablesのDANT機能でポートを変換します。

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


Linuxルータのiptablesの設定は以下のようにしました。
静的NATを使って設定したので、仮想インターフェイスの作成が必要です。
(仮想インターフェイスの作成については、(Linux)CentOSでちょっとトリッキーなNATルータを構築してみたを参照)

iptables -F
iptables -t nat -F
iptables -X


iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT


#NATの設定リセット
iptables -t nat -F

#クライアントからのパケットを仮想インターフェイスのIPにアドレス変換
iptables -t nat -A POSTROUTING -s 10.0.0.2 -j SNAT --to 192.168.0.10
#仮想インターフェイスに入ってくるパケットをクライアントのIPアドレスに変換
iptables -t nat -A PREROUTING -d 192.168.0.10 -j DNAT --to 10.0.0.2


#DNAT例 ここで25ポートを587ポートに変換 (xxx.xxx.xxx.xxxはメールサーバのIP)
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination xxx.xxx.xxx.xxx:587


この環境で、クライアントからメール送信(25ポート宛て)した時に、Linuxルータ側でパケットキャプチャしたときは以下のようになってました。

# tcpdump -n tcp port 25 or 587
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on seth0, link-type EN10MB (Ethernet), capture size 96 bytes
19:54:25.039575 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: S 3954643844:3954643844(0) win 65535
19:54:25.061470 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: S 373935822:373935822(0) ack 3954643845 win 65535
19:54:25.062094 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: . ack 1 win 64970
19:54:25.089189 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 1:30(29) ack 1 win 33120
19:54:25.093427 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1:17(16) ack 30 win 64955
19:54:25.115068 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 30:53(23) ack 17 win 33120
19:54:25.150178 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 17:57(40) ack 53 win 64944
19:54:25.171725 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 53:61(8) ack 57 win 33120
19:54:25.172503 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 57:95(38) ack 61 win 64940
19:54:25.193558 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 61:69(8) ack 95 win 33120
19:54:25.194221 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 95:101(6) ack 69 win 64936
19:54:25.215981 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 69:83(14) ack 101 win 33120
19:54:25.220544 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 101:1285(1184) ack 83 win 64929
19:54:25.342188 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: . ack 1285 win 33120
19:54:25.342812 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1285:1290(5) ack 83 win 64929
19:54:25.375987 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 83:111(28) ack 1290 win 33120
19:54:25.389477 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1290:1296(6) ack 111 win 64915
19:54:25.410860 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 111:134(23) ack 1296 win 33120
19:54:25.411031 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: F 134:134(0) ack 1296 win 33120
19:54:25.411620 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: . ack 135 win 64903
19:54:25.411817 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: F 1296:1296(0) ack 135 win 64903
19:54:25.433325 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: . ack 1297 win 33119

25 packets captured
25 packets received by filter
0 packets dropped by kernel

どうやら、ちゃんとレンタルのメールサーバと会話できているようです。

しかし、上記のiptablesの設定は、あくまで実験環境なので実際に運用するにはLinuxルータ側でNAPTの設定が必要かと思われます。
DNATの --to-destination でポート変換がかけれるわけですが、IPも必ず指定しないと行けません。
ということで、インターネット側のメールサーバはひとつしか使えないことになるので、複数メールサーバを使っている場合にはNGです。
また、指定時はIPアドレスでないといけないこともネックですね。(もし、レンタルサーバのメールサーバのIPが変わったら変更しないといけません)

ということで、この方法は余り現実出来ではありません。

もう一つの方法OP25B対策Part2 sendmailでメールサーバを構築し別メールサーバに全転送(推奨)のほうが現実的です。(Postfixでの方法はOP25B対策Part2 メールサーバを構築し別メールサーバに全転送【Postfix編】で書いています。)


余談ですが、iptabelsの設定の中で、"REDIRET" というのがあります。
これを使えば、ポートだけ変換できるじゃん!と思ったんですが、これはLinux自身でパケットを受信する場合のみポートリダイレクトするようです。
今回のように、ルータとしての役割を持たせてパケット転送するときには使えないということです。

iptables -t nat -A PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 587

このことは、@IT:natテーブルを利用したLinuxルータの作成の最後の方に 「「-j REDIRECT」は、ホスト自身の別サービスポートにしかリダイレクトできません。そのためLinuxルータとHTTPプロキシサーバが同一のホストで動作していない場合は、REDIRECTも使用できません。」 と書いてました。



参考:
iptables のテーブル表示 と アクセス許可/natの例 - ihirokyの日記
Mazn.net iptablesでポートフォワーディング
iptablesの設定あれこれ
iptablesによるパケットフィルタリング
REDIRECTターゲット REDIRECTがホスト自身に対してしか適用されないことが書いてません。。
[PR]
by Jehoshaphat | 2013-04-01 23:00 | ネットワーク | Trackback | Comments(0)
(ツール)簡易SMTPサーバ Radish3
Windows環境でPHPでメール送信を行うWEBアプリを作っていて、なかなか難しいのがメール送信部分のテストです。

ということで、メール送信のテストが用意の行えるよう簡易SMTPサーバである Radish3 を使ってみました。

http://radish.brothersoft.jp/からダウンロードします。
ダウンロードしたファイルを実行すると、Radishの本体の "radish_3_0_0_b041.lzh" がダウンロードされます。

後は解凍して実行するだけです。

今回はテスト目的で使い、実際に配送はしないので、メニューバーの "設定" → "SMTP/POP3サーバ" で "キュー常時処理" のチェックを外すようにします。(そうしないとキューに入ったメールをそのまま外に配送してしまいます)

php.iniの設定も関係してきますが、デフォルトだと下記のように自身の25ポートにメールを投げるので、そのままで構わないと思いいます。


[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25



これで実際にPHPからメールを送ってみると、Radishメイン画面の "mail" タブの "QUEUE" にメールが溜まります。
プロパティを表示すると、関連付けられたメーラーでメール内容を確認することができます。


参考:
[どうでもよいこと]Webアプリでのメール送信テストにはRadish使うといいよ | Ryuzee.com
ローカル開発用メールサーバー「Radish」 の紹介とその導入方法 | うつしよ
[PR]
by Jehoshaphat | 2012-11-08 22:45 | ツール | Trackback | Comments(0)
telnetでSMTPメール送信
ちょっとSMTPがらみを調べてる時に telnet でメール送信できることを知りました。

まずはSMTPプロトコルのおさらいです。
SMTP(Simple Mail Transfer Protocol)は名前のごとく非常にシンプルなプロトコルです。
MUA(メールクライアント)から送信されたメールもしくは他のMTA(メールサーバ)から送信されたメールを受信し、自身の管理するドメインのものならメールボックスに格納し、他のドメイン宛てならそのドメインのメールサーバに転送するというものです。

SMTPはテキストベースのコマンドでやり取りしてるようです。(ちょうどFTPと似たような感じです。)

なので telnet でメール送信できるわけですね。

SMTP認証をしてない素のメールサーバに対してtelnetでメール送信する場合は下記のようなコマンドになります。
(Linuxのコンソールからとあるレンタルサーバで借りてるメールサーバにtelnetした場合です。)

$ telnet smtp.exsample.jp 25 ←メールサーバに接続
Trying xxx.xxx.xxx.xxx...
Connected to smtp.exsample.jp (xxx.xxx.xxx.xxx).
Escape character is '^]'.
220 smtp.exsample.jp ESMTP
HELO exsample.jp ←あいさつ(HELOの後はなんでもかまわない?)
250 smtp.exsample.jp
MAIL FROM:hoge00@exsample.jp ←送信元メールアドレス(エンベロープ送信者)
250 ok
RCPT TO:hoge01@exsample.jp ←送信先メールアドレス(エンベロープ受信者)
250 ok
DATA ←これからメール内容送ること通知
354 go ahead
subject: test ←ここから3行はメールヘッダ。
from: hoge00@exsample.jp
to: hoge01@exsample.jp
meil send test ←メール本文
. ←メール内容終わることを通知
250 ok 1280190256 qp 85712
quit ←コネクション終了
221 smtp.exsample.jp
Connection closed by foreign host.

ちなみに、ISP(プロバイダ)がスパム対策で、OP25BをしているとISP指定のメールサーバ以外にはポート25でアクセスできません。
その場合はtelnet接続時にMUAからMTAへの送信に使うポートとして推奨されているサブミッションポート587を指定するといいようです。


ちなみにsendmailとか使ってると下記のような感じになるようです。
(sendmailでメールサーバ構築し、サーバ上でメール送ってるのでtelnet先がlocalhostになっています。)

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Tue, 27 Jul 2010 00:02:15 +0900
HELOO localhost
500 5.5.1 Command unrecognized: "HELOO localhost"
HELO localhost
250 localhost.localdomain Hello testserver [127.0.0.1], pleased to meet you
MAIL FROM:hoge00@exsample.jp
250 2.1.0 hoge00@exsample.jp... Sender ok
RCPT TO:hoge01@gmail.com
250 2.1.5 hoge01@gmail.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
subject: test
from: hoge00@exsample.jp
to: hoge01@gmail.com
this test
.
250 2.0.0 o6QF2FNx009985 Message accepted for delivery
quit
221 2.0.0 localhost.localdomain closing connection
Connection closed by foreign host.


このtelnetですが、Windowsのコマンドプロンプトからやるとメールヘッダや本文がうまく解釈されてませんでした。
(おそらく文字コードの問題だとは思うんですが。。)
なので、Linuxからした方が無難かもしれません。

普通のメールクライアントも上記のようなコマンドを発行してメール送信してるんですね。。

普段何気なく使ってるメールですが、調べると結構面白いです。いずれメールサーバ構築してみたいですね。


参考:
Simple Mail Transfer Protocol - Wikipedia
Geekなぺーじ : メールの仕組み(SMTP)
Linuxexpert - SMTP配送の仕組みとsendmail-MailServer/SMTP配送の仕組みとsendmail-PukiWiki
telnetでメール送信
[PR]
by jehoshaphat | 2010-11-07 13:16 | ネットワーク | Trackback | Comments(0)