1

Тема: FreeBSD + PF + Ограничение доступа

Хочу написать правила для PF которые должны делать следующее:

  • открывать только нужные порты TCP & UDP

  • раздавать интернет только конкретным IP в локалке, остальные должны просто сидеть в локалке без инета.

  • Различного рода защиту от DDOS и прочего спама.

Вот с помощью интернета набросал что-то по кусочкам, но почему-то оно не закрывает порты.

ext_if = "nfe0"     ## внешний интерфейс
int_if = "rl0"     ## локальный интерфейс
lan="192.168.1.0/24"## локальная подсеть
## tcp порты использующиеся на сервере
tcp_services="{ 20, 21, 22, 25, 80, 53, 110, 143, 443, 3306, 8080 }"
## udp порты использующиеся на сервере
udp_services="{ 53, 514 }"
## разрешенные icmp типы запросов
icmp_types="{ echoreq, unreach}"
## таблица куда заносим уродов ддосеров
table <ddos> persist
## таблица уродов для pop3, которые долбятся на почту 
table <pop3> persist
##сбрасываем соединение грубо
set block-policy drop
## полностью пропускаем проверку на петле 
set skip on lo0
## полностью пропускаем проверку на интерфейсе
set skip on $int_if
## включаем логирование на интерфейсе
set loginterface $ext_if
## оптимизация
set optimization normal
## нормализуем все входящие пакеты на всех интерфейсах
scrub in all
scrub on $ext_if all reassemble tcp
## проброс NAT внутри сеть
nat on $ext_if from $lan to any -> $ext_if
## правило для антиспуфинга
antispoof quick for $ext_if
## политика по умолчанию
block all
## разрешаем петлю
pass quick on lo0 all
## блочим всех кто попался в таблицу ddos
block in quick on $ext_if from <ddos> to any
## разрешаем с внешки ломится на разрешенные tcp порты
pass in on $ext_if proto tcp from any to $ext_if port $tcp_services flags S/SA keep state
## чистим траф www от SYN flood
pass in on $ext_if proto tcp from any to $ext_if port www flags S/SA synproxy state
## www режим тех кто превысил лимиты и ложим в таблицу
pass in on $ext_if proto tcp to $ext_if port www flags S/SA keep state \(max-src-conn-rate 5/2, overload <ddos> flush)
## ftp режим тех кто превысил лимиты и ложим в таблицу
pass in on $ext_if proto tcp to $ext_if port ftp flags S/SA keep state \( max-src-conn 400, max-src-conn-rate 400/2, overload <ddos> flush)
## флюшкаем уродов по лимитам которые ломятся безможно на почту
pass in on $ext_if proto tcp from any to $ext_if port pop3 flags S/SA keep state (max-src-conn-rate 15/60, overload <pop3> flush)
## пропускаем udp на разрешенные порты
pass in on $ext_if proto udp from any to $ext_if port $udp_services keep state
## разрешаем только некоторые типы icmp
pass in on $ext_if inet proto icmp all icmp-type $icmp_types keep state
## разрешаем 20 порт для ftp
pass in quick on $ext_if proto tcp from any to any port 20 flags S/SA keep state
## разрешаем 21 порт для ftp
pass in quick on $ext_if proto tcp from any to any port 21 flags S/SA keep state
## разрешаем порты выше 49151 для passive FTP mode
pass in quick on $ext_if proto tcp from any to any port > 49151 keep state
## разрешаем все модуляции для исходящих tcp соединений 
pass out on $ext_if proto tcp all modulate state flags S/SA
## разрешаем исходящие протоколы
pass out on $ext_if proto { tcp, udp, icmp } all keep state

2

Re: FreeBSD + PF + Ограничение доступа

вы указали порты 20,21 в списке разрешенных портов и потом еще отдельно правила указываете. Подозреваю, что правила фтп не сработают, потому что до них не дойдет, а значит и смысла в них нет