Балансировка нагрузки на каналы при помощи PF
Опции ядра:
device pf device pflog device pfsync options ALTQ
Конфигурационный файл /etc/pf.conf:
lan_net = "192.168.0.0/24" int_if = "dc0" ext_if1 = "fxp0" ext_if2 = "fxp1" ext_gw1 = "68.146.224.1" ext_gw2 = "142.59.76.1" # правила nat для исходящих соединений на каждом внешнем интерфейсе nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2) # default deny block in from any to any block out from any to any # пропускаем все исходящие пакеты на внутреннем итерфейсе pass out on $int_if from any to $lan_net # пропускаем (quick) пакеты предназначенные самому шлюзу pass in quick on $int_if from $lan_net to $int_if # балансировка исходящего tcp трафика идущего из внутренней сети pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto tcp from $lan_net to any flags S/SA modulate state # балансировка исходящего icmp и udp трафика идущего из внутренней сети pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto { udp, icmp } from $lan_net to any keep state # основные "выпускаюшие" правила на внешнем интерфейсе pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state pass out on $ext_if1 proto { udp, icmp } from any to any keep state pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state pass out on $ext_if2 proto { udp, icmp } from any to any keep state # маршрутизация пакетов идущих с любого IP на $ext_if1 через $ext_gw1 и # пакетов идущих на $ext_if2 через $ext_gw2 pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
Автозагрузка /etc/rc.conf:
pf_enable="YES" pf_rules="/etc/pf.conf" pf_flags="" pflog_enable="YES" pflog_logfile="/var/log/pflog" pflog_flags=""