15.7. MSS クランプによって Path MTU Discovery 問題を回避する (ADSL, ケーブル, PPPoE, PPtP ユーザ向け)

先に説明があったように、Path MTU Discovery は、 もう以前のようにはうまく動作しません。 ネットワークの経路のどこかに、MTU の制限 (<1500) があるとわかっているような場合に、 PMTU Discovery がこれを発見してくれると期待することはできません。

MTU 以外にも、パケットの最大サイズを設定する方法はあります。 これは Maximum Segment Size と呼ばれています。 これは SYN パケットの一部、TCP オプションのフィールドです。

最近の Linux カーネルと、いくつかの PPPoE ドライバ (特に Roaring Penguin のが素晴らしい) は、 この MSS を「クランプする」機能を持っています。

この方法の長所は、MSS の値を設定すると、 リモート側にも「この値より大きなパケットを送るな」ということを はっきり伝えられることです。この機構の動作には ICMP トラフィックは必要ありません。

一方欠点は、これは明らかにその場しのぎだということです。 この方法はパケットを修正しており、end-to-end の関係を保存しません。 この点を除けば、この小技は多くの場合で使えますし、魔法のように効きます。

これを行うには、iptables-1.2.1a 以降と Linux 2.4.3 以降が必要です。 基本的なコマンドラインは次の通り:
# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu

これは接続に対する適切な MSS を計算します。 もうちょっと勇気がある方、あるいは自分の知識に確信がある方は、 次のようにすることもできます。

# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128

これは先方に渡す SYN パケットの MSS を 128 にします。 パケットの小さな VoIP を使っていて、 http の巨大なパケットが来ると音声通話が途切れてしまうような場合には、 これを用いると良いでしょう。