Небольшой шиблон для использования в личных целях.
Входящие данные:
Скорость канала 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 <BLACKLIST> flush global)"
#######################################################
# Table
#######################################################
table <BLACKLIST> 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 <BLACKLIST> 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 <BLACKLIST> flush global)"
#######################################################
# Table
#######################################################
table <BLACKLIST> 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 <BLACKLIST> 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
- Некоторые правила можно убрать или объединить
[ad name=»Google Adsense»]
Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!
КМК в статье в тексте правил табличка ушла.
> table persist ????
и в антискане:
># Antiscan
>block in quick on $ext_if from ??????? to any
Ой-ой-ой! Поправил, спасибо.
народ объясните как написать правило проброса?
Проброса чего куда? NAT, PAT?
rinetd проброс портов, если не хочешь с редиректами заморачиватся., но всё равно надо будет открывать то, что пробробрасывать собрался =)