Есть много разных способов решить задачу загрузки правил iptables при старте системы... и много вещей обломано о плюсы и минусы каждого из них.
Приведу самый, как мне кажется, простой и доступный. Я использую встроенный механизм запуска скриптов по событию включения сетевого адаптера. (if-up)
Для начала, хорошо бы иметь хоть какие-то правила, чтобы было, что сохранять. Если такое богатство у вас уже есть, смело переходите к следующему шагу.
$ sudo -E -s
# iptables -F
# iptables -X
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 80 -j REJECT
# iptables -P INPUT DROP
# exit
$
Шаг 1. Убедимся, что нас поняли правильно. (Или что правила именно те, про которые вы думаете, если вы используете собственный набор)
$ sudo iptables-saveВнимательно прочтите вывод команды. Убедитесь, что нет повторов, все правила загружены и располагаются в желаемом порядке.
Шаг 2. Прикинемся рутом.
$ sudo -E -sШаг 3. Сохранение правил и установка их автозагрузки.
# echo "#! /sbin/iptables-restore" > /etc/network/if-up.d/iptables-rules
# iptables-save >> /etc/network/if-up.d/iptables-rules
# chmod +x /etc/network/if-up.d/iptables-rulesШаг 4. Всё... если ничего не произошло, значит, всё сработало как надо.
Можете проверить, что файл создан и сделан исполняемым.
# ls -lA /etc/network/if-up.d/ipt*
-rwxr-xr-x 1 root root 1214 2010-06-10 19:08 /etc/network/if-up.d/iptables-rules
Шаг самый-самый последний. Проверка работоспособности.
Просто перезагрузите систему.
$ sudo rebootПосле чего проверьте, что правила действительно загрузились:
$ sudo iptables-saveВывод команды не должен отличаться от того, что вы видели ранее. Плюс-минус взаимное положение таблиц в выводе...
Вспомогательный скрипт iptsave.shЭта часть
необязательна, но очень помогает сохранять голову на плечах.
Начнём с простого. Простой терминал от простого пользователя (вас-с...)
$ mkdir ~/bin
$ nano ~/bin/iptsave.sh
#! /bin/sh
chmod -x /etc/network/if-up.d/iptables-rules
cp --backup=numbered -aT -- /etc/network/if-up.d/iptables-rules /var/backups/iptables-rules
echo "#! /sbin/iptables-restore" > /etc/network/if-up.d/iptables-rules
iptables-save >> /etc/network/if-up.d/iptables-rules
chmod +x /etc/network/if-up.d/iptables-rules
^O^X
$ chmod +x ~/bin/iptsave.sh
Всё. Теперь можно сказать
$ sudo -E iptsave.sh
и проверить, что всё произошло, как надо.
$ ls -lA /var/backups/iptables-rules*
-rw-r--r-- 1 root root 980 2010-05-08 03:26 /var/backups/iptables-rules
-rw-r--r-- 1 root root 979 2010-05-08 03:45 /var/backups/iptables-rules.~1~
Редактировать правила можно двумя способами:
1. Внося изменения в активные таблицы любым удобным Вам способом (из командной строки либо пользуясь удобным Вам междумордием).
2. Напрямую редактируя файл /etc/network/if-up.d/iptables-rules и запуская его вручную, либо перезапуская всю сеть (service networking restart), чтобы изменения вступили в силу.
В обоих случаях, запустите скрипт
iptsave.sh после того, как вы добились желаемого эффекта.
Это создаст резервную копию вашего файла. Хотя содержание копии будет различаться в зависимости от того, каким способом вы редактируете правила, пользуясь всё время одним и тем же способом, вы всегда будете иметь полный набор копий.
P.S.
Скрипт
iptsave.sh не надо класть в автозагрузку ни в каком виде, это плохо кончится.
Этот скрипт лежит у меня в
~/bin и запускается только когда я что-то меняю в iptables.
Этот (приведённый мною) скрипт создаёт ДРУГОЙ скрипт, в каталоге
/etc/network/if-up.d/ с именем
iptables-rules.
Со всеми приличествующими моменту реверансами, типа создания бэкапа и делания скрипта исполнимым.
P.P.S.
Более продвинутый скрипт, с обнулением счётчиков:
#! /bin/sh
chmod -x /etc/network/if-up.d/iptables-rules
cp --backup=numbered -aT -- /etc/network/if-up.d/iptables-rules /var/backups/iptables-rules
echo "#! /sbin/iptables-restore\n`iptables-save`" | \
sed -r "s/^(\:[A-Z\_\-]+ (ACCEPT|DROP) \[)[[:digit:]]+\:[[:digit:]]+\]/\10:0\]/" > \
/etc/network/if-up.d/iptables-rules
chmod +x /etc/network/if-up.d/iptables-rules
Bonus pack:
#! /bin/sh
for table in "conntrack" "mangle" "nat" "filter" "IMQ" ; do
iptables-save -t $table > /tmp/iptables-temp-table 2> /dev/null
grep -q '^\-A' /tmp/iptables-temp-table && case $1 in
'-r') sed -r "s/^(\:[A-Za-z0-9\_\-]+ (ACCEPT|DROP|-) \[)[[:digit:]]+\:[[:digit:]]+\]/\10:0\]/" < /tmp/iptables-temp-table ;;
*) cat /tmp/iptables-temp-table ;;
esac
done
rm /tmp/iptables-temp-table
Всегда сохраняет таблицы в указанном порядке. Удобно для прогонки diff'ов при поиске различий между версиями.