Часто бывает необходимо произвести настройку iptables на удаленном сервере. Однако есть вероятность в результате неправильных действий потерять полностью удаленный доступ. В данной статье рассмотрен один из методов, который позволяет избежать данной проблемы.
Все написанное в статье протестировано на Linux Debian 6 squeeze, однако может быть использовано на любом дистрибутиве Linux с незначительными специфическими изменениями.
Основная идея состоит в использовании двух файлов конфигурации iptables /etc/iptables.conf
и /etc/iptables.test.conf
,где /etc/iptables.conf
- основной файл рабочей конфигурации iptables, который запускается при старте системы и переодически по cron/etc/iptables.test.conf
- тестируемая конфигурация
Создание основного файла конфигурации iptables
/etc/iptables.conf
представляет из себя текущую рабочую конфигурацию iptables, которая загружается при старте системы. Если у вас нет рабочей конфигурации, то следует для начала создать правило, которое разрешает любые действия.
nano /etc/iptables.conf
#!/bin/sh
# Путь до iptables для удобстваIPT="/sbin/iptables"
# Удаляет все правила$IPT -F
$IPT -X
# Разрешает все подключения$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
Данный файл должен автоматически запускаться вместе с сетевыми интерфейсами. Для этого необходимо написать в файле /etc/network/interfaces
запуск /etc/iptables.conf
nano /etc/network/interfaces
# Loopback device:auto lo
iface lo inet loopback
pre-up /etc/iptables.conf
Этим мы добавили автозапуск /etc/iptables.conf
перед запуском loopback интерфейса.
Помимо этого у файла /etc/iptables.conf
должно быть разрешено выполнениеchmod u+x /etc/iptables.conf
Тестирование нового правила
В случае потери доступа к удаленному хосту в результате неправильной настройки iptables, мы восстановим рабочую конфигурацию из файла /etc/iptables.conf
, сбросив новые настройки к заведомо рабочим. Для этого добавим в cron периодический запуск /etc/iptables.conf
crontab -e
# Сбрасывать iptables к рабочим настройкам каждые 5 минут*/5 * * * * /etc/iptables.conf
Далее мы создаем тестовую копию настроек iptables, скопировав текущую конфигурацию
cp -p /etc/iptables.conf /etc/iptables.test.conf
Редактируем файл /etc/iptables.test.conf
и вносим в него свои изменения
nano /etc/iptables.test.conf
#!/bin/sh
IPT="/sbin/iptables"
# Очищает все правила$IPT -F
$IPT -X
# Запрещает все$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Все устоявшиеся соединения разрешены$IPT -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Весь локальный трафик разрешен$IPT -A INPUT -i lo -j ACCEPT
# Разрешаем подключиться по ssh$IPT -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
# Разрешаем HTTP в обе стороны$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 80 -j ACCEPT
# Разрешаем нашему хосту делать DNS запросы$IPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
# Разрешаем "пинги"$IPT -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
$IPT -A OUTPUT -p ICMP --icmp-type 8 -j ACCEPT
Данный файл указан в качестве примера.
После создания собственных правил их нужно протестировать. Для этого запускаем /etc/iptables.test.conf
Тестируем новое правило, и если оно работает как задумывалось, то копируем его в основную конфигурациюcp -p /etc/iptables.test.conf /etc/iptables.conf
Теперь новое рабоче правило уже работает и будет загружаться автоматически при старте системы из скрипта /etc/network/interfaces
Если вдруг доступ к удаленному хосту был утерян, то ждем наступления времени, кратного 5-ти минутам (или другого указанного в cron) и сброса настроек iptables на рабочие. После чего вносим изменения, запускаем и снова тестируем их.
После того, как удалось добиться желаемого результата и сохранения iptables в /etc/iptables.conf
, необходимо закомментировать или удалить созданную строку в crontab
crontab-e
# Сбрасывать iptables к рабочим настройкам каждые 5 минут# */5 * * * * /etc/iptables.conf