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

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

Andrey Matveev

Хакер, номер #079, стр. 079-100-3


block in log quick on $ext_if inet from $unroutable to any

/* Блокируем и регистрируем попытки сканирования */

block in log quick on $ext_if from any os NMAP

/* На этих интерфейсах пропускаем пакеты */

pass quick on { lo0, $int_if } all

/* Еще один метод борьбы с IP Spoofing'ом */

antispoof log for lo0 inet

/* Осторожно отвечаем на эхо-запросы */

pass in on $ext_if inet proto icmp from any to any icmp-type 8 code 0 keep state (max 32)

pass out on $ext_if inet proto icmp from any to any icmp-type 8 code 0 keep state

/* пропускаем весь исходящий UDP-трафик */

pass out on $ext_if inet proto udp from any to any keep state

/* Чтобы получить качественно сгенерированные ISN-числа, включаем модуляцию для исходящих TCP-соединений (так мы становимся менее уязвимыми для атак типа TCP Hijacking); применив модуляцию для входящих TCP-соединений, можно успешно противостоять ACK-наводнениям */

pass out on $ext_if inet proto tcp from any to any flags S/SA modulate state

За счет использования ключевого слова scrub производится нормализация и дефрагментация IP-пакетов (замечание: пересборка фрагментов производится только для IPv4-пакетов, и только если явно не указан параметр no-df в случае, когда необходимо пробросить NFS-трафик через файрвол). Правило вида «scrub on $ext_if all fragment reassemble» отбрасывает пакеты с недопустимыми комбинациями флагов (например SYN и FIN или SYN и RST), тем самым вводя в заблуждение сканеры портов ala Nmap. Помимо «fragment reassemble», директива scrub обладает еще несколькими заслуживающими внимания опциями:

random-id — позволяет генерировать случайные идентификаторы в заголовке IP-пакета;

min-ttl значение — устанавливает минимальное значение времени жизни в заголовке IP-пакета;

max-mss значение — устанавливает максимальный размер сегмента в заголовке IP-пакета (например, правило «scrub out on pppoe0 max-mss 1440» идеально для ADSL);

reassemble tcp — усложняет выяснение аптайма хоста, расположенного за NAT'ом, а также запрещает понижать TTL как инициатору соединения, так и адресу назначения (мы же не хотим, чтобы наш бридж так просто обнаружили).

Для тестирования некоторых правил файрвола можно воспользоваться пассивным фингерпринтингом lcamtuf.coredump.cx/p0f-help/. Приведу пример для обычного, непрозрачного бриджа под управлением OpenBSD 3.6-STABLE (pf с опциями scrub и nat):

my.real.ip.addr:52566 - OpenBSD 3.0-3.4 (up: 494 hrs) Signature:

[16384:48:1:64:M1460,N,N,S,N,W0,N,N,T:.] ->

213.134.128.25:80 (distance 16, link: ethernet/modem)

Отчет онлайновой утилиты после включения "reassemble tcp":

my.real.ip.addr:60512 - OpenBSD 3.0-3.4 (up: 8850 hrs) Signature:

[16384:48:1:64:M1460,N,N,S,N,W0,N,N,T:.] ->

213.134.128.25:80 (distance 16, link: ethernet/modem)

С конфигурированием закончили. Парсим файл с рулесетами на предмет возможных ошибок:

# pfctl -n -f /etc/pf.conf

И активируем новые правила:

# pfctl -f /etc/pf.conf

[прозрачность во всем]

Невероятно, но факт: на одном хосте *можно* совместить транспарентный мост и транспарентную проксю. Сложность заключается вот в чем: ввиду специфики сетевой модели (разные уровни OSI) пакеты, которые форвардит с одного интерфейса на другой прозрачный мост, просто не доходят до IP-стека операционной системы. Соответственно, правила перенаправления (rdr) не будут работать для пакетов, не адресованных бриджу. Поэтому одного редиректа недостаточно: нужно роутить (route-to) входящие www-запросы на интерфейс обратной петли. Если перейти на язык конфигов, ларчик открывается следующим образом:

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