web-dev-qa-db-ja.com

LinuxカーネルのIPマスカレード(ソースNAT)が高いパケットレートでソースIPを設定できない理由

標準のLinuxNATのスループットをテストしようとしています。次の仮想ネットワークをセットアップしました。

[192.168.42.5] <--> [192.168.42.2:192.168.35.2] <--> [192.168.35.10]

真ん中のホストには2つのインターフェースがあり、ubuntu 14.04を実行し、NATとして構成されています。

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eht1 -j ACCEPT

[192.168.42.5]ホストには、2番目のネットワークのルートルールもあります。

Sudo ip route add 192.168.35.0/24 via 192.168.42.2 dev eth1

次に、hping3ホストで[192.168.42.5]を実行します。

Sudo hping3 192.168.35.10  -k -s 3453 -S -n -p 80 -i u1000

また、[192.168.35.10]tcpdumpの通信も監視しています。

Sudo tcpdump -i eth1

システムは、約1,000 Pkt /秒の速度で正常に動作します。 tcpdumpは、到着したパケットを表示します。

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1520954148, win 512, length 0

しかし、(-i u700キーを使用して)パケットレートを上げると、何らかの理由でNATは送信元アドレスの書き換えに失敗し、ターゲットは次のようなパケットを取得します。

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1554999038, win 512, length 0

192.168.42.0/24サブネットへの利用可能なルートがないため、hping3は応答を受け取りません。その場合は、パケットレートが遅い場合でも、NATが通常の動作に戻るまで、リラックスして1〜2分待つ必要があります。

NATが非常に奇妙に失敗するのはなぜですか?容量が不足している場合、変更されていないパケットを転送するのはなぜですか?

P.S. NAT([192.168.35.10]ホストの対応するルールを使用)の代わりに通常のルーターをセットアップすると、10k Pkt/sのレートでも定期的に処理されます。

2
Necto

問題は-k 国旗。私が見たところ、あなたは非常に珍しいセットアップをセットアップし、同じ送信元/宛先で大量の接続を作成しました。 IPtablesはステートフルファイアウォールであり、各接続を個別に追跡します。ハッシュテーブルに大量の衝突が発生することになると思います。これは一般的にあなたが見ているものかもしれないアクセスを遅くします。

ルータは、ステートレスまたはセミステートフルな方法で動作している可能性があります。これにより、関連するオーバーヘッドが削減されます。

3
BillThor