GrabDuck

Настройка iptables скриптом | Kubuntu.ru

:

Давным давно у меня у меня как-то спрашивали, как в конторе тонко настроить iptables для раздачи интернета, но чтобы при этом было понятно, какое правило для чего нужно. Примерно тогда у меня родилась мысль сваять этот мануал, но руки все не доходили. А сейчас я и сам начал замечать, что уже забываю кое-какие тонкости, и пока не забыл вообще все, делаю шпаргалку. Если она пригодится кому-то еще - замечательно.

На форуме уже некое количество раз поднимался вопрос, как рулить иптаблей, в частности в подшивке есть мануал. Но по большему счету у этих мануалов есть один общий нюанс - они все мало подходят для корпоративного регулирования трафика и больше расчитаны на домашнего пользователя. В частности, в мануале из подшивки все регулирование ведется двумя инструментами: iptables-save (для сохранения правил в конфиг) и iptables-restore (соответственно, для восстановления из конфига). Сам по себе метод неплохо, особенно в домашнем секторе, где один раз настроил и забыл, а в конфиге содержится цепочек раз-два и обчелся. Но если контора у вас большая, а конфиг достигает в размене нескольких мегабайт, там сам черт ногу сломит, а не то, что системный администратор. Поэтому на выручку нам придет bash-скрипт, в котором мы и будем все конфигурировать. Этот метод хорош помимо наглядности еще и тем, что позволяет использовать переменные, циклы и вводить некоторую отладочную информацию о ходе выполнения скрипта, чего нет в вышеозначенном методе.

То, что будет описано ниже - это всего лишь шпаргалка, некий шаблон, на который можно будет опираться при создании своих скриптов. Поэтому все будет сейчас строиться на некоторых допущениях. Кроме того, в данном мануале не рассматривается сетевая безопасность, т.к. это совершенно отдельный разговор, который я сейчас не хочу поднимать.
Кроме того, следует учитывать, что мы тут рассматриваем наиболее общие, типовые варианты правил, на базе которых можно будет сочинять какие-то свои, более сложные. Ну и т.к. статья расчитана на людей с минимальным уровнем подготовки, я не расписываю назначение различных ключей команд, а так же почему в одних случаях указываются те или иные ключи, а в других случаях, казалось бы - похожих, этих ключей нет.

Вводная информация.

Допустим, у нас есть контора с некоторым количеством компов, интернет в которой раздается через линуксовый роутер. На роутере установлено две сетевые карты, одна из которых смотрит в интернет, а вторая - во внутреннюю сеть.
внутренняя сеть вида 10.1.0.0/24
eth0=xxx.xxx.xxx.xxx  # Ваш внешний IP-адрес
eth1=10.1.0.1         # Внутренний IP-адрес роутера.

Предположим, что на роутере у нас живет почтовый сервер, ssh, прокся и днс. Соответственно, это у нас будут заюзаны порты 25 и 110 для почты, 3128 для прокси, 22 для ssh.

Кроме того, в конторе есть некоторый набор серверов и пользователей с разным уровнем допуска в интернет.

Теперь можно приступить к ваянию самого скрипта.

Подгрузка необходимых модулей ядра

Тут все стандартно. Если вам для работы нужен какой-то модуль, подгружается он командой /sbin/modprobe имя_модуля. Какие модули для работы будут вам нужны, вам виднее. Подгружайте по своему усмотрению.

Очистка таблиц

Для того, чтобы завести новые правила, для начала надо сбросить все старые. Делаем это нехитрым набором команд:
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -F
iptables -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Мы очистили все таблицы, сбросили имеющиеся подключения и разрешили loopback. Фактически, после этого роутер готов для приема новых правил.

Разрешаем icmp

Наверняка вам захочется занятся любимым делом - попинговать яндекс =). Ну и попинговать сам роутер заодно. Поэтому разрешаем ходить icmp-пакетам.
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT

Разрешаем обновлять время контроллерам домена

Предположим, у вас в конторе есть пара контроллеров домена, которые страсть как хотят обновлять время. Пусть их адреса будут 10.1.0.3 и 10.1.0.4. Чтобы не катать для каждого контроллера свой набор правил, нам поможет цикл.
TimeServer="aaa.aaa.aaa.aaa bbb.bbb.bbb.bbb"   # вместо aaa.aaa.aaa.aaa и bbb.bbb.bbb.bbb введите адреса любимых серверов времени!
LocTimeServs="10.1.0.3 10.1.0.4"
for tm in $TimeServer; do
for locts in $LocTimeServs; do
iptables -A FORWARD -p udp -i eth1 -o eth0 -s $locts -d $tm --dport 123 -j ACCEPT
iptables -A FORWARD -p udp -o eth1 -i eth0 -d $locts -s $tm --sport 123 -j ACCEPT
done
done
Думаю, удобство и наглядность использования циклов очевидны.

Разрешаем почтовому серверу слать и принимать почту

Порты у нас стандартные - 25 и 110, так что ничего мудрить не будем:
MailPorts="25 110"
for mp in $MailPorts; do
iptables -A INPUT -p tcp --dport $mp -j ACCEPT
iptables -A OUTPUT -p tcp --sport $mp -j ACCEPT
done
Тут мы открыли доступ к почтовым портам как изнутри сети, так и извне (почту слать/получать мы же хотим). Напомню, что разрешения по подсетям, кому можно, а кому нет, настраиваются не тут, а в конфиге почтового сервера.

Разрешения на обращения к прокси-серверу

С проксей дело обстоит примерно так же, как с почтой, за исключением того, что обращение на проксёвые порты мы дадим только для внутренней сети (мы же не хотим, чтобы через нас гулял кто попало).
iptables -A INPUT -p tcp -i eth1 -s 10.1.0.0/24 --dport 3128 -j ACCEPT
iptables -A OUTPUT -p tcp -o eth1 -d 10.1.0.0/24 --sport 3128 -j ACCEPT

Доступ на роутер по SSH

Допустим, вы админ-паранойик, и желаете, чтобы на роутер попасть можно было исключительно изнутри сети и только с вашей машины. Допустим, IP-адрес вашего компа - 10.1.0.10.
iptables -A INPUT -p tcp -i eth1 -s 10.1.0.10 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -o eth1 -d 10.1.0.10 --sport 22 -j ACCEPT

Остальные гуляют лесом.

Доступ админу куда угодно

Вы же бородатый одмин и хотите свободно ходить в инторнеты куда угодно, а не по общеофисным правилам доступа? Значит, нужно нарисовать себе такой доступ!
iptables -A FORWARD -s 10.1.0.10 -j ACCEPT
iptables -A FORWARD -d 10.1.0.10 -j ACCEPT

Доступ к icq

Дадим всему офису посидеть в ютненькой асечке.
LoginICQServ="...................."   # Сюда следует вставить IP-адреса асечных серверов через пробел (по образцу настройки времени)
IcqPorts="5190"
for icqserv in $LoginICQServ; do
for icq in $IcqPorts; do
iptables -A FORWARD -p tcp -o eth1 -i eth0 -s 10.1.0.0/24 -d $iсqserv --dport $icq -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -d 10.1.0.0/24 -s $iсqserv --sport $icq -j ACCEPT
done
done

Выпустим бухгалтерию в клиент-банки

Ну и напоследок дадим бухам доступ к их клиент-банкам. Для каждого банка правила нужно рисовать отдельно.
BankIP="............................"    # Ну вы поняли. Список адресов банка через пробел
BuhIP="......................."     # список IP-адресов бухов, которым можно в эти банки ходить. Так же через пробел.
ClientBankPorts=".............."    # То же самое, но для списка портов, на которые ломится клиент-банк.
for bankadr in $BankIP; do
for buh in $BuhIP; do
for ClPorts in $ClientBankPorts; do
iptables -A FORWARD -p tcp -s $buh -d $bankadr --dport $ClPorts -j ACCEPT
iptables -A FORWARD -p tcp -d $buh -s $bankadr --sport $ClPorts -j ACCEPT
done
done
done

Ну и напоследок, собственно, сам форвардинг:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source xxx.xxx.xxx.xxx   # вместо иксов ваш внешний IP-адрес

echo "1" > /proc/sys/net/ipv4/ip_forward

Ну а теперь соберем все это безобразие в единый скрипт. Создадим файл /etc/network/rc.firewall (или с любым другим понравившимся вам именем, это несущественно). В сам файл пихаем все нужные нам правила: