关于iptables DNAT / SNAT设置,在这里有很多的问题,但我还没有find解决我目前的问题。
我有服务绑定到eth0的IP地址(例如192.168.0.20),我也有一个IP地址eth0:0(192.168.0.40)与另一台服务器共享。 只有一个服务器处于活动状态,因此该别名界面依赖于哪个服务器处于活动状态。 为了获得服务接受的stream量,使用DNAT规则来更改目的IP。
iptables -t nat -A PREROUTING -d 192.168.0.40 -p udp --dport 7100 -j DNAT --to-destination 192.168.0.20
我还希望来自此服务的所有出站stream量看起来都来自共享IP,以便在主备备份故障切换的情况下返回响应能够正常工作。
iptables -t nat -A POSTROUTING -p udp --sport 7100 -j SNAT --to-source 192.168.0.40
我的问题是,SNAT规则并不总是运行。 入站stream量导致像这样的连接跟踪条目。
[root]# conntrack -L -p udp udp 17 170 src=192.168.0.185 dst=192.168.0.40 sport=7100 dport=7100 src=192.168.0.20 dst=192.168.0.185 sport=7100 dport=7100 [ASSURED] mark=0 secmark=0 use=2
这意味着POSTROUTING链不运行,出站stream量以真实IP地址为源。
我想我可以在原始表中设置一个NOTRACK规则,以防止这个端口号的conntracking,但有没有一个更好或更有效的方式来做到这一点?
编辑 – 另一个问题:有一种方法(在CentOS / Linux中)有一个可以绑定但不能使用的接口,这样它可以连接到networking或在服务器之间交换共享IP地址时分离。
我find了解决我的问题。
通过使用内核参数net.ipv4.ip_nonlocal_bind=1 ,我可以让我的服务绑定到不存在的地址。
当eth0:0接口出现时,stream量被服务接受。 ARP等由ucarp /networking处理。 有了这个,就不需要DNAT / SNAT规则了。
我可以build议两个select,你可以select其中一个或你自己的。
您可以设置您的服务来监听通配符地址,从而完全避免使用DNAT规则。 SNAT规则将被应用在传出的数据包上。
或者,根据您使用的HA解决scheme,您可以将其configuration为在迁移时开始监听浮动IP(192.168.0.40)的服务。
没有如此相关的注释,但OpenBSD CARP中不存在这种麻烦。 使用CARP,您可以在所有节点上configuration虚拟IP,但只有一个活动。 这当然意味着您可以让您的服务在所有节点上的虚拟IP上进行侦听。
这不太好,但是你可以在所有节点上configuration虚拟IP(甚至可以启动它),并使用arptables来禁用该IP的ARP回复或公告。 然后,您可以使ucarp启用或禁用ARP规则,因为节点成为主设备或从设备。