我的机器上有大约 20 个 VPS(在本地 IP 上运行),我正在使用 iptables 在这些 VPS 上使用脚本重定向某些端口,如下所示:
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 无法快速处理它,添加一个间隔不是一个选项,因为我需要快速完成这些命令。
这个问题有更好的解决方案吗?
当一个 VPS 发生变化时,我认为没有理由重置所有规则。除非您的意思是每个 VPS 有 2000 个命令,但在这种情况下,我会假设您做错了什么。
一般来说,我建议您为每个 VPS 设置两条链,一条是活动的,一条是非活动的。如果您真的需要在两个命令之间等待,
iptables
那么就这样做——同时配置非活动链。完成此操作后,您将主链中的引用从活动链更改为非活动链(可能PREROUTING
)。如果您使用许多
iptables
命令来检查哪个 VPS 是目标,那么您可以开始使用ipset
以通过单个命令完成此操作。例子
您为所有活动链和所有非活动链创建两个链。这允许在没有竞争条件的情况下进行更改。
如果要更改配置,则重置非活动链并配置它们:
准备好后,将非活动链组变为活动链组:
由于
-j ACCEPT
在末尾chaingroup_b
仍然存在chaingroup_a
被忽略。但是您无论如何都应该删除它,以防止PREROUTING
每次更改都增长:事实上,iptables 可以做得足够快,我已经测试了近 1900 条规则。您只需要在列表文件中跟踪 ip:ports,然后编写一个脚本,例如如下所示的 bash 脚本,然后从该文件重新加载 ip:port's
我假设文件中的每一行都类似于 realport:vps-ip:port
这样你只需要处理列表。您还可以使用其他格式来代替 realport:vps-ip:port,例如使其以逗号分隔。然后将 -d: 更改为 -d 或其他任何内容。