我有一个 debian 盒子,有两个接口 wan 和 lan(192.168.0.1)。在 lan:80 上,我有一个必须从本地网络访问的站点。我还需要从 wan:777 访问该网站。这是我的 iptables 规则:
iptables -A INPUT -i $LAN -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A FORWARD -p tcp -d 192.168.0.1 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
然而,这不起作用。仅当我从 INPUT 中删除时它才有效-i $LAN
。我的意思是这样的:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A FORWARD -p tcp -d 192.168.0.1 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
然而,这是一个不好的方法,因为网站现在也在 wan:80 上,这不是我想要的。我的错误是什么?
答案1
你可以尝试iptables -A INPUT -d 192.168.0.1 -p tcp --dport 80 -j ACCEPT
这是错误的使用方法iptables -A INPUT -i $LAN -p tcp --dport 80 -j ACCEPT
答案2
如果网络服务器正在侦听端口 80,那么您需要在 INPUT 链上启用该端口。如果不允许到达目标端口,NAT 是不够的,这就是为什么如果不限制源接口,NAT 就可以工作。
由于目的地相同,您不能在 WAN:777 端口上定义另一个虚拟主机吗?
答案3
我得到了答案俄罗斯Linux论坛:
iptables -t mangle -A PREROUTING -i $WAN -p tcp --dport 777 -j MARK --set-mark 0x1234
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A INPUT -m mark --mark 0x1234 -j ACCEPT