Не вижу смысла сбрасывать все правила при изменении одного VPS. Если вы не имели в виду 2000 команд на VPS, но в этом случае я бы предположил, что вы делаете что-то не так.
В общем, я предлагаю иметь две цепочки для каждого 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 2