Внезапно оказалось, что 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 от другого дистрибутива, ломаться там нечему.
Запуск и остановка
Поскольку все мы нетерпеливые, захочется сразу позапускать новую софтинку. Делать это можно не только инит-скриптом, но еще и командами
Замечание к конфигурации
Все стандартные конфиги надо брать из тех, что поставляются в коробке. Они содержат не только осмысленные комментарии о назначении файла, но и маркеры для парсера, работоспособность систеы без которых не гарантируется. В убунте они оказались в /usr/share/doc/shorewall-common/default-config.
Сама конфигурация файрволла лежит в /etc/shorewall, далее все конфигурационные файлы без путей должны лежать именно там.
Конфигурация типичного домашнего роутера
1. Зоны.
Правила хождения пакетов в Shorewall используют абстракцию зон — все сети, которые вы хотите обрабатывать, надо как-то обозвать. Для начала следует определиться с названиями зон. В моем случае их будет 4: необходимая зона, содержащая сам файрволл, домашняя сетка с DHCP, провайдерская локалка и интернет через PPPoE. Не забудьте скопировать заготовку из вашего пакета! Конфиг получился примерно такой:
Здесь nbn — провайдерская локалка (да-да, нетбайнет), mork — домашняя говносетка.
2. Интерфейсы и хосты
Когда вы определились с тем, какие у вас будут зоны, нужно сказать, как поделить между зонами сетевые интерфейсы (l2) и IP-сети (l3).
В файле interfaces надо перечислить все обрабатываемые интерфейсы. Делается это в формате «В этой зоне будет этот интерфейс целиком», поэтому при делении интерфейса на несколько зон вместо зоны надо указать прочерк.
Мой простейший вариант:
Да-да, у меня сетевухи называются lan и prov. У большинства это будет eth0, eth1, etc.
Как видно из примера, можно использовать маски. В данном случае под ppp+ попадут разнообразные PPP-туннели, в том числе и ppp0.
При делении одного интерфейса на несколько зон следует в файле host указать, какая подсеть какого интерфейса в какую зону попадает. Синтаксис там простой — «зона интерфейс: подсеть», с возможностью добавления исключений.
3. Политики
Когда вы разделили окружающий мир на зоны, обязательно надо сказать, кому что можно делать по умолчанию. Называется это дело политиками, лежит в файле policy, необходимо определить политики для всех возможных направлений пробегания трафика. Лучше всего в конец дописать дефолтную политику, а чуть выше — исключения:
Здесь я разрешил весь трафик из моей домашней сетки и с файрволла куда угодно, а все остальное запретил
4. Первый полет
На этом этапе конфиг должен скомпилироваться и заработать. Только вот интернет будет только на файрволле — ведь мы не настроили NAT. Но когда что-то работает, это уже радует :)
5. Настройка NAT
Маскарадинг, как всегда, включается просто. Обратите внимание: указываются не зоны, а интерфейсы. Можно указать IP-подсеть, можно делать исключения. Файл masq:
6. shorewall.conf
Добрались до того, куда надо было залезать в самом начале, но было лень и непонятно. В этом файле лежит конфигурация парсера, некоторые особенности поведения и прочая ахинея. Правим и обращаем внимание на следующие параметры:
7. Правила (ну наконец-то!)
Для полностью корректной работы я бы здесь еще разрешил весь ICMP. Заодно SSH снаружи. Файл rules:
7a. Port-forwarding описывается там же:
8. Profit!
К этому моменту у вас должен быть полностью настроенный домашний роутер с NAT из домашней сетки во все стороны и с порт-форвардингом. Снаружи позволены только ICMP и SSH. Все конфигурационные файлы (5 новых, 1 подправленный) содержат строки, в которых сложно ошибиться, конфигурация легко переносится на машины с другим именованием сетевых карточек, другими адресами присоединенных сетей. Вы не паритесь о флагах TCP-пакетов, о происхождении входящих UDP-пакетов (о, как я дебажил DNS с простым iptables и политикой «все входящее запрещать»). В дебиане и убунте еще следует подправить /etc/default/shorewall, чтобы инит-скрипт мог нормально отрабатывать, местами нужно внести shorewall в любимый ранлевел.
9. PostScriptum
На этом возможности Shorewall не ограничиваются. В него встроена поддержка шейпинга (посредством tc из iproute2), нескольких аплинков (заслуживает отдельной статьи), IPv6 и прочего. Есть возможность конфигурировать его при помощи Webmin. Объемы документации, FAQ и подробность манов способны впечатлить. Надеюсь, многие линуксоиды, как новички, так и опытные администраторы, найдут для себя что-то полезное в этой обвязке к iptables.
Просьба не холиварить на темы «Линукс — говно, у нас в OpenBSD круче», «А у меня Kerio WinRoute, а вы все неудачники» и подобные.
Статья для тех, кто выбрал Linux из каких-то соображений и не хочет тратить уйму времени на изучение iptables (а там есть, где запутаться).
Посему, под катом простыня
Для начала, что же это такое — Shorewall?
Shorewall — обвязка к
Сейчас актуальная версия 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.