IPTables - 仅当目标未监听时才进行 DNAT

IPTables - 仅当目标未监听时才进行 DNAT

我有接口 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)以防它不能按预期工作 - 但从测试来看它似乎运行良好!

相关内容