Файрвол-невидимка Andrey Matveev Хакер, номер #079, стр. 079-100-2 Также (для чистоты эксперимента и остроты ощущений) приведу вариант с ADSL LAN-модемом и беспроводным клиентом: --[ ISP_ADSL ]-----(fxp0)[ BRIDGE ](ral0) - - - [ LAPTOP ] Последовательно поднимаем сетевые интерфейсы: # echo up > /etc/hostname.fxp0 # echo up > /etc/hostname.fxp1 В случае с Wi-Fi адаптером (здесь Gigabyte GN-WPKG 802.11 b/g выступает в качестве точки доступа) команда будет выглядеть так: # echo 'up media autoselect mode 11g mediaopt hostap nwid wlan chan 11' > /etc/hostname.ral0 Создаем транспарентный бридж: # echo 'add fxp0 add fxp1 up' > /etc/bridgename.bridge0 Для проверки работоспособности разрешаем прохождение всех пакетов без ограничений: # echo 'pass quick on { lo0, fxp1, fxp0 } all' > /etc/pf.conf Правим конфигурационный файл /etc/rc.conf, содержащий параметры загрузки демонов при старте системы: # vi /etc/rc.conf /* В сетевых службах нет надобности, мы просто не сможем ими воспользоваться */ sshd_flags=NO sendmail_flags=NO portmap=NO inetd=NO /* Включаем фильтр пакетов */ pf=YES pf_rules=/etc/pf.conf Все. На этом настройка закончена, перезагружаемся: # shutdown -r now [на уровень выше] Существует две немаловажные особенности, относящиеся ко всем видам бриджей (обычному, при котором каждому сетевому интерфейсу соответствует свой IP-адрес; полупрозрачному — установлен хотя бы один IP-адрес; прозрачному — наш случай, в котором нет ни одного IP-адреса). Во-первых, пакеты проходят через псевдоустройство pf дважды. Такое поведение обусловлено тем, что бридж перенаправляет пакетики с одного сетевого интерфейса на другой (примечание: в файле /etc/sysctl.conf нет необходимости устанавливать значение переменной net.inet.ip.forwarding равным 1). Поэтому нужно пропускать весь трафик на внутреннем интерфейсе, а фильтрацию производить только на внешнем. Либо наоборот: фильтровать на внутреннем, пропускать на внешнем. Кому как проще мысленно представлять маршруты прохождения пакетов. И, во-вторых, в разрешающих правилах (pass) в обоих направлениях (in/out) на фильтруемом интерфейсе (в нашем случае fxp0) для сохранения состояния соединений необходимо использовать сочетание «keep state». # vi /etc/pf.conf /* Объявляем макросы */ ext_if = "fxp0" int_if = "fxp1" unroutable = "{ 127/8, 10/8, 172.16/12, 192.168/16, 255.255.255.255/32 }" /* Предмет отдельного разговора, см. ниже */ scrub on $ext_if all random-id reassemble tcp fragment reassemble /* Запрещаем трансляцию адресов (паранойя, так как NAT на транспарентном бридже все равно не будет работать) */ no nat on { lo0, $int_if, $ext_if } from any to any /* Применяем политику запрета по умолчанию */ block all block inet proto tcp block inet proto udp /* Блокируем и регистрируем соединения по протоколам IPv6 и IGMP */ block in log quick inet6 all block out log quick inet6 all block in log quick proto igmp all block out log quick proto igmp all /* Блокируем широковещательные запросы и пакеты с фальсифицированным адресом источника */ block in quick on $ext_if inet from any to 255.255.255.255 |