25番ポートの罠

ちょっと事情があって,今日はメールサーバを構築していた.

事情の方はそのうち解決策を見つけるか,諦めたときに話すとして,こちらの話をしてしまおう.

まず,いろいろと面倒くさいことが多いのでDNSは登録してしまった方がいい.

俺は今回,Dynamic DO!.jpに登録した.もちろん無料ですよ.

このへんの親切なDynamic DNSというのはDynamicDNS Client Tool「DiCE」とかを使うと非常に楽に設定できたりする.

でも,そんなものに頼るのはWindowsだけでいいので,Linuxを使うなら自前でなんとかしよう.

なんのことはない,IPアドレスが変わったときに,

wget -q -O - 'http://free.ddo.jp/dnsupdate.php?dn=ドメイン&pw=パスワード'

という動作ができればいいだけのことである.

まぁそのへんは何かスクリプトを作るといいです.

俺はこのへんを参考にしました.

http://240net.ddo.jp/linux/linuxddns.html

さて,このくらいは訳はない.

本題のメールサーバに入ろう.

まず,UbuntuDebian系なので,インストール時点でSendmailが入っている可能性がある.

Senmdailでも構わないのだが,今回はPostfixを使う.

$ sudo apt-get install postfix postfix-pcre

Postfixをインストールしたら,設定をしなければならない.

インストール画面で多少聞かれるのだが,いずれにしろmain.cfを書き換える必要がある.

その前にPostfixランレベル3,5で自動起動するように設定する.

(0:シャットダウン,1:シングルユーザーモード,2:ネットワークなしのマルチユーザーモード,3:通常のマルチユーザーモード,4:未使用,5:グラフィカルログインによるマルチユーザーモード,6:システムの再起動)

#chkconfig --level 35 postfix on

#chkconfig --list postfix

postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off

次にrootのエイリアスを設定する.

エイリアスとはつまり別名のこと.たとえば管理者rootでメールを送信するとroot@example.comとかになっちゃうのだけれど,これがイヤなので,user@example.comで送りたい.

そんなときに使うといいかもしれないエイリアス

/etc/aliasesを開いて,

root:hoge

と追記しておけば問題ないです.編集し終えたらnewaliasesコマンドを実行して,エイリアスデータベースを作成します.

# /usr/bin/newaliases

そしていよいよPostfixの設定.

/etc/postfix/main.cfを編集します.

最低限のメール送信に大事なところは以下の通り.

myhostname = hoge.ddo.jp

mydomain = hoge.ddo.jp

(DO!.jpはmxレコードに対応しており,ホスト名とドメイン名は同じhoge.ddo.jpで大丈夫)

myorigin = $mydomain

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, $mydomain

mynetworks = 172.16.50.0/27

(ここはLAN内の自分のネットワークを指定する.)

alias_map = hash:/etc/aliases

alias_databese = hash:/etc/aliases

mail_spool_directory = /var/spool/mail

(ここは受信側の設定なので今はやらなくてもいい)

設定が終了したらPostfixを再起動しましょう.

# /etc/init.d/postfix reload

ログは/var/log/mail.logにあります.

動作確認,そしてメールを送信してみましょう.

# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 hoge.ddo.jp ESMTP Postfix

これで入力待ちになればOK.

送信してみましょう.

# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 hoge.ddo.jp ESMTP Postfix

ehlo hoge.ddo.jp // 自分のホスト名を入力します

250-hoge.ddo.jp

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-XVERP

250 8BITMIME

mail from: // メールの差出人を入力

250 Ok

rcpt to: // メールの宛先

250 Ok

data // メール本文の始まりを宣言

354 End data with .

subject: test // メールのタイトル

test message // メールの本文

. // ドットはメール本文の終了を意味します

250 Ok: queued as 922A5142893

quit // セッションを終了します.

221 Bye

Connection closed by foreign host.

これでメールが送れる,予定でした.

さぁ,ここからが本題です.こんなどこのHPにでも乗っているような手引きでメールが送れるのであればここには書かない.

つまり,当然のごとく遅れていなかったのです.

宛先をgmail,yahooメール,ezweb.ne.jpと変更してみましたが,すべてダメでした.

というわけで/var/log/mail.logを読みます.

Nov 17 17:47:46 h3poteto postfix/smtp[14678]: connect to alt1.gmail-smtp-in.l.google.com[74.125.142.26]:25: No route to host

主にこんなエラーが出ています.

つながってないことは誰でもわかりますが,これが噂のOP25Bというやつです.

主にこれはスパムメール対策としてISPで行われていることが多い.

つまり,俺で言うならniftyですね.

一応確認してみましょう.

$ nslookup -type=mx gmail.com

として,表示される文字列の中に「alt1.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:400e:c03::1b」などという文字があるはずです.

$ telnet alt1.gmail-smtp-in.l.google.com 25

としてみましょう.これで,gmailのサーバに25番ポートからSMTP接続しているのですが,

Trying 74.125.142.27...

telnet: Unable to connect to remote host: No route to host

このように出てくれば,25番ポートからの接続がISPのおかげでできないということになります.

最近こういうプロバイダは多いのでしょうか,よくわかりませんが…….

さて,対策をします.

自分が契約しているISP側で規制されているので,そこを無理やりこじ開けることはできません.

なので,自分のサーバから送信するメールを,一度自分のISPをリレーして送るようにします.

まず,自分が契約しているISP(俺で言うならnifty)の契約情報書類を探してきて,ユーザ名,パスワード,送信メールサーバの情報を見つけます.

ユーザ名: hoge001

パスワード: mypasswd

送信メールサーバ: smtp@example.ne.jp

/etc/postfix/main.cfを再び編集します.

# OP25B対策の設定

relayhost = [smtp.example.ne.jp]:587

smtp_sasl_auth_enable=yes

smtp_sasl_password_maps=hash:/etc/postfix/isppasswd

smtp_sasl_security_options = noanonymous

smtp_sasl_mechanism_filter =

次に/etc/postfix/master.cfを開き,編集します.

submission inet n - - - - smtpd

-o smtpd_enforce_tls=yes

-o smtpd_tls_security_level=encrypt

-o smtpd_sasl_auth_enable=yes

-o smtpd_client_restrictions=permit_sasl_authenticated,reject

-o milter_macro_daemon_name=ORIGINATING

これらのコメントアウトを外します.

main.cfにて記述した,password_mapsのハッシュの場所に,パスワードファイルを作ります.

$ sudo emacs /etc/postfix/isppasswd

存在しないと思うので新規に作成します.中身は以下のように書いておけば大丈夫.

smtp.example.ne.jp hoge001:mypasswd

これを有効にします.

# postmap /etc/postfix/isppasswd

インストールしてない場合は,saslのライブラリをインストールします.

$ sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin

これで設定は終わりです.

postfixを再起動して,メールが送信できるか確認してみると,無事できました.

# /etc/init.d/postfix reload

# telnet localhost 25

.....

いやいや,後半は手こずりました.

25番ポートに制限があるってことはすぐにわかったんですけど,リレーしないと送れないってことなんですね.

参考サイト:

http://linux.kororo.jp/cont/server/postfix.php

http://dqn.sakusakutto.jp/2010/07/postfixoutbound-port-25-blocki.html