![IPTables - 仅当目标未监听时才进行 DNAT](https://linux22.com/image/1525283/IPTables%20-%20%E4%BB%85%E5%BD%93%E7%9B%AE%E6%A0%87%E6%9C%AA%E7%9B%91%E5%90%AC%E6%97%B6%E6%89%8D%E8%BF%9B%E8%A1%8C%20DNAT.png)
我有接口 eth0(互联网接入)和 tap_vpn0(vpn tap 接口,网络为 192.168.110.0/24)。我想要的是,将所有通过 eth0 传入的连接 DNAT 到 192.168.110.2,但前提是服务器本身没有监听服务(主要是 VPN 服务器本身,但基本上是 中显示的任何其他服务netstat -plunt
,包括实际的 SSH)。
现在我正在做的是
iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2
写下一长串静态例外。但是,如果实际主机上的端口未关闭,如果数据包将在本地成功处理,有没有办法告诉 IPTables 不要进行 DNAT?所以,如果我稍后在服务器上打开一个随机端口 9988,我不需要添加另一个例外,iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPT
但它不会被 DNAT?
答案1
似乎iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT
可以解决问题。-m socket
根据描述,它确实可以做到这一点 - 如果此数据包有任何接受套接字,则匹配。诀窍是使用--nowildcard
我之前省略的选项 - 甚至它的手册页也说“套接字匹配默认不会接受零绑定侦听器,因为这样本地服务就可以拦截原本会转发的流量。” - 这实际上正是我所需要的 - 本地服务在有任何可用时进行拦截!
最终的规则如下:
iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2
我保留了端口 22(ssh)以防它不能按预期工作 - 但从测试来看它似乎运行良好!