ブリッジポートへのTCP MSSの設定

ブリッジポートへのTCP MSSの設定

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方向を使用)。

br0HostAとHostBに直接通信の代わりにVXLANを介して通信するアドレスを割り当てる必要がありますか?イーサネット1、このルールはブリッジ出力フック(またはシステム出力+入力フック)で繰り返す必要があります。これは、転送されたフレームとは見なされないためです。

関連情報