次のように、1 つの Xen VM のトラフィックを別の Xen VM に透過的にルーティングしようとしています。
------- 192.168.250.4 192.168.250.3 ---------
| VM1 | <-----------------bridged----------------> | VM2 | <-----> Internet
------- | with |
| squid |
| proxy |
---------
理由は聞かないでください。iptablesを試しているだけです。VM2のSquidプロキシ(透過モード)を介してHTTPトラフィックを正常にルーティングできます。
iptables -t nat -A PREROUTING -p tcp --dport 80 –s ! 192.168.250.3 -j REDIRECT --to-port 3128
192.168.250.4
しかし、他のすべてのトラフィックを単純に通過させるにはどうすればよいのでしょうか? この構成はすでに試しましたが、VM1 ( )からインターネットにアクセスしようとすると、「接続が拒否されました」というエラーが発生します。
vm2:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
# route outgoing udp traffic
DNAT udp -- !192.168.250.3 0.0.0.0/0 udp dpt:!80 to:192.168.250.3
# route outgoing tcp traffic
DNAT tcp -- !192.168.250.3 0.0.0.0/0 tcp dpt:!80 to:192.168.250.3
# this is the working squid rule
REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 3128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
# route incoming traffic
SNAT all -- 0.0.0.0/0 192.168.250.3 to:192.168.250.4
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
何が間違っているのでしょうか? すでに多くのチュートリアルを読みましたが、ほとんどが正しく動作しません... (ちなみに: /proc/sys/net/ipv4/ip_forward
1 です)
答え1
REDIRECT を使用する代わりに、DNAT と SNAT を試してください。次を試してください。
iptables -t nat -I PREROUTING -d 192.168.250.3 -j DNAT --to-destination 192.168.250.4 iptables -t nat -I POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.250.3
答え2
ついに正しい方法を見つけました:
発信接続 (VM1 --> インターネット/イントラネット) の NAT は、ソース書き換え (SNAT) で機能します。
iptables -t nat -A POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.2.125
VM2の現在192.168.2.125
の外部IPは(ない内部アドレスになります)。私の場合、その IP は DHCP によって割り当てられるため、動的 IP で SNAT を実行するようにルールを変更する必要があります。これは MASQUERADE コマンドによって実行されます。
iptables -t nat -A POSTROUTING -s 192.168.250.4 -j MASQUERADE
最終的な iptables 構成は次のようになります (他のテーブル/チェーンは空です)。
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.250.4 0.0.0.0/0