FreeBSD ve PF ile birden çok ağ geçidinin olduğu yerlerde yük dengeleme yaparak tüm ağ geçitlerini kullanmak mümkündür. buna örnek verecek olursak 2 adet veya daha fazla ADSL bağlantısı, 2 veya daha fazla wi-fi bağlantı , 2 veya daha fazla network, ADSL, Wifi arasında yük dağılımı gibi ihtiyaçlar olabilir.

Yukarıdaki örnekde 4 adet router üzerinden internet erişimine sahip bir FreeBSD ile 10.1.1.0/24 local networkü için loadbalance yapacağız. Örnekteki router bağlantıları kablo, wifi ppp veya herhangi bir bağlantı olabilir. 4 router için vermiş olduğum örneği istediğiniz adet için editleyerek değştirebilirsiniz.
Not : 2 Farklı interface üzerinden aynı gateway’e PPPOE yapamazsınız. yani iki PPPOE bağlantınızın 2 sininde ağ geçidi 192.168.0.1 gibi tek bir ip olamaz. FreeBSD multiple routing tables eksikleri tamamlandıktan sonra mümkün olacak.
Sisteminizde pf firewall ve ipforwarding düzgün olarak yapılandırılmış olmalıdır.
/etc/rc.conf içerisine
gateway_enable=”YES”
pf_enable=”YES” # Enable PF (load module if required)
pf_rules=”/etc/pf.conf” # rules definition file for pf
pf_flags=”" # additional flags for pfctl startup
pflog_enable=”YES” # start pflogd(8)
pflog_logfile=”/var/log/pflog” # where pflogd should store the logfile
pflog_flags=”" # additional flags for pflogd startup
Satırlarını ekleyin.
# öncelikle dahili network’ümüzü, dışarıya çıktığımız interface leri ve ağ geçitlerimizi belirleyelim
# local network 10.1.1.0/24 network’ü
lan_net = “10.1.1.0/24″
# Local network’ümüzün bağlı olduğu ağ arayüzü
int_if = “fxp0″
# 1 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü
ext_if1 = “vr0″
# 2 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü
ext_if2 = “vr1″
# 3 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü
ext_if3 = “vr2″
# 4 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü
ext_if4 = “vr3″
# 1 numaralı ağ geçidimizin adresi.
ext_gw1 = “192.168.0.1″
# 2 numaralı ağ geçidimizin adresi.
ext_gw2 = “192.168.1.1″
# 3 numaralı ağ geçidimizin adresi.
ext_gw3 = “192.168.2.1″
# 4 numaralı ağ geçidimizin adresi.
ext_gw4 = “192.168.3.1″
# PPPOE gibi bağlantılarda nat ihtiyacımız varsa yapılandırıyoruz ( internet bağlantı ihtiyacınız yoksa bu kısmı atlayın
# Local den gelen 1 nolu ağ geçidine giden paketler için NAT kuralı
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
# Local den gelen 2 nolu ağ geçidine giden paketler için NAT kuralı
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
# Local den gelen 3 nolu ağ geçidine giden paketler için NAT kuralı
nat on $ext_if3 from $lan_net to any -> ($ext_if3)
# Local den gelen 4 nolu ağ geçidine giden paketler için NAT kuralı
nat on $ext_if4 from $lan_net to any -> ($ext_if4)
# default deny
pass in from any to any
pass out from any to any
#local ağ arayüzünden local network e giden paketlere izin veriyoruz.
pass out quick on $int_if from any to $lan_net
# Local interface e gelen paketlere izin veriyoruz.
pass in quick on $int_if from $lan_net to $int_if
# Devamlı değişen ip adresinin bankacılık işlemlerinde sorun çıkarmaması için tek ağ ara yüzünden çıkmasını sağlıyoruz
# alternatif olarak sticky connections kullanılabilir, dağılımlarda çok daha fazla düzensizlik yarattığını tesbit ettik.
pass in quick on $int_if route-to ($ext_if1 $ext_gw1) \
proto tcp from $lan_net to port https
# dışarı giden TCP paketlerimizi 4 ağ geçidimiz arasında Round Robbin ile dağıtıyoruz.
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2), ($ext_if3 $ext_gw3), ($ext_if4 $ext_gw4) } round-robin \
proto tcp from $lan_net to any flags S/SA modulate state
# Dışarı giden UDP ve ICMP paketlerimizi 4 ağ geçidimiz arasında Round Robbin ile dağıtıyoruz.
# TCP den ayrı belirtmemizin sebebi statefull protokol olmamaları
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2), ($ext_if3 $ext_gw3), ($ext_if4 $ext_gw4) } round-robin \
proto { udp, icmp } from $lan_net to any keep state
# Tek tek dış ağ arayüzlerinden çıkan paketlere izin veriyoruz.
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
pass out on $ext_if3 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if3 proto { udp, icmp } from any to any keep state
pass out on $ext_if4 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if4 proto { udp, icmp } from any to any keep state
# Dış ağ arayüzlerinin birbirleri arasındaki routingleri düzenliyoruz.
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if2 route-to ($ext_if3 $ext_gw3) from $ext_if3 to any
pass out on $ext_if2 route-to ($ext_if4 $ext_gw4) from $ext_if4 to any
pass out on $ext_if3 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if3 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if3 route-to ($ext_if4 $ext_gw4) from $ext_if4 to any
pass out on $ext_if4 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if4 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if4 route-to ($ext_if3 $ext_gw3) from $ext_if3 to any
Bu kadar , FreeBSD ve PF kullanarak 4 adet farklı internet bağlantısını birleştirmiş olduk, Bu yapılandırma ile şu an p4 3Ghz bir bilgisayar 3 Adet ADSL ( PPPOE ) 8 Mbit , 1 Adet Kablo net ( 4 Mbit ) olmak üzere 7000 ortalama state ile %10 un altında cpu kullanımı sorunsuz olarak çalıştırmaktadır.