FreeBSD ve PF ile outgoing loadbalancing.
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.
Comments
Comment from alper
Time 02/03/2010 at 2:24 pm
Konu firewall olmadığı için block accept gibi konulara girmedim, yazılarımda zaten konuları mümkün olduğunca birbirinden bağımsız yazıyorum. Bir çoğunu da hali hazırda konu hakkında fikri olan insanların kullanacağını düşünerek yazıyorum. Default block koyup izin vermek isteyen arkadaşlar sanırım sizin yazdığınızı referans alacaklardır
Comment from Mehmet
Time 02/03/2010 at 2:16 pm
Cok yararli bir calisma olmus paylasiminiz icin cok tesekkur ederim. Yukaridaki yazida gozunuzden kactigini dusundugum asagidaki ifade yerine
# default deny
pass in from any to any
pass out from any to any
dogrusunun
# default deny
block in from any to any
block out from any to any
ya da sadece
block all
yeterli olacak sanirim.