В чём разница между мост-брандмауэром (bridging firewal) и обычным брандмауэром (межсетевой экран, firewall)? Обычный брандмауэр работает, как маршрутизатор: находящуюся за ним систему кофигурируют таким образом, чтобы из неё межсетевой экран был виден как шлюз во внешнюю сеть, а внешние маршрутизаторы конфигурируются так, чтобы видеть его как шлюз в защищенную сеть. Мост (bridge) -- это часть оборудования, соединяющая два (или более) сегмента сети вместе и просто перенаправляет пакеты в обе стороны. Другими словами, маршрутизатор соединяет две сети вместе и выполняет роль транслятора между ними; мост же похож на патч-кабель (patch cable), соединяющий две части одной сети вместе. Мост-брандмауэр действует как мост, но одновременно фильтрует проходящие пакеты, оставаясь невидимым для другой стороны.
Почему у вас может появиться желание использовать мост-брандмауэр? На ум сразу приходят две причины:
Вы можете подключить брандмауэр не изменяя существующую сетевую конфигурацию.
Вы можете защитить ту часть сети, в которой вы не имеете контроля над внешней маршрутизацией (external routing) в вашу сеть.
Моя проблема
У меня в офисе новое "с иголочки" ADSL соединение от Demon Internet (ISP в UK -- United Kingdom или Объединенное Королевство, официальное название Великобритании. Прим. ред.) с подсетью на 16 адресов (базовый, широковещательный, ip-адрес шлюза + 13 ip-адресов). По вине капризов и причуд UK-коммерции и "регулятивного окружения", линия и маршрутизатор были установлены и являются собственностью British Telecom plc., а оборудование для конфигурации маршрутизатора, как встроенного шлюза (internal gateway), отсутствует. Это оставляет мне две возможности:
Соединить каждый хост напрямую с ADSL и настроить iptables отдельно для каждого из них.
Использовать межсетевой экран с ip-маскарадингом для предоставления внешнему миру одного ip-адреса.
Первый вариант неприемлем с точки зрения безопасности. Рост числа iptable-конфигураций увеличивает вероятность ошибки и затраты на администрирование. Второй вариант тоже имеет свои недостатки. В то время, как почти все можно настроить и вполне успешно использовать под ip-маскарадингом, есть и исключения, в том числе некоторые технологии, которые я хотел бы исследовать, например VPN. Мост-брандмауэр может решить эти проблемы. Такой экран может располагаться за ADSL-маршрутизатором, выполнять часть его функций и защищать сеть без перекофигурирования самого маршрутизатора. Последняя оставшаяся проблема -- это то, что реализация межсетевого моста в стандартном ядре Linux не использует iptables, поэтому вы получаете машину, которая выполняет либо функции моста, либо межсетевого экрана, но не может являться и тем и другим одновременно.
Решение
К счастью есть проект, позволяющий машине выполнять функции моста (bridging) в связке с iptables так, что любые проходящие через мост пакеты должны подчиняться правилам iptables. В результате получаем полностью прозрачный для сети межсетевой экран не требующий специальной маршрутизации. В том, что касается Интернета, такой брандмауэр никак себя не проявляет за исключением случая, когда определённые соединения блокируются. Программное обеспечение представляет собой накладываемую на ядро "заплатку" (патч, patch), позволяющую существующему коду сетевого моста работать внутри iptables. Для удобства разработчиками создан rpm-пакет с ядром (для RedHat 7.2) с уже установленной заплаткой. Хуже то, что использование этого патча мало документировано, поэтому я и подумал о том, чтобы восполнить этот пробел (в помощь собравшихся пойти по этому пути).
Функционирование моста (bridging) и маршрутизация -- как это работает
Если кратко, то мост работает связывая два или более сетевых интерфейса. Производя мониторинг активности во всех подключённых сегментах сети, код реализации моста "выучивает" MAC-адреса, до которых можно "достучаться" с каждого интерфейса и использует эту информацию для принятия решения о том, куда отправлять тот или иной пакет. Интерфейсы, подключенные к мосту обычно не имеют ассоциированных с ними ip-адресов , но, в целом, с точки зрения межсетевого экрана, мост представляет собой единый интерфейс.
Рисунок: прохождение пакетов при включенном межсетевом экране.
Топология сети
Мои статические адреса расположены в диапазоне xxx.xxx.xxx.48-63, маска подсети -- 255.255.255.240. Я решил разделить этот диапазон на два сегмента: диапазон xxx.xxx.xxx.48-56 будет использоваться для сети, расположенной перед сетевым экраном и включать в себя ip-адрес ADSL-маршрутизатора (xxx.xxx.xxx.49). Диапазон xxx.xxx.xxx.57-62 предназначен для сети, расположенной за межсетевым экраном. Учтите, что это не настоящие подсети, поскольку они соединены при помощи моста, а не маршрутизатора.
Рисунок: Топология сети
Правила для межсетевого экрана
Пример скрипта с правилами для межсетевого экрана очень похож на скрипт настройки обычного брендмауэра (он списан с Oskar Andreasson's iptables tutorial). Основные правила следующие:
Блокировать пакеты с нежелаемых ip-адресов.
Разрешать любые исходящие соединения из внутренней сети.
Разрешать прохождение пакетов принадлежащих уже установленным соединениям.
Разрешать соединения с указанными портами и хостами, расположенными снаружи.
Объявление переменных
Для понимания и простоты обслуживания, хорошей идеей будет использовать в качестве имён интерфейсов и ip-адресов переменные. Значения, используемые в описываемых примерах следующие:
IP_TABLES=/sbin/iptables
BR_IP="xxx.xxx.xxx.57" BR_IFACE=br0 LAN_BCAST_ADDRESS="xxx.xxx.xxx.63" INTERNAL_ADDRESS_RANGE="xxx.xxx.xxx.56/29" INET_IFACE="eth1" LAN_IFACE="eth0" LO_IFACE="lo" LO_IP="127.0.0.1"
"xxx.xxx.xxx" представляет собой первые три байта ip-адреса. $INTERNAL_ADDRESS_RANGE содержит адрес сегмента сети, расположенного за межсетевым экраном.
Настройка моста
Теперь мы должны произвести несколько обычных настроек. Во-первых, мы отключим наши два интерфейса и удалим их ip-адреса.
ifdown $INET_IFACE ifdown $LAN_IFACE ifconfig $INET_IFACE 0.0.0.0 ifconfig $LAN_IFACE 0.0.0.0
Если вы только что выполнили эти команды по telnet'у или через ssh-соединение, то встаньте и перейдите к консоли вашего брандмауэра:).
Следующей командой мы создаём мост и присоединяем к нему ethernet-интерфейсы.
brctl addbr $BR_IFACE brctl addif $BR_IFACE $INET_IFACE brctl addif $BR_IFACE $LAN_IFACE
Теперь, если вы хотите, то можете поднять мост как внутренний интерфейс,
ifconfig $BR_IFACE $BR_IP
Блокирование спуфинга
Мы можем блокировать пакеты со злонамеренно измененными адресами (spoofed) ещё на уровне цепочки преобразований [mangle] PREROUTING. Здесь мы можем одновременно захватить как входящие (INPUT) так и транзитные (FORWARDED) пакеты. Предпочтительнее использовать mangle PREROUTING, чем nat PREROUTING, потому что при передаче в nat таблице на соответствие ip-адреса и имени хоста проверяется только первый пакет.
Эта строка гарантирует, что только пакеты с правильными внутренними адресами ($INTERNAL_ADDRESS_RANGE) будут приняты внутренним интерфейсом ($LAN_IFACE):
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $INTERNAL_ADDRESS_RANGE -j ACCEPT
А эта цепочка предотвратит принятие пакетов с внутренними адресами ($INTERNAL_ADDRESS_RANGE) внешним интерфейсом ($INET_IFACE):
$IPTABLES -t mangle -A PREROUTING -i $INET_IFACE ! -s $INTERNAL_ADDRESS_RANGE -j ACCEPT
Доступ к сетевому экрану из внутренней сети
Можно сделать межсетевой экран полностью невидимым в сети или, ради удобства, разрешить соединения из него. Эти команды разрешат все соединения из внутренней сети. В зависимости от степени вашего доверия к пользователям локальной сети, вы можете быть более избирательным.
$IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $LAN_BCAST_ADDRESS -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $BR_IP -j ACCEPT
Помните, что пакеты из диапазона $INTERNAL_ADDRESS_RANGE, которые пришли на неправильный интерфейс, вы уже уничтожили.
Дополнительная информация
Патч на ядро, без которого правила iptables работать не будут.
Рекомендую прочесть iptables tutorial от Oskar Andreasson.
Для лучшего понимания пакетной фильтрации и работы в сети попробуйте также почитать Rusty's Remarkably Unreliable Guides .
Sparkle Home Page (сайт компании автора)
Благодарности
Спасибо за действительно полезный патч и замечание по этой статье.
David Whitmarsh
David Whitmarsh -- независимый консультант, его компания, Sparkle Computer Co Ltd, обслуживает главным образом финансовые организации в Лондоне. При наличии четырех детей время становится большой ценностью, и единственная для Дейвида возможность поработать с Linux и свободным софтом -- работа на лаптопе во время ежедневных поездок из Sussex'а.