私の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