Материал предоставлен редакцией журнала Системный администратор. Опубликовано в журнале "Системный администратор" N 2 2009
Едва ли можно утверждать, что Linux испытывает недостаток в средствах настройки межсетевых экранов. Чем же выделяется из них Shorewall? Попробуем разобраться!
Организация шлюза для выхода в Интернет - та задача, с которой неминуемо сталкивается практически любой администратор. Естественно, для сетей разных размеров она будет решаться по-разному, но в сегменте SOHO для этих целей, вероятнее всего, будет выделен обычный компьютер под управлением специализированного (IpCop, Smoothwall, ClarkConnect и т. п.) или универсального (Debian, Red Hat, ...) дистрибутива Linux (случай с BSD оставим для другой статьи). При использовании IpCop со товарищи все более-менее ясно: у администратора есть веб-интерфейс, через который задаются необходимые параметры и активируются требуемые сервисы, после чего система оказывается способной решать типовые задачи без сколько-нибудь серьезной настройки. Это очень удобно и эффективно, до тех пор, пока те самые задачи не выходят за рамки типовых. Как только это случается, зачастую оказывается проще настроить с нуля универсальный дистрибутив, чем перекроить "под себя" специализированный.
Универсальность, в свою очередь, обычно подразумевает несколько возможных путей решения одной и той же задачи, даже если речь идет о вещах столь обыденных, как настройка межсетевого экрана и маршрутизации. Практически все современные дистрибутивы Linux предлагают для этих целей собственные инструменты (как консольные, так и графические), но, в принципе, ничего не мешает использовать iptables/iproute2 и напрямую. Кроме того, существует как минимум один универсальный конфигуратор, подходящий практически к любому дистрибутиву, а в Mandriva даже выполняющий роль того самого "собственного инструмента" - Shorewall (http://www.shorewall.net) Томаса Истепа (Thomas M. Eastep). Вот о нем-то мы и поговорим подробнее.
Основная задача Shorewall - преобразование высокоуровневой логики работы межсетевого экрана, описанной в многочисленных конфигурационных файлах /etc/shorewall, в низкоуровневые правила iptables. В терминах Shorewall, такой процесс называется "компиляцией" и выполняется с помощью "компилятора" - скрипта на языке оболочки или на Perl.
Изначально Shorewall был написан на чистом Shell; Perl-компилятор (Shorewall-perl) появился в версии 3.4.2 как сопутствующий продукт, но в настоящий момент он уже является более гибким, чем исходный вариант, ныне известный как Shorewall-shell. Shorewall-perl работает гораздо быстрее "собрата", аккуратнее проверяет конфигурационные файлы на этапе компиляции (и генерирует более подробные сообщения об ошибках), поэтому, если у вас нет каких-то специальных требований или антипатии к Perl, есть смысл остановиться именно на нем.
Основным преимуществом Shorewall является уже упомянутая выше высокоуровневость: вы сообщаете, что нужно сделать, предоставив программе самой решать, как это реализовать. Надо отметить, что генерируемые Shorewall правила отнюдь не избыточны и грамотно структурированы, то есть одной из "оберточных проблем" - нечитабельного вывода - можно не опасаться. Более того, все создаваемые в ходе работы компилятора вспомогательные скрипты имеют аккуратные отступы, так что (при желании) в них всегда можно разобраться.
Из недостатков Shorewall нужно отметить некоторую потерю гибкости (по сравнению с использованием "чистых" iptables/iproute2 ) и, что более важно, статичность создаваемой конфигурации. Для внесения каких-либо изменений (скажем, добавлении правила фильтрации) нужно отредактировать соответствующие файлы (правда, это необязательно делать напрямую - Shorewall умеет выполнять подстановки переменных) и выполнить повторную компиляцию. В некоторых случаях это может быть неприемлемо.
В заключение этого вводного обзора хочу обратить внимание на еще одно преимущество Shorewall - превосходную документацию, как справочную, так и обучающую. В дистрибутиве можно найти заготовки конфигурационных файлов для типовых ситуаций: отдельная машина, шлюз, шлюз с DMZ. Исходя из этого обстоятельства, я не буду пытаться обогнать указанные ресурсы в плане подробности изложения, а постараюсь проиллюстрировать подходы к настройке Shorewall в ряде распространенных ситуаций.