手当たり次第に書くんだ

飽きっぽいのは本能

VyOS TCP MSS clamp 設定 – PPPoE / VPN 経路で詰まりを防ぐ

VyOS の TCP MSS clamp は、PPPoE、VPN、GRE、IPsec などで実効 MTU が小さくなる経路に対して、TCP SYN の MSS 値を補正するための設定です。通信全体を小さくする機能ではなく、TCP セッション開始時に相手へ伝える最大セグメントサイズを調整します。

Web 表示や SSH、Git、API 通信などで、小さな通信は通るのに大きな通信だけ止まる場合、MTU / MSS / PMTUD の問題が疑われます。特に PPPoE や VPN を重ねている環境では、経路上のオーバーヘッドを考慮する必要があります。

この記事では、VyOS 1.5 系で読むことを前提に、TCP MSS clamp の役割、値の決め方、policy route での設定例、tcpdump による確認手順をまとめます。

この記事の結論

  • MSS clamp は TCP SYN の MSS 値を補正する設定である
  • PPPoE / VPN / tunnel のように MTU が小さくなる経路で検討する
  • 値は固定暗記ではなく、経路 MTU とヘッダオーバーヘッドから考える
  • 設定後は tcpdump で SYN の MSS が変わっているか確認する
  • PMTUD が正常に働く構成では不要な場合もある

MTU と MSS の関係

MTU は、経路上で運べる IP パケットの最大サイズです。MSS は TCP のペイロード最大サイズで、通常は MTU から IP ヘッダと TCP ヘッダを引いた値として考えます。

項目意味
MTUIP パケットとして運べる最大サイズEthernet 1500、PPPoE 1492
MSSTCP ペイロードの最大サイズIPv4 なら MTU – 40 が目安
PMTUD経路 MTU を検出する仕組みICMP に依存する場面がある
MSS clampTCP SYN の MSS を補正する設定PPPoE / VPN 経路で使う

MSS clamp は UDP や ICMP のサイズを直接変えるものではありません。TCP SYN に含まれる MSS 値を補正し、相手にこのサイズ以下で送ってほしいと伝えるための調整です。

MSS clamp が必要になる場面

MSS clamp は、出口側の実効 MTU が小さいのに、入口側では大きな MSS のまま TCP セッションが始まる場面で検討します。PMTUD が正しく動けば回避できる場合もありますが、ICMP が途中で落ちると問題が見えにくくなります。

  • PPPoE の外向き経路で HTTPS や Git clone が途中で止まる
  • OpenVPN や GRE を通る TCP 通信だけ不安定になる
  • 小さな ping は通るが、大きな応答やファイル転送だけ詰まる
  • ICMP が途中で制限され、PMTUD が期待通りに働かない
  • tcpdump で SYN の MSS が経路に対して大きすぎる

値を決める考え方

MSS の値は、固定値として暗記するものではありません。下位経路の MTU、PPPoE や VPN のヘッダ、IPv4 / IPv6 の違い、トンネルを重ねているかで変わります。

経路見ること考え方
Ethernet のみMTU 1500通常は MSS 1460 が目安
PPPoEMTU 1492IPv4 TCP なら MSS 1452 が目安
OpenVPNVPN オーバーヘッド実測と設定値を合わせて調整する
GRE / IP6GREカプセル化ヘッダトンネル MTU と合わせて決める
複数の重ね合わせ最小の実効 MTU一番小さい経路に合わせる

必要以上に小さい MSS にすると、通信効率が落ちます。問題を避けるために下げる場合でも、どの経路で、どの通信に対して、どの値へ補正するのかを残しておくと後から見直しやすくなります。

policy route で MSS を補正する

VyOS では、policy route の中で TCP SYN に対して MSS を補正できます。ここでは、LAN 側から特定の出口へ向かう通信に対して MSS を 1414 にする例を示します。値は環境依存です。

configure
set policy route inside rule 3000 protocol 'tcp'
set policy route inside rule 3000 tcp flags 'SYN'
set policy route inside rule 3000 set tcp-mss '1414'
commit
save

この例では inside という policy route を前提にしています。実際には、対象インターフェイスへ policy route を適用しているか、対象通信がその policy を通っているかを合わせて確認します。

configure
set interfaces ethernet eth1 policy route 'inside'
commit
save

PPPoE や VPN と合わせる

PPPoE、OpenVPN、GRE などの個別記事では、各経路の MTU / MSS を扱います。MSS clamp 単体で考えるのではなく、出口側の MTU、トンネルの MTU、Firewall、PBR と合わせて見ることが重要です。

構成MSS clamp の位置注意点
LAN から PPPoELAN 側から外へ出る TCP SYNPPPoE の MTU 1492 を考慮する
LAN から VPNVPN へ入る前の TCP SYNVPN オーバーヘッドを考慮する
PBR で出口分岐分岐対象の policy route該当通信だけ補正する
トンネル内通信トンネルへ入る通信トンネル MTU と合わせる

確認する

設定後は、設定が入っていることと、実際の TCP SYN の MSS が変わっていることを確認します。設定コマンドだけを見ても、通信がその経路を通っていなければ効果はありません。

show configuration commands | match 'tcp-mss'
show configuration commands | match 'policy route'
sudo tcpdump -ni eth1 'tcp[tcpflags] & tcp-syn != 0'

tcpdump では SYN パケットの MSS option を見ます。入口側と出口側でキャプチャできる場合は、MSS 値が意図した値へ補正されているかを比較します。

よくあるつまずき

症状見る場所考え方
設定したのに効かないpolicy route の適用先対象通信がその policy を通っているか見る
まだ大きな通信だけ止まるMSS 値と経路 MTU値が経路に対して大きすぎないか確認する
UDP の通信が直らないMSS clamp の対象MSS は TCP SYN への補正である
IPv6 で問題が残るICMPv6 / PMTUDICMPv6 を落としていないか確認する
効率が落ちたMSS を下げすぎ必要以上に小さくしていないか見る

まとめ

VyOS の TCP MSS clamp は、PPPoE、VPN、トンネルなどで実効 MTU が小さくなる経路に対して、TCP SYN の MSS 値を補正する設定です。なんとなく小さくするのではなく、経路 MTU、ヘッダオーバーヘッド、対象通信を確認して値を決めます。

設定後は、policy route の適用先と tcpdump の SYN パケットを確認します。PMTUD が正しく動く環境では不要な場合もあるため、MSS clamp は常時入れるお守りではなく、詰まりの原因と対象経路を見たうえで使う調整として扱います。

関連する記事
VyOS TCP MSS clamp 設定 – PPPoE / VPN 経路で詰まりを防ぐ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る