いくつかのルールに従って、あるホストから別のホストに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接続追跡をクリアすることですか?
何千もの同時ストリームをサポートする必要があり、毎秒いくつかが追加および削除されます。
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とポートのペアのレコードのみをクリアします。