ネットワークトラブルの中で、特に嫌なものは MTU や MSS 関連のトラブルです。 この手のトラブルでは、同じ相手に同じ通信アプリケーションを使っていても、通信ができたりできなかったりするような現象が見られます。再現性がなさそうにみえるので、思わず「パソコンをリブートして様子をみてください」と言いたくなってしまうのですが、それでは何の解決にもなりません。 覚悟を決めてパケットキャプチャーしてみると特定のサイズのパケットだけ届いていないというような現象が判明し、冷や汗をかくことになるわけです。
さて身近なところで Cisco PIX/ASA に関連して MSS のトラブルが起こりました。 詳細はこちらの URL にある通りなのですが、要約すると以下のようなものです。
- クライアントが通知した MSS を超えるセグメント長となるパケットがサーバ側から到達したため、ASA がドロップした
- サーバに手を入れられない場合、有効な workaround は、MSS のチェックを無効にすること
根本の問題は通知した MSS を無視するようなサーバの存在ですね。 ASA はこのようなサーバからのパケットを不正なパケットと判断してドロップしてしまったわけです。 Software Version 7.0 からデフォルトの動作がこのようになりました。
通信できるようにするという観点では、先の URL にあるような設定を入れて MSS チェックを無効化すればよいですが、 お客様/社内のしかるべき責任者へこの設定変更内容をきちんと説明できなければなりません。 TCP に明るくない方へ説明する時に、「MSS とは」というところから始めると下手すると細かい話ばかりになって何を説明しているのかわからなくなってしまいます。 以下の点をうまく説明できると良いですね。
- そもそも、クライアントの通知した MSS を無視するようなタコな実装のサーバが悪い。
- そのサーバとの通信を許可するためには PIX/ASA の MSS チェックを無効化しなければならない。
- 確かにセキュリティレベルという観点からするとチェックをしなくなるのでレベルは落ちるが、実際問題としてイマドキの端末ならばこのようなパケットによりバッファーオーバーフロー等の問題を起こすようなタコな実装はしていない。 従って事実上チェックを無効化するリスクは小さい。
1. と 3. が矛盾するような気がちょっとだけしますが…