我的机器上有大约20个VPS (运行在本地IP上),我使用那些VPS上的iptables重定向某些端口,如下所示:
iptables -t nat -A PREROUTING -p tcp -d %hostIP% --dport %real_port% -i eth0 -j DNAT --to-destination %vps_local_ip%":%vps_destination_port%为了刷新(新创建或删除的vps ),我必须像2000 iptables命令一样运行,首先删除所有规则,然后再插入它们,有时会跳过几个命令,因为iptables不能那么快地处理它,添加间隔不是一个选项,因为我需要快速完成这些命令。
对这个问题有什么更好的解决办法吗?
发布于 2018-04-08 13:22:37
当一个VPS发生变化时,我不认为有理由重置所有规则。除非您指的是每个VPS的2000条命令,但在这种情况下,我会假设您做错了什么。
一般来说,我建议每个VPS有两条链,一条是活动的,一条是非活动的。如果您确实需要在两个iptables命令之间等待,那么只需在配置非活动链时执行它。完成此操作后,您可以将引用从主链中的活动链更改为非活动链(可能是PREROUTING)。
如果您正在使用许多iptables命令来检查哪个VPS是目标,那么您可以开始使用ipset,以便通过一个命令完成这一任务。
您为所有活动链和所有非活动链创建两个链。这允许在没有种族条件的情况下进行更改。
iptables -t nat -I PREROUTING 1 -j chaingroup_a
iptables -t nat -A chaingroup_a -j vps_1a
iptables -t nat -A chaingroup_a -j vps_2a
iptables -t nat -A chaingroup_a -j vps_3a
iptables -t nat -A chaingroup_a -j ACCEPT # stop applying rules
iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 42 -j DNAT --to-destination 10.1.2.3:4242如果要更改配置,则重置非活动链并配置它们:
iptables -t nat -F chaingroup_b
iptables -t nat -F vps_1b
iptables -t nat -F vps_2b
iptables -t nat -F vps_3b
iptables -t nat -A chaingroup_b -j vps_1b
iptables -t nat -A chaingroup_b -j vps_2b
iptables -t nat -A chaingroup_b -j vps_3b
iptables -t nat -A chaingroup_b -j ACCEPT # stop applying rules
iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 4321 -j DNAT --to-destination 10.1.2.3:12345准备完成后,将非活动链组变为活动链组:
iptables -t nat -I PREROUTING 1 -j chaingroup_b由于-j ACCEPT位于chaingroup_b的末尾,仍然存在的chaingroup_a被忽略。但无论如何,您都应该删除它,以防止PREROUTING随每次更改而增长:
iptables -t nat -D PREROUTING 2https://unix.stackexchange.com/questions/436331
复制相似问题