Skip to main content

Пересобрать ядро FreeBSD с поддержкой PF и ALTQ

Статья раскажет как быстро пересобрать ядро на FreeBSD.

pf bsd

Программный межсетевой экран OpenBSD, известнй как PF (Packet Filter), был партирован с систему FreeBSD еще в 2004 году. Межсетевой экран в систему можно подгрузить разными способами, но для включения подсистемы ALTQ (alternate queuing of network packets) вам потребуется пересобрать ядро.

Для начала необходимо сделать копию конфигурационного файла ядра (путь зависит от установленного дистрибутива):

# cd /usr/src/sys/`uname -m`/conf
# cp GENERIC pfaltq

Далее необходимо изменить значение поля ident на название нашей новой копии:

# edit pfaltq
- ident GENERIC
+ ident pfaltq

Так же в конец документа необхдимо добавить следующие опции:

#PF
device pf
device pflog
device pfsync
#ALTQ
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_CDNR
options ALTQ_PRIQ
options ALTQ_NOPCC
options ALTQ_DEBUG

Произвести сохранение.

Далее переходим в директорию src и запускаем сборку ядра:

# cd /usr/src
# make -j4 buildkernel KERNCONF=pfaltq

После окончания, сборки запускаем установку ядра:

# make -j4 installkernel KERNCONF=pfaltq

Перед перезагрузкой добавляем /etc/rc.conf:

# PF
pf_enable="YES" # Set to YES to enable packet filter (pf)
pf_rules="/etc/pf.conf" # rules definition file for pf
pflog_enable="YES" # Set to YES to enable packet filter logging
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile

Перезагружаемся:

# shutdown -r now

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

# uname -a
FreeBSD s1 10.1-RELEASE-p9 FreeBSD 10.1-RELEASE-p9 #3: Thu Apr 9 17:40:22 MSK 2015 root@s1:/usr/obj/usr/src/sys/pfaltq amd64

PF не загрузится, т.к. мы не позаботились о создании файла /etc/pf.conf.

Исправим это и добавим несколько правил:

# edit /etc/pf.conf
### -- intrface -- тут необходимо перечислить интерфейсы
ie= "{ bce0, gre555 }"
### -- options --
set skip on lo0
set block-policy drop
set timeout { frag 10, tcp.established 3600 }
scrub in all fragment reassemble
table <ssh_filter> persist
# -- ICMP -- echoreq, unreach
pass inet proto icmp all icmp-type { echoreq, unreach } keep state
pass in on $ie inet proto udp from any to any \
port 33433 >< 33626 keep state
pass in on $ie proto tcp from any to $ie port ssh \
flags S/SA keep state (max-src-conn 5, max-src-conn-rate 5/60, overload <ssh_filter> flush global)
block drop in log quick on $ie from <ssh_filter>

Запустим pf вручную:

# pfctl -f /etc/pf.conf

Полезные команды:

pfctl -F all Очистить все правила
pfctl -f /etc/pf.conf Загрузить pf.conf
pfctl -nf /etc/pf.conf Анализировать файл, но не загружать
pfctl -Nf /etc/pf.conf Загрузить только правила NAT из файла
pfctl -Rf /etc/pf.conf Загрузить только правила фильтрации
pfctl -sn Показать текущие правила NAT
pfctl -sr Показать текущие правила фильтрации
pfctl -ss Показать текущее состояние таблиц
pfctl -si Показать статистику правил и состояние счетчиков
pfctl -sa Показать все (имеющиеся правила и статистику)
pfctl -e Включить Packet filter

Добавление и удаление адресов из таблицы на лету:

pfctl -t ssh_filter -T add 192.168.1.1 Добавление адреса в таблицу.
pfctl -t ssh_filter -T delete 192.168.1.1 Удаление адреса из таблицы.
pfctl -t ssh_filter -Tf Полная очистка таблицы.

Просмотр содержимого таблицы и более подробной статистики по каждому адресу:

pfctl -t ssh_filter -T show
pfctl -t ssh_filter -T show -v
pfctl -t ssh_filter -Ts -v
pfctl -s info

Кроме того, теперь PF создает state по-умолчанию, т.е. даже если нет опции log можно понять по какому правилу прошел пакет.

Посмотреть что заблокировал PF:

# tcpdump -n -e -ttt -r /var/log/pflog
# tcpdump -i pflog0
00:00:01.947206 rule 35..16777216/0(match): block in on gre3: 37.145.23.75.58230 > 127.0.0.1.8081: Flags [P.], seq 0:2, ack 1, win 4322, length 2

Тут видим какое правило заблакировало (rule 35):

# pfctl -vss | grep -A2 '37.145.23.75'
all tcp 127.0.0.1:8081 <- 37.145.23.75:56773 ESTABLISHED:ESTABLISHED
[2864412628 + 65432] wscale 6 [2270356911 + 66496] wscale 8
age 00:05:04, expires in 01:00:00, 1623:2546 pkts, 97348:2677899 bytes, rule 35, source-track

freebsd, altq, PF