Tips'n'tricks юниксоидаAndrey Matveev Хакер, номер #106, стр. 109 Доблестный юниксоид! Представляю твоему вниманию подборку различных трюков, рекомендаций и советов, касающихся фильтра пакетов pf. Блокируем широковещательные запросы и пакеты с фальсифицированным адресом источника: table <blacklist> { 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \ 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 224.0.0.0/3, \ 255.255.255.255/32 } block in quick on $ext_if inet from any to 255.255.255.255 block in log quick on $ext_if inet from <blacklist> to any Регистрируем заблокированные попытки соединения: block return log(all) Разрешаем прохождение ICMP-запросов: icmp_types = "{ echoreq, unreach }" pass inet proto icmp all icmp-type $icmp_types keep state Для корректной работы утилиты traceroute необходимо разрешить UDP-пакеты с портом назначения 33433-33626: pass out on $ext_if inet proto udp from any to any \ port 33433 >< 33626 keep state Вот так можно транслировать внутренние адреса в основные для двух внешних сетевых интерфейсов: nat on $ext_if_a inet from <users> to any -> ($ext_if_a:0) nat on $ext_if_b inet from <users> to any -> ($ext_if_b:0) За счет использования ключевого слова scrub можно производить нормализацию и дефрагментацию IPv4-пакетов, к примеру, так мы оставим nmap не у дел: scrub in Встроенный метод для борьбы с IP Spoofing'ом: antispoof log for { lo0, $int_if } inet Для того чтобы VoIP-телефон с IP-адресом 192.168.1.122 мог работать через шлюз *BSD/pf, следует добавить следующие правила: set timeout { udp.first 300, udp.single 150, udp.multiple 900 } nat on $ext_if proto udp from 192.168.1.122 to any -> $ext_if:0 static-port pass in quick on $ext_if inet proto udp from any to any \ port 5060 keep state pass out quick on $ext_if inet proto udp from { $ext_if:0, 192.168.1.122 } \ to any keep state pass in quick on $int_if inet proto udp from 192.168.1.122 \ to any keep state Чрезмерную активность ssh-брутфорсеров можно подавить, отслеживая максимальное количество подключений: table <sshbf> persist block in log quick on $ext_if inet from <sshbf> pass in log on $ext_if inet proto tcp to $ext_if port ssh keep state \ (max-src-conn-rate 5/60, overload <sshbf> flush global) Примечание: таблицу sshbf с IP-адресами злоумышленников можно периодически очищать: # crontab -e 0 7 * * 6 /sbin/pfctl -t sshbf -Tflush 2>/dev/null Интересующие тебя пакеты можно перенаправлять на псевдоинтерфейс pflog0: ext_if = "fxp0" set loginterface $ext_if Для просмотра журналов набирай: # tcpdump -netttr /var/log/pflog Для просмотра событий в режиме реального времени: # tcpdump -nettti pflog0 Пример простейшего учета трафика: для каждого правила добавляем метку (label) и периодически запускаем pfctl -sl: pass out log from <clients> to any port { 25, 110, 993, 995 } \ label client-email keep state При перенаправлении пакетов можно использовать диапазон портов: rdr on $ext_if proto tcp port 6000:7000 -> $target Для экономии динамически выделяемой памяти можно уменьшить значения тайм-аутов в таблице состояния соединений: set optimization aggressive Еще один небольшой оптимизационный трюк: можно отказаться от использования p0f (passive OS fingerprinting, пассивное определение версии операционной системы): set fingerprints "/dev/null" Несколько рекомендаций и замечаний одной строкой:
|