手当たり次第に書くんだ

飽きっぽいのは本能

VyOS MSS / MTU 設定 – PPPoE 経路で通信が詰まる時の確認

VyOS で PPPoE を使う環境では、MSS / MTU の扱いが通信品質に直結します。普段は意識しなくても、PPPoE、VPN、トンネル、PBR を組み合わせると、特定サイトだけ開けない、HTTPS だけ途中で止まる、大きなファイル転送だけ不安定になる、といった症状につながることがあります。

vyos mss で調べる時に重要なのは、固定値を暗記することではありません。どの経路の実効 MTU が小さくなっているのか、PMTUD が働いているのか、どの TCP SYN に MSS clamp を当てるのかを順番に確認することです。

この記事では、VyOS 1.5 系で読むことを前提に、PPPoE 経路で MTU と MSS を確認する流れをまとめます。細かなコマンド差分は利用している ISO と回線方式で確認してください。

この記事の結論

  • MTU は IP パケットとして運べる最大サイズ、MSS は TCP ペイロードの最大サイズである
  • PPPoE では一般的に MTU 1492 を意識するが、VPN やトンネルを重ねるとさらに小さくなる
  • MSS clamp は TCP SYN の MSS 値を補正する設定であり、すべての通信を小さくする設定ではない
  • PMTUD が正しく働かない経路では、MSS clamp が実務上の回避策になることがある
  • 設定後は pingtcpdump で、経路と SYN の両方を確認する

MTU と MSS の違い

項目見る層意味
MTUIP / link経路上で運べる IP パケットの最大サイズ
MSSTCPTCP ペイロードとして送れる最大サイズ
PMTUD経路フラグメントせずに通る MTU を見つける仕組み
MSS clampTCP SYN相手へ通知する MSS 値を経路に合わせて補正する仕組み

IPv4 の TCP では、単純化すると MSS は MTU から IP ヘッダ 20 バイトと TCP ヘッダ 20 バイトを引いた値として考えます。MTU 1500 なら MSS 1460、MTU 1492 なら MSS 1452 が目安です。ただし、VPN や追加トンネルが重なる場合は、実効 MTU がさらに小さくなります。

PPPoE で MTU が小さくなる理由

Ethernet の標準的な MTU は 1500 バイトですが、PPPoE では PPPoE / PPP のヘッダ分だけ実効 MTU が小さくなります。そのため、PPPoE インターフェイスでは MTU 1492 を見ることが多くなります。

ただし、1492 という値だけを入れて終わりではありません。PPPoE の先に VPN、IPsec、GRE、OpenVPN などを重ねる場合、TCP から見える実効サイズはさらに小さくなります。

PPPoE インターフェイスの MTU を指定する

次は、PPPoE インターフェイスに MTU 1492 を指定する例です。ユーザー名、パスワード、source interface は環境に合わせます。

configure
set interfaces pppoe pppoe0 authentication user 'user@example.net'
set interfaces pppoe pppoe0 authentication password 'password'
set interfaces pppoe pppoe0 source-interface 'eth1'
set interfaces pppoe pppoe0 mtu '1492'
commit
save

DF ping で経路 MTU を確認する

IPv4 では、DF ビットを立てた ping で、フラグメントせずに通るサイズを確認できます。-s は ICMP データ部分のサイズなので、IP ヘッダと ICMP ヘッダを含む全体サイズとは異なります。

ping 8.8.8.8 -c 4 -M do -s 1472
ping 8.8.8.8 -c 4 -M do -s 1464
ping 8.8.8.8 -c 4 -M do -s 1414

ここで見るのは、ある固定値が正しいかどうかではなく、その経路でフラグメントなしに通る最大サイズです。宛先、プロバイダー、トンネル、Firewall の扱いによって結果は変わります。

TCP MSS clamp を使う

PPPoE や VPN 経路で TCP 通信だけが不安定な場合、MSS clamp を検討します。MSS clamp は TCP SYN に含まれる MSS 値を補正し、相手に大きすぎる TCP セグメントを送らせないための設定です。

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 を前提にしています。実際には、LAN 側インターフェイスへ policy route が適用されているか、対象通信がその policy を通っているかを合わせて確認します。

tcpdump で SYN の MSS を見る

設定後は、設定コマンドだけでなく、実際の TCP SYN に含まれる MSS 値を確認します。MSS clamp が効いていれば、対象経路へ入る SYN の MSS が指定値に補正されます。

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

よくあるつまずき

症状見る場所考え方
HTTPS だけ不安定PMTUD、ICMP、MSSTCP の大きなセグメントが詰まっていないか見る
ping は通るが Web が遅いDF ping と tcpdump疎通確認と TCP セッションを分ける
MSS clamp が効かないpolicy route の適用インターフェイス対象通信が policy を通っているか見る
値を下げても改善しないFirewall、NAT、経路、DNSMSS 以外の問題も切り分ける
小さくしすぎたスループットと再送必要以上に MSS を下げない

まとめ

VyOS の MSS / MTU 設定では、PPPoE の MTU 1492 や MSS 1452 という目安だけで判断しません。VPN やトンネルを重ねた経路では、実際に通るサイズと TCP SYN の MSS を見ながら調整します。

MSS clamp は便利ですが、万能薬ではありません。PMTUD、Firewall、NAT、PBR、VPN の経路を確認したうえで、どのインターフェイスを通るどの TCP SYN を補正するのかを決めることが重要です。

関連する記事
VyOS MSS / MTU 設定 – PPPoE 経路で通信が詰まる時の確認

コメントを残す

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

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

トップへ戻る