KVM, Benim icin yeni bir baslangic – Networking 1

Network zamanimizda SDDC ile beraber degisime baslasmis ve VMware NSX , Openstack Networking Neutron , OpenDaylight gibi SDN yaklasimlariylada network alt yapilarini sekillendirme gereksinimlerini koruklemektedir.

Acikcasi o kadar cok VMware ile ilgilenmekten vSwitch , vDS , Virtual Port , Port group , Uplink Port ,  NSX derken KVM, Xen , Openstack networking e donunce soyle bir ne oluyor dedim kendi kendime , onun icin bu konu biraz genis.

Ubuntu dokumantasyonu KVM/Networking anlatirken iki tip seyden bahsediyor ;

  • Usermode Networking
    • Cok basitce guest OS lar network servislerine erisebilirken (NAT yapilmis bir ortam) mesela bir web sayfasini gezip bir yerlere FTP yapabilirken , host edilen ve disariya acik olan servislerin (mesela bir web server olarak calismak (google.com web sitesini host etmek gibi)) sunulmasina imkan verilmez.
  • Bridged Networking –> Bunu simdi uzun uzadiya anlatacagim fakat kisaca kendisi guest OS larin sanal network kartlarinin bagli oldugu bridge ve bu bridge uplink i konumunda olan fiziksel arabirim uzerinden dis network lere erisim saglar.

Oncelikle “Bridge” : Bridge aslinda cok eski bir network deyimi –> http://www.just2good.co.uk/bridgeSwitch.php

Bridge

Essentially, the problem with extending LANs with hubs and repeaters is that signals are amplified, but so too is the noise. Since these devices are dumb, all data is forwarded onto the rest of the network. With many nodes, the result is that the amount of network traffic becomes too volumous and the collision rate increases.

A way around this is to use a more intelligent device such as a bridge. It should be noted that a bridge can be a dedicated piece of hardware, or may also be a suitably configured workstation with two Ethernet network cards.

Bridges allow LANs to be split up into smaller ‘segments’ (called internetworking), yet all machines in the divided network still form a single IP network. A node within a segment in this internetwork will only see frames transmitted by nodes within the same segment, and not frames from nodes in other segments of the internetwork, unless they are forwarded from one segment to the other by the bridge. Hence the bridge performs the filtering of frames in order to limit the amount of network traffic. This is possible because bridges work at Layer 2 (Data Link) of the OSI model. This means that they can examine the data being sent and determine which segment the data needs to be forwarded to.

Gorevi transparan olarak iki network interface i arasinda trafigi gecirmek , OSI ye gore ikinci katmanda calisir yani MAC adresleri ile hasir nesir olur ,  bunu yaparkende protokol bagimsizdir IP , IPX , NetBEUI (heygidi hey) , STP destekler, multiple-bridge destekler

Linux da bridging kernel kodunda ve sanal olarak yapilmakla beraber hardware cihazlara gore birtakim avatajlarida vardir mesela filtering ve traffic shaping gibi . Mesela filtering e ornek olarak “ebtables” verilebilir. Iptables in L2 de calisani gibi dusumebilirsiniz neler yapabilir derseniz buna , ornek derseniz buna tiklayin. Traffic Shaping icin ise Linux da Traffic-Control (tc) ornek verilebilir.

KVM ve sanal makine gozunden baktigimizda bridge = vswitch veya bridge = L2 Switch , yani KVM uzerinde kosan sanal makineleri sanal network interface lerinin baglandigi yazilim tabanli switch. VMware gozunden vSS (vSphere Standard Switches) . Sonuc olarak hypervisor VM ler arasi ve dis networklere dogru trafigi bridge’ler sayesinde iletir.

Burada TUN/TAP , MacVLAN , MacVTap , VEPA diye kavramlar onu sonradan inceleyecegiz. (elde var bir)

Peki Open vSwitch ne ? 

Anahtar konular, elimizde eger birden fazla KVM nodu var ise , network islemlerini bir programatige kavusturmak istiyor isek ve standart trafik bilgi ve olcumleme araclarini  (NetFlow,IPFIX) kullanacaksaniz bu durumda adres Open vSwitch oluyor, biraz daha ayrintiya girecek olur isek.

Durumun Tasinabilirligi : Herhangi bir sanal sunucunun durumunun kolayca saptanabilmesi ve farkli bir KVM host a tasinabilir olmasi gerekir , bunu yaparkende halihazirda sistem calisirken ogrenilmis  L2 learning tablo’larinin , L3 Forwarding tablo’larinin ve set edilmis Access List , QoS , policy routing ve monitoring (NetFlow,IPFIX) ayarlarinin ayni sekilde sanal makinenin yeni yerinde calisiyor olmasi gerekir. Open vswitch bunu saglar.

Network Dinamiklerine cevap verme : Sanal ortamlarda sayisiz vm yaratma , silme , migrate etme gibi islemler yapilir , eger bu islemleri izleyip birseyler tetiklemek istiyorsaniz open vswitch size OVSDB (Network State Database) ve NetFlow gibi araclarla degisiklikleri izleyip aksiyon almanizi saglarlar. Mesela OVSDB sorgulayarak VM Migration lari izleyebilirsiniz. OpenvSwitch hakkinda daha sonra daha ayrintili bakacagim (elde oldu 2)

Baslangic icin bu kadar yeterli, zaten ilk basta linux bridging kullanacagimiz icin , openstack olaylarinida daha sonra girecegimden yola devam (Bu arada openstack e girdigimizde birde ML2 adli plugin le karsilasacagiz ki o da bize KVM host uzerinde networking icin linux bridge mi , openvswitch mi , cisco nexus mu artik ne kullanacagimizi belirleyen bir arabirim olacak) (elde oldu 3)

Simdi bir onceki “KVM, Benim icin yeni bir baslangic – Kurulum” uzerinden devam edelim ;

KVM icin gerekli seyler kurulduktan sonra birkac noktayi belirlemek lazim ;

Oncelikle bir “ifconfig” yapalim , goreceksiniz ki loopback ve ethernet interface’inden farkli bir interface daha var

virbr0    Link encap:Ethernet  HWaddr 76:81:28:9d:b2:05

inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0

UP BROADCAST MULTICAST  MTU:1500  Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Eger “cat /etc/network/interfaces” derseniz hic birsey goremeyeceksiniz🙂

Bu arada ortada 192.168.122.0/24 bir network turemis ve sart olmasada bridge interface “virbr0” atanmis


Kurulum esnasinda “virbr0” adinda bir bridge yaratilmis ve KVM host uzerindeki herhangi bir fiziksel interface’e atanmamis.

noroot@kvmci:~$ brctl show

bridge name bridge id STP enabled interfaces

virbr08000.000000000000yes


 

Normalde ilk kurulumda herhangi firewall kurali aktif degil idi Ubuntu sunucuda , ne ufw (gufw) nede iptables fakat ilgili kurallar ilgili bridge interface icin otomatik olarak gelmis

noroot@kvmci:~$ sudo iptables -L -v -n

[sudo] password for noroot:

Chain INPUT (policy ACCEPT 236 packets, 20251 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0 ACCEPT     udp  —  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53

0     0 ACCEPT     tcp  —  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53

0     0 ACCEPT     udp  —  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67

0     0 ACCEPT     tcp  —  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0 ACCEPT     all  —  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED

0     0 ACCEPT     all  —  virbr0 *       192.168.122.0/24     0.0.0.0/0

0     0 ACCEPT     all  —  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0

0     0 REJECT     all  —  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

0     0 REJECT     all  —  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 160 packets, 18157 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0 ACCEPT     udp  —  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68


 

Birde libvirt kurulumu ile beraber “dnsmasq” turemis durumda , boylece hizli bir sekilde DHCP , DNS , BOOTP/PXE boot gibi servisler hizlica kullanilabilir durumda.

noroot@kvmci:~$ ps -fe | grep dnsmasq

libvirt+  1647     1  0 18:39 ?        00:00:00 /usr/sbin/dnsmasq –conf-file=/var/lib/libvirt/dnsmasq/default.conf

noroot    1824  1714  0 19:04 pts/0    00:00:00 grep –color=auto dn


 

Libvirt api daha onceki makalemizde dedigimiz gibi sadece hypervisor’leri degil ayni zamanda storage, network gibi bilesenleride yonetiyor fakat makalenin bundan sonraki kisminda libvirt virtual networking ile ilgili herhangi birsey yazmayacagim, yapmak istedigim cok kabaca bir VM’e public ip adresi vermek ve onu internet e cikartmak yani bridge i sanki Pass-True cihaz gibi kullanmak.

Oncelikle su fazlaliklari bir atalim , yaratilan bridge , iptables rule lari falan hepsi bir gitsin . Burada libvirt varsayili olarak bu ayarlamalari yaptigindan kaldirmasida cok kolay.

Asagidaki komut  sayesinde libvirt kurulumunda varsayili olarak kurulan default network’unu acilista devreye girmemesini saglayacagiz

noroot@kvmci:~$ virsh net-autostart default –disable

setlocale: No such file or directory

Network default unmarked as autostarted

Durum bu sekilde olacak

noroot@kvmci:~$ virsh net-list

setlocale: No such file or directory

Name                 State      Autostart     Persistent

———————————————————-

default              active     no            yes

Simdi hersey temiz olsun makineyi bir reboot edelim bridge’in kayboldugunu ve iptables kurallarinin gittigini gorelim

Uzerinde calisacagimiz yapinin resmi asagidaki gibi olacak ;

Screen Shot 2015-11-27 at 14.39.02

Yukardaki resimde gordugunuz gibi bir KVM node mevcut ve iki adet network interface’i var, ilgili interface’ler “access mode” tanimli, burada ben ikinci interface’imi “bridge” gereksinimleri icin kullanacagim. Daha sonra sanal makineler yaratilacak ve bridge interface’i kullanaraktan yollarina devam edecekler.

Oncelikle herhangi bir ip adresi atanmamis olan ikinci interface’imi up ediyorum

noroot@kvmci:~$ sudo ifconfig em2 up

brctl” komutu ile “bridge1” adinda bir bridge yaratiyorum

noroot@kvmci:~$ sudo brctl addbr bridge1

[sudo] password for noroot:

Bridge’in kullanacagi network interface’ini set ediyorum

 

noroot@kvmci:~$ sudo brctl addif bridge1 em2

Kontrol edelim ….

noroot@kvmci:~$ brctl show

bridge name bridge id STP enabled interfaces

bridge1 8000.0017a4770c95 no em2

Bridge interface’ini up edelim

noroot@kvmci:~$ sudo ifconfig bridge1 up

Bu islemden sonra “ifconfig” dediginizde bridge interface’inizde gormeye baslayacaksiniz, elimizde henuz makine olmadigindan geri kalan sanal sunucu yaratma ve ilgili bridge interface baglanma olayini o zaman yapacagiz.

Son olarak burada bridge interface yarattigim network interface’i “trunk” ayarlida olabilir , bir baglanti uzerinden birden fazla bridge’de yaratabiliriz ama buradaki makale cok basit bir sekilde neyin ne oldugunu anlamak icin var.

Bu arada ilgili bridge konfigrasyonu KVM Node reboot edildiginde gidecek , kalici ayarlanmis degil.

Guzel Linkler

OVS Hakkinda bunuda izlemeden gecememek lazim bu arada :) https://www.openstack.org/summit/openstack-paris-summit-2014/session-videos/presentation/migrating-production-workloads-from-ovs-to-linux-bridge-w-ml2

http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=FAQ;hb=HEAD
https://github.com/openvswitch/ovs/blob/master/WHY-OVS.md

 

Posted on 27/11/2015, in KVM and tagged , , , , , . Bookmark the permalink. 1 Comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: