web-dev-qa-db-ja.com

ConntrackはUDPをブロックしていますNAT

いくつかのルールに従って、あるホストから別のホストにudpパケットを中継する必要があるアプリケーションに取り組んでいます。基本的にはNATです。

UDPポートを両方のホストとネゴシエートし、その後、ホストAから受信し、ネゴシエートされたポートを使用してホストBに送信する必要があります。

だから私は動的にiptablesルールを追加および削除しています。

#私のアドレスは10.1.1.1 
#Aは10.10.10.10:30590-10.1.1.1:36232 
#Bは10.20.20.20:30588-10.1.1.1:36230 
 
#AからB 
 iptables -t nat -A PREROUTING -s 10.10.10.10/32 -i eth0 -p udp -m udp --sport 30590 -j DNAT- -to-destination10.20.20.20:30588
iptables-t nat -A POSTROUTING -d 10.20.20.20/32 -p udp -m udp --dport 30588 -j SNAT --to-source 10.1.1.1: 36232 
 
#BからA 
 iptables -t nat -A PREROUTING -s 10.20.20.20/32 -i eth0 -p udp -m udp --sport 30588 -j DNAT --to-destination 10.10.10.10:30590
iptables -t nat -A POSTROUTING -d 10.10.10.10/32 -p udp -m udp --dport 30590 -j SNAT --to-source 10.1.1.1 :36230 

これはほとんどの場合機能しますが、ルールが追加される前に最初のパケットが到着し始める場合があります。 UDPの「接続」をクリアすると、ルールが機能します(conntrack -D -p udp)。

次のようなルールを使用して、接続追跡を無効にしようとしました。

 iptables -t raw -A PREROUTING -j NOTRACK 
 iptables -t raw -A OUTPUT -j NOTRACK 
 
#または
 iptables -t raw -A PREROUTING -j CT --notrack 
 iptables -t raw -A OUTPUT -j CT --notrack 

しかし、これらはどれも機能していないようです。

唯一の解決策は、すべてのストリームのUDP接続追跡をクリアすることですか?

何千もの同時ストリームをサポートする必要があり、毎秒いくつかが追加および削除されます。

1
Vargas

NATは接続追跡に依存するため、接続追跡を無効にすることは適切ではありません。したがって、NATは機能しなくなります。

NATルールが挿入された後、関連する既存の接続追跡レコードをクリアする必要があります。これにより、後続の到着パケットは、代わりにnatテーブルで新しいDNAT/SNATルールをチェックします。 'キャッシュされた'結果を検索するだけです。

ただし、canすべてのudp接続追跡レコードに影響するconntrack -D -p udpよりも具体的にターゲットを設定します。たとえば、conntrack -D -p udp --src <ip> --sport <port> --dst <ip> --dport <port>は、特定のsrc/dstipとポートのペアのレコードのみをクリアします。

2
cflee