Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #79, ИЮЛЬ 2005 г.

Файрвол-невидимка

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

Назад на стр. 079-100-1  Содержание  Вперед на стр. 079-100-3