2つのLinuxホスト間にVXLANトンネルがあります。トンネルは、1500バイトのMTUを持つイーサネットリンクを介して転送されます。各エンドで、VXLAN インターフェイスとは異なるイーサネット インターフェイスがブリッジに依存します。次のようになります。
| Host A | Host B |
Client Device <--> eth0 <--> br0 <--> vxlan0 <-|-> vxlan0 <--> br0 <--> eth0 <--> Client Device
| | |
| eth1 <-|-> eth1 |
ここでは、クライアントデバイスとeth1にのみIP設定があります。他のすべては、2つのサイト間のレイヤ2リンクだけです。
VXLANには50バイトのオーバーヘッドが含まれています。一部のプロトコルが中断されるのを防ぐために、レイヤ2リンク(eth0、br0、vxlan0)のMTUを1500バイトに設定しました。 TCP断片化を防ぐために、vxlan0インターフェイスのTCP MSSを1400バイトに設定したいと思います。どうすればいいですか?
私はブリッジに対してiptables()をオンにできることを知っていますecho 1 > /sys/class/net/br0/bridge/nf_call_iptables
。ただし、iptablesにはシステムのこの部分とは関係のない他の多くの規則があり、そうすると大幅なパフォーマンスコストが発生します。
を使用してルーティング用にMSSを設定できることを知っていますip route add ... advmss 1400
。ただし、関連するパケットはホスト A またはホスト B でルーティングされません。それらは単にあるインターフェースから別のインターフェースに接続されます。
iptablesのパフォーマンスを低下させることなく、このトラフィックに低TCP MSSを適用する方法はありますか?
答え1
nftables交換する予定ebtables+iptables:ほとんどの機能は、IPレベルと同様にブリッジレベルでも利用できます。br_netfilter(ブリッジレベルのステートフルIPファイアウォール、カーネル> = 5.3を含む)
bridgemss.nft
以下は、HostAとHostBにロードされたルールセット(と呼びます)ですnft -f bridgemss.nft
。
table bridge t
delete table bridge t
table bridge t {
chain c {
type filter hook forward priority filter; policy accept;
oifname vxlan0 tcp flags syn tcp option maxseg size set 1400
}
}
もちろん、必要に応じてルールセットを変更できます(たとえば、ホストAとホストBではそれぞれ1方向を使用するのではなく、ホストAでのみ2方向を使用)。
br0
HostAとHostBに直接通信の代わりにVXLANを介して通信するアドレスを割り当てる必要がありますか?イーサネット1、このルールはブリッジ出力フック(またはシステム出力+入力フック)で繰り返す必要があります。これは、転送されたフレームとは見なされないためです。