透過NAT用のiptables

透過NAT用のiptables

次のように、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_forward1 です)

答え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

関連情報