Openbsd pf огляд правил

Вимкнення pf з консолі
pfctl -d

Включення pf з консолі
pfctl -e

Застосування правил pf з файлу
pfctl -f /etc/pf.conf

включення pf
/etc/rc.conf.local
pf = YES # enable PF

Включення маршрутизації пакетів з консолі, при перезавантаженні скасовується
sysctl net.inet.ip.forwarding = 1
sysctl net.inet6.ip6.forwarding = 1

Включення маршрутизації пакетів на постійній основі
/etc/sysctl.conf
net.inet.ip.forwarding = 1
net.inet6.ip6.forwarding = 1

Починаючи з OpenBSD з 4.1 до правил за замовчуванням застосовується опція keep-state
Для відмови відповідати на них, динамічних правил, додайте правилом no state

Загальний синтаксис правил
action direction quick on interface inet proto protocol from src_addr to dst_port

1. action: дозволити (pass) або блокувати (block) передачу пакета

2. direction: напрямок проходження пакета входить (in) \ вихідний (out)

3. quick: ключове слово, пакет співпадає з правилом застосовується негайно, правило вважається останнім у ланцюжку

4. on interface: вказати мережевий інтерфейс

5. inet: inet - протокол IPv4 \ inet6 - протокол IPv6

6. proto: вказівка ​​протоколів tcp, udp, icmp, icmp6

8. to dst_port: порт призначення пакета

Дозволяємо проходження ssh
pass in quick on de0 proto tcp to port 22
або так
pass in quick on de0 proto tcp to port ssh

Дозволяємо ICMP ехо запити (keep state - відстеження з'єднань)
pass inet proto icmp all icmp-type 8 code 0 keep state
або так
pass in quick inet proto icmp all icmp-type echoreq

Дозволяємо вихідний трафік
pass out

блокуємо всі
block all
або окремо
block out all
block in all

кидок портів
rdr on de0 inet proto tcp to de0 port 3389 -> 192.168.0.69 port 3389

перемнние
ext_if = "de0"
int_if = "de1"

set skip on lo0 # пропустити перевірку на петлі

scrub in all # збираємо \ нормалізуємо всі частини пакета перед відправкою

nat on $ ext_if from $ int_if: network to any -> $ ext_if # Правило NAT

block all # заборонимо все звідусіль

pass on lo0 # дозволити трафік на петлі (замінювані першим правилом - set skip on lo0)

pass in on $ int_if from any to any # дозволяємо все з локальної мережі
або наприклад так (вибірково по портам)
pass in on $ int_if proto tcp from $ int_if: network to any port
pass out on $ ext_if proto tcp from $ ext_if to any port

pass out on $ ext_if from $ ext_if to any # дозволяємо opnbsd доступ зовні

pass in on $ ext_if proto tcp from any to $ ext_if port ssh # дозволяємо ssh

pass in inet proto icmp all icmp-type echoreq # дозволяємо ICMP
або так наприклад
pass on $ ext_if proto icmp from any to any
pass on $ int_if proto icmp from any to any

Додаємо по одному ip на рядок
192.168.0.2
192.168.0.3
192.168.0.4

nat on $ ext_if from to any -> ($ ext_if)

Приклад захисту від DDOS атак

На початку додамо таблицю для злочинців
table persist

правило блокування
block in log quick from


pass in on $ ext_if proto tcp to $ ext_if port 80 flags S / SA keep state (max-src-conn 30, max-src-conn-rate 10/5, overload flush global)

Подивитися чорний список:
pfctl -t brute -T show

Видалити з чорного списку:
pfctl -t brute -T flush

Приклад очитки через cron кожні 30 хвилин
* / 30 * * * * root pfctl -t brute -T flush

Приклад очищення через N кількість секунд (в нашому прикладі 12 годин):
pfctl -t brute -T expire 43200


ALTQ це альтернативна платформа організації черг для BSD.

Є три планувальника, зараз підтримувані FreeBSD в реалізації ALTQ:

CBQ Class Based Queueing. Черги, приєднані до інтерфейсу, створюють дерево.
Таким чином, у кожної черги можуть бути подальші дочірні черзі.
У кожної черги можуть бути пріоритет і привласнена пропускна здатність.
Пріоритет, головним чином, управляє часом, за яке пакети будуть відіслані, в той час як інші будуть чекати своєї черги
За рахунок цього регулюється пропускна здатність.

PRIQ Priority Queueing. У цих черг не може бути дочірніх черг.
Кожній черзі привласнюється унікальний пріоритет, в межах від 0 до 15
Пакети з вищим номером мають вищий пріоритет.

HFSC Hierarchical Fair Service Curve.
У батьківській черзі визначається сумарна пропускна здатність для всіх черг інтерфейсу.
Вказується загальна пропускна здатність, яку надає провайдером і не залежить від швидкості мережевого інтерфейсу.
У дочірній черзі ця директива визначає максимальну швидкість передачі інформації в бітах, яка буде оброблена чергою в будь-який момент

список параметрів роботи черги:
default - потрапив в цю чергу пакет не перевіряється далі, а негайно обробляється
red - Random Early Detection відкидає пакети, які можуть імовірно перевантажити чергу
ecn - Explicit Congestion Notification - схожий на red, але red використовує більш оптимізований алгоритм і обробка черг в red відбувається набагато швидше

параметр borrow - черга-нащадок може брати вільну пропускну здатність черзі-батька в разі потреби
параметр priority - пріоритет черги. У CBQ і HFSC значення можуть бути від 0 до 7, для PRIQ - від 0 до 15. Значення за замовчуванням для всіх черг - 1

# Включення черзі на мережевому інтерфейсі в 10 мегабіт для списку черг:
altq on de0 cbq bandwidth 10Mb queue

# Чергу general бере 10% від нашого 10 мегабіт каналу
queue general bandwidth 10% cbq (default)

# Чергу web бере 30%, має двох нащадків: webchildone, webchildtwo
# Їх механізм визначення передчасної навантаження - red
# Можуть брати смугу пропускання у черзі-батька - web за допомогою параметра borrow
# Чергу web має пріоритет 4, в нашій конфігурації він - найвищий пріоритет
# Т.к значення вище 4 не визначені, відповідно чергу web буде обробляти пакети першої
queue web bandwidth 30% priority 4 cbq (borrow red)

# Черзі-нащадки мають швидкості в процентному відношенні відповідно 50% і 30%
# Відсотки обчислюються із загальної пропускної здатності каналу, який призначений батьківської черзі - web
queue webchildone bandwidth 30%
queue webchildtwo bandwidth 50% cbq (borrow)

# Чергу post бере 5% від загальної смуги пропускання, має нижчий пріоритет - 0
# Її механізм визначення передчасної навантаження - ecn
queue post bandwidth 5% priority 0 cbq (borrow ecn)

# Чергу ssh має двох нащадків: ssh_connect, ssh_data мають пріоритети 7 і 0
# Коли з'явиться пакет на порт призначення 22, правило помістить його в чергу ssh_connect
# Після встановлення з'єднання пакет перейде в чергу ssh_data і матиме найвищий пріоритет для батьківської черзі - ssh
queue ssh bandwidth 20% cbq (borrow)
queue ssh_data priority 7
queue ssh_connect priority 0

Правила для черг

Повний синтаксис правила:
action direction [log] [quick] on interface [af] [proto protocol] from src_addr [port src_port] to dst_addr [port dst_port] [tcp_flags] [state]

для action
Дія, яке буде застосовуватися до пакету - це pass або block. pass передасть пакет назад до ядра для
подальшої обробки. в той час як block буде реагувати відповідно до block-policy.
Реакція за замовчуванням може бути скасована, визначаючи або block drop або block return.

block return out on de0 inet all queue general

pass out on de0 inet proto tcp from 192.168.1.0/24 to any port 80 keep state queue webchildone
pass out on de0 inet proto tcp from 192.168.0.0/24 to any port 80 keep state queue webchildtwo

pass out on de0 inet proto tcp from any to any port 22 keep state queue (ssh_connect, ssh_data)

pass out on de0 inet proto tcp from any to any port 25 keep state queue post