iptables は、特定の外部 IP からのトラフィックを別のローカル IP にルーティングし、外部 IP を送信元として使用して応答を返します。

iptables は、特定の外部 IP からのトラフィックを別のローカル IP にルーティングし、外部 IP を送信元として使用して応答を返します。

私のRaspberry Piは、私のルーターと残りのホームネットワークの間にある標準ゲートウェイです。私のデスクトップコンピュータが特定の外部IPにパケットを送信するとき、Raspberry Piにそのパケットを別のローカルコンピュータに送信させたいと思います。 (ゲームサーバーをエミュレートしようとしましたが、ゲームにサーバーIPがハードコードされています。)これはTCPとUDPの両方で機能する必要があります。

私のラズベリーパイで次のルールを試しました。 (1337=ゲームポート、1.2.3.4=ゲームサーバー、192.168.0.169=他のローカルマシンエミュレートサーバー)

iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p udp -m udp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337
iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337

UDPはうまく動作します。送信されたパケットはルーティングされ、192.168.0.169応答が返されます。しかし、それらは1.2.3.4(存在しないゲームサーバー)から来るのではなく、私のシミュレーションサーバーから来ます192.168.0.169。 UDPの場合これは重要ではありませんが、TCPの場合、これはハンドシェイクに失敗します。

ラインシャーク

(私のデスクトップコンピュータは、シミュレートされた192.168.0.199ゲームサーバーのWiresharkビューです192.168.0.169。私が知っている限り、SYN ACKが機能しないため、再送信が発生します。SYN ACKが予期しないIPから来ているため)。

192.168.0.199次の規則を使用してパケットの送信元IPを書き換えました。

iptables -t nat -A POSTROUTING -s 192.168.0.169/32 -d 192.168.0.199/32 -p tcp -j SNAT --to-source 1.2.3.4

しかし、それは単に動作しません。私はまだiptablesに慣れていないので何か間違っているかもしれませんが、ゲームサーバーから自分のデスクトップにすべてのパケットのソースを書き換えるのが良いアイデアであるかどうかはわかりません(他のアプリケーションが問題を引き起こす可能性があります)。

ボーナスの質問:応答があるときにDNATはソースIPを書き換える必要がありますか?

答え1

ボーナスの質問:応答があるときにDNATはソースIPを書き換える必要がありますか?

はい、iptables NAT ルールは接続の最初のパケットでのみ機能し、後続のパケットは最初のルールによって設定されたマッピングに従って処理されます。

送信されたパケットは192.168.0.169にルーティングされ、応答が返されます。しかし、これは1.2.3.4(存在しないゲームサーバー)ではなく、シミュレートされたサーバーからのものです。

問題は、NATが自分に送信していないパケットを変換できないことです。これがあなたのシナリオで起こるものです。

  • クライアントは1.2.3.4で初期パケットを作成します。
  • クライアントはルーティングテーブルを見て、より良いパスを見つけられず、デフォルトゲートウェイ(つまりNATボックス)にパケットを送信します。
  • NATボックスは、接続追跡テーブルでパケットを照会して新しい接続であることを確認し、NAT操作を実行した後に接続追跡エントリを設定します。
  • NAT はルーティングテーブルで新しい宛先を検索し、パケットをサーバに送信します。
  • サーバーは、送信元と宛先を交換しながら、通常どおりに応答します。
  • サーバーはルーティングテーブルを検索し、クライアントIPに一致するエントリを見つけ、クライアントに直接パケットを送信する
  • 応答はクライアントに到達しますが、NAT Boxを介して戻らないため、無効な送信元IPがあります。
  • 返信が削除されました。

だから私たちは何ができますか? 1つの解決策は、クライアントからサーバーへのトラフィックを偽装して、サーバーがトラフィックがNATボックスからのものであることを認識できるようにすることです。私はこのトリックを行う必要があると信じています

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.169 -j MASQURADE

関連情報