Open vSwitch kasutamine operatsioonisüsteemiga Debian v. 8 Jessie

Allikas: Imre kasutab arvutit

Sissejuhatus

Open vSwitch (OVS) http://openvswitch.org/ on vaba tarkvaraline tarvaraline kommutaator. OVS puhul on üheks aktsendiks kasutamine virtualiseerimise lahenduste juures.

Mõisted

  • repeater - põhimõtteliselt kahepordine seade liinil sumbuva signaali võimendamiseks
  • hub - moodustab ühe collision domeeni (mis on tavaliselt ka broadcast domain); võib kujutleda kui mitmepordist repeaterit
  • bridge - põhimõtteliselt kahepordine seade, aitab eraldada collision domeene, aga bridge mõlemad pooled on samas broadcast domeenis
  • switch - tekitab collision-vaba võrgu; võib kujutleda kui mitmepordist bridge't
  • collision domeen - sama traadi peal käivad signaalid on kõigile seadmetele (nt arvutite võrguseadmetele) nähtavad, st iga üksik etherneti frame ja seal sees olev ip pakette vms); switchisid kasutades on iga pordi taga oma collision domeen, domeenis on üks arvuti
  • broadcast domeen - võrgus olevad osalised, kellele jõuavad arp jms broadcastitud paketid (mille nt bridge ja switch läbi lasevad)

Tööpõhimõte

OVS esineb tuuma moodulite ja userspece haldusutiliitide kujul kasutades võimalikult palju ära Linux tuumas juba olemasolevaid võimalusi, nt QoS. Töödavad kaks deemonit

  • ovs-vswitchd - tegeleb pakettide switchimisega
  • ovsdb-server - tegeleb switchi seadistamisega ja teda juhitakse ovs-vsctl programmiga

Asjasse puutuvad failid

  • logi - /var/log/openvswitch/ovs-vswitchd.log
  • andmebaas - /var/lib/openvswitch/conf.db

OVS kasutamisel otseselt seaditusfaili midagi ei tule kirjutada, erinevate ovs_* käsude tulemusena kirjutatakse andmebaasi sisu ja koheselt vastav muudatus ka kehtestatakse; see sisu nö elab arvuti reboodi üle.

Switchi seadistamist kirjeldatakse järgmistes punktides, eriti maksab tähelepanu pöörata punktis NetFlow kirjeldatud viisile anda ühe korraga mitut kästu kasutades käskude vahel ühiseid muutujaid

Paigaldamine

Debian v. 7 Wheezy

Debian v. 7 Wheezy paketihaldus sisealdab 2014 aasta suve seisuga üsna vana tarvkara v. 1.4.2

# apt-get install openvswitch-switch
...
[FAIL] Inserting openvswitch module ... failed!
Module has probably not been built for this kernel.
Install the openvswitch-datapath-source package, then read
/usr/share/doc/openvswitch-datapath-source/README.Debian

ning edasi nagu arvuti õpetab

# apt-get install openvswitch-datapath-source
# module-assistant auto-install openvswitch-datapath

Tulemusena tekitavad kaks tuuma moodulit

/lib/modules/3.2.0-4-amd64/kernel/openvswitch_mod.ko
/lib/modules/3.2.0-4-amd64/kernel/brcompat_mod.ko

Lisaks võiks paigaldada kaks paketti

# apt-get install openvswitch-brcompat openvswitch-controller

Debian Jessie (testing)

Debian Jessie (testing) paketihaldus sisaldab 2014 suve seisuga v. 2.1.4 tarkvara

# apt-get install openvswitch-switch
..
Inserting openvswitch module.
/etc/openvswitch/conf.db does not exist ... (warning).
Creating empty database /etc/openvswitch/conf.db.
Starting ovsdb-server.
Configuring Open vSwitch system IDs.
Starting ovs-vswitchd.
Enabling remote OVSDB managers.

kusjuures paistab, et 2014 suvel on tuumaga sobiv moodul kaasas

# lsmod | grep openvswitch
openvswitch            63887  0 
gre                    12777  1 openvswitch
vxlan                  35023  1 openvswitch
libcrc32c              12426  1 openvswitch

Ubuntu v. 14.04

Praktiliselt nagu Debian Jessie.

Käivitamine

Käivitamiseks tuleb öelda

# /etc/init.d/openvswitch-switch start

Tulemusena Ubuntu keskkonnas

# /etc/init.d/openvswitch-switch status
ovsdb-server is running with pid 28633
ovs-vswitchd is running with pid 28684

ja töötavad sellised protsessid

# ps -ea | grep ovs
2601 ?        00:00:00 ovsdb-server
2602 ?        00:00:00 ovsdb-server
2652 ?        00:00:00 ovs-vswitchd
2653 ?        00:00:00 ovs-vswitchd

Kasutamine

Switchi tekitamine

Switchi tekitamiseks

# ovs-vsctl add-br ovsbr0
# ovs-vsctl add-port ovsbr0 eth1

Omaduste küsimiseks

# ovs-vsctl show
bc34235e-cf7a-4c4f-b8e5-c59b4b9fea5c
   Bridge "ovsbr0"
       Port "ovsbr0"
           Interface "ovsbr0"
               type: internal
       Port "eth1"
           Interface "eth1"
   ovs_version: "2.1.4"

Seejärel saab ovsbr0 seadmele omistada ip aadressi ja kasutada võrku.

# ovs-appctl fdb/show ovsbr0
 port  VLAN  MAC                Age
    1     0  00:04:23:bd:17:d9  269
    1     0  00:04:23:c8:fa:eb  116
    1     0  00:16:17:ab:d4:b7   47
    1     0  6c:50:4d:53:6a:da   35
    1     0  12:bd:eb:f8:bc:15   27
    1     0  00:00:5e:00:01:0b    1

Switchi portide nimekirja küsimiseks

# ovs-vsctl list port

Pordi lisamiseks switchile

# ovs-vsctl add-port ovsbr0 tep0

Pordi kustutamiseks

# ovs-vsctl del-port ovsbr0 tep0

Switchi omaduste küsimiseks

# ovs-vsctl list bridge ovsbr0

VLAN kasutamine

VLAN sildi kasutamine

Kahe füüsilise liidesega ovsbr0 switch seadistus paistab nt selline

# ovs-vsctl show
c94cbdcf-2c25-4c02-ae93-f8d68ddce07d
   Bridge "ovsbr0"
       Port "eth2"
           tag: 400
           Interface "eth2"
       Port "ovsbr0"
           Interface "ovsbr0"
               type: internal
       Port "eth3"
           Interface "eth3"
   ovs_version: "2.1.0"

kus

  • Port eth2 koosneb ühest füüsilisest samanimelisest liidesest ja see on nn mode access režiimis port, st sealt lähevad välja ilma vlan siltideta vlan 200 paketid, mis on kuskilt muud kaudu switchi sisenenud

Sellise tulemuse saavutamiseks sobib

  • moodustada nö tavaline eth2 ja eth3 liidestega switch
  • täpsustada eth2 port seadistust, et ta on mode access
# ovs-vsctl set port eth2 tag=400

Üksiku parameetri väärtust saab küsida

# ovs-vsctl get port eth2 tag
400
VLAN trunk kasutamine

Vaikimisi on Open vSwitch pordid selliste omadustega, et sealt saavad läbi igasugused paketid

  • vlan siltidega
  • ilma vlan siltideta

Olgu kahe füüsilise liidesega ovsbr0 switch seadistus nt selline

# ovs-vsctl show
c94cbdcf-2c25-4c02-ae93-f8d68ddce07d
   Bridge "ovsbr0"
       Port "eth2"
           tag: 400
           Interface "eth2"
       Port "ovsbr0"
           Interface "ovsbr0"
               type: internal
       Port "eth3"
           trunks: [400, 401, 402]
           Interface "eth3"
   ovs_version: "2.1.0"

kus

  • port eth3 on trunk port ja tegeleb ainult vlan 400, 401 ja 402 siltidega pakettidega
  • tulemusena saavad switchi eth3 kaudu sisse vlan 400 sildiga paketid ja eth2 kaudu välja sama vlan paketid, millelt on vlan silt eemaldatud

Internal pordi tekitamine

Internal pordi tekitamiseks vlan 1005 peale sobib öelda

# ovs-vsctl add-port ovsbr0 vlan1005 tag=1005 -- set interface vlan1005 type=internal

Pordi shutdown olekusse viimine

Tundub, et nö port administrativ shutdown jaoks on samaväärne öelda

# ifconfig vlan1005 down
# ifconfig vlan1005 up

NetFlow

NetFlow seadistamiseks sobib öelda nt

# ovs-vsctl -- set Bridge xenbr0 netflow=@nf -- \
  --id=@nf create NetFlow targets=\"192.168.10.123:9910\" active-timeout=30
6b0b6bfd-5a8e-4bbe-aec3-77939db1ac4b

kus

  • OVS'iga seotud objektidel on oma id väärtused, tavaliselt on see objekti loomisel antud käsu väljundiks
  • -- märkidega eristatakse ühe korraga sisuliselt antavaid mitmeid käske (NetFlow objekti loomine ja objecti ühendamine bridega)
  • --id=@nf omistab järgneva käsu tulemusena tekkiva objekti id väärtuse näidatud muutujale (@nf), mida saab mõnes muus käsus kasutada

Tulemuse vaatamiseks sobib öelda

# ovs-vsctl list NetFlow
_uuid               : 6b0b6bfd-5a8e-4bbe-aec3-77939db1ac4b
active_timeout      : 30
add_id_to_interface : false
engine_id           : []
engine_type         : []
external_ids        : {}
targets             : ["192.168.10.123:9910"]

kus

  • TODO

ning

# tcpdump -ni eth0 port 9910
...
09:51:36.436933 IP 192.168.10.9.58324 > 192.168.10.123.9910: UDP, length 264
09:51:39.438722 IP 192.168.10.9.58324 > 192.168.10.123.9910: UDP, length 408

Eemaldamiseks

# ovs-vsctl clear Bridge xenbr0 netflow

Kasulikud lisamaterjalid

Port mirror

Eeldame, et on olemas switch ovsbr0 ning selle küljes portid eth2 ja eth4, kusjuures port eth2 sisenev ja väljuv liiklus peegeldakse porti eth4. Port mirrori tekitamiseks sobib öelda üks käsk

# ovs-vsctl -- set Bridge ovsbr0 mirrors=@m \
  -- --id=@eth2 get Port eth2 \
  -- --id=@eth4 get Port eth4 \
  -- --id=@m create Mirror name=mymirror \
  select-dst-port=@eth2 select-src-port=@eth2 \
  output-port=@eth4

kus

  • --id=@eth2 get Port eth2 - küsib swithi port eth2 id väärtuse ja omistab muutujale @eth2
  • --id=@eth4 get Port eth4 - küsib swithi port eth4 id väärtuse ja omistab muutujale @eth4
  • --id=@m create Mirror name=mymirror select-dst-port=@eth2 select-src-port=@eth2 output-port=@eth4 - tekitad mirrori mymirror, seostab sellega port eth2 switchi suhtes siseneva ja väljauva liikluse ja mirrordab ta porti eth4
  • set Bridge ovsbr0 mirrors=@m - ühendab mirror objekti bridgega

Mirrorite andmete esitamiseks

# ovs-vsctl list mirror mymirror

Switchi ühe konkreetse mirrori kustutamiseks sobib öelda

# ovs-vsctl -- --id=@m get mirror mymirror -- remove bridge ovsbr0 mirrors @m

Switchi kõige mirrorite kustutamiseks sobib öelda

# ovs-vsctl clear Bridge ovsbr0 mirrors

Kasulikud lisamaterjalid

Kahe switchi ühendamine

Tundub, et kahe switchi nö patch abil ühendamisel käib seal kõik liiklus läbi. Eeldusel, et lähtepunktiks on kahe switchi olemasolu, sobib öelda

# ovs-vsctl \
          -- add-port br0 patch0 \
          -- set interface patch0 type=patch options:peer=patch1 \
          -- add-port br1 patch1 \
          -- set interface patch1 type=patch options:peer=patch0

Kasulikud lisamaterjalid

GRE tunnel

GRE tunnel on üks mitmetest nö üldotstarbelistest tunnelitest, mida võiks iseloomustada nii nagu ikka tunnelit: mis pannakse ühest otsast sisse, tuleb teisest otsast välja. Open vSwitch kontekstis sobib GRE tunnelit kasutada selleks, et kahes füüsilises virtuaalsete arvutite pidamisega tegelevas arvutis töötavaid sisemise võrke ühendada kokku üheks ethernetiks. Kui need kaks füüsilist arvutit asuvad üksteisest kaugemal, siis võib olla asjakohane kapseldada GRE paketid omakorda IPSec sisse.

Eeldusel, et kaks arvutit on juba võrku ühendatud mingil viisil, nt

arvuti-1                                                             arvuti-2
 ____                                                                 ____ 
|    |  eth0                                                   eth0  |    |
|    |---------- andmekeskuse sisene ruuditud võrk ------------------|    |
|____|  192.168.10.11                                 192.168.40.12  |____|

sobib GRE tunneldamisega seotud bridge'de moodustamiseks sobib öelda ühes arvutis ja teises arvutis

arvuti-1 # ovs-vsctl add-br grebr0
arvuti-2 # ovs-vsctl add-br grebr0

Mille tulemusena moodustatakse vastavastes arvutites midagi sellist

arvuti-1 # ovs-vsctl show
ad1affc3-ba05-4019-b344-e9bbbfc2f68e
   Bridge "grebr0"
       Port "grebr0"
           Interface "grebr0"
               type: internal

GRE tunneli moodustamiseks öelda

arvuti-1 # ovs-vsctl add-port grebr0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.40.12
arvuti-2 # ovs-vsctl add-port grebr0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.10.11

ja moodustatakse juurde midagi sellist

arvuti-1 # ovs-vsctl show
ad1affc3-ba05-4019-b344-e9bbbfc2f68e
   Bridge "grebr0"
       Port "gre0"
           Interface "gre0"
               type: gre
               options: {remote_ip="192.168.40.12"}
       Port "grebr0"
           Interface "grebr0"
               type: internal

Tulemusena töötavad kaks grebr0 bridge't nö sama ethernet peal, nt arp paketid kostavad ühest teise jne. Sellise asjakorralduse kasutamiseks sobib nt virtuaalsete serverite seadistamisel näidata nende võrguseadmete jaoks kasutatavaks bridgeks grebr0 ja need virtuaalsed arvutid on praktiliselt samas ethernetis.

Lihtsalt GRE tunneliga moodustatud etherneti testimiseks sobib tekitada kummaski switchis täiendav OVS internal port

arvuti-1 # ovs-vsctl add-port grebr0 test0 -- set interface test0 type=internal
arvuti-2 # ovs-vsctl add-port grebr0 test0 -- set interface test0 type=internal
arvuti-1 # ifconfig test0 10.100.100.11/24
arvuti-2 # ifconfig test0 10.100.100.12/24

ning veenduda, et ühest saab teist pingida

arvuti-1 # ping 10.100.100.12

Tulemust võiks kujutada selliselt

        arvuti-1                                                            arvuti-2
         ____                                                                 ____ 
        |    |  eth0                                                   eth0  |    |
        |    |---------- andmekeskuse sisene ruuditud võrk ------------------|    |
        |____|  192.168.10.11                                  192.168.40.12 |____|

   grebr0 -> test0 (10.100.100.11)                                      grebr0 -> test0 (10.100.100.12)

kus

  • arvutite füüsilised võrguseadmed on erinevates ethernetides ja subnetides
  • mõlemas arvutis on grebr0 bridge sees test0 nimeline virtuaalne võrguliides
  • test0 võrguliidesed asuvad samas virtuaalses ethernetis

Kasulikud lisamaterjalid

OpenFlow kontroller

OpenFlow kontroller on võrgus töötav teenus, mida saab Open vSwitch kasutada, selleks, et keegi teda nö juhiks (õpetaks ACL'i jms). Tundub, et prkatiliseks kasutamiseks seda tingimata vaja ei ole ja vaikimisi käivad ka andmed switchist läbi. Paistab, et Ubuntu paketihalduses on ka OpenFlow kontroller

# apt-get install openvswitch-controller

Flow nimekirja küsimine

# ovs-ofctl dump-flows ovsbr0
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=7877.116s, table=0, n_packets=12241, n_bytes=1250181, idle_age=1, \
  priority=0 actions=NORMAL

Switchi haldamine

Switchi portide ja vastavate interface'ide vastavuse küsimiseks sobib öelda

# ovs-ofctl show ovsbr0
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000000c42071a46
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC \
  SET_NW_DST  SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
1(eth2): addr:00:0c:42:07:1a:46
    config:     0
    state:      0
    current:    1GB-FD AUTO_NEG
    advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG \
   AUTO_PAUSE AUTO_PAUSE_ASYM
    supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG
    speed: 1000 Mbps now, 1000 Mbps max
2(eth3): addr:00:0c:42:07:1a:47
    config:     0
    state:      0
    current:    1GB-FD AUTO_NEG
    advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG \
   AUTO_PAUSE AUTO_PAUSE_ASYM
    supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG
    speed: 1000 Mbps now, 1000 Mbps max
LOCAL(ovsbr0): addr:00:0c:42:07:1a:46
    config:     0
    state:      0
    speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

Debian /etc/network/interfaces kasutamine

Olgu tarvis ühendada arvuti sedasi

  • eth0 on ühendatud mode access režiimis switchi porti ja seal käib 192.168.10.0/24 võrgu liiklus
  • arvuti poole peab saama pöörduda 192.168.10.48 ip aadressiga
# cat /etc/network/interfaces
allow-ovs ovsbr0
iface ovsbr0 inet manual
  ovs_type OVSBridge
  ovs_ports eth0 vlan10

allow-ovsbr0 eth0
iface eth0 inet manual
  ovs_bridge ovsbr0
  ovs_type OVSPort
  ovs_options tag=10

allow-ovsbr0 vlan10
iface vlan10 inet static
  ovs_bridge ovsbr0
  ovs_type OVSIntPort
  ovs_options tag=10
  ovs_extra set interface ${IFACE} external-ids:iface-id=$(hostname -s)
  address 192.168.10.48
  netmask 255.255.255.0
  gateway 192.168.10.254

kus

  • toodud seadistusfaili tõttu moodustatakse (ja kustutatakse) kogu ovsbr0 seade (selle asjaolu tõttu võib olla mõislik kasutada ühes arvutis kahte OVS switchi, st teise konfiguratsioon elab arvuti reboodid üle)
  • allow-ovs seadmete juhitmiseks sobib öelda
# ifup --allow=ovs ovsbr0
# ifdown --allow=ovs ovsbr0

Käisitsi saab vlan10 seadme tekitada öelda

# ovs−vsctl add−port br0 vlan10 tag=10 −− set Interface vlan10 type=internal
# ifconfig vlan10 192.168.10.48

Kasulikud lisamaterjalid

Märkused

  • Tundub, et Ubuntu v. 14.04 juurde on tekkinud biosdevname süsteem, selle väljalülitamiseks sobib kasutada tuuma argumendina
biosdevname=0

Vastasel korral võivad tekida em1 nimelised võrguseadmed ja see võib eksitada.

  • Virtuaalse ethernet liidese tekitamiseks sobib öelda
# ip tuntap add dev liides1 mode tap
  • Tundub, et tüüpiline probleem Open vSwitch kasutamisel on, et sealt kus oodatakse ilma vlan siltideta pakette on nad siltidega ja vastupidi, uurimisel aitab tcpdump -e võtme kasutamine, nt
# tcpdump -nei seadmenimi
  • Võrgu debugimisel peab arvestama, et switchi enda nimelisel seadmel (st mis vastab ovs-vsctl add-br seadmenimi) ei ole eriti liiklust näha, ainult vahel arp jms pakette
  • Tundub, et kunagi (v. 1.4 kandis?) oli probleemiks, et muud kompnendid (nt libvirt) ei töötanud otseselt Open vSwitch tarkvraaga ja kasutamiseks olid ettevalmistatud nn workaroundid, fake bridge ja ühilduvuseks brctl süsteemiga sai näidata failis /etc/default/openvswitch-switch rida
BRCOMPAT=yes

2.x versioonidel ja 2014 aasta suvel enam neid probleeme reegline pole (brcompat arendamisest on üldse loobutud).

Kasulikud lisamaterjalid