セッションが開始されたネットワーク インターフェイスへのすべての TCP トラフィックを制限するにはどうすればよいでしょうか?

セッションが開始されたネットワーク インターフェイスへのすべての TCP トラフィックを制限するにはどうすればよいでしょうか?

同じサブネットに設定された 2 つのネットワーク インターフェイス (lan0、wlan0) を備えた組み込み Linux システムがあります。このシステム上のサーバーは、両方のインターフェイスで TCP 接続を受け入れます。

セッションのすべての応答が、要求が受信されたのと同じインターフェイスで送信されるようにするにはどうすればよいでしょうか。つまり、TCP セッションのすべてのトラフィックを特定のネットワーク インターフェイスに制限するにはどうすればよいでしょうか。

listen() ソケットと受け入れられたソケットは、setsockopt(fd, BIND_TO_DEVICE) を使用してインターフェース/デバイスにバインドできます。サーバーは両方のインターフェースに対してこれを実行します。これにより、セッションが作成されたインターフェースを検出し、同じインターフェースへの送信トラフィックを制限することができます。

しかし、accept() が発生すると、SYN-ACK がクライアントに送り返され、ARP ルックアップが原因で、この初期パケットが他の (間違った) インターフェイスを介して送信される可能性があるという問題が発生するようです。クライアントは他の (間違った) インターフェイスにも表示されるため、ARP はクライアントの IP アドレスを他の (間違った) インターフェイスで見つけることができます。

答え1

iptables を使用してインターフェースの TCP 接続を制限できます。

#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match

関連情報