Не вижу смысла сбрасывать все правила при изменении одного 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
На самом деле iptables может сделать это достаточно быстро, и я проверил это почти для 1900 правил. Все, что вам нужно, это отслеживать порты ip :в файле списка, а затем написать скрипт, например. сценарий bash, подобный следующему, и перезагрузите порты ip :из этого файла
Я предполагаю, что каждая строка в файле представляет собой что-то вроде realport :vps -ip :port
#/bin/bash
HOST=100.200.100.200 # your public address
LIST=/path/to/file
iptables -t nat -F
cat "$LIST" | while read line
do
realport=`echo $line|cut -f1 -d:`
vpsip=`echo $line|cut -f2 -d:`
port=`echo $line|cut -f3 -d:`
iptables -t nat -A PREROUTING -p tcp -d $HOST --dport $realport -i eth0 -j DNAT --to-destination $vpsip:$port
done
iptables save
Таким образом, вам нужно будет позаботиться только о списке. Вы также можете использовать другие форматы вместо realport :vps -ip :port, например, разделяя их запятыми -. Затем измените -d :на -d или что-то еще.