Конфиг PF для Web-сервера

Что такое pf и с чем его едят здесь я описывать не буду, приведу лишь рабочий конфиг для Web-сервера, если кому пригодиться - хорошо =)


### Макросы (определение интерфейсов и списков)

###Внешний интерфейс (предполагается что внутреннего интерфейса нет)
ext_if = "rl0" 

###Типы разрешенных ICMP запросов (эхо-запрос, например traceroute и хост выключен)
icmp_types="{ echoreq, unreach }" 

###Адреса с которых возможно подцепиться к серверу
admin="{10.10.100.20 , 10.10.100.30}"


### Весь входящий трафик подвергаем нормализации и дефрагментации
set timeout { interval 10, frag 30 }
set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 }
set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, other.multiple 60 }
set timeout { adaptive.start 0, adaptive.end 0 }
set limit { states 15000, frags 30000 }
set optimization normal

###Сбрасываем все соединения
set block-policy drop

###Указываем системе, где находится файл с определениями отпечатков (fingerprints) 
###для различных операционных систем
set fingerprints "/etc/pf.os"
set require-order yes

###Интерфейс для логирования
set loginterface rl0

###Вычищаем входящий трафик
scrub in on $ext_if all fragment reassemble


### Блокируем все отовсюду с записью в лог
block log all

###Полностью пропускам проверку на петле
set skip on lo0

#Блокируем спуфинг (подмену IP-адреса) на внешнем интерфейсе
antispoof for $ext_if inet

### Блокируем пакеты не имеющие обратных маршрутов.
block in from no-route to any

### Блокируем пакеты не прошедшие проверку по таблице маршрутизации 
block in from urpf-failed to any

### Блокируем броадкастовые пакеты
block in quick on $ext_if from any to 255.255.255.255

### Блокируем пакеты пришедшие с зарезервированных под частные сети диапазонов 
###адресов
block in log quick on $ext_if from { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 
255.255.255.255/32 } to any

### Блокируем тех, кто хочет определить тип нашей операционной системы используя 
###сканеры типа NMAP
### * F : FIN  - Finish; end of session
### * S : SYN  - Synchronize; indicates request to start session
### * R : RST  - Reset; drop a connection
### * P : PUSH - Push; packet is sent immediately
### * A : ACK  - Acknowledgement
### * U : URG  - Urgent
### * E : ECE  - Explicit Congestion Notification Echo
### * W : CWR  - Congestion Window Reduced
block in quick on $ext_if proto tcp flags FUP/WEUAPRSF
block in quick on $ext_if proto tcp flags WEUAPRSF/WEUAPRSF
block in quick on $ext_if proto tcp flags SRAFU/WEUAPRSF
block in quick on $ext_if proto tcp flags /WEUAPRSF
block in quick on $ext_if proto tcp flags SR/SR
block in quick on $ext_if proto tcp flags SF/SF

### Пропускаем все пакеты (tcp и udp) от нашего сервера наружу
pass out on $ext_if proto { tcp, udp} from any to any modulate state

##Разрешаем ICMP только для нужных нам адресов (ибо нефик)
pass in log on $ext_if inet proto icmp from $admin to $ext_if icmp-type $icmp_types

### открываем ssh для нужных нам адресов (для администрирования) на 
###нестандартном порту
pass in on $ext_if proto tcp from $admin to $ext_if port 2843 flags S/SA synproxy state

### Разрешаем http и https для доступа к нашему web-серверу.
pass in on $ext_if proto tcp from any to $ext_if port 80 flags S/SA synproxy state
pass in on $ext_if proto tcp from any to any port 443 flags S/SA synproxy state

### Разрещаем 110 и 25 (pop3 и smtp)порты для доступа к нашему почтовому серверу
pass in on $ext_if proto tcp from any to $ext_if port 110 flags S/SA synproxy state
pass in on $ext_if proto tcp from any to $ext_if port 25 flags S/SA synproxy state

#### Разрешаем соединяться с нашим FTP сервером
pass in on $ext_if proto tcp from any to $ext_if  port {20,21,49152:65535} 
flags S/SA synproxy state

### Разрешаем соединяться по SNMP с определнных адресов, для мониторинга 
###состояния сервера
pass in inet proto udp from $home to $ext_if port {161,162} keep state

Также интересно:

 

Немного справочной информации:
 
Управление pf -
# pfctl-e - запуск сервера
# pfctl-d - остановка сервера
# pfctl -f /etc/pf.conf загрузить pf.conf
# pfctl -nf /etc/pf.conf анализировать файл, но не загружать
# pfctl -Nf /etc/pf.conf загрузить только правила NAT из файла
# pfctl -Rf /etc/pf.conf загрузить только правила фильтрации
# pfctl -sn показать текущие правила NAT
# pfctl -sr показать текущие правила фильтрации
# pfctl -ss показать текущее состояние таблиц
# pfctl -si показать статистику правил и состояние счетчиков
# pfctl -sa показать все
 
Для полного списка команд смотрите man pfctl(8).
 
Просмотр логов pf - 
tcpdump -n -e -ttt -r /var/log/pflog
Интересное на сайте: 
5
Ваша оценка: Нет Средняя: 5 (1 оценка)

Комментарии

### Блокируем тех, кто хочет определить тип нашей операционной системы используя
###сканеры типа NMAP
я бы делал:
block in quick proto tcp flags FUP/WEUAPRSF
вместо 
block in quick on $ext_if proto tcp flags FUP/WEUAPRSF
 

А где правило NAT?

А что Вы собрались "натить" на веб-сервере?