iptables 用于透明 NAT

iptables 用于透明 NAT

我正在尝试透明地将一个 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

但是我怎样才能简单地让所有其他流量通过呢?已经尝试过此配置,但当我尝试从 VM1 访问 Internet 时,它给出了“连接被拒绝”错误(192.168.250.4):

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 --到目标 192.168.250.4 iptables -t nat -I POSTROUTING -s 192.168.250.4 -j SNAT --到源 192.168.250.3

答案2

我终于找到了正确的方法:

对传出连接 (VM1 --> Internet/intranet) 进行 NAT 与源重写 (SNAT) 配合使用:

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.2.125

192.168.2.125VM2 的当前外部 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

相关内容