Linux Ortamında L2 Ether-Channel ve Virtual Bridging Part-I

Merhabalar, bu makalede linux yapılarda ether-channel  teknolojisinden nasıl faydalanabileceğimizi basitçe anlatacağım. Linux bir çok uygulamada olduğu gibi network tarafında da oldukça kabiliyetli. Tabi bu kabiliyetten fayda sağlamak için neyin nasıl yapılacağını bilmek gerekiyor.

Günümüzde açık kaynak kodlu işletim sistemlerinin son derece stabil bir halde sunulması işleri çok kolaylaştırdı. Birazcık script bilgisi ile bir linux makinadan bir dedicated  router , firewall veya bir dedicated switch elde etmek mümkün. Normal servislere ilave olarak bu uygulamaları dahil etmek de mümkün.  Biraz CPU veya RAM takviyesi ile arzu edilen verimi fazlası ile veriyor.

Bu makalede kullanacağımızı linux makina CentOS olacaktır. Bu arada yeni çıkan CentOS  7 sürümünün Xen veya KVM hypervisor’ler  ile sanallaştırma işleminde yazılım maliyeti olmadan  mükemmel işler çıkardığını söyleyebilirim.

Senaryomuz sunucu üzerindeki 4 adet 1 Gbps linkten  ether-channel ile 4 Gbps elde etmek şeklinde olacak .

Ether-channel’in neden ve nasıl yapıldığını az çok biliyoruz. Linux’da da  benzer işlemi bond type interface’ler ile yapabiliyoruz ve bu işlemi channel bonding olarak adlandırıyoruz.  Nasıl yapıldığını anlatmaya başlamadan önce ether-channel’in Linux’da kullanım şekillerine teorik olarak çok kısa değinelim.

1-  High Availabity (HA) :

Amaç adı üstünde birden çok linkden maksimum availability elde etmektir. Bonding sayesinde fiziksel arayüzlerin birisinde meydana gelen sorun herhangi bir kesintiye yol açmayacaktır. Trafik bond arayüz’deki diğer fiziksel arayüzlerden akmaya devam edecektir.

2- Optimum Bant Genişliği (BW) ve Load Balance (LB):

Arayüzlerin sahip olduğu tüm bant genişliğini kullanabilmek amacıyla bonding işlemi kullanılabilir. Bu şekilde bir yapının tek switchle veya birden çok switch ile yapılabilmesi mümkündür.

Birden çok ve birbirinden izole az portlu switchler ile bonding yapılması maliyet açısından çok uygun olacaktır. Bunu aşağıdaki resime bakarak daha iyi anlayabiliriz. 90 üzerinde port bonding yapılacaksa biz en az 96 portlu bir switch’e gerek duyarız. Tek şase yerine ufak swithcler ile port sayısını sağlamak daha uygun maliyet sağlar.

initro1

Teorik olarak modlara değindikten sonra biraz işin teknik kısmına bakalım :

 

mode=0 (balance-rr)

Paketler bir sırasıyla channel’daki fiziksel arayüzlerden yollanırlar. Bu mod HA(High Ava.. )  + LB (Load Balance) sağlar.

mode=1 (active-backup)

Bu modda sadece 1 arayüz aktif diğerleri ise backup durumundadır. Bu mod HA sağlar ancak LB sağlamaz.

mode=2 (balance-xor)

Source veya destination mac adreslerine göre LB yapılabilen bu modda her mac bir fiziksel arayüzden gidecek şekilde bir  LB algoritması çalışır. LB + HA sağlar.

mode=3 (broadcast)

Tüm trafik tüm arayüzlere yollanır.  UDP benzeri trafikler için üst seviyede HA sağlayabilir. Ancak LB sağlamaz .

mode=4 (802.3ad-LACP)

Bildiğimiz LACP protokolü yardımı ile yapılan channel bonding işlemidir.  HA + LB sağlar.

mode=5 (balance-tlb)

Gönderilen trafik fiziksel arayüzlere eşit olarak dağıtılırken gelen trafik aktif olan bir tek fiziksel ara yüzden kabul edilir. Yani gelen trafik için sadece 1 fiziksel arayüz kullanılır.  Karşı tarafta dummy switch olsa bile çalışır. Yani özel bir swith gereksinimini ortadan kaldırır. HA ve kısmi LB sağlar.

mode=6 (balance-alb)

Mode 5 ile benzer şekilde özel switch gereksinimi yoktur. Giden trafiğe aynen mode-5 gibi işlem yapar.  Gelen trafiğe ise : aldığı arp isteklerini farklı fiziksel arayüzler ile yanıtlayarak load balance sağlar. Cisco’daki GLBP’ye benzer bir algoritmaya sahiptir. HA ve LB sağlar.

Şimdi işin yapılandırma kısmına geçelim (Cisco’nun LACP Active olarak yapılandırıldığı kısmını geçiyoruz):

Topoloji (Resime tıklayarak büyütebilirsiniz) :

Intro

Öncelikli olarak bonding işleminde kullanacağımız bond arayüzü oluşturuyoruz ve net manager’i disable ediyoruz. Bond arayüz yapılandırmasını bonding.conf dosyası içinde gerçekleştiriyoruz.

nano /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 mode=1 miimon=100 ----> Bu girdi ifcfg altında belirtilecekse burdan kaldırılmalıdır.
 

Burada birden çok bond arayüz oluşturabiliriz. Örn :

alias bond1 bonding
options bond1 miimon=100 mode=4
alias bond2 bonding
options bond2 miimon=200 mode=5
alias bond3 bonding
options bond3 miimon=350 mode=2
Sonrasında : 
modprobe bonding
ssytemctl stop NetworkManager
systemctl disable NetworkManager

(Option’da belirttiğimiz mode ve mii değerleri bond ifcfg altında da belirtilebilir.)

Burada mode ile çalışma şeklini belirtirken miimon ile’de fiziksel linklerin monitor edilme periyodunu belirliyoruz. miimon=100 demek 100 ms’de bir linklerin faal olup olmadığını kontrol et anlamı taşıyor.

Bond channel oluşturduktan sonra sırada bond channel arayüz için bir config dosyası oluşturulması var.

touch /etc/sysconfig/network-scripts/ifcfg-bond0 -> Dosyayı oluşturuyoruz.
nano /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
TYPE=Bond
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
USERCTL=no
BONDING_OPTS="mode=4 miimon=123" 

Bond channel artık var ancak yukarıda biz bond arayüzü L3 olarak oluşturduk. Bunu L2 olarak da yapabiliyoruz ve o L2 olarak yapılandıracağız.

ifcfg-bond0
DEVICE=bond0
TYPE=Bond
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="miimon=123 mode=4"

Sırada fiziksel arayüzlerin bond channel’a eklenmesi işlemi var . Bunun için arayüzlerin conf dosyalarını düzenliyoruz.

ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:0C:12:63:31:Z4
MASTER=bond0
SLAVE=yes 
USERCTL=no
ifcfg-eth1 
DEVICE=eth1 
BOOTPROTO=none 
ONBOOT=yes
HWADDR=00:0C:12:63:31:Z5
MASTER=bond0 
SLAVE=yes 
USERCTL=no
ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:0C:12:63:31:Z6
MASTER=bond0
SLAVE=yes
USERCTL=no 
ifcfg-eth3 
DEVICE=eth3 
BOOTPROTO=none 
ONBOOT=yes
HWADDR=00:0C:12:63:31:Z7
MASTER=bond0 
SLAVE=yes 
USERCTL=no 

Şuan her şey hazır gibi. Sadece network servisini restart edip kontrol edeceğiz.

service network restart
Shutting down interface bond0:                             [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface bond0:                               [  OK  ]
chkconfig network on

Şimdi kontrol edelim :

ifconfig
bond0     Link encap:Ethernet  HWaddr 00:0C:12:63:31:Z4
          UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
          RX packets:119676 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1342 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1623240 (2.9 MiB)  TX bytes:92250 (95.2 KiB)
eth0      Link encap:Ethernet  HWaddr 00:0C:12:63:31:Z4
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:25057 errors:0 dropped:0 overruns:0 frame:0
          TX packets:371 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:832257 (812.7 KiB)  TX bytes:22751 (22.2 KiB)
          Interrupt:19 Base address:0x2000
eth1      Link encap:Ethernet  HWaddr 00:0C:12:63:31:Z5
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:25620 errors:0 dropped:0 overruns:0 frame:0
          TX packets:473 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:791043 (772.5 KiB)  TX bytes:22507 (19.1 KiB)
          Interrupt:19 Base address:0x2080
eth2      Link encap:Ethernet  HWaddr 00:0C:12:60:31:Z6
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:25620 errors:0 dropped:0 overruns:0 frame:0
          TX packets:373 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:791043 (772.5 KiB)  TX bytes:21203 (17.7 KiB)
          Interrupt:19 Base address:0x2080
eth3      
          Link encap:Ethernet  HWaddr 00:0C:12:60:31:Z7
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:24620 errors:0 dropped:0 overruns:0 frame:0
          TX packets:471 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:791043 (772.5 KiB)  TX bytes:20301 (19.4 KiB)
          Interrupt:19 Base address:0x2080
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:104 (104.0 b)  TX bytes:104 (104.0 b)
 
cat /proc/net/bonding/bond0

 
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 123
Up Delay (ms): 0
Down Delay (ms): 0
 
802.3ad info
LACP rate: fast
Active Aggregator Info:
	Aggregator ID: 1
	Number of ports: 4
	Actor Key: 17
	Partner Key: 1
 
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Slave Interface: eth3
MII Status: up
Link Failure Count: 0
 

Bond arayüz 4 adet fiziksel arayüz ile birlikte ayakta. Bu durumda yapı aşağıdaki gibi bir hal almış durumda:

 Intro1.5

Bu aşamaya kadar network L2 olarak tamam ancak IP yapılandırması için L3 arayüze ihtiyaç duyuyoruz. L3 arayüz olarak fiziksel arayüzleri veya bond channel’i kullanmadık. L3 için bridge arayüzü kullanacağız. Bridge sayesinde linux server içindeki sanallaştırma unsurlarına sanal arayüz ve ip desteği vereceğiz.

Bu makale için bu kadarı yeterli. VBridge arayüz ve sanallaştırmaya doğru sonraki makalelerde ilerleyeceğiz.

Görüşmek üzere herkese iyi günler.

Murat KAYAPINAR
Elect. Eng. & Comm. Eng.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir