読者です 読者をやめる 読者になる 読者になる

B-mobile 3G

うちの先生が出先でインターネットするのにB-mobile 3Gを使い始めました。
で、その設定をやらされたわけですが、どういうわけかimap4でメールが受信できない。
いや、厳密には特定のimapクライアントがメールサーバに接続できないという状況。
原因を探っていろいろ調べてたらちょっとおもしろい結果に行きついたのでここに紹介。
 
 
まず状況を整理。

主な障害

  • Winbiffにてimap4接続ができない

原因の切り分け

  1. LAN経由では接続可能

クライアントの設定は問題なし。B-mobileとの兼ね合いが問題か。

  1. Outlook Expressだとimap4を使用可能

Winbiff固有の問題?

詳細な解析

TcpdumpWinbiffがやりとりするパケットをキャプチャ
  • 3way handshakeは成功している
  • しかし、CAPABILITYコマンドへのレスポンスを受け取れていない
  • サーバ側でtcpdumpすると、返答は正しく送信されている
  • パケットの流れは以下の通り
  1. Client, ServerのPort143へ syn
  2. Server, Clientへ syn/ack
  3. Client, Serverへ ack
  4. Server, バナーを送信
  5. Client, バナーへのackと"B1 CAPABILITY"を送信
  6. Server, ackと"CAPABIRITY(略)" 返信
    1. Client, "CAPABIRITY" を受信できず(B1...へのackは受信)
    2. Server, ackが来ないので再送 (しかし届かず)
    3. やがてタイムアウト
Outlookの場合もキャプチャ
  • CAPABILITYへのレスポンスを受信できた
  • Winbiffとの違いは CAPABILITYコマンドの前の文字列(識別子?)
  • 流れは以下
  1. Client, ServerのPort143へ syn
  2. Server, Clientへ syn/ack
  3. Client, Serverへ ack
  4. Server, バナーを送信
  5. Client, バナーへのackと"xxxx CAPABILITY"を送信(xxxxはフローごと変化する4文字)
  6. Server, ackと"CAPABIRITY(略)" 返信
  7. Client, "CAPABIRITY(略)" を受信
  8. 以下ユーザ認証〜正常に通信

原因推測

おそらくはb-mobile側のパケットフィルタに引っかかったのだろうと予想。
そこでフィルタリング内容を推測することに。

パケットの内容の比較

OutlookWinbiffとで、問題のパケット(CAPABILITYへのレスポンス)の内容を比較してみた。
結果、hogehoge CAPABIRITY のパケットの hogehoge部以外はすべて同一。
CAPABIRITYへのレスポンスはhogehoge部をそのまま引用する。
そのため、この部分だけが異なる という結果になった。
言い換えると "B1"という2文字が含まれるパケットは受信できず、
"xxxx"という任意の4文字が含まれるパケットは受信できたということ。

Telnetで再現

そこで、Telnetを使って手動でパケットを送り、検証してみた。
試したパケットと結果は以下の通り

  1. B1 CAPABILITY 通信失敗
  2. BB CAPABILITY 通信失敗
  3. A1 CAPABILITY 通信失敗
  4. AA CAPABILITY 通信失敗
  5. B11 CAPABILITY 通信成功
  6. AAA CAPABILITY 通信成功
  7. A CAP 通信成功

 
ここで通信成功は、レスポンスを受信できたことを、通信失敗はレスポンスを受信できなかったことを意味する。


で、まとめると、
hoge CAPABILITY の hoge 部が 2文字だとおかしい
ということになる。

続く検証

ここまでの結果で、どうも、受信できない原因はパケットの内容というよりサイズにありそうだと思い至る。
件のパケットのペイロードは199バイトだったので、ホントにこいつだけが受信できないのかを検証。

自分でやってもいいのだが、面倒でいろいろあって、後輩に頼んで任意のサイズのパケットを送信するプログラムを組んでもらう。
そして実際に検証。
受信するパケットのサイズをいろいろ変えて結果、やはりペイロードが199バイトのパケットだけを受信できないことが確認できた。
ちなみに使用するポート番号やIPアドレスには依存しない模様。
とにかく、ペイロードが199バイト(IP、TCPヘッダを除いた値)のパケットだけ、受信できなかった。

 
 
何故それだけ受信できないのかは不明であるが、とりあえずここまで検証したところでサポートへ連絡。
現在返答待ち。
 
 
これだけやって、手元の環境依存の話だったら笑えるな。。。