FreeBSD + PF (Packet Filter)
Как, чрез FreeBSD платформа да имаме интернет на машините във вътрешната мрежа, въпреди, че isp-тo го забранява. TTL-ът на върнатите от доставчика пакети e 1 и след като минат през рутера не достигат машината към която трябва да отидат. Какво да правим ?
Дифолтния кърнел на FreeBSD няма съпорт за pf, затова трябва да се прекомпилира кърнела с 3 допълнителни значещи реда реда:
device pf # Support for OpenBSD’s Packet Filter
device pflog # Enables logging the network traffic
device pfsync # Monitor “State Changes”
Отваряме за едит /etc/rc.conf и вътре за pf ни трябва:
pf_rules=”/etc/pf.conf”
pf_flags=”“
pflog_enable=”YES”
pflog_logfile=”/var/log/pflog”
pflog_flags=”“
Следващата стъпка е основното – правилата в /etc/pf.conf. Тук е малко по-особеното – трябва да се деасемблират пакетите, да се сетне нужната ни дължина, да се асемблират обратно и тогава да се изпратят. Дадените примери са за една машина, която ще се връзва и един ethernet interface, но не е проблем да са повече лан-картите, или пък от една лан-карта да отива кабел в switch, друг router или някакъво друго мрежо-capable дивайсче
Ето какво ни трябва в /etc/pf.conf:
## PACKETS MODIFYING #######################
scrub in on $ext_if all min-ttl 25 max-mss 1400 fragment reassemble
scrub out on $ext_if all min-ttl 65 max-mss 1400 fragment reassemble
scrub in
scrub in all fragment reassemble
scrub in on $ext_if all no-df fragment reassemble
#######################################
## NAT ##################################
# Internal Machines rules
nat on $all_if from
Последните 2 реда са за пример – за всеки запис – нов нат като предходните. Ето краткото обяснение на горенаписаното:
scrub-овете служат да си поиграем с пакетите. Накратко какво става: на изходящите пакети слагаме TTL 65, а на входящите – 25. Така сме сигурни, че входящите пакети ще пристигнат до машината, която ги чака и няма да бъдат загубени по трасето.
nat-овете map-ват пакетите и след като се получи отговор се пращат до машината, която ги е изпратила първоначално. Идеята с няколко думи е, че ако машина М1 изпрати пакет до сървър S1, mинаващ през рутер R1, то nat-ът на R1 изпраща пакета “от негово име” като прави таблица, в която се пази информацията, че резултатът ще се препрати обратно до М1. S1 отговаря на R1 и nat-ът пренасочва пакета към M1.
И за променливите: $ext_if е лан-картата с жицата от доставчика. $all_if – списък с всички интерфейси, с които искам да работя. Изглежда по този начин: all_if=”{ rl0 re0 lo0 }”. int_machines> е таблица с IP-тата на всички машини от вътрешната мрежа. Ето как се създава подобна таблица:
table {\
}
Трябва да се обърне внимане на предпоследния ред – няма запетая накрая ![]()
също е таблица, изглежда по същия начин като (с други ип-та вътре естествено :>). За мое улеснение в таблицата с IP-тата на машините във вътрешната мрежа не съм набил IP-тата вътре. Предварително са създадени променливи с името на всяка от машините и нейното IP и после тези променливи са написани в таблицата. Още един плюс за таблиците – динамично може да се вкарват IP-та, но това е тема на друг разговор…
Бием един рестарт заради кърнела и сме готови ![]()
Статията е взета от ТУК.