Шаблон правил PF

Опубликовано – 15.12.2010

Небольшой шиблон для использования в личных целях.

 Входящие данные:
 Скорость канала 10мб/с, сделан статический PAT для www_server и bittor_server, SSH на внешний адрес.

 Порядок установки описан тут, но в принципе ничего сложного, для рутера на базе Pentium-200MMX, достаточно всё разместить в одной партиции /.

 В процессе установки предложить настроить сетевые интерфейсы, но если этого не сделать, то после загрузки необходимо подправить содержимое файликов:


$ cat /etc/hostname.fxp0
inet 77.77.77.77 255.255.255.0 NONE

 Где fxp0 имя сетевого интерфейса, адрес, маска и автоматически определяемый бродкаст. Маршрут по умолчанию прописывается в файл /etc/mygate. Имя машины, включая домен (FQDN) прописывается в /etc/myname.

 Если необходимо прописать статические маршруты (мне это требуется), то необходимо добавить строки:


$ cat /etc/hostname.fxp1
inet 192.168.2.1 255.255.255.0 NONE
!route add -net 192.168.100.0/24 192.168.2.2

Для включения маршрутизации необходимо поместить в /etc/sysctl.conf строку net.inet.ip.forwarding=1 и/или выполнить команду:


# sysctl net.inet.ip.forwarding=1

 После настройки надо перезагрузиться или выполнить команду:


# sh /etc/netstart

 Для работы PF необходимо в /etc/rc.conf.local добавить строки:


pf=YES
pf_rules=/etc/pf.conf
ftpproxy_flags=""

 Краткая шпаргалка по командам PF:
# pfctl -f /etc/pf.conf — Загрузить файл конфигурации pf.conf
# pfctl -nf /etc/pf.conf — Проверить файл конфигурации, но не загружать

# pfctl -sr — Показать текущий загруженный набор
# pfctl -ss — Показать текущую таблицу состояний
# pfctl -si — Показать счетчики
# pfctl -sa — Показать все, что можно

Можно запустить процесс FTP-Proxy вручную, командой:

/usr/sbin/ftp-proxy

 Содержимое /etc/pf.conf. Внимание! Этот синтаксис подойдет только для PF с OpenBSD до версии 4.7 включительно (для 4.8 смотри пример ниже):


#######################################################
# Macros
#######################################################

ext_if="xl0"
int_if="fxp0"
dmz_if="rl0"

icmp_types = "{ echoreq, echorep, unreach }"

# Hosts & Network
my_net = "192.168.2.0/24"
private_lan = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"
www_server = "192.168.2.2"
bittor_server = "192.168.2.3"

# Antiscan
SynState="flags S/SAFR synproxy state"
AntiScanPort="{23:79, 6000:8000}"

#######################################################
# Options
#######################################################

set debug urgent
set require-order yes
set block-policy drop
set loginterface $ext_if
set state-policy if-bound
set fingerprints "/etc/pf.os"
set ruleset-optimization none
set skip on lo

# Antiscan
AntiScanSTO ="(max 60, source-track rule, max-src-conn 1, max-src-nodes 60, max-src-conn-rate 5/60, overload flush global)"

#######################################################
# Table
#######################################################

table persist

#######################################################
# ALTQ
#######################################################

altq on $ext_if priq bandwidth 10000Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)

#######################################################
# NAT Rules
#######################################################

nat on $ext_if from $my_net to any -> ($ext_if)
nat-anchor "ftp-proxy/*"

#######################################################
# Redirect Rules
#######################################################

rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021

# RDR for WWW server
rdr on $ext_if proto tcp from any to any port 80 -> $www_server
# RDR for Bittor server
rdr on $ext_if proto { tcp, udp } from any to any port 9996 -> $bittor_server

#######################################################
# Scrub
#######################################################

match in all scrub (no-df max-mss 1452)

#######################################################
# Block/Pass Rules
#######################################################

# Incoming rule
block all
# Block non-routable addresses from elsewhere
#block drop in quick on $ext_if from $private_lan to any
#block drop out quick on $ext_if from any to $private_lan
# Antiscan
block in quick on $ext_if from to any

# Antispoofing
antispoof for {lo $int_if}

# FTP
anchor "ftp-proxy/*"

# ICMP
pass inet proto icmp all icmp-type $icmp_types keep state

#
# PASS IN EXTERNAL
#

# ALTQ ACK
pass in on $ext_if proto tcp from any to $ext_if flags S/SA keep state queue (q_def, q_pri)

# SSH Access to Sentinel
pass in on $ext_if inet proto tcp from any to ($ext_if) port ssh flags S/SA keep state
pass in on $ext_if inet proto tcp from any to any port ssh modulate state (source-track rule max-src-nodes 8 max-src-conn 8 max-src-conn-rate 3/60)

# Access to bittor
pass in on $ext_if inet proto { tcp, udp } from any to $bittor_server port 9996 flags S/SA synproxy state queue (q_def, q_pri)

# Access to WWW server
pass in on $ext_if inet proto tcp from any to $www_server port 80 flags S/SA syn proxy state queue (q_def, q_pri)

# Antiscan
pass in on $ext_if inet proto tcp from any to any port $AntiScanPort $SynState $AntiScanSTO

#
# PASS OUT EXTERNAL
#

# Allow outgoing traffic to do as it pleases
pass out on $ext_if proto { udp, icmp } all keep state
pass out on $ext_if proto tcp from $ext_if to any flags S/SA keep state queue (q_def, q_pri)

#
# PASS LAN Interface
#

# Allow LAN to do anything
pass in on $int_if from $int_if:network to any keep state

#
# DMZ
#

pass in on $dmz_if inet proto tcp from any to any port ssh modulate state (source-track rule max-src-nodes 8 max-src-conn 8 max-src-conn-rate 3/60) queue(q_def, q_pri)

 Правила для PF OpenBSD 4.8 (не идентичны верхнему примеру — нет PAT/NAT внутренних сервисов, нет DMZ, WAN через tun0):


#######################################################
# Macros
#######################################################

ext_if="tun0"
int_if="vr0"

icmp_types = "{ echoreq, echorep, unreach }"

# Hosts & Network
my_net = "{ 10.79.0.0/23, 10.79.225.2/30, 10.77.1.99, 10.77.1.33 }"
private_lan = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

# Antiscan
SynState="flags S/SAFR synproxy state"
AntiScanPort="{23:79, 6000:8000}"

#######################################################
# Options
#######################################################

set debug urgent
set require-order yes
set block-policy drop
set loginterface $ext_if
set state-policy if-bound
set fingerprints "/etc/pf.os"
set optimization high-latency
set ruleset-optimization basic
set skip on lo

# Antiscan
AntiScanSTO ="(max 60, source-track rule, max-src-conn 1, max-src-nodes 60, max-src-conn-rate 5/60, overload flush global)"

#######################################################
# Table
#######################################################

table persist

#######################################################
# ALTQ
#######################################################

altq on $ext_if priq bandwidth 1999Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)

#######################################################
# NAT Rules
#######################################################

match out log on egress from (self) to any tag EGRESS nat-to ($ext_if:0)
match out log on $ext_if from $my_net to any nat-to ($ext_if:0)

#######################################################
# Scrub
#######################################################

match in all scrub (no-df max-mss 1452)

#######################################################
# Block/Pass Rules
#######################################################

# Incoming rule
block all
block in on ! lo0 proto tcp to port 6000:6010

# Block non-routable addresses from elsewhere
block drop in quick on $ext_if from $private_lan to any
block drop out quick on $ext_if from any to $private_lan

# Antiscan
block in quick on $ext_if from to any

# Antispoofing
antispoof for {lo $int_if}

# FTP
anchor "ftp-proxy/*"

# ICMP
pass inet proto icmp all icmp-type $icmp_types keep state

#
# PASS IN EXTERNAL
#

# ALTQ ACK
pass in on $ext_if proto tcp from any to ($ext_if) flags S/SA keep state queue (q_def, q_pri)

# SSH Access to Sentinel
pass in on $ext_if inet proto tcp from any to ($ext_if) port ssh flags S/SA keep state
pass in on $ext_if inet proto tcp from any to any port ssh modulate state (source-track rule max-src-nodes 8 max-src-conn 8 max-src-conn-rate 3/60)

# Antiscan
pass in on $ext_if inet proto tcp from any to any port $AntiScanPort $SynState $AntiScanSTO

#
# PASS OUT EXTERNAL
#

# Allow outgoing traffic to do as it pleases
pass out on $ext_if proto { udp, icmp } all keep state
pass out on $ext_if proto tcp from ($ext_if) to any flags S/SA keep state queue (q_def, q_pri)

#
# PASS LAN Interface
#

# Allow LAN to do anything
pass in on $int_if from $my_net to any keep state

 Краткая шпаргалка по опциям:

set block-policy option — реакция на действие block
drop — молча убить пакет
return — отправить TCP RST для блокированного TCP пакета и ICMP Unreachable для всех остальных

set optimization option — оптимизация под конкретные условия
normal — подходит для большинства сетей
high-latency — сети с большой задержкой, например спутниковое соединение
aggressive — агрессивное удаление соединений из таблицы состояний. Уменьшает требования к памяти на нагруженных системах и снижает риск отброса соединения.
conservative — очень консервативные настройки. Требует памяти и процессорного времени.

set ruleset-optimization option — оптимизация правил
none — отключить
basic — делать так:
— удалять дублирующие правила
— удалять правила, являющиеся поднаборами других правил
— комбинировать правила в таблицы, если это возможно
— переупорядочивать правила, для повышения производительности
profile — использовать загруженный набор правил в качестве профиля для упорядочивания правил quick для сетевого трафика

 Просмотреть результат работы правил, содержащих ключевое слово log можно командой:

tcpdump -netttr /var/log/pflog

 Если Вы обнаружили ошибку в правилах, сообщите мне пожалуйста.
 Стоит почитать:
 OpenBSD Pf Firewall «how to» ( pf.conf )
 Настройка PPPoE-клиента с помощью pppoe(8)
 Опции PF
 Крайнее изменение: 16.02.2011

 Некоторые уточнения:

  • Если нужна скорость, то вместо списков IP-адресов лучше использовать таблицы
  • Если нужна скорость, то убрать строку set ruleset-optimization none
  • Некоторые правила можно убрать или объединить




 Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!

5 комментариев в Шаблон правил PF

  1. Masty:

    КМК в статье в тексте правил табличка ушла.

    > table persist ????
    и в антискане:

    ># Antiscan
    >block in quick on $ext_if from ??????? to any

  2. Mixa:

    Ой-ой-ой! Поправил, спасибо.

  3. stas:

    народ объясните как написать правило проброса?

  4. Mixa:

    Проброса чего куда? NAT, PAT?

  5. ttys:

    rinetd проброс портов, если не хочешь с редиректами заморачиватся., но всё равно надо будет открывать то, что пробробрасывать собрался =)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*