Включение маршрутизации пакетов из консоли, при перезагрузке отменяется
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: ключевое слово, пакет совпадающий с правилом применяется немедленно, правило считается последним в цепочке
7. from src_addr: адрес или сеть - источник пакета
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
Просмотреть вю цепочку правил pf
pfctl -vf /etc/pf.conf
Проброс портов
rdr on de0 inet proto tcp to de0 port 3389 -> 192.168.0.69 port 3389
Пример с NAT:
Перемнные
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 {22,80,110,143}
pass out on $ext_if proto tcp from $ext_if to any port {22,80,110,143}
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
либо немного изменив правила можно применить NAT к IP адресам из файла в начале сделаем так:
table <pf-allow-pc> file "/etc/pf-allow-pc"
Добавляем по одному ip на строку
192.168.0.2
192.168.0.3
192.168.0.4
nat on $ext_if from <pf-allow-pc> to any -> ($ext_if)
Пример защиты от DDOS атак
В начале добавим таблицу для преступников
table <brute> persist
Правило блокировки
block in log quick from <brute>
Тут: max-src-conn - число одновременных соединений, позволенных от одного хоста (в нашем примере 30) max-src-conn-rate - число новых подключений, позволеных от одного хоста. (в нашем примере 10 соединений за 5 секунд) overload <brute> - превысивший лимит адрес будет добавлен в таблицу flush global - по достижению лимита все соединения с ним уничтожаются
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 <brute> 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
Очереди и балансировка нагрузки
https://ru.wikipedia.org/wiki/ALTQ
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, web, post, ssh }
#очередь 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) { webchildone, webchildtwo }
#очереди-потомки имеют скорости в процентном отношении соответственно 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) { ssh_connect, ssh_data }
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
Комментарии пользователей
Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!