среда, 3 марта 2010 г.

PF для рабочей станции в локальной сети

Типичный конфиг (файл /etc/pf.conf) для пакетного фильтра рабочей станции:

#PF:2010-03-03
#-------------------
#1/Macros
# Сетевой интерфейс
ext_if="net0"
# Разрешенные типы icmp сообщений
allowed_icmp_types="{ echoreq, unreach }"
# Разрешённые сервисы
# 1. разрешить запросы к серверу NFS и RPCBIND только из локальной сети
# 2. обеспечить запуск с флагами mountd -p 883, rpc.lockd -p 884, rpc.statd -p 885 в rc.conf
# 3. выделенные порты для torrent и http/https/ssh-серверов доступны всем
allowed_lan_tcp_services="{ ssh, www, http, https, ntp, nfsd, rpcbind, 883, 884, 885, 6881:6991, 8080 }"
allowed_lan_udp_services="{ ntp, nfsd, rpcbind, 883, 884, 885, 6881:6991 }"
allowed_wan_tcp_services="{ ssh, www, 6881:6991, 8080, 8081 }"
allowed_wan_udp_services="{ ntp, 5501, 6881:6991 }"
#-------------------
#2/Tables
#-------------------
#3/Options
# ведение лога
#--set loginterface $ext_if
# тем, кто лезет туда, куда не нужно, - бить по рукам
set block-policy drop
# на интерфейсах петли пакеты не фильтровать
set skip on { lo }
# укороченный таймаут для состояния установленного tcp соединения
set timeout { frag 10, tcp.established 24000, icmp.first 10, icmp.error 5 }
#-------------------
#4/Scrub
# Нормализовать все входящие пакеты
scrub in all
#-scrub on $ext_if random-id max-mss 1452 reassemble tcp fragment reassemble
#-------------------
#5/Queueing
#-------------------
#6/Translations
# Перенаправить tcp трафик с порта 80 на порт 8080 для пользовательского Web-сервера
rdr proto tcp from any to any port http -> self port 8080
#-------------------
#7/Filter Rules
# Антиспуффинг
#-antispoof for $ext_if
# Блокировать всё, что не разрешено
block all
#-------------------
# Разрешить входящий ICMP (ping)
pass inet proto icmp all icmp-type $allowed_icmp_types
# Разрешить трафик IGMP для IP-TV
pass quick on $ext_if inet proto igmp from any to any allow-opts
# Разрешающий доступ откуда угодно (ограниченные службы)
pass in quick on $ext_if proto tcp to port $allowed_wan_tcp_services
pass in quick on $ext_if proto udp to port $allowed_wan_udp_services
# Разрешающий доступ из локальной сети (ограниченные службы)
pass in quick on $ext_if proto tcp from $ext_if:network to port $allowed_lan_tcp_services
pass in quick on $ext_if proto udp from $ext_if:network to port $allowed_lan_udp_services
# Разрешить исходящий трафик
pass out all


Проверка синтаксиса


% pfctl -nf /etc/pf.conf


Запуск в работу


% echo 'pf_enable="YES"' >> /etc/rc.conf
% echo 'pf_rules="/etc/pf.conf"' >> /etc/rc.conf
% pfctl -ef /etc/pf.conf


Проверка действующих правил и прочей статистики


% pfctl -sa


Выключение


% pfctl -d


Примечание касательно трансляции IP-TV

При запуске VLC, например, с URL-адресом такого вида udp://@239.1.1.28:5501 воспроизведение начнётся не сразу, а спустя примерно 45 секунд с момента нажатия на кнопку PLAY. Однако переключение на другие каналы будет происходить практически мгновенно.