{"id":1183,"date":"2015-09-07T17:35:51","date_gmt":"2015-09-07T15:35:51","guid":{"rendered":"http:\/\/tn.genano.de\/wordpress\/?p=1183"},"modified":"2015-09-07T17:39:19","modified_gmt":"2015-09-07T15:39:19","slug":"kvm-vms-mit-bonding-und-vlans-und-cisco-switchen-auf-centos-67-bridgen","status":"publish","type":"post","link":"https:\/\/tn.genano.de\/wordpress\/2015\/09\/07\/kvm-vms-mit-bonding-und-vlans-und-cisco-switchen-auf-centos-67-bridgen\/","title":{"rendered":"KVM VMs mit Bonding und VLANs und Cisco Switchen auf CentOS 6\/7 bridgen"},"content":{"rendered":"<p>Wer gro\u00dfe Rechner mit KVM und vielen VMs hat kommt vielleicht an einen Punkt an dem Ihm das Gigabit Interface nicht mehr reicht. Dann gibt es verschiedene Varianten die Bandbreite zu erh\u00f6hen.<\/p>\n<p>Eine einfache Variante ist es auf ein 10 Gigabit Interface zu nutzen. Schnell einfach und sch\u00f6n, wenn man die M\u00f6glichkeit hat.<\/p>\n<p>Alternativ kann man auch einzelne Gigabit Interfaces nutzen und die Rechner darauf verteilen. Das ist einfach und ben\u00f6tigt wenig Konfiguration, ist allerdings auch nur wenig flexibel und man muss immer aufpassen auf welchen Interface man einen Rechner anlegt.<\/p>\n<p>Es gibt aber auch eine schicke L\u00f6sung f\u00fcr dieses Problem. Das Zusammenfassen von Interfacen. Dabei agieren &lt;N&gt; Interface wie ein einzelnes, erh\u00f6hen dabei aber die Gesamtbandbreite und sind untereinander Fehlertolerant. Ein entsprechendes Setup soll hier anhand von Cisco Switchen erl\u00e4utert werden.<\/p>\n<p><!--more--><\/p>\n<p>Achtung, Portchannel bei Cisco und Bonding unter Linux meinen bei uns das gleiche, bitte nicht verwirren lassen.<\/p>\n<h2>Auf dem Cisco<\/h2>\n<p>Zuerst wird einen passenden Portchannel auf dem Cisco angelegt. Dazu loggt man sich ein, enabled sich\u00a0 (falls n\u00f6tig) und wechselt in den configure Modus.<\/p>\n<pre>conf t<\/pre>\n<p>Nun wird das Interface angelegt, dabei wird &#8222;Po&#8220; bzw. &#8222;Portchannel&#8220; durchnumeriert. Zu beachten ist das der Interface Name wirklich frei ist.Wird\u00a0versehentlich eine existierender Portchannel verwendet kann dies zu Stre\u00df mit dem Netzwerkadmin f\u00fchren ;-).<\/p>\n<pre>interface &lt;freies!!! po device&gt; z.B. po1\r\ndescription Mein_Schoener_neuer_Portchannel<\/pre>\n<p>Nat\u00fcrlich f\u00fcgt man auch eine sprechende Description ein, sp\u00e4testens in drei Monaten ist man froh dar\u00fcber.<\/p>\n<p>Anschlie\u00dfend wird die Encapsulation des Portchannels eingestellt, also das Verfahren mit dem die VLANs \u00fcbertragen werden. Vielleicht ist das in der Konfiguration schon default, schadet aber nichts. Der Modus wird auf Trunk umgestellt, damit \u00fcbertr\u00e4gt der Switch alle VLANs an diesem Port. Das ist prinzipiell nicht wirklich sicher, deswegen kann man einem Trunkport Accesslisten geben, dazu sollte man sich auf jeden Fall informieren.<\/p>\n<pre>switchport trunk encapsulation dot1q\r\nswitchport mode trunk\r\nno ip address\r\nend<\/pre>\n<p>Zus\u00e4tzlich wird dem Port noch gesagt das er keine IP-Adresse hat, das scheint auf diversen Switchen nicht unbedingt n\u00f6tig zu sein, stand aber in meiner Doku so und schadet nicht. Mit &#8222;end&#8220; wird die Konfiguration abgeschlossen.<\/p>\n<p>Damit ist der eigentliche Portchannel konfiguriert. Nun m\u00fcssen diesem Portchannel noch die entsprechenden Interfaces zugeteilt werden, welche dann\u00a0zusammengefa\u00dft werden.<\/p>\n<p>Im configure Modus des Switches (oder des Stacks) w\u00e4hlt man dazu das Interface aus welches man konfigurieren will, versieht es mit einer Description (ich w\u00fcrde TRUNK und einen Hinweis auf den Portchannel vorkommen lassen). Dazu wird auch wieder die Encapsulation eingestellt (diese kann einen andere sein, mu\u00df aber durchg\u00e4ngig \u00fcberall gleich sein).<\/p>\n<pre>conf t\r\nint &lt;einzelnes bonding interfaces&gt;\r\ndesc host.domain.tld-PCH-TRUNK\r\nswitchport trunk encapsulation dot1q\r\nswitchport mode trunk\r\nno ip address\r\nno shut<\/pre>\n<p>Zus\u00e4tzlich\u00a0teilt man dem Port noch seinen Modus mit, sagt auch Ihm das er keine IP braucht und setzt den Port auf &#8222;no shut&#8220; also auf an.<\/p>\n<p>Nun kommt die Konfiguration des Link Aggregation Control Protocol welches beschreibt wie Switche und Server\u00a0physische Verbindungen zusammenfassen. Das ganze ist nach IEEE 802.3ad spezifiziert. Dabei gibt man das Protokoll an (es gibt viele, oft propriet\u00e4re), f\u00fcr mich hat sich dabei LACP bew\u00e4hrt. Und es wird das Interface dem eigentlichen Portchannel zugewiesen.<\/p>\n<pre>channel-protocol lacp\r\nchannel-group &lt;int&gt; mode passive #&lt;&lt;--- Portchannel Interface Nummer\r\nend<\/pre>\n<p>Da der Linuxtreiber per default im passive Mode arbeitet verwenden wir diesen. Dabei wird von beiden Seiten keine negoation durchgef\u00fchrt wird.<\/p>\n<p>Damit ist die Ciso Konfiguration abgeschlossen. Bitte das &#8222;write&#8220; nicht vergessen, sonst wird es beim n\u00e4chsten reboot des switches b\u00f6se ;-).<\/p>\n<h2>Auf Linux<\/h2>\n<p>Auf den Linux Rechnern reicht f\u00fcr das Interface eine minimale Konfiguration. In diesem Beispiel verwenden wir Interface 1 bis 3 (eth1 bis eth3) f\u00fcr einen 3 Gigabit Portchannel und eth0 als Admin Netz f\u00fcr den Host. Theoretisch k\u00f6nnte man auch den Bond selbst f\u00fcr das Admin Netz verwenden, allerdings ist ein reines eth einfach stabiler und wird auch bei Auslastung des Bonds nicht eingeschr\u00e4nkt.<\/p>\n<h3>Physikalische INterfaces<\/h3>\n<p>Konfiguration aus \/etc\/sysconfig\/network-scripts\/ifcfg-eth1<\/p>\n<pre>IPV6INIT=no\r\nBOOTPROTO=none\r\nDEVICE=eth1\r\nONBOOT=yes\r\nHWADDR=xx:xx:xx:xx:xx:xx\r\nUUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx\r\nTYPE=Ethernet\r\nDEFROUTE=no\r\nPEERDNS=no\r\nPEERROUTES=no\r\nIPV4_FAILURE_FATAL=no\r\nIPV6_AUTOCONF=no\r\nIPV6_DEFROUTE=no\r\nIPV6_PEERDNS=no\r\nIPV6_PEERROUTES=no\r\nIPV6_FAILURE_FATAL=no\r\nNAME=\"System eth1\"\r\nMASTER=bond0\r\nSLAVE=yes\r\nUSERCTL=no<\/pre>\n<p>Das meiste sind Defaultwerte, wichtig sind neben den Hardware spezifischen Werten wie Userid und Macadresse noch die Master Einstellung auf das erste Bonding Interface (bond0) und die Slave Einstellung um das Device als Slave dem Bond0 zu zu ordnen. Unter CentOS 6 k\u00f6nnen diverse Einstellungen entfallen und einfach nur Master und Slave erg\u00e4nzt werden.<\/p>\n<h3>Bonding INterface<\/h3>\n<p>Als erstes muss das Linux Kernel Modul (der Treiber) f\u00fcr das Bonding geladen werden. Dazu passt man \/etc\/modprobe.d\/bonding.conf an und f\u00fcllt sie entsprechend mit:<\/p>\n<pre>alias bond0 bonding<\/pre>\n<p>Nun k\u00f6nnte man booten oder das Modul einfach mit modprobe laden.<\/p>\n<pre><span class=\"crayon-p\">modprobe bonding mode=<\/span>4 miimon=100<\/pre>\n<p>Mit der Datei \/etc\/sysconfig\/network-scripts\/ifcfg-bond0 konfigurieren wir den Bond.<\/p>\n<pre>DEVICE=bond0\r\nONBOOT=yes\r\nBOOTPROTO=none\r\nUSERCTL=no\r\nBONDING_OPTS=\"mode=4 miimon=100\"<\/pre>\n<p>Die Konfiguration ist auch recht \u00fcbersichtlich, da der Bond nur virtuell existiert haben wir keine Hardware spezifischen Eintr\u00e4ge. Das Device hei\u00dft bond0 (es kann hei\u00dfen wie es will, ich w\u00fcrde aber etwas sprechendes nehmen). Beim Booten soll es gestartet werden, wir ben\u00f6tigen kein Boot Protokoll wie DHCP oder STATIC weil wir keine IP Konfiguration auf dem Interface haben. Der Mode 4 bei den Bonding Options besagt das ein IEEE 802.3 ad Tunnel verwendet werden soll und miimon gibt an wie oft (in Millisekunden) der Link der einzelnen Bond Interfaces \u00fcberwacht werden soll. Weitere Parameter finden sich in der CentOS Doku.<\/p>\n<p>Soweit so gut, bisher k\u00f6nnen wir noch nicht viel mit dem Interface anfangen, es f\u00e4llt maximal das default VLAN raus. In der Regel m\u00f6chte man aber gezielt (verschiedene VLANs) f\u00fcr seine VMs zur Verf\u00fcgung haben. Dazu m\u00fcssen nun die einzelnen VLANs konfiguriert werden und im Anschlu\u00df Bridges f\u00fcr KVM.<\/p>\n<h3>VLAN INterfaces<\/h3>\n<p>Um VLAN Interfaces anzulegen reicht es aus eine entsprechende Konfiguration zu erstellen und VLAN=yes zu sagen.<\/p>\n<pre>DEVICE=bond0.20\r\nVLAN=yes\r\nONBOOT=yes\r\nTYPE=Ethernet<\/pre>\n<p>Mit der obigen Konfiguration wird das VLAN 20 auf dem Rechner zur Verf\u00fcgung gestellt. W\u00fcrde man eine IP-Adresse auf dem Interface Konfigurieren h\u00e4tte man nun einen Multi-Homed-Host mit einem Interface in zwei Netzen. Wir lassen jedoch alle weitere Konfiguration weg, da wir lediglich unsere VMs im entsprechenden Netz betreiben wollen.<\/p>\n<h3>Bridge INterfaces<\/h3>\n<p>Um die Netzwerke an KVM zu \u00fcbergeben ben\u00f6tigt man Bridges (Br\u00fccken). Diese vermitteln zwischen unseren (virtuellen) Hardware Interfacen und dem Hypervisor.<\/p>\n<p>Mit dem Befehl brctl kann man die Bridges verwalten. Die erste Bridge wird wie folgt angelegt:<\/p>\n<pre>brctl addbr br0<\/pre>\n<p>Damit ist das eigentliche Bridgedevice angelegt, uns fehlt aber noch die eigentliche Zuordnung zum Physikalischen Interface. Dazu ben\u00f6tigen wir eine weitere Anweisung:<\/p>\n<pre>brctl addif br0 bond0.20<\/pre>\n<p>Nun ist festgelegt welches Interface die Brigde versorgt. Man k\u00f6nnte also auch sagen &#8222;VLAN 20 liegt auf br0&#8220;. Damit das ganze nach dem Booten auch noch funktioniert und \u00fcber die ifup Scripte gestartet werden kann muss dazu nat\u00fcrlich auch noch Konfiguration her.<\/p>\n<p>In \/etc\/sysconfig\/network-scripts\/ifcfg-bond0.20 erg\u00e4nzen wir dazu die Bridgeinformation:<\/p>\n<pre>DEVICE=bond0.20\r\nVLAN=yes\r\nONBOOT=yes\r\nTYPE=Ethernet\r\n<span style=\"color: #ff0000;\">BRIDGE=br0<\/span><\/pre>\n<p>Und legen in \/etc\/sysconfig\/network-scripts\/ifcfg-br0<\/p>\n<pre>DEVICE=br0\r\nTYPE=Bridge\r\nBOOTPROTO=none\r\nONBOOT=yes\r\nDELAY=0<\/pre>\n<p>die Konfiguration der Bridge an. Nun \u00fcberpr\u00fcfen wir mit brctl show unsere Konfiguration:<\/p>\n<pre>bridge name bridge id STP enabled interfaces\r\nbr0 8000.xxxxxxxxxxxx no bond0.20<\/pre>\n<p>Ein ifup br0 macht unsere Bridge f\u00fcr das System verf\u00fcgbar. Mit ip a sehen wir unsere Bridge.<\/p>\n<pre>5: br0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UNKNOWN \r\n link\/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff\r\n inet6 xxxx::xxxx:xxxx:xxxx:xxxx\/64 scope link \r\n valid_lft forever preferred_lft forever<\/pre>\n<p>Nun sollte man einmal booten und schauen ob auch alle Interface up kommen wie man es erwartet.<\/p>\n<h3>Im Virtmanager<\/h3>\n<p><a href=\"http:\/\/img.tn.genano.de\/wordpress\/wp-content\/uploads\/2015\/09\/kvm_nic_selection.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1190\" src=\"http:\/\/img.tn.genano.de\/wordpress\/wp-content\/uploads\/2015\/09\/kvm_nic_selection.png\" alt=\"kvm_nic_selection\" width=\"268\" height=\"223\" \/><\/a>Ab sofort sollten jetzt die Brigdes im der NIC selection im Virt-Manager auftauchen. Hier ein Ausschnitt auf einem Host mit mehreren VLANs. Durch die Auswahl einer Bridge kann man den Host jetzt in das entsprechende Netz packen.<\/p>\n<p>Ich hoffe das hilf dem einem oder anderen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer gro\u00dfe Rechner mit KVM und vielen VMs hat kommt vielleicht an einen Punkt an dem Ihm das Gigabit Interface nicht mehr reicht. Dann gibt es verschiedene Varianten die Bandbreite zu erh\u00f6hen. Eine einfache Variante ist es auf ein 10 &hellip; <a href=\"https:\/\/tn.genano.de\/wordpress\/2015\/09\/07\/kvm-vms-mit-bonding-und-vlans-und-cisco-switchen-auf-centos-67-bridgen\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,43,3],"tags":[260,264,262,263,248,261],"class_list":["post-1183","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-konfiguration","category-linux","tag-bonding","tag-bridge","tag-cisco","tag-kvm","tag-linux","tag-portchannel"],"_links":{"self":[{"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/posts\/1183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1183"}],"version-history":[{"count":0,"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/posts\/1183\/revisions"}],"wp:attachment":[{"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tn.genano.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}