操作して学ぶ

SMTPフロー可視化

メールを送るたびに、裏ではクライアントとサーバーが十数往復のテキストコマンドをやり取りしています。 接続直後の挨拶から、拡張ネゴシエーション(EHLO)、暗号化への昇格(STARTTLS)、認証(AUTH)、 本文の転送(MAIL/RCPT/DATA)、切断(QUIT)までを1ステップずつ追えます。 メッセージの色はフェーズを表します。

クライアントMUA / 送信MTAサーバーSMTPサーバー▼ ここから全て暗号化1. 220 グリーティング2. EHLO(自己紹介)3. 250 対応拡張機能の一覧4. STARTTLS5. 220 Go ahead6. TLSハンドシェイク(鍵交換・証明書検証)7. EHLO(再送)8. 250 拡張機能の一覧(再送)9. AUTH LOGIN10. 334(Username を要求)11. ユーザー名(Base64)12. 334(Password を要求)13. パスワード(Base64)14. 235 認証成功15. MAIL FROM16. 250 OK17. RCPT TO18. 250 OK19. DATA20. 354 本文入力開始21. ヘッダ + 本文 + 終端のドット22. 250 受理(キュー投入)23. QUIT24. 221 切断
接続拡張ネゴシエーション暗号化開始認証メール転送切断
1 / 24
接続サーバークライアント

1. 220 グリーティング

220 mail.example.com ESMTP Postfix

TCP接続が確立すると、クライアントが何か言う前にサーバーから先に挨拶が届く。多くのプロトコルはクライアントが最初に喋るが、SMTPは逆——「相手の準備ができているか」を先に伝える設計。

要点220番台は「これから始まる/準備完了」を示す応答コード。ホスト名やソフトウェア名をあえて伏せる運用も多い。

押さえどころ

  • サーバーが先に喋る。TCP接続が確立すると、クライアントが何か送る前に 220 の挨拶が届く。多くのプロトコルと逆の順番。
  • EHLOを2回送る。STARTTLSの前後で同じEHLOを送り直すのは儀礼ではなく、平文だった1回目のやり取りが経路上で書き換えられていた可能性を消すため(STARTTLSダウングレード攻撃対策)。
  • Base64は暗号化ではない。AUTH LOGINのユーザー名・パスワードはBase64で符号化されるだけ。安全なのはSTARTTLSで経路全体が暗号化されているから。
  • 250はまだ「届いた」ではない。DATAの後の 250 queued as … は「サーバーが引き受けた」印であって、宛先に配送できた保証ではない。
  • dot-stuffing。本文の終端は単独行の「.」。本文中に行頭「.」があると誤って終端と解釈されるため、送信側がピリオドを2つに複製して回避する。

ここで可視化したのはメールを送信する側(MUA→送信MTA、または587番のSubmission)の1本道です。 複数のMTAを経由する中継や、送信ドメイン認証(SPF/DKIM/DMARC)による「なりすまし対策」はこのやり取りの外側の話になります。