четверг, 3 апреля 2014 г.

Удалённая настройка iptables

Иногда бывает необходимость настройки iptables на удалённом хосте.
Мне недавно пришлось столкнуться с этим на олимпиаде и на своей VPS'ке.
Часто правильные правила iptables получается получить с некоторым использованием метода тыка и против таких случаев нужно страховаться.
Тут я опишу как можно безболезненно настроить iptables так, чтобы в случае перекрытия доступа самому себе, этот доступ можно было бы получить заново.

Идея такая: в кроне записываем правило, которое в определённый момент времени будет сбрасывать правила iptables.
То есть, предположим я придумал цепочку правил и применил её, и вдруг соединение с удалённым хостом внезапно прекратилось. Однако до этого мы добавили скрипт в cron, который очистит все правила и доступ к удалённому серверу можно будет получить снова.

Важно!
Правила iptables применяются сразу же после выполнения.
К примеру, если в терминале ввести:
$ iptables -A INPUT -p TCP --dport 22 -j DROP
то соединение по ssh сразу будет потеряно.

Создадим скрипт, который будет очищать все правила iptables:
# vim /etc/restore_iptables.conf
#!/bin/sh
IPT="/sbin/iptables"
# Удаляем все правила
$IPT -F
$IPT -X
# Разрешаем все подключения
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

Также нужно сделать скрипт исполняемым:
# chmod +x /etc/restore_iptables.conf

Скрипт должен запускаться сразу же после поднятия сетевых интерфейсов, в Debian достаточно добавить строчку сделать так:
# vim /etc/network/interfaces
auto lo
iface lo inet loopback
   pre-up /etc/iptables.conf

Теперь добавим правило в cron, чтобы запускать наш скрипт резервного восстановления каждые пять минут, к примеру:
# crontab -e
*/5 * * * * /etc/restore_iptables.conf

Теперь мы можем тестировать новые правила.
Для этого создадим файл с тестовыми правилами, к примеру:
# vim /etc/test_iptables.conf
IPT="/sbin/iptables"
$IPT -F
$IPT -X
# Тут мы ошиблись и дропаем соединение по ssh
$IPT -A INPUT -p TCP --dport 22 -j DROP
$IPT -A OUTPUT -p TCP --sport 22 -j DROP

Запустим его:
# chmod +x /etc/test_iptables.conf
# /etc/test_iptables.conf

При таких правилах у нас тут же дропнется соединение по ssh. Однако мы всё учли, достаточно подождать 5 минут и можно реконнектиться.

После того, как вы уверены, что все правила работают как нужно, нужно убрать или закомментировать правило в cron:
# crontab -e
#*/5 * * * * /etc/restore_iptables.conf
и скопировать новый файл правил вместо нашего резервного:
# cat /etc/test_iptables.conf > /etc/restore_iptables.conf

Будьте внимательнее!

1 комментарий: