【メール】メール送信時のSMTP(Simple Mail Transfer Protocol)プロトコルの解析

今回はメール送信時の SMTP プロトコルの動作について解説します。

パケットは WireShark で取得し、コマンドラインよりパケットを解析しています。

 

【Wireshark v2.6.2】インストール方法と使用方法

 

 

SMTP プロトコルとは

SMTP プロトコルとはコマンドに基づくテキスト指向のプロトコルです。

クライアントがコマンドを発行すると、メールサーバーがコマンドを処理して応答(レスポンス)を返します。

この対話がセッションが終了するまで続きます。

更に、各コマンドはシーケンシャルです。

つまり前のコマンドが完了しない限りは、次のコマンドが実行されません。

例えば、宛先メールサーバーからレスポンスが返ってこない前に宛先メールサーバーにデータを送信することはできません。

 

SMTP のコアコマンド

以下、SMTP のコアコマンドです。

 

※コアコマンドではありませんが、SMTP 拡張コマンドに「ehlo」コマンドがあります。

 

 

■SMTP コマンドの終了

SMTP コマンドは、「CR文字(キャリッジリターン)」「LF文字(ラインフィード)」の組み合わせ「CRLF(CR+LF、復帰改行)」で完了します。

コマンドとレスポンスの各行の長さは512文字を超えられません。

 

 

■SMTP コマンドには大文字・小文字の区別はない

SMTP コマンドには大文字・小文字の区別はないので、例えば telnet コマンドで直接メールサーバーにコマンドを送信する際も、大文字でも小文字でも問題はありません。

 

 

 

SMTP コマンド応答コード

応答コードは「3桁」になります。

1桁目、2桁目、3桁目でそれぞれ応答コードの意味を持っています。

 

■1桁目(最上位桁)

 

■2桁目

 

※3桁目にはほとんど意味はないようです。その時その時で0になるのか8になるのか決められるようで、ルールはありません。

 

SMTP コマンドの結果は、通常1桁目で判断します。

2桁目、3桁目はコードの意味を細かく知ることができますが、1桁目で成功や失敗を判断します。

例えば肯定完了状態を表す「250 OK」なら 2 で成功と判断できますが、「50」では判断できません。

 

 

 

SMTP プロトコルのセッション

SMTP プロトコルのセッションは以下のような流れで進みます。

  1. 宛先の決定
  2. 接続の確立
  3. セッションの初期化
  4. 必要なトランザクションを行うための対話
  5. セッションの切断

 

 

 

環境

 

宛先の決定

最初に DNS に問い合わせます。

1735 2018-12-21 15:12:07.292125 15.10.10.84 -> 8.8.8.8      DNS Standard query MX dest-example.co.jp

1736 2018-12-21 15:12:07.294150 15.10.10.84 -> 8.8.8.8      DNS Standard query MX dest-example.co.jp

1741 2018-12-21 15:12:07.300090 15.10.10.84 -> 8.8.8.8      DNS Standard query MX dest-example.co.jp

 

クライアントは、DNS サーバーに問い合わせを行い、メールアドレスの右側の部分の FQDN 用の MX(Mail Exchanger:メール交換機)の情報を要求します。

 

 

DNS サーバーより MX レコード(MX 10 mail2.provider.co.jp MX 10 mail1.provider.co.jp)が返ってきます。

更に返ってきた MX レコードより「mail2.provider.co.jp」を正引きし、レコード(A 2.2.2.2 A 1.1.1.1)が返ってきます。

1797 2018-12-21 15:12:07.381821      8.8.8.8 -> 15.10.10.84 DNS Standard query response MX 10 mail2.provider.co.jp MX 10 mail1.provider.co.jp 
1798 2018-12-21 15:12:07.381867 15.10.10.84 -> 8.8.8.8      DNS Standard query A mail2.provider.co.jp 
1799 2018-12-21 15:12:07.383242      8.8.8.8 -> 15.10.10.84 DNS Standard query response A 2.2.2.2 A 1.1.1.1

 

接続の確立

初めにクライアントは SMTP プロトコル(25/TCP)を利用して、メールサーバーと TCP 接続(シェイクハンド)を生成します。

1817 2018-12-21 15:12:07.430083 15.10.10.84 -> 1.1.1.1 TCP 60324 > 25 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=549959836 TSER=0 WS=7 
1818 2018-12-21 15:12:07.432896 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 TSV=2978547982 TSER=549959836 WS=7 
1819 2018-12-21 15:12:07.432916 15.10.10.84 -> 1.1.1.1 TCP 60324 > 25 [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=549959839 TSER=2978547982

標準の SMTP ポートは「25/TCP」です。

セッションの開始は、クライアント - サーバー間の接続を確立するための一連の対話からなります。

SMTP 認証が必要な場合もあります。

(サブミッションポート 587/TCP、メール暗号化 465/TCP など)

 

 

セッションの初期化

宛先メールサーバーよりアクセスが来ます。

「220 real-mail-server.co.jp ESMTP Postfix」は宛先メールサーバーが準備完了していることを示しています。

「Postfix」とパッケージ名まで情報が返ってきているのでセキュリティ的には情報を与えすぎと見えますが、そこは各メールサーバーの運用者のポリシー次第になります。

それに対して HELO コマンドで送信元(ソース)のメールサーバーの FQDN(source-smtp-server.com)を返しています。

1823 2018-12-21 15:12:07.488672 1.1.1.1 -> 15.10.10.84 SMTP S: 220 real-mail-server.co.jp ESMTP Postfix

1824 2018-12-21 15:12:07.488686 15.10.10.84 -> 1.1.1.1 TCP 60324 > 25 [ACK] Seq=1 Ack=39 Win=5888 Len=0 TSV=549959895 TSER=2978548037

 

もし宛先のメールサーバーで SMTP サービスを提供していない場合は、以下のようなメッセージを返すこともあります。

554   No  SMTP  service  available

 

 

 

メールサーバー側が接続の挨拶として、応答コード「220」を返して来たら、それに対して クライアントは自分の身元を知らせるために HELO コマンドで自身(送信元、ソース)のメールサーバーの FQDN(source-smtp-server.com)を返しています。

1825 2018-12-21 15:12:07.488706 15.10.10.84 -> 1.1.1.1 SMTP C: HELO source-smtp-server.com

1829 2018-12-21 15:12:07.491036 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=39 Ack=25 Win=14592 Len=0 TSV=2978548040 TSER=549959895 
1830 2018-12-21 15:12:07.491272 1.1.1.1 -> 15.10.10.84 SMTP S: 250 real-mail-server.co.jp

 

それに対してメールサーバーが「250」を返して来たら接続確立の対話は完了です。

 

 

必要なトランザクションを行うための対話

相手メールサーバーに対して「MAIL FROM」を返しています。

1831 2018-12-21 15:12:07.491296 15.10.10.84 -> 1.1.1.1 SMTP C: MAIL FROM:<xxx_de9c@source-smtp-server.com>  

1835 2018-12-21 15:12:07.499924 1.1.1.1 -> 15.10.10.84 SMTP S: 250 2.1.0 Ok 

 

 

 

 

 

宛先メールサーバーに対して「宛先メールアドレス(test-xxxx@dest-example.co.jp)」を通知しています。

1836 2018-12-21 15:12:07.499952 15.10.10.84 -> 1.1.1.1 SMTP C: RCPT TO:<test-xxxx@dest-example.co.jp>

1845 2018-12-21 15:12:07.541996 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=77 Ack=127 Win=14592 Len=0 TSV=2978548091 TSER=549959906 
1885 2018-12-21 15:12:07.830471 1.1.1.1 -> 15.10.10.84 SMTP S: 250 2.1.5 Ok 

 

 

 

宛先メールサーバーに対してデータを送信しています。

1886 2018-12-21 15:12:07.830502 15.10.10.84 -> 1.1.1.1 SMTP C: DATA 
1916 2018-12-21 15:12:08.034712 1.1.1.1 -> 15.10.10.84 SMTP S: 354 End data with . 
1917 2018-12-21 15:12:08.034807 15.10.10.84 -> 1.1.1.1 SMTP C: DATA fragment, 512 bytes 
1927 2018-12-21 15:12:08.077305 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=128 Ack=645 Win=15616 Len=0 TSV=2978548626 TSER=549960441 
1928 2018-12-21 15:12:08.077319 15.10.10.84 -> 1.1.1.1 SMTP C: . 
1929 2018-12-21 15:12:08.079661 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=128 Ack=759 Win=15616 Len=0 TSV=2978548628 TSER=549960483 
1931 2018-12-21 15:12:08.124272 1.1.1.1 -> 15.10.10.84 SMTP S: 250 2.0.0 Ok: queued as CA621840250 

 

 

セッションの終了

データを送信したので SMTP レベルで終了処理をしています。

1932 2018-12-21 15:12:08.124307 15.10.10.84 -> 1.1.1.1 SMTP C: QUIT 
1933 2018-12-21 15:12:08.126596 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=165 Ack=765 Win=15616 Len=0 TSV=2978548675 TSER=549960530 
1934 2018-12-21 15:12:08.126901 1.1.1.1 -> 15.10.10.84 SMTP S: 221 2.0.0 Bye 

 

 

 

最後に宛先メールサーバーと TCP レベルで終了処理をしています。

1935 2018-12-21 15:12:08.126911 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [FIN, ACK] Seq=180 Ack=765 Win=15616 Len=0 TSV=2978548676 TSER=549960530 
1936 2018-12-21 15:12:08.126929 15.10.10.84 -> 1.1.1.1 TCP 60324 > 25 [FIN, ACK] Seq=765 Ack=181 Win=5888 Len=0 TSV=549960533 TSER=2978548676 
1937 2018-12-21 15:12:08.129256 1.1.1.1 -> 15.10.10.84 TCP 25 > 60324 [ACK] Seq=181 Ack=766 Win=15616 Len=0 TSV=2978548678 TSER=549960533

 

 

参照図書

合計約530ページと大書ですが、中身は充実しています。

メールサーバー周りを開発するエンジニアにとっては必須の技術書です。

電子メールプロトコル詳説―インターネット電子メールアーキテクチャからIETF標準プロトコル群の詳細

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人