Linux ile outgoing loadbalancing

31 December, 2009 (15:29) | Loadbalancing | By: alper

Linux ile Birden fazla internet çıkışını aynı anda kullanmak için outgoing loadbalancing temel olarak iproute2 ve iptables yardımı ile yapılır. Burada anlattığım yöntem ECMP ( Equel Cost multipath Routing )’ olarakta bilinir.

Şekildeki örnek 5 adet çeşitli modemlerle yapılandırılmış olsada bu bağlantı türleri herhangi bir bağlantı olabilir ( PPPOE , Kablonet , MetroEth , GHDSL vs vs ). Ağ geçitleri istenildiği kadar artırılıp azaltılabilir. Ben burada farklı interface ler üzerinden nasıl yapılacağını anlatıyorum fakat daha önce uyguladığım 2 farklı noktada hem giriş hem çıkış için tek interface’i olan ( sadece eth0 ) linux sorunsuz olarak  çalışıyor.

  • 1. ipforwarding düzgün olarak yapılandırılmalıdır.

sysctl net.ipv4.ip_forward=1

veya

echo “1″ > /proc/sys/net/ipv4/ip_forward

Kalıcı olması için kullanmış olduğunuz linux sürümünde  gerekli ayarları yapmayı unutmayınız örneğin /etc/sysctl.conf içerisinde.

  • 2. rt_tables

Multiple Routing table için gerekli tabloları oluşturalım :

root@linux:~# echo “10 gw1″ >> /etc/iproute2/rt_tables

root@linux:~# echo “20 gw2″ >> /etc/iproute2/rt_tables

root@linux:~# echo “30 gw3″ >> /etc/iproute2/rt_tables

root@linux:~# echo “40 gw4″ >> /etc/iproute2/rt_tables

root@linux:~# echo “50 gw5″ >> /etc/iproute2/rt_tables

Yapmış olduğumuz işlemi kontrol ediyoruz.  ”cat /etc/iproute2/rt_tables”  girmiş olduğumuz bilgiler kalıcıdır her açılışta yeniden eklemenize gerek yoktur. Kaç ağ geçidimiz varsa okadar adet oluşturuyoruz.
  • 3. Konfigurasyon alias’larını oluşturalım
# local interface’imiz
lint=”eth0″
#  Linux’un internete ulaşmak için kullandığı 1. nolu ağ geçidinin ip adresi
gw1ip=”192.168.0.1″
# Linux’un bu ağ geçidine ulaşmak için kullandığı interface
gw1int=”eth1″
# Policie routing için şu an kullanmasakta lazım olabileceği için kullanacağımız
# fwmark değeri istediğiniz rakamı kullanmakta özgürsünüz.
gw1mark=”1″
#  Linux’un 1 nolu ağ geçidine ulaşmak için kullandığı kendine ait eth1 interface’ine ait ip adresi
gw1src=”192.168.0.2″

# Diğer ağ geçitleri için gerekli ayarları tek tek açıklamadan yazıyorum gw1 için

#yaptığımız örneğin hepsi için yeterli açıklamayı yapacağına inanıyorum.

gw2ip=”192.168.1.1″
gw2int=”eth2″
gw2mark=”2″
gw2src=”192.168.1.2″
# 3 Nolu ağ geçidi
gw3ip=”192.168.2.1″
gw3int=”eth3″
gw3mark=”3″
gw3src=”192.168.2.2″
# 4 Nolu ağ geçidi
gw4ip=”192.168.3.1″
gw4int=”eth4″
gw4mark=”4″
gw4src=”192.168.3.2″
# 5 Nolu ağ geçidi
gw5ip=”192.168.4.1″
gw5int=”eth5″
gw5mark=”5″
gw5src=”192.168.4.2″
  • 4. Routing tablolarına ağ geçitlerimizi girelim.
# iproute2 ağ geçidi x.x.x.x dir. ulaşmak için kullandığı interface YY dir. bu kural table ZZ içine yazılacaktır.
ip route add default via $gw1ip dev $gw1int table gw1
ip route add default via $gw2ip dev $gw2int table gw2
ip route add default via $gw3ip dev $gw3int table gw3
ip route add default via $gw4ip dev $gw4int table gw4
ip route add default via $gw5ip dev $gw5int table gw5

Note : 5 Adet ağ geçidini multiple routing table içerisine girdik ama hala sistemin kendine ait defaultgateway yani ağ geçidi yok, buradaki örnekte iproute2 ile roundrobbin yapacağımızdan gerekte olmayacak, roundrobbin devre dışı bıraktığınızda internete çıkamayacağınızı ve internetten de bu makinaya ulaşamayacağınızı unutmayın, olası ihtimal için devamlı ulaşabileceğiniz bir ağ geçidinizi default olarak tanımlamanızı öneririm. DHCP veya Elle yapılandırma yaptığınız interface lere ağ geçidi girmeyin. Virden fazla ağ geçidi ne yaptığınızı bilmiyorsanız size sorun yaratabilir.
örnek olarak 1 nolu internet çıkışımızı default tanımlıyoruz.
ip route add default via $gw1ip dev $gw1int

  • 5. FWMARK ile işaretlenmiş paketleri ilgili tablolara gönderelim.
# gw1 için marklanmış paketler tablo gw1 e gönder.
ip rule add from all fwmark $gw1mark table gw1
# diğer ağ geçitleri için kurallar.
ip rule add from all fwmark $gw2mark table gw2
ip rule add from all fwmark $gw3mark table gw3
ip rule add from all fwmark $gw4mark table gw4
ip rule add from all fwmark $gw5mark table gw5

Basit bir internet paylaşımı için bu basamaklara gerek yoktur. Policie routing için gerekli olacak.
  • 6.  Paketleri ait oldukları routing tablolarına gönderebilmek için gerekli rule’ları girelim.
Bu işlemi doğru olarak yaptğınızda internetten bu ip  adreslerine  ( aynı subnetmask deki ipler için değil )  ulaşabilmeniz gerekiyor.
# gw1 in ip adresine giden paketleri tablo gw1 e gönder.
ip rule add from $gw1src table gw1
# gw1′in ip adresinden gelen pkaetleri tablo gw1′e ata ( buna pek gerek yok ekleme sebebim tamamen piskolojik
# teknik bir sebep içermiyor )

ip rule add to $gw1src table gw1

# diğer ağ geçitleri için kurallar :
ip rule add from $gw2src table gw2
ip rule add to $gw2src table gw2
ip rule add from $gw3src table gw3
ip rule add to $gw3src table gw3
ip rule add from $gw4src table gw4
ip rule add to $gw4src table gw4
ip rule add from $gw5src table gw5
ip rule add to $gw5src table gw5

Kotrolü :

Tüm interface lerden sırasıyla ping atarak kontrol edebilirsiniz.
ping -I gw1int www.google.com.tr # veya aynı subnetmask de olmayan bir ip adresi

  • 7. Routing cache de daha önce kalan girdileri temizleyelim.
ip route flush cache

  • 8. RoundRobbin ile gelen paketleri ağ geçitlerine dağıtalım.


ip route add equalize default scope global \
nexthop via $gw1ip dev $gw1int weight 1 \
nexthop via $gw2ip dev $gw2int weight 1 \
nexthop via $gw3ip dev $gw3int weight 1 \
nexthop via $gw4ip dev $gw4int weight 1 \
nexthop via $gw5ip dev $gw5int weight 1

  • 9 .  NAT ( Masquerade )
İnternet bağlantılarımız için çıkışlarımız NATD istiyorsa isteyen interface ler için iptables a aşağıdaki kuralları girmeliyiz. istemediğniz interface’e girmeyiniz.
iptables -t nat -A POSTROUTING -o $gw1int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw2int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw3int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw4int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw5int -j MASQUERADE

  • 10. Policy Routing
a) iptables ile

iptables Matches kullanarak istediğimiz paketi istediğimiz ağ geçidinden gitmesi için işaretleyebiliriz.
örneğin local interfaceimiz ( eth0 ) a gelen https isteklerinin sadece 1 nolu ağ geçidinden gitmesini istiyoruz.

iptables -A PREROUTING -t mangle -i $lint  -p tcp –dport 443 -j MARK –set-mark $gw1mark

b) ip rule ile

Örneğin 1.1.1.1 ip adresinden gelen isteklerin 1 nolu ağ geçidi üzerinden sabit çıkmasını istiyoruz.
ip rule add from 1.1.1.1 to any table gw1

Bu kadar Roundrobbin ile çalışan Outgoing Linux loadbalancer router’imiz oldu :)

Comments

Comment from Kubilay
Time 01/22/2010 at 11:50 am

merhaba
Benim için çok önemli bir soruyu size soracağım. Umarım siz yardımcı olabilr siniz.,
Öncelikle elimdeki cihazları sayayım,
3 adet pc (bir tanesi centos 5.4 çift etherneti var, diğeri şahsi kullanım, extradanda notebook var)
1 adet switch
1 adet wireless dağıtıcı (kablomodeme şu an direk bağlı)
1 adet baş belası kablo modem (zurnanın zırt dediği ve herkesin çözemediği konuda bu)

Evimde 3 bilgisayar 2 ip kamera var ve kablonet ile onlara ip veremiyorum. Nedeni ise sizinde bildiğiniz gibi sadece 2 adet ip adresi veriyhorlar ve dış ip olduğu için router sız dağıtamıyorsunuz. bendede router yok. Centos ile router denemelerim oldu fakat başarılı olmadım. Bir yerde “şu şu şöyle şu iş içinde şunu araştırın, yada şu şöyle geri kalanınıda siz araştırın” gibi yazılar var. tamam araştırdım çok eğlendim ama bunları bir türlü birleştiremiyorum.

Sizden ricam lütfen Dhcp kurulumundan başlayıp ip maskelemeye kadar ama lütfen kablo neti düşünerek anlatabilir misiniz. Çevrede bunu ihtiyacı olan okadar çok insan tanıyorumki.

Şimdiden çok teşekkür ediytorum.

Comment from alper
Time 01/23/2010 at 10:42 pm

aslında çok basit yapacağın işlem, kablo netten ip satin almadıysan NATD yapıcaksın yada linuxdaki ismiyle , MASQUERADE, dediğin şekilde uzun uzun anlatmamın burda yolu yok dhcp server gibi bir konuda yazmayı düşünmüyorum ama en kısa yoluyla centos üzerine eth0 kablo net e bağlı eth1 ise iç networkune bakan interface in olduğunu düşünelim.
“iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE” komutunu veriyorsun kablonet router da anlattığım gibi ipforwarding enable ediyorsun. bukadar. sonra içerdeki istemcilere elle ip adresi ver ağ geçidi olarak linux iç network ip adresi , DNS olarak kablonet dns lerini veriyorsun. internete sorunsuz çıkman lazım dhcp server ve dns server ile internete çıktığından emin olduktan sonra uğraşman daha mantıklı sorunları adım adım çözersin. Bu gibi sorunlar için irc.freenode.net de kolaylıkla yardım bulabilirsin.

Comment from Kubilay
Time 01/28/2010 at 1:04 pm

Çok teşekkür ederim. Şu an çalışıyor.

Bir ricam daha var sizden. O da , kablonete göre bana örnek bir dhcpd.conf dosyası yazabilir misiniz ?

Burada da takıldığım ufak bir nokta varda.

Şimdiden teşekkür ederim.,

Saygılarımla.

Comment from admin
Time 01/28/2010 at 7:32 pm

dhcp server’in internet bağlantı şekliyle alakası yoktur

Comment from Kubilay
Time 01/31/2010 at 1:58 am

Tesekkür ederim .

Comment from Ali Osman Kurt
Time 02/01/2011 at 5:58 pm

Merhaba,
Anlaşılır bir anlatım ve çok uzatmadan yeterli detayla anlattığınız bu konu için tebrik ederim.
Bu yapıda modemlerden birisi bozulduğunda kullanıcıların internet bağlantısının devam edebilmesi için ne lazım gelir?

Comment from YUNUS DESTANCI
Time 02/02/2011 at 5:20 pm

Merhaba Alper bey, konu ile tam ilgisi varmı tam emin değilim ama sise şöyle bir şey soracağım.Benim pfsense firewall cihazımda 2 adet internet 1 adet lan bacağım var. benim lan bacağımın ip adresi 192.168.1.0/24 şeklinde. ben bu ip adreslerinden bazı ip adreslerini 1 nci modemden, bazı ip adreslerini 2 nci modemden internete çıkarmak istiyorum. bana bu konu hakkında yardımcı olursanız sevinirim.şimdiden çok saolun.

Comment from admin
Time 02/03/2011 at 8:21 am

Script yazarak , Modemlerin durumlarını kontrol edip , Çalışmayan hattı devreden çıkarmanız gerekli

Comment from admin
Time 02/03/2011 at 8:23 am

pass in on $int_if route-to \ satırından önce direk nat kurali her ip için ayrı ayrı oluşturursan o ip adresleri hep o modemden çıkarlar. Pek tercih edilen bir şey değildir :)

Write a comment