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

    Внезапно оказалось, что 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.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 57
    • –17
      >файрволл
      а я сижу за роутером и срал я на все файерволосрачи с высокой горки :)
      • +1
        Я тоже сидел, пока не оказалось, что файлопомойку лучше хранить на PC-говнороутере, а не на D-link DIR-300, что хочется иметь локальную зону в DNS и свой DHCP-сервер, не ставящие всю сетку в зависимость от моих экспериментов со своим компом. У подруги делал на шореволле мульти-ISP с одним из аплинков на роутере в локалке. Если задуматься, можно еще придумать бонусы.
        • 0
          >нескольких аплинков (заслуживает отдельной статьи)
          Жду
      • +1
        Автор! Пиши ещё, завалю кармой!
        /me пошел прикручивать софт к Gentoo
        • 0
          Что именно интересует?
          • 0
            Вобще всё :) И защита (ограничения запросов, трафика и.т.д.), и роутинг (строть кластер будем — нужен будет роутинг). Вобщем было бы хорошо более-менее мануала что-то с разъяснениями.
            • +5
              Вам нужен сетевой инженер. Я всего лишь линуксоид, слегка коснувшийся темы. Крайне советую нанять хорошего специалиста, чтобы потом не кусать локти из-за аномалий в проекте, вызванных ошибкой в проектировании сети.
              • +2
                Вы без этих знаний собираетесь строить кластер? Удачи!
                • 0
                  Кластер кластеру рознь. Вот Pacemaker+OpenAIS+Aache+MySQL — тоже кластер, хотя там ничего подобного не нужно знать.
                  • 0
                    Я не один там, я больше по WEB части, но стремлюсь и к остальным знаниям. Я и не собираюсь поставить и вводить в production всё с ходу, для этого есть время для тестирования, изучения и.т.д. Мы сами для себя строим, можем тестировать столько, сколько потребуется.
                    • 0
                      Если не секрет, что и для чего кластер?
                      P.S>Обидеть не хотел, но как-бы это сетевые основы, и автор заметки явно дал понять, что заметка для «домохозяек»
            • 0
              *я, может быть, чего-то не понимаю*
              В чем смысл этих зон, если в примере одной зоне соответствует один интерфейс?
              Это всегда так, или только в примере?
              И зачем эти зоны вводить?
              • 0
                В примере — да, получилось так. В сферическом случае в вакууме можно сделать физически несвязанные между собой сети за одним файрволлом (несколько интерфейсов в одной зоне), разделить компы в одной физической сети на разные зоны, сделать зону, находящуюся за какой-нибудь железкой на другом конце физической сети.
                • 0
                  Так понятнее, спасибо. :)

                  Настройка несколько непривычная, но синтаксис проще, чем у iptables.
              • +1
                асус WL500 сдыхает от 3500-5к соединений, а я изза этого чихаю. А роутер пытаюсь на вьяте поднять (хитрый роутер, очень хитрый).
                Сталкивался с шорволом, но как то не прижился (, в итоге юзаю скрипты от айпитейбла и свои.
                • –1
                  Вероятно, ее не зря активно рекламируют — с разбегу правильно настроить систему может только специалист их поддержки, время работы которого многого стоит.
                  • 0
                    ну если поднять так — то не сложно ), а на вирт машине чуть сложней. А супорт скорее всего на меня как на больного посмотрит )). Хотя под вмвар там есть солюшн.
                    • 0
                      Не очень понимаю, зачем роутер в виртуалке. Это же сильно бьет по производительности сети из-за того, что каждый фрейм пробрасывается с железной сетевухи в виртуальную и наоборот. То есть, можно упереться в процессор и пропускную способность RAM вместо сетевой карточки.
                      Не зря же лучшие сетевые девайсы — специально заточенные под это дело железки, со специальной ОС и кучей проприетарного кода для обработки трафика.
                      • 0
                        Если система виртулизации умеет пробрасывать pci-устройства (например xen), то в этом есть смысл.
                    • 0
                      ой незнаю, что там сложного. я прекрасно настроил виатту с первой попытки, воружившись их мануалами. вполне доступно.
                  • +4
                    Эм… iptables не намного сложнее чем те конфиги которые вы предлагаете править. Хотя… кому как больше нравится =). Против ничего не имею =)
                    • +1
                      Для таких случаев — да, примерно то же самое. А теперь представьте, что PPPoE вдруг стал называться ppp1 из-за того, что при поднятии туннеля предыдущий pppd не успел умереть. Или что провайдер поменял Вам выдаваемый IP. Shorewall дает интересную абстракцию.
                      Сам я стал изучать его, когда понадобилось сделать Multi-ISP в хитрой конфигурации. Со стандартным набором команд пришлось бы писать длинные и глючные скрипты, а также долго дебажить набор правил для iptables.
                      И вот еще камень в сторону iptables: понимать, что куда течет по дампу таблиц бывает сложно.
                      Всему свое место. Это дома не страшно экспериментировать. На серверах я предпочитаю чистый iptables, поскольку там почти всегда одинаковая конфигурация, и чем меньше прослоек, тем надежнее.
                      • 0
                        if-up / if-down / cron every 5 sec на монитор + перключаловка между каналами. опция в демоне персист кажись.
                        скрипт пишется тоже 1 раз ).
                    • +1
                      Никогда не видел смысла в таком софте, но статья годная. Пойду попробую, авось не придётся ручками писать загрузку/сохранение правил iptables для дебиана :)
                      • 0
                        iptables-save
                        iptables-restore
                        iptables-apply

                        какбы написано уже )
                        • 0
                          ага, а вот чтобы не использовать б-гомерзкий rc.local нужно стянуть или написать init-скрипт.
                          • –1
                            Я rc.local обычно для подобных целей и использовал. А чем он так «богомерзок»??
                            • +1
                              Не помню уже, в чём было дело в моём случае, но в конце концов отказался от rc.local в пользу /etc/network/interfaces, по событию up для loopback'а.
                              • 0
                                в убунте if-up /if-down работают через /etc/network/interfaces, а в rc.local кидаю что то на подобии «noip2/ventrilo/teamspeak/».

                                Вопрос, в Shorewall реализована iptables-apply? (откат при удачной / не удачной правке)?
                                • 0
                                  Не имею представления, это к автору статьи :)
                                  • 0
                                    Shorewall сделан так, что не рвет имеющиеся соединения. То есть, когда в конфиге какая-то ахинея, консоль не отмирает.
                                    Отношение к уже установленным сессиям (оставлять или обрывать) меняется опцией ADMINISABSENTMINDED в конфиге.
                                    • 0
                                      а в случае «бутерброд маслом вниз» интересует.

                                      Т.е. вносим ахинею в фаервол, и в єтот момент моргает свет, коннект рвется… а ты сидел через прова который тебе ИП поменял по DHCP.
                                      • 0
                                        Там можно подсасывать правила из кастомного каталога. Например, shorewall restart /root/shorewall-playground прочитает совсем непроверенный конфиг без необходимости править основной.
                                        не тестировал
                        • 0
                          ещё хорошо m0n0wall и Pfsense но для предприятия, для дома кажется лучше Shorewall, тут хоть система не урезана)
                          ps по установке Shorewall в разы просто в разы проще)
                          • 0
                            ммм, ИМХО, для Предприятия хорошо Checkpoint/Juniper/Cisco, для пРЕДПРИЯТИЙ вышеописанное подойдет замечательно.
                          • 0
                            Отличная штука.

                            Более полугода работает под Ubuntu Server 9.04
                            Потратил около недели на танцы с бубном и на освоение. Зато теперь трогаю только если порт нужно пробросить.

                            Доволен, как слон. Работает NAT-ом в домашней сетке из 4-х компов (сервер 5-й).
                            • +1
                              в чем профит по сравнению с ufw/gufw?
                              • 0
                                Хотя бы в отвязанности от конкретного дистрибутива.
                                Еще я как-то с разбегу не обнаружил в UFW поддержки NAT. Точнее, она там реализована путем вписывания сырых правил iptables в конфиг.
                                UFW не дает простого способа разделить домашнюю сеть, сеть провайдера и инет.
                                В общем, UFW — примитивная обвязка, подходящая только для standalone-машины. Shorewall же дает кучу возможностей по настройке маршрутизатора.
                                • 0
                                  Чтобы не быть голословным: официальный гайд, следует всмотреться в секцию «ufw Masquerading», улыбнуться и закрыть вкладку.
                                  • 0
                                    Согласен. Изначально рассматривал решения, не привязаные к определённому дистру.
                                    Не являюсь фанатом ubuntu (любимые дистры Gentoo и Archlinux)
                                    Не холивара ради, просто поднял систему «на посмотреть» под Ubuntu Server, а посмотреть у меня — это хотя бы несколько дней поработать и распробовать. А т.к. всё работает без нареканий, глупо это дело сносить и ставить любимый дистр, что бы опять допиливать.
                                    Всё это дело тихонько работает на серевере и я его особо и не трогаю.
                                • +1
                                  Спасибо за статью, станет легче начать. Дома использую firehol, из минусов — отсутвие шейпера, из плюсов — более понятный конфиг, например:
                                  version 5
                                  interface eth0 lan
                                  policy accept
                                  interface eth1 internet
                                  protection strong
                                  server custom ssh tcp/XXX default accept
                                  server custom torrent tcp/49161 default accept
                                  server custom torrent udp/49163 default accept
                                  client all accept

                                  router lan2internet inface ppp+ outface eth1
                                  masquerade
                                  route all accept

                                  router internet2lan inface tun+ outface eth0
                                  masquerade
                                  route all accept
                                • –1
                                  Эмм… Простите, а что сложного в iptables?
                                  • 0
                                    Я 2 года назад тоже считал «Что столжного в этом или том». Активно ставил друзьям Gentoo, конфигурировал боевой апач, на трех виртуалках гонял Coda…
                                    Там нет ничего сложного, ровно как нет ничего сложного в sed. И в конфигурации ядра Linux нет ничего сложного. Только понятно это становится после того, как уже изучен некоторый объем документации.
                                    Так вот, о чем это я… Этот стартовый объем документации в случае с shorewall сильно ниже.
                                    • 0
                                      ИМХО, лучше один раз с iptables разобраться.
                                      • +1
                                        Согласитесь, что стартовый объем документации — он на то и стартовый, чтобы изучать его в первую очередь. Iptables включить в него необходимо. По моему мнению, лучше научиться писать правила на iptables, потратив на это n часов, чем n/2 на разбор конфигов каких-либо обвязок и в конечном итоге не понимать, что именно происходит в системе. И вот тогда будет меньше вопросов, подобных этому: комментарий из соседнего топика.
                                        • +1
                                          Года три назад настроил iptables (man+«метод научного тыка», инета не было, чтоб погуглить и/или хауту почитать, хорошо что вообще эти слова iptables и man в голове откуда-то были), работает и работает, с год назад понадобилось кое-что изменить — еще n часов, чтоб понять, что я два года назад написал, еще n чтоб понять, что теперь надо написать. Итого 3n часов, сейчас вот шейпинг захотелось сделать и еще одну сеть, так лучше я почитаю n часов про Shorewall, чем 2n, а то и 3n часов буду разбираться с «нативными» инструментами.

                                          В общем, имхо, если что-то постоянно не используешь, не стоит тратить время на его изучение, если есть более простые в изучении обвязки и обертки — прочитал, настроил и забыл до следующего раза.
                                    • +1
                                      не понял смысла. Морда к iptables кто его не осилил? Кстате когда выбирал фэрвол iptable и ipf тупо не справились с поставленой задачей, пришел к pf :) ipfw — надоело ехать через весь город к консоли если опечатался. Вообщем pf мой вечный друг.
                                      p.s.
                                      не для холивара ради. просто так ИМХО
                                      • 0
                                        Это не просто морда к таблицам. Это обвязка сразу для iptables, роутинга, шейпинга. Возможность определить логику работы маршрутизатора в одном каталоге интуитивно понятными словами.
                                        Повода изучить pf пока не было, к сожалению. Для адекватного сравнения нужно плотно попользоваться каждым из кандидатов на звание лучшего, поэтому утверждать ничего не буду.
                                        • 0
                                          а shorewall умеет шейпить vlan-интерфейсы?
                                          • 0
                                            При том, что vlan-ы должны называться типа eth1.115, думаю, должен. Это абстракция, вносимая ниже. Возможен конфликт с алиасами, но они используются далеко не всегда.
                                            Попробуйте. Будет интересен результат
                                            • 0
                                              Да не, тут не сколько дело в алиасах. Когда-то читал про проблему в очередях cbq и htb. Типа трафик они на vlan не могут шейпить.
                                      • +1
                                        Я не перевариваю такой табличный формат конфигов. Мне больше по душе ferm.
                                      • 0
                                        пользую на работе, очень доволен, при 150 юзерах чистыми iptables запарился бы разруливать
                                        • 0
                                          stolen, спасибо за статью )

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.