Virtuaalisen järjestelmän verkkosiltaus

Kohteesta Linux.fi
Loikkaa: valikkoon, hakuun
Jakelukohtainen.png
Artikkeli soveltuu vain tietylle jakelulle vaikka sen tulisi käsitellä aihetta neutraalisti. Sitä tulisi muuttaa siirtämällä jakeluriippuvaiset yksityiskohdat Jakelukohtaista kappaleen alle - tai koko sivu kyseisen jakelun alasivuksi.

Tässä artikkelissa käsitellään verkkosillan luomista virtuaalikoneessa pyörivään järjestelmään. Huomaa kuitenkin, että voit päästä helpommalla käyttämällä valmiita ratkaisuja. Esimerkiksi Virtualbox siltaa yhteyden automaattisesti ja helposti, kun valitset virtuaalisen verkkokortin asetuksista "Bridged Network".

Isäntäkone A[muokkaa]

Isäntäkoneen käyttöjärjestelmä on tässä esimerkissä Sabayon linux 4.0, joka on Gentoo-pohjainen ja sopii erinomaisesti mm. testailuun.

Linux ariloulaleelay 2.6.27-sabayon #1 SMP Sat Dec 20 16:15:56 UTC 2008 x86_64 Intel(R) Core(TM)2 CPU 4300 @ 1.80GHz GenuineIntel GNU/Linux

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2
                  ss ht tm pbe syscall lm constant_tsc arch_perfmon pebs bts rep_good nopl pni monitor ds_cpl est tm2 ssse3 cx16 xtpr lahf_lm

libvirt + KVM Gentoossa[muokkaa]

Tästä eteenpäin seuraa Gentoo-kohtaista testausjärjestelmän pystytystä. Asennetaan qemu, kvm ja libvirt.

Sabayonin System.map pitää linkittää oikeaan paikkaan jotta ytimen moduuleja voidaan kääntää:

ariloulaleelay ~ # ln -s /boot/System.map-genkernel-x86_64-2.6.27-sabayon /lib/modules/2.6.27-sabayon/build/System.map

Qemu täytyy kääntää gcc-3:lla!

 >>> Emerging (1 of 1) app-emulation/qemu-softmmu-0.9.1-r3
 * qemu-0.9.1.tar.gz RMD160 SHA1 SHA256 size ;-) ...                                                                                                 [ ok ]
 * checking ebuild checksums ;-) ...                                                                                                                 [ ok ]
 * checking auxfile checksums ;-) ...                                                                                                                [ ok ]
 * checking miscfile checksums ;-) ...                                                                                                               [ ok ]
 * qemu requires gcc-3 in order to build and work correctly
 * please compile it switching to gcc-3.
 * We are aware that qemu can guess a gcc-3 but this feature
 * could be harmful.

Qemu käännetään versiolla 3.4.6, muilla kääntäjä on järjestelmän oletus: gcc-4.3.2. Tässä asennetut paketit:

 Wed Feb 25 16:46:08 2009 >>> sys-devel/gcc-3.4.6-r2
 Wed Feb 25 16:55:31 2009 >>> app-emulation/qemu-softmmu-0.9.1-r3
 Wed Feb 25 17:05:27 2009 >>> app-emulation/qemu-0.9.1
 Wed Feb 25 17:08:20 2009 >>> app-emulation/libvirt-0.5.1
 Wed Feb 25 17:13:01 2009 >>> app-emulation/kqemu-1.3.0_pre11
 Wed Feb 25 17:19:45 2009 >>> app-emulation/kvm-84
 Wed Feb 25 17:22:20 2009 >>> app-emulation/virtinst-0.400.0
 Wed Feb 25 17:22:45 2009 >>> app-emulation/virt-viewer-0.0.3
 Wed Feb 25 17:23:21 2009 >>> app-emulation/virt-manager-0.6.0-r1

Lopuksi käynnistetään libvirtd ja asetetaan se käynnistymään automaattisesti:

# /etc/init.d/libvirtd start
# rc-update add libvirtd default

Ytimen moduulit[muokkaa]

Jotta guest voi kytkeytyä siltaan, tarvitaan 'tun'-moduuli. Muutoin näet virheen: ”Failed to add tap interface 'vnet%d' to bridge 'br0' : No such file or directory”. Ladataan myös virtualisointimoduulit, joista ainoastaan toinen riittää. Kvm:ää käytetään mikäli keskusyksikköpiiri tukee virtualisointilaajennoksia ja kqemua käytetään, mikäli kvm:ää ei voi käyttää.

# modprobe tun
# modprobe kqemu
# modprobe kvm

Verkko[muokkaa]

eth0 on kytketty reitittimeen NAT1 (192.168.1.0/24), joka on kytketty palomuurin kautta internetiin. Tämä simuloi dmz-aluetta, joka sillataan virtuaalikoneelle. Sillattavalla liitännällä ei tule olla omaa ip-osoitetta isäntäjärjestelmässä.

	eth0      Link encap:Ethernet  HWaddr 00:18:f3:16:aa:7f

eth1 on toinen verkkokortti, joka on kytketty reitittimeen NAT2 192.168.0.0/24. Tämä simuloi sisäverkkoa, mutta sen kautta ei ole pääsyä internetiin. Fyysisesti tämä on täysin erillinen verkosta NAT1.

	eth1      Link encap:Ethernet  HWaddr 00:20:18:8e:43:32
		inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0

Reititykset ovat vielä asetettu siten, että isäntäkone on kytketty eth0:n kautta verkkoon NAT1, johon tullaan kytkemään verkkosilta:

 $ route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
 192.168.0.0     *               255.255.255.0   U     0      0        0 eth1
 192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
 loopback        ariloulaleelay  255.0.0.0       UG    0      0        0 lo
 default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

Luodaan uusi verkkoyhteys ”Bridge to LAN”[muokkaa]

Lainaukset brctl-manuaalista. Ks. myös [1]

”This is the recommended config for general guest connectivity on hosts with static wired networking configs. Provides a bridge from the VM directly onto the LAN. This assumes there is a bridge device on the host which has one or more of the hosts physical NICs enslaved.”

Silta on br0, jolla on ”hallussaan” (enslaves) eth0.

”The guest VM will have an associated tun device created with a name of vnetN, which can also be overridden with the <target> element. The tun device will be enslaved to the bridge. The IP range / network configuration is whatever is used on the LAN. This provides the guest VM full incoming & outgoing net access just like a physical machine.”

bridge.xml: määritellään silta br0 ja yhdistetään liikenne eth0 -> vnet0. UUID on luotu uuidgen:llä.

 <network>
   <name>bridge</name>
   <uuid>4aa7bd44-302e-4bcd-896b-34c83be1dec0</uuid>
   <bridge name='br0' stp='on' forwardDelay='0' />
   <interface type='bridge'>
     <source bridge='eth0'/>
     <target dev='vnet0'/>
   </interface>
   <ip address='192.168.1.100' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.1.101' end='192.168.1.254' />
     </dhcp>
   </ip>
 </network>

Ladataan määritykset libvirtiin. Tämä luo automaattisesti sillan br0.

 $ virsh net-define bridge.xml
 Verkko bridge määritetty tiedostosta bridge.xml
 $ virsh net-start bridge
 Verkko bridge käynnistetty
 $ virsh net-list
 Nimi                 Tila       Automaattikäynnistys
 -----------------------------------------
 bridge               aktiivinen no

”An ethernet bridge is a device commonly used to connect different networks of ethernets together, so that these ethernets will appear as one ethernet to the participants. Each of the ethernets being connected corresponds to one physical interface in the bridge.”

br0:aan yhdistetään eth0. libvirt yhdistää itse luomansa laitteen ”vnet0”.

# brctl addif br0 eth0

Määritetään sillan route:

# route add -net 192.168.1.0 netmask 255.255.255.0 dev br0

Muut routet korjataan aiemmasta konfiguraatiosta. Ip 192.168.1.1 on sillan käyttämä gateway-osoite, ja tästä tehdään myös oletusgateway.

 # route del -net 192.168.1.0 netmask 255.255.255.0 dev eth0
 # route del default gw 192.168.1.1

Ohjataan 192.168.0.x-verkkoon (NAT2) menevät pyynnöt kulkemaan eth1:n kautta:

 # route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1

Oletusreitti voi kulkea vain sisäverkkoon, (NAT2) tai dmz-verkkoon (NAT1). Oletusreittejä voi olla vain yksi!!

 # route add default gw 192.168.1.1 br0 # NAT1, netti toimii
 # route add default gw 192.168.0.1 netmask 255.255.255.0 dev eth1 # NAT2, jutellaan vain suljetun sisäverkon kanssa

Alla on reititystaulu, jossa isäntäkone on yhteydessä NAT1:een ja NAT2:een, pääsee vielä internetiinkin.

	$ route
	Kernel IP routing table
	Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
	192.168.1.0     *               255.255.255.0   U     0      0        0 br0
	192.168.0.0     *               255.255.255.0   U     0      0        0 eth1
	loopback        ariloulaleelay  255.0.0.0       UG    0      0        0 lo
	default         192.168.1.1     0.0.0.0         UG    0      0        0 br0


Sillä oletusreitti on br0, internet toimii.

	ariloulaleelay $ ping linux.fi
	PING linux.fi (82.118.208.5) 56(84) bytes of data.
	64 bytes from web.mpoli.fi (82.118.208.5): icmp_seq=1 ttl=55 time=22.9 ms

Kun virtuaalikone on päällä, pingaus sillan kautta NAT1:een pitäisi toimia:

	ariloulaleelay $ ping 192.168.1.14
	PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
	64 bytes from 192.168.1.14: icmp_seq=1 ttl=64 time=2.67 ms

Samoin kuin NAT2-”sisäverkossa” olevien koneiden, joilla on eri route.

	ariloulaleelay $ ping 192.168.0.101
	PING 192.168.0.101 (192.168.0.101) 56(84) bytes of data.
	64 bytes from 192.168.0.101: icmp_seq=1 ttl=64 time=0.449 ms


Dnsmasq ei ole päällä. Jos se olisi, sen konfiguraation olisi lisättävä

	except-interfaces=br0

Virtuaalikone A[muokkaa]

Gentoo 2008.0 x86 live-cd, ei käynnistä X:ää ja on kevyt testaukseen. Live-cd sisältää ssh-palvelimen.

 $ virt-install --connect=qemu:///system \
   --name=gentoo \
   --nodisks \
   --cdrom=var/iso/install-x86-minimal-2008.0.iso \
   --ram=1024 \
   --network bridge:br0

br0:lla on nyt eth0:n MAC-osoite ja siltaan on yhdistetty myös vnet0. Kun guest on käynnistynyt se hakee ip-osoitteen omaan virtuaaliliitäntäänsä eth0, mutta isännän vnet0 ei saa ipv4-osoitetta.

 $ brctl show
 bridge name     bridge id               STP enabled     interfaces
 br0             8000.0018f316aa7f       yes             eth0
                                                         vnet0
 virbr0          8000.000000000000       yes

Samassa verkossa eth0:n kanssa olevat koneet voivat nyt liikennöidä virtuaalikoneen kanssa NATin/palomuurin sääntöjen mukaan.


zapotec $ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:1f:3b:xx:xx:xx
          inet addr:192.168.1.11  Bcast:192.168.1.255  Mask:255.255.255.0

Virtuaalikoneen ip:n loppuosaksi arpoutui 14, ja kun ssh-palvelin on käynnissä, voi sinne ottaa toiseen NAT1:een kytketyltä laitteelta yhteyttä.

zapotec $ ssh 192.168.1.14 -l root
Password: 
Welcome to the Gentoo Linux Minimal Installation CD!

livecd ~ # ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 54:52:00:00:5A:C2  
          inet addr:192.168.1.14  Bcast:192.168.1.255  Mask:255.255.255.0