メールを送りたい!

問題文  

問題1  

あなたの同僚のAさんはチームで使うためのメールサーバを作ることになってしまった。そんなAさんが自分の環境から作成中のメールサーバに対してメールが送信できないと相談を受けた。

A 「今メールサーバ作ろうとしてるんだけど、どうも自分の環境からメールが届かないんだよね」
A 「メールサーバの設定はあってると思うんだけど、ちょっと見てもらえないかな」

clientからusermxにメールが送れない原因について調査して結果を報告せよ。
(usermxからメールを送信する必要はありません。)

メールは次のコマンドで送ることができる。

echo "メール本文" | sendmail [email protected] 

アクセス情報  

  • client 192.168.3.2
  • usermx 192.168.3.35

初期状態  

  • メールを送ることができない

終了状態  

  • 原因が特定できており、報告がされている

補足事項  

  • この問題ではリセット要求は動作しないことに注意すること。(リセット要求を送ると20分間解答不能になる)

問題2(問題1で50%以上の回答で解放)  

A 「そういえば今使ってるメールクライアントの設定、ictscmx.final.ictsc.net ってメールサーバに送る設定になってるしポートが 587 に設定されてるな」
A 「同じように設定すればメールが送れるかもしれんね、ユーザ名とパスワードは…両方ともictscに設定されてるな」

適切な設定をclientに設定し、clientからusermxにメールを送信し、usermxが受信できることを確認せよ。 (usermxからメールを送信する必要はありません。)

メールは次のコマンドで送ることができる。

echo "メール本文" | sendmail [email protected] 

(teamXXは自分のチーム番号に置き換えて下さい。例: team01)

アクセス情報  

  • client 192.168.3.2
  • usermx 192.168.3.35

初期状態  

  • メールを送信することができない

終了状態  

  • メールを送信することができる

解説  

  • 要約
    • この問題のテーマはOP25B(Outbound Port 25 Blocking)である。

Aさんの環境であるclientからusermxに疎通することは確認できます。

$ ping usermx.teamxx.final.ictsc.net
PING usermx.teamxx.final.ictsc.net (xxx.xxx.x.xx) 56(84) bytes of data.
64 bytes from xxx.xxx.x.xx (xxx.xxx.x.xx): icmp_seq=1 ttl=58 time=0.902 ms

clientからusermxにメールアドレスが送れないことを確認してみます。

echo "hogehoge" | sendmail [email protected]

(xxはチーム番号、ex: team01 -> usermx.team01.final.ictsc.net)

$ sudo less /var/log/maillog
Feb 27 11:08:51 client postfix/smtp[1340]: connect to usermx.teamxx.final.ictsc.net[xxx.xxx.x.xx]:25: Connection timed out
Feb 27 11:08:51 client postfix/smtp[1340]: 5E211B06F4: to=<[email protected]>, relay=none, delay=30, delays=0.07/0.02/30/0, dsn=4.4.1, status=deferred (connect to usermx.teamxx.final.ictsc.net[xxx.xxx.x.xx]:25: Connection timed out)

送れませんでした。
connect to usermx.teamxx.final.ictsc.net[xxx.xxx.x.xx]:25 ということから、telnetを使って25番ポートにアクセスをしてみます。

$ yum -y install telnet
$ telnet usermx.teamxx.final.ictsc.net 25
Trying xxx.xxx.x.xx...

返ってきません。一方でusermxのほうでは次のようになります。

$ telnet usermx.teamxx.final.ictsc.net 25
Trying xxx.xxx.x.xx...
Connected to usermx.teamxx.final.ictsc.net.
Escape character is '^]'.
220 usermx.teamxx.final.ictsc.net ESMTP Postfix

postfixから応答があります。clientから25番ポートでの通信ができていない事がわかります。
client の firewall の設定を確認してみます。

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

特に問題はなさそうです。(ガバガバじゃねぇか)
25 番ポートにつながらない…うーん。

  • 25番ポート つながらない |検索|

はい、OP25Bです。
問題1では以上のようなことを根拠にOP25Bであることに言及してもらえれば満点でした。
(OP25Bのついての解説は省略します)

続いて問題2です。ここからはclientからusermxにメールを送信することが目標になります。
問題文はictscmx.final.ictsc.net というメールサーバが存在することを示しています。
ポート番号 587…?

  • op25b ポート 587 l検索|

はい、サブミッションポートです。
ユーザ名とパスワードは…両方ともictsc... はSMTP認証の情報を示していました。
つまりはこのメールサーバを経由してメールを送ってほしかったのです。 試しにtelnetでアクセスを行ってみます。

$ telnet ictscmx.final.ictsc.net 587
Trying xxx.xxx.x.x...
Connected to ictscmx.final.ictsc.net.
Escape character is '^]'.
220 ictscmx.final.ictsc.net ESMTP Postfix

返答がありました。ここで上記の認証情報を使うための確認をしておきます。

ehlo ictscmx.final.ictsc
250-ictscmx.final.ictsc.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

250-AUTH=PLAIN LOGIN は平文でのSMTP認証をする設定であることを示しています。(ヤバいですね☆)
試しに認証情報を入れてみると、

AUTH LOGIN
334 VXNlcm5hbWU6
aWN0c2M=
334 UGFzc3dvcmQ6
aWN0c2M=
235 2.7.0 Authentication successful

ictsc:ictscで認証ができることが確認できました。(ictscをBASE64でエンコードするとaWN0c2M=になります。)

ここからpostfixに設定を入れたりしていきます。
始めに認証情報を作成します。

$ vi /etc/postfix/smtp_pass

ictscmx.final.ictsc.net:587 ictsc:ictsc

これを

$ postmap /etc/postfix/smtp_pass

してpostfix側で読み込みます。 postfix の設定ファイルにSMTP認証と、リレー先のメールサーバの設定を追加します。

$ vi /etc/postfix/main.cf

relayhost = final.ictsc.net:587

smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/smtp_pass
smtp_sasl_mechanism_filter=plain
  • relayhost = [ictscmx.final.ictsc.net]:587 等でも可能です。
  • smtp_sasl_mechanism_filter=plain は無くても送れます。(書いてくれるとわかってるぞアピールになりそう)

postfixを再起動しメールを送信した後、usermxにメールが届くことを確認します。

本選終了後追記  

上記が想定回答でしたが、作問者の不手際により以下の回答が可能になっていました。

  • relayhost を指定した後、認証を設定しない場合でもictscmx経由でメールがusermxに届く

これは用意されているictscmx側の設定に問題があったためです。
前述の通り、ictscmxにはSMTP認証の設定がされており、main.cfにはreject_unauth_destinationをして認証を通っていないメールをリレーしないように設定をしていたはずでした。しかしこの設定は

Postfixがメールを転送する場合: 解決された RCPT TO アドレスが $relay_domains またはそのサブドメインにマッチし、送信者指定のルーティング (user@elsewhere@domain) を含まない場合

(引用: http://www.postfix-jp.info/trans-2.3/jhtml/postconf.5.html)

となっており、relay_domainsはデフォルトの$mydestinationに設定していました。そのmydestinationの中には$mydomainという項目が入ってしまっていました。

おわかりでしょうか… $mydomainはfinal.ictsc.net を示しているためPostfixがメールを転送する場合 に該当してしまっていたのです…。
したがって、実は採点基準であるusermx にメールを送ることに成功する方法として認証を設定しなくてもリレーできてしまうという状態なっていました。

これは私の環境作成・検証のミスであり、回答をしていただいた皆さんには申し訳ない気持ちでいっぱいです。
提出された回答では認証を設定する想定回答に基づいたものが多く、「ありがとう…。ごめんなさい…。」みたいな状態で数時間採点をしていました。

1次予選メール問題の回答状況から色々と改善を試みたメール問題でしたが、上記のような不備がありながらも多くのチームに回答を頂けて良かったです。この問題がPostfixもといメール周りについて触る機会になれば幸いです。

採点基準  

問題1:80 点

  • 原因が OP25B であることに言及する。 50%
  • 十分な根拠を示す(回答フォーマットに従う) 50%

問題2:70点

  • usermx にメールを送ることに成功する。 100%