Настройка iptables на удаленном хосте

iptables Linux Debian Cron

Часто бывает необходимо произвести настройку 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

18 Мар 2013 22:04 -- Юрий Акимов