
私には2つのネットワークがあり、どちらも独自のNATの下に隠されています 192.168.31.0/24
-> 192.168.33.0/24
-> インターネット
TCPサーバー192.168.33.35
とクライアントがオンになっています192.168.31.32
たとえば、クライアントはインターネットの にあるサーバーに TCP 要求を実行します66.66.66.66
。最後のゲートウェイが代わりに192.168.33.1
に要求を送信して192.168.33.35
クライアントを騙すようにします。
私が試したものの中で最も実現可能なものは次のとおりです。
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
サーバーは Syn パケットを受信して応答しました。しかし、サーバー応答の送信元 IP は192.168.33.35
ゲートウェイを通過した後も残っているようです。そして、192.168.31.1
ゲートウェイで受信されたパケットは失われます。
SNAT 部分が機能していないようです。
標準の openWrt ツールを使用してサーバーをエミュレート/偽装するにはどうすればよいですか?
答え1
次のようなことが起こります:
- サーバー
192.168.33.35
は Syn パケットを確認し192.168.33.Z
(ネットワークを認識せず192.168.31.0/24
、ゲートウェイの「WAN」アドレスを確認しますが192.168.31.1
、それが何であるかはわかりませんZ
)、このアドレスに応答します。 - ルーティング テーブルによると、このアドレスはローカル ネットワークに属しているため、応答は の MAC アドレス宛てになります
192.168.33.Z
。 - 応答が物理的にマシンを通過する場合でも
192.168.33.1
、応答は別のマシンの MAC アドレス宛てであるため、ゲートウェイは応答を改ざんしません。 192.168.33.Z
は からの応答を確認します192.168.33.35
。 からの応答を期待しています66.66.66.66
が、何をすべきかわかりません。
NATを実行するかどうかは関係ありません192.168.33.Z
(192.168.31.1
LAN側で)。失敗のメカニズムは、NATループバック(ヘアピンNAT)は部分的にしか設定されていない。
192.168.33.35
サーバーがゲートウェイの MAC アドレスに応答を送信するようにする必要があります192.168.33.1
。
ルーティング ルールを設定します
192.168.33.Z
( は私が知らないのでZ
、あなたが知っていることに注意してください。実際の番号を置き換えてください)192.168.33.0/24
。または、ネットワーク全体に対してもルーティング ルールを設定します。# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
192.168.33.35
これはからまでのすべての通信に影響することに注意してください。が として動作する192.168.33.Z
場合、パケットは不必要にルーティングされますが、それによって問題が発生することはありません。192.168.33.35
192.168.33.35
または、
192.168.33.1
ゲートウェイに DNAT だけでなく SNAT も実行させます。このソリューションは、すでにリンクされている回答の NAT ループバックのソリューションと基本的に同じです。# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
この断片はあなたの状況に当てはまります:
の NAT テーブルは、
iptables
接続の最初のパケットにのみ使用されることに注意してください。接続に関連するそれ以降のパケットは、最初のパケットが変換されたときに確立された内部マッピング テーブルを使用して処理されます。
これは、クライアントから接続を開始するときに、2 番目の行 ( iptables … -j SNAT --to-source 66.66.66.66
) が無関係であることを意味します。最初のパケットが適切に SNAT および DNAT されたため、後続のパケットは適切に SNAT および DNAT されます。
最初の一文が
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
ゲートウェイ上で動作する場合、追加のトリックなし192.168.31.1
で他のクライアントに対して必要な操作を実行します。192.168.31.0/24
あなたのこの2行目
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
接続を開始する場合に適用されますから 192.168.33.35
インターネット サーバーがこれを実行することはめったにないので、このルールはまったく必要ないかもしれません。必要な場合は、次の点に注意してください。
- このルールは、パケットがこのルールが適用されるゲートウェイを経由してルーティングされる場合にのみ機能します
192.168.33.1
。そのため、ローカル コンピューターに到達してそれらに提示するには、上記と同様にマシン66.66.66.66
上のルーティング テーブルを調整する必要があります。192.168.33.35
66.66.66.66
として動作して外部ホストに到達できたとしても66.66.66.66
、その応答は実際の に届き66.66.66.66
、あなたには返ってこないため、 として(ネットワーク外の)外部ホストと通信することはできません。
答え2
ルーティングで実行しました。残念ながら、実際のサーバーにアクセスするには柔軟性が低くなりますが、少なくとも機能します。次のようになります。
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
サーバー上では:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up