Crossbow laat toe om heel eenvoudig virtuele netwerkinterfaces aan te maken. Een zogenaamde VNIC is een pseudo-netwerkinterface die meestal geconfigureerd wordt bovenop een fysieke netwerkinterface (NIC). Elke NIC kan meer dan één VNIC hebben, en elke VNIC gedraagt zich voor de rest van het systeem alsof het een fysieke interface is. Een VNIC kan exclusief toegekend worden aan een virtuele machine in VirtualBox of xVM of aan een zone.

Door de toepassing van bandbreedtebeheer, quality of service en firewallregels op de afzonderlijke virtuele interfaces kan het gebruik van netwerkresources en de isolatie van de services in de virtuele machines heel precies ingesteld worden. Wanneer je de eerste VNIC op een systeem aanmaakt, creëert OpenSolaris ook impliciet een virtuele switch op de fysieke interface. Deze virtuele switch verbindt alle VNIC's die op dezelfde fysieke interface gebouwd zijn, en forwardt de netwerkpakketten tussen de VNIC's. Hierdoor moet netwerkverkeer tussen VNIC's niet langs het externe netwerk passeren. Tussen VNIC's op verschillende NIC's is er zo geen virtuele switch.

Creëer een VNIC

Het eenvoudigste voorbeeld is het aanmaken van één VNIC. Kijk eerst welke je bestaande fysieke netwerkinterfaces zijn:

[email protected]:~$ dladm show-phys

LINK MEDIA STATE SPEED DUPLEX DEVICE

nge0 Ethernet up 1000 full nge0

Blijkbaar heet de interface hier nge0 en is het een Gigabit Ethernetinterface. Nu gaan we hierboven een VNIC aanmaken:

[email protected]:~$ pfexec dladm create-vnic -l nge0 vnic0

Standaard geeft dit commando een willekeurig MAC-adres aan de VNIC, maar met de optie -m kun je een specifiek MAC-adres toekennen.

De bestaande VNIC's kunnen we bekijken met:

[email protected]:~$ dladm show-vnic

LINK OVER SPEED MACADDRESS MACADDRTYPE VID

vnic0 nge0 1000 2:8:20:f7:8f:1d random 0

Je ziet dat de snelheid van de VNIC overeenkomt met de snelheid van de fysieke interface waarop ze gebouwd is (1000 Mbps). Deze snelheid kun je nu verminderen naar bijvoorbeeld 5 Mbps:

[email protected]:~$ pfexec dladm set-linkprop -p maxbw=5 vnic0

[email protected]:~$ dladm show-vnic

LINK OVER SPEED MACADDRESS MACADDRTYPE VID

vnic0 nge0 5 2:8:20:f7:8f:1d random 0

OpenSolaris gebruikt de interface vnic0 echter nog niet, daarom moeten we eerst een IP-interface creëren voor de VNIC en er een IP-adres aan toekennen, bijvoorbeeld met DHCP:

[email protected]:~$ pfexec ifconfig vnic0 plumb

[email protected]:~$ pfexec ifconfig vnic0 dhcp start

[email protected]:~$ ifconfig vnic0

vnic0: flags=1004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4> mtu 1500 index 3

inet 192.168.1.123 netmask ffffff00 broadcast 192.168.1.255

Vanaf nu kun je de virtuele netwerkinterface gebruiken. Als je bijvoorbeeld een groot bestand over het IP-adres van de VNIC verstuurt met scp, zul je zien dat dit trager gaat dan wanneer je het rechtstreeks over het IP-adres van de fysieke interface stuurt, dankzij de bandbreedtebeperking die we ingebouwd hebben. Je kunt ook tijdens het gebruik van de VNIC de snelheid veranderen, bijvoorbeeld als je merkt dat je de bandbreedte te veel of te weinig beperkt hebt. Voer bijvoorbeeld "pfexec dladm set-linkprop -p maxbw=1000 vnic0" uit en je zal zien dat de download er ineens sneller doorvliegt. 2 Mbps is overigens de laagste snelheid die je op dit moment kunt instellen, dus voor een fijnmaziger bandbreedtebeperking volstaat Crossbow nog niet.

Een VNIC in een zone

Wanneer je een VNIC voor een zone wilt gebruiken, moet je weten dat zones standaard hun IP-stack delen met de globale zone. Dit betekent dat de globale zone de netwerkconfiguratie die je tijdens de configuratie van een zone hebt ingegeven beheert. In de niet-globale zone kun je bijvoorbeeld het IP-adres van de zone niet meer veranderen met ifconfig. Dit is de manier die we in ons artikel over zones hebben gebruikt.

Heeft je OpenSolaris-machine de beschikking over meerdere netwerkinterfaces, dan is het daarentegen interessanter om een interface exclusief aan één zone te binden. Dat kan door de optie "set ip-type=exclusive" in de configuratie van de zone, waardoor de zone zijn netwerkinterface volledig autonoom kan beheren met zijn eigen TCP/IP-stack, routingtabel en DHCP-autoconfiguratie. De systeembeheerder kan dan ook het ifconfig-commando in de zone uitvoeren. Een exclusieve IP-stack is ideaal in combinatie met een VNIC. De configuratie van de zone ziet er dan zo uit:

# zonecfg -z myzone0

myzone0: No such zone configured

Use 'create' to begin configuring a new zone.

zonecfg:myzone0> create

zonecfg:myzone0> set zonepath=/zones/myzone0

zonecfg:myzone0> set ip-type=exclusive

zonecfg:myzone0> add net

zonecfg:myzone0:net> set physical=vnic0

zonecfg:myzone0:net> end

zonecfg:myzone0> exit

Heb je tevoren in de globale zone een IP-interface gecreëerd voor vnic0 met ifconfig vnic0 plumb, zoals we hierboven deden, dan moet je dit overigens eerst ongedaan maken met ifconfig vnic0 unplumb, omdat de IP-stack anders niet exclusief kan zijn.

Creëer een virtuele switch

In sommige gevallen is het interessanter om VNIC's te maken die niet bovenop een bepaalde fysieke interface geïmplementeerd zijn, maar volledig virtueel. Dat kan door eerst een zogenaamde etherstub aan te maken, een virtuele switch. Daarna maak je VNIC's aan bovenop deze etherstub, waardoor ze met elkaar verbonden worden door deze virtuele switch. Ze kunnen dus netwerkverkeer naar elkaar sturen, maar niet rechtstreeks naar andere fysieke of virtuele NIC's. Dit is ideaal om een privaat virtueel netwerk aan te maken tussen zones of virtuele machines, of om een volledig fysiek netwerk virtueel na te bootsen voor experimenten.

Als voorbeeld maken we een etherstub en sluiten we er drie VNIC's op aan:

[email protected]:~$ pfexec dladm create-etherstub etherstub0

[email protected]:~$ pfexec dladm create-vnic -l etherstub0 vnic1

[email protected]:~$ pfexec dladm create-vnic -l etherstub0 vnic2

[email protected]:~$ pfexec dladm create-vnic -l etherstub0 vnic3

We zien nu onze vnic0 die we eerder hebben aangemaakt op de fysieke interface nge0, en onze drie VNIC's die we zonet op etherstub0 hebben aangemaakt:

[email protected]:~$ dladm show-vnic

LINK OVER SPEED MACADDRESS MACADDRTYPE VID

vnic0 nge0 2 2:8:20:f7:8f:1d random 0

vnic1 etherstub0 0 2:8:20:70:58:2d random 0

vnic2 etherstub0 0 2:8:20:65:ea:95 random 0

vnic3 etherstub0 0 2:8:20:7:42:bc random 0

Nu kunnen we net als hiervoor weer een zone aanmaken met één van de nieuwe VNIC's als exclusieve interface, bijvoorbeeld myzone1 met vnic1 en myzone2 met vnic2. Het enige verschil is nu dat deze twee zones via hun VNIC's op een eigen privaat virtueel netwerk aangesloten zijn, met etherstub0 als virtuele switch. De perfecte labosituatie dus als je niet wil dat de zones interageren met het externe netwerk.

Koppel het virtuele en fysieke netwerk

We kunnen echter ook perfect het fysieke netwerk koppelen aan dit private virtuele netwerk. Omdat vnic3 op etherstub0 is aangesloten maar nog niet gebruikt in een zone, hoeven we enkel de globale zone met het virtuele netwerk verbinden via vnic3. Stel dat we voor het virtuele netwerk in het adresbereik 192.168.0.0/24 werken, dan kunnen we vnic3 bijvoorbeeld het volgende statische IP-adres geven:

[email protected]:~$ pfexec ifconfig vnic3 plumb

[email protected]sol:~$ pfexec ifconfig vnic3 inet 192.168.0.3/24 up

Kijk nu met het commando routeadm of IPv4 forwarding ingeschakeld is, en zonee dan schakel je dit in:

[email protected]:~$ pfexec routeadm -u -e ipv4-forwarding

Nu moeten we nog NAT instellen op onze fysieke interface nge0. Dit kan met de volgende IP Filter-configuratie in /etc/ipf/ipnat.conf:

map nge0 192.168.0.0/24 -> 0/32 portmap tcp/udp auto

map nge0 192.168.0.0/24 -> 0/32

Schakel nu IP-filtering in en controleer of de NAT-regels geladen zijn:

[email protected]:~$ pfexec svcadm enable network/ipfilter

[email protected]:~$ pfexec ipnat -l

List of active MAP/Redirect filters:

map nge0 192.168.0.0/24 -> 0.0.0.0/32 portmap tcp/udp auto

map nge0 192.168.0.0/24 -> 0.0.0.0/32

List of active sessions:

In de zones met VNIC's vnic1 en vnic2 stel je ook een IP-adres in hetzelfde adresbereik in, bijvoorbeeld 192.168.0.1 respectievelijk 192.168.0.2. Stel dan 192.168.0.3 in de zones als default gateway in:

[email protected]:~$ route add default 192.168.0.3

[email protected]:~$ route add default 192.168.0.3

Omdat NAT op de globale zone draait, heb je nu ook van in de niet-globale zone toegang tot externe servers.

Regel het verkeer

Verder zijn er nog meer mogelijkheden met het concept van een "flow" in Crossbow. Alle netwerkverkeer kun je onderverdelen in flows, die kunnen gebruikt worden om specifieke poorten qua bandbreedte te beperken of statistieken op te vragen. Je kunt bijvoorbeeld een flow aanmaken voor webverkeer:

[email protected]:~$ pfexec flowadm add-flow -l vnic0 -a transport=tcp,local_port=80 httpflow

We maken dus een flow met naam httpflow aan, die gedefinieerd is voor TCP-verkeer over vnic0 op poort 80. De huidige configuratie van flows kunnen we ook opvragen:

[email protected]:~$ flowadm show-flow

FLOW LINK IPADDR PROTO PORT DSFLD

httpflow vnic0 -- tcp 80 --

Nu kunnen we de bandbreedte van deze flow beperken, bijvoorbeeld tot 2 Mbit/s:

[email protected]:~$ flowadm set-flowprop -p maxbw=2m httpflow

Deze configuratie kunnen we ook altijd opvragen:

[email protected]:~$ flowadm show-flowprop

FLOW PROPERTY VALUE DEFAULT POSSIBLE

httpflow maxbw 2 -- 2m

httpflow priority -- --

Met flowprop kunnen we dus net zoals met linkprop de bandbreedte beperken, maar dan specifiek voor een specifiek protocol. Zo zorg je erbijvoorbeeld voor dat een download van een webserver in één van je zones slechts tegen een bepaalde snelheid gaat, maar dat je wel via scp bestanden tegen een hogere snelheid naar de webserver kunt uploaden.

Complexe virtuele netwerken

Crossbow is een welkome aanvulling in OpenSolaris. De voorbeelden die we hier gaven zijn eenvoudig van opzet, maar kunnen eindeloos gevarieerd worden. Zo kun je met enkele commando's heel complexe virtuele netwerken aanmaken en beheren. De commando's die we bespraken, dladm en flowadm, hebben bovendien een heel aantal subcommando's en opties voor geavanceerdere mogelijkheden, die te vinden zijn in de man-pagina's. Vooral in combinatie met zones is Crossbow een ideale manier om vlug een virtueel netwerklabo op te zetten.

Bron: Techworld