我有一台像网关一样工作的机器,有两个网络接口:
eth0
局域网:192.168.1.0/24eth1
WAN :XXX.XXX.XXX.XXX
(我的公共IP)
这台机器在 virtualbox 上有 3 个 VM guest。所有这些都具有桥接网络并具有由我们的 DNS 提供的静态 IP。
我有以下 iptables
*filter
-A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# Rules a webserver VM
*nat
-A POSTROUTING -o eth1 -j MASQUERADE
-A PREROUTING -d XXX.XXX.XXX.XXX/32 -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.100
-A POSTROUTING -s 192.168.1.100/32 -j SNAT --to-source XXX.XXX.XXX.XXX
我可以从 LAN 访问虚拟机,但是当我尝试从 WAN 访问它们时,它不起作用。怎么了?
答案1
假设过滤器表中 FORWARD 的默认策略是 DROP 是否正确? (如果不是,这两个过滤规则将毫无意义,因为无论如何你都会接受一切。)
如果这个假设是正确的,那么您的问题是缺少将新数据包转发到虚拟机的 ACCEPT 规则。添加此规则:
iptables -A FORWARD -i eth1 -o eth0 -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
顺便说一句,来自虚拟机的数据包的 SNAT 规则是多余的 - 您已经伪装了通过 eth1 发出的所有数据包。