11.24. TCPMSSターゲット

TCPMSS ターゲットを使うと、ファイヤーウォールに接触する TCP SYN パケットの MSS (Maximum Segment Size) 値を変更することができる。 MSS 値は、各々のコネクションの中で使用するパケットの最大サイズをコントロールするために用いられる。通常この値は、 MTU から 40バイトを引いた値だ。このターゲットは、パケットのフラグメンテーションが必要だということを伝える ICMP をブロックしてしまう ISP やサーバへの対策として利用することが多い。そうした状態でよく見られるのは、ファイヤーウォールやルータは完璧に機能しているはずなのに、大きなパケットになるとファイヤーウォール内側のローカルマシンは遣り取りができない、といった奇妙な現象だ。具体的に言えば、メールサーバが、小さなメールなら送れるがサイズの大きなメールが送れない、あるいは WEB ブラウザで、接続自体は成立しているのにデータを何も受信しないまま固まる、 ssh 接続はできるが scp だと最初のハンドシェークの後ハングする、などの現象だ。つまり、大きなパケットを扱うものが全てうまくいかないわけだ。

TCPMSS ターゲットは、コネクションを介して出て行くパケットのサイズを変更することによって、そうした問題を解決してくれる。憶えておいてほしいのは、 MSSSYN パケットについてだけ設定すればよいということ。それ以降の MSS は各ホストが自分で面倒を見るからだ。 TCPMSS ターゲットには 2種類のオプションがある。

Table 11-18. TCPMSSターゲットオプション

オプション--set-mss
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1460
説明--set-mss オプションは、全送出パケットに MSS を具体的にセットする。上記の例は、インターフェイス eth0 から出ていく全パケットの MSS1460バイトにセットしている (イーサネットでの MTU は通常 1500バイトであり、そこから 40バイトを引くと 1460バイト)。 MSSSYN パケットでのみ調整すればよく、後は末端のホストが勝手に面倒を見る。
オプション--clamp-mss-to-pmtu
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
説明--clamp-mss-to-pmtu では MSS が自動的に適切な値に設定される。よって、具体的な値を与える必要がない。その際の MSSPMTU (Path Maximum Transfer Unit = 経路上での最大転送可能サイズ) から 40バイトを引いた値が自動的に選定される。それはほとんどの場合に妥当な値だ。

Note

Linux カーネル 2.5, 2.6 で機能する。