iptablesは、tunインターフェイスから送信されるUDPパケットの送信元ポートを書き換えています。 NATルールを設定してポートXを転送しました(詳細は以下を参照)。NATの背後にあるアプリケーションがポートXで転送されたUDPパケットを受信し、その後 "別のUDPパケット(送信元ポートX)を送信することで、そのパケットは何らかの方法で送信元ポート1024を取得します。送信元ポートは、NATボックスを離れる前にすでに書き換えられています。リモートアプリは、このパケットを拒否します。 1024ではなく送信元ポートXが必要です。
「 暗黙の送信元ポートマッピング 」が行われていると思います。ポートXは1つの機能専用であり、衝突は発生しないため、これは必要ありません。NATマシンも、他のマシンもそのポートを使用しません。 iptablesにソースポートをそのまま維持させるにはどうすればよいですか?
送信元ポートが書き換えられたパケットが発信されるNATの背後にあるホストで、次のことを(一度に1回)試しましたが、すべて同じ結果になりました。
iptables -t nat -A POSTROUTING -o tun0 -p udp --sport X -j SNAT --to 10.7.0.5:X
iptables -t nat -A POSTROUTING -o tun0 -p udp -j SNAT --to 10.7.0.5
iptables -t nat -A POSTROUTING -o tun0 -p udp -j MASQUERADE
NATを実行するリモートの外向きボックス:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport X -j DNAT --to-destination 10.7.0.5:X
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
アプリを0.0.0.0ではなくtun0インターフェースにバインドすることで問題が解決しました。
conntrack -E
で、接続に別のインターフェイス(tun0ではない)からの送信元アドレスがあることがわかったので、それを試しました。そのため、パケットが正しい宛先に到達し、正しい送信元アドレスが書き直されたとしても、接続トラッカー内のパケットの状態は正しくありませんでした。