Рассказ про то, как правильно сохранять и загружать правила iptables в Debian.
Поместить запуск в rc.local это не самое правильное решение, более правильно – это сохранить правила iptables перед выключением, потом перед поднятием сетевого интерфейса загрузить правила, объясню как это сделать:
Для сохранения правил iptables существует команда:
После этого правила будут сохранены в файле (имя произвольное) /etc/ip_rulles.lst
Для загрузки правил соответственно:
Тут мы подошли к самому интересному, то бишь феншую _:) – в файле настроек сети /etc/network/interfaces в каждый из интерфейсов можно добавлять секции которые будут выполнятся до поднятия, после поднятия, до отключения и после отключения интерфейса –секции:
up
post-up
down
pre-down
post-down
pre-up команда
– запустить команду до поднятия интерфейса. Если команда завершается с ошибкой, тогда ifup не отмечает интерфейс как настроенный, выводит сообщение об ошибке и завершается со статусом 0.
up команда
post-up команда
– запустить команду после поднятия интерфейса. Если команда завершается с ошибкой, тогда ifup не отмечает интерфейс как настроенный (даже если он в действительности настроен), выводит сообщение об ошибке и завершается со статусом 0.
down команда
pre-down команда
– запустить команду перед отключением интерфейса. Если команда завершается с ошибкой, тогда ifdown помечает интерфейс как не настроенный (даже если на самом деле его настройки не были сброшены) и завершается со статусом 0.
post-down команда
– запустить команду после отключения интерфейса. Если команда завершается с ошибкой, ifdown помечает интерфейс как не настроенный и завершается со статусом 0.
В нашем примере сохранение/восстановление правил привяжем к интерфейсу eth0 (хотя можно и к любому другму):
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
pre-up echo “1” > /proc/sys/net/ipv4/ip_forward # Включаем форвардинг пакетов
pre-up iptables-restore < /etc/ip_rulles.lst # Загружаем правила
post-down iptables-save > /etc/ip_rulles.lst # Сохраняем правила
Теперь выполним наш скрипт и сохраним правила:
# iptables-save > /etc/ip_rulles.lst
Скрипт /etc/firewall.sh – должен содержать загрузку правил iptables, подробней например тут.
Теперь все правила будут выставляться автоматически.
Также если сделать restart (лучше start/stop) сети – правила сохраняться и сразу загрузятся.
Чтобы обновить можно принудительно сделать:
# /etc/init.d/networking start
или
# ifup eth0
Но чем хороши эти секции? Тем что на них можно повесить исполнение любого скрипта/команды, например при поднятии ppp0 устанавливать другие маршруты, да вообще все-что угодно…
Примеры:
Запуск сетевого интерфейса eth0 с динамическим IP адресом, при условии, что файл /etc/network/local-network-ok существует. Если такой файл не существует, интерфейс eth0 не поднимется.
iface eth0 inet dhcp
pre-up [ -f /etc/network/local-network-ok ]
Настройка DSL-интерфейса dsl-provider, созданного программой pppoeconf.
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up
provider dsl-provider
Примеры можно посмотреть в документации /usr/share/doc/ifupdown/examples/network-interfaces .