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

Tips'n'tricks юниксоида

Andrey Matveev

Хакер, номер #106, стр. 109

(andrushock@real.xakep.ru)

Доблестный юниксоид! Представляю твоему вниманию подборку различных трюков, рекомендаций и советов, касающихся фильтра пакетов 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"

Несколько рекомендаций и замечаний одной строкой:

  • Формирование очередей (queueing) и генерирование случайных идентификаторов в заголовке IPv4-пакета (параметр random-id директивы scrub) имеет смысл использовать только для исходящих пакетов.
  • Для переключения pf в режим вывода отладочной информации запусти pfctl -xm и проверяй /var/log/messages.
  • Authpf автоматически создает макросы $user_ip и $user_id.
  • Scrub-опции fragment crop и fragment drop-ovl не работают с NAT.
Содержание