Файрвол-невидимка 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-запросы на интерфейс обратной петли. Если перейти на язык конфигов, ларчик открывается следующим образом: |