Как стать автором
Обновить

Shorewall: файрволл для всех

Время на прочтение5 мин
Количество просмотров38K
Внезапно оказалось, что Shoreline firewall совсем не освещен на Хабре, несмотря на то, что является крайне удобным инструментом (и весомым аргументом против pf в холиварах) для настройки файрволла под линуксом.

Просьба не холиварить на темы «Линукс — говно, у нас в OpenBSD круче», «А у меня Kerio WinRoute, а вы все неудачники» и подобные.
Статья для тех, кто выбрал Linux из каких-то соображений и не хочет тратить уйму времени на изучение iptables (а там есть, где запутаться).

Посему, под катом простыня


Для начала, что же это такое — Shorewall?
Shorewall — обвязка к старому доброму iptables, стандартному средству настройки файрволла в Linux. В актуальной версии использует нечто Perl для того, чтобы прочитать и распарсить целую кипу несколько конфигурационных файлов, сгенерировать файл, совместимый с iptables-restore и скормить его последнему. Отличается простотой конфигурации, добавленными уровнями абстракции при настройке, активной разработкой, делающей его под стабильным Debian сильно устаревшим, а также очень вкусными штуками типа поддержки нескольких аплинков.

Сейчас актуальная версия Shorewall 4.4, в Lenny — 4.0, в Karmic — 4.2. Поскольку ближайшая ко мне машина работает под Ubuntu Server 9.10, в основном я буду рассказывать про версию 4.2, а поскольку основной набор возможностей появился в Shorewall сразу, все или почти все должно работать с любой версией Shorewall.

До версии 4.2 включительно Shorewall мог использовать для обработки конфигов как Perl, так и Shell. В версии 4.4 поддержку Shell выбросили (ибо нечего плодить глючные сущности), поэтому будем говорить только о Perl-версии.

Итак, Установка
Поскольку весь shorewall представляет собой набор perl-скриптов и заготовки для конфигов, про зависимости говорить глупо. Нужен Perl и iptables. Если в репозиториях вашего дистрибутива есть shorewall-perl подходящей вам версии — ставьте, если нет — возьмите deb или rpm от другого дистрибутива, ломаться там нечему.

Запуск и остановка
Поскольку все мы нетерпеливые, захочется сразу позапускать новую софтинку. Делать это можно не только инит-скриптом, но еще и командами
shorewall {start,stop,restart}
, что во время отладки даже предпочтительнее — об ошибках будет написано прямо в консоли.

Замечание к конфигурации
Все стандартные конфиги надо брать из тех, что поставляются в коробке. Они содержат не только осмысленные комментарии о назначении файла, но и маркеры для парсера, работоспособность систеы без которых не гарантируется. В убунте они оказались в /usr/share/doc/shorewall-common/default-config.
Сама конфигурация файрволла лежит в /etc/shorewall, далее все конфигурационные файлы без путей должны лежать именно там.

Конфигурация типичного домашнего роутера
1. Зоны.
Правила хождения пакетов в Shorewall используют абстракцию зон — все сети, которые вы хотите обрабатывать, надо как-то обозвать. Для начала следует определиться с названиями зон. В моем случае их будет 4: необходимая зона, содержащая сам файрволл, домашняя сетка с DHCP, провайдерская локалка и интернет через PPPoE. Не забудьте скопировать заготовку из вашего пакета! Конфиг получился примерно такой:
# cat zones |tail -7
#ZONE   TYPE    OPTIONS                 IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
inet    ipv4
nbn     ipv4
mork    ipv4
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

Здесь nbn — провайдерская локалка (да-да, нетбайнет), mork — домашняя говносетка.

2. Интерфейсы и хосты
Когда вы определились с тем, какие у вас будут зоны, нужно сказать, как поделить между зонами сетевые интерфейсы (l2) и IP-сети (l3).
В файле interfaces надо перечислить все обрабатываемые интерфейсы. Делается это в формате «В этой зоне будет этот интерфейс целиком», поэтому при делении интерфейса на несколько зон вместо зоны надо указать прочерк.
Мой простейший вариант:
# tail -5 interfaces
#ZONE   INTERFACE       BROADCAST       OPTIONS
mork    lan             detect          dhcp
inet    ppp+            detect
nbn     prov            detect
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Да-да, у меня сетевухи называются lan и prov. У большинства это будет eth0, eth1, etc.
Как видно из примера, можно использовать маски. В данном случае под ppp+ попадут разнообразные PPP-туннели, в том числе и ppp0.

При делении одного интерфейса на несколько зон следует в файле host указать, какая подсеть какого интерфейса в какую зону попадает. Синтаксис там простой — «зона интерфейс: подсеть», с возможностью добавления исключений.

3. Политики
Когда вы разделили окружающий мир на зоны, обязательно надо сказать, кому что можно делать по умолчанию. Называется это дело политиками, лежит в файле policy, необходимо определить политики для всех возможных направлений пробегания трафика. Лучше всего в конец дописать дефолтную политику, а чуть выше — исключения:
# tail -6 policy
#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK
fw      all     ACCEPT
mork    all     ACCEPT
all     all     REJECT
#LAST LINE -- DO NOT REMOVE

Здесь я разрешил весь трафик из моей домашней сетки и с файрволла куда угодно, а все остальное запретил

4. Первый полет
На этом этапе конфиг должен скомпилироваться и заработать. Только вот интернет будет только на файрволле — ведь мы не настроили NAT. Но когда что-то работает, это уже радует :)

5. Настройка NAT
Маскарадинг, как всегда, включается просто. Обратите внимание: указываются не зоны, а интерфейсы. Можно указать IP-подсеть, можно делать исключения. Файл masq:
# cat masq |tail -3
#INTERFACE              SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK
ppp+,prov               lan
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE


6. shorewall.conf
Добрались до того, куда надо было залезать в самом начале, но было лень и непонятно. В этом файле лежит конфигурация парсера, некоторые особенности поведения и прочая ахинея. Правим и обращаем внимание на следующие параметры:
STARTUP_ENABLED=Yes — пусть запускается
VERBOSITY=1 — многословность в консоли
SHOREWALL_COMPILER=perl — чтобы не перепуталось, если что
*_LOG_LEVEL — когда все заработаеткак надо, поставьте в none, чтобы не засоряло dmesg
LOG_MARTIANS — так же
IP_FORWARDING=On — для маскарадинга очень нужно. Можно, кончно, и в sysctl.conf это делать, но тут уместнее
CLAMPMSS=Yes — лучше включить, если у аплинка MTU меньше, чем у какой-нибудь из машин в домашней сетке. 
                   No здесь может привести к крайне неприятному багу с неработающей википедией на части компов.
ADMINISABSENTMINDED=Yes — не мните себя б-гом, оставьте так


7. Правила (ну наконец-то!)
Для полностью корректной работы я бы здесь еще разрешил весь ICMP. Заодно SSH снаружи. Файл rules:
# cat rules |tail -11|grep -v ^#SECTION|head -5
#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK  CONNLIMIT        TIME
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP
SECTION NEW
ACCEPT          all             all             icmp
ACCEPT          inet            $FW             tcp     22

7a. Port-forwarding описывается там же:
# cat rules |grep -E '(#ACTION|DNAT)'
#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK  CONNLIMIT        TIME
DNAT            all             mork:navoff:31840 udp   31840
DNAT            nbn             mork:navoff:7777 udp    7777
DNAT            nbn             mork:navoff:7777 tcp    7777


8. Profit!
К этому моменту у вас должен быть полностью настроенный домашний роутер с NAT из домашней сетки во все стороны и с порт-форвардингом. Снаружи позволены только ICMP и SSH. Все конфигурационные файлы (5 новых, 1 подправленный) содержат строки, в которых сложно ошибиться, конфигурация легко переносится на машины с другим именованием сетевых карточек, другими адресами присоединенных сетей. Вы не паритесь о флагах TCP-пакетов, о происхождении входящих UDP-пакетов (о, как я дебажил DNS с простым iptables и политикой «все входящее запрещать»). В дебиане и убунте еще следует подправить /etc/default/shorewall, чтобы инит-скрипт мог нормально отрабатывать, местами нужно внести shorewall в любимый ранлевел.

9. PostScriptum
На этом возможности Shorewall не ограничиваются. В него встроена поддержка шейпинга (посредством tc из iproute2), нескольких аплинков (заслуживает отдельной статьи), IPv6 и прочего. Есть возможность конфигурировать его при помощи Webmin. Объемы документации, FAQ и подробность манов способны впечатлить. Надеюсь, многие линуксоиды, как новички, так и опытные администраторы, найдут для себя что-то полезное в этой обвязке к iptables.
Теги:
Хабы:
Всего голосов 62: ↑51 и ↓11+40
Комментарии57

Публикации

Истории

Ближайшие события

Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область