Portál AbcLinuxu, 15. června 2025 05:16

Linux-VServer a OpenVZ - síťová rozhraní

5. 9. 2007 | Jaroslav Tomeček
Články - Linux-VServer a OpenVZ - síťová rozhraní  

Po úvodních dílech, které se zabývaly instalací systému a tvorbou serverů, se zaměříme na správu a konfiguraci. Začneme sítěmi.

Virtualizace síťových rozhraní je implementačně jednou z nejproblematičtějších oblastí virtualizačních nástrojů. Virtualizovaná síť musí být rychlá a spolehlivá, ale přitom nesmí příliš zatěžovat procesor. Řešením může být virtuální síťový hardware simulující funkčnost skutečného zařízení nebo rozšíření funkcí a služeb jádra tak, aby bylo možné navázat určité IP adresy určitým procesům. To však s sebou přináší mnohé problémy jako je například adresace loopback a multicastu.

Linux-VServer

Linux-VServer pro síťové rozhraní rozšiřuje funkce a služby jádra, avšak pracuje pouze s IP vrstvou ISO-OSI modelu. Nelze tedy například udělit virtuálnímu serveru MAC adresu. Systém umožňuje prostřednictvím utility chbind navázat určitou IP adresu na proces a všechny jeho potomky. Stejná IP adresa virtuálního serveru je připojena ke všem procesům kontextu. Je možné, aby síťové zařízení mělo z pohledu přiřazeného serveru zvláštní jméno. Do Linux-VServeru není zatím implementována podpora IPv6. Současné verze nepodporují multicast ani loopback adresaci kontextů.

Nastavení síťových rozhraní

Nastavit síťová rozhraní můžeme už při vytváření virtuálního serveru přepínačem --interface utility vserver. Argumentem tohoto přepínače může být například guest0=eth0:10.0.0.19/32, kde guest0 je jméno virtuálního rozhraní, eth0 jemu odpovídající fyzické rozhraní, za dvojtečkou následuje IP adresa s délkou prefixu za lomítkem. Virtuální jméno, prefix a IP adresa nejsou povinné údaje a pokud je neuvedeme, použijí se standardní nastavení. Vynecháme-li například virtuální jméno, bude v kontextu pojmenováno stejně jako fyzické.

Další přepínač je --netdev <dev>, jehož prostřednictvím určíme síťové zařízení, které bude kontext využívat. Argumentem --netbcast <broadcast> konfigurujeme broadcast adresu a jeden z dvojice přepínačů --netmask a --netprefix pro konfiguraci síťové masky, resp. síťového prefixu. Žádný z těchto přepínačů není povinný.

Síťové nastavení kontextů se uchovává v adresářích /etc/vservers/<ID_of_vserver>/. Každému rozhraní odpovídá jeden podadresář pojmenovaný dvoumístným číslem, počínající adresářem 00. Adresáře mohou obsahovat tyto soubory:

Nastavení démonů, program chbind

Linux-VServer ve své implementaci nevytváří virtuální síťové zařízení pro každý kontext. Z tohoto důvodu mohou mít některé démony problém s vázáním na IP adresu, pokud mají být spuštěny zvlášť v hostitelském i virtuálním serveru. K tomuto účelům je určen program systému Linux-VServer chbind.

Pokud například budeme chtít provozovat démon httpd na hostitelském serveru s IP adresou 10.0.0.19 a zároveň na virtuálním serveru test, pak spustíme příkaz chbind na hostitelském serveru:

# /usr/sbin/chbind --ip 10.0.0.19 /etc/rc.d/init.d/httpd \
> restart

Tím „navážeme“ démon httpd na hostitelském serveru na IP adresu 10.0.0.19. Poté restartujeme virtuální server test:

# /usr/sbin/vserver test restart

Nyní je démon httpd na obou serverech navázán na jinou IP adresou.

Při instalaci Linux-VServeru jsou v hostitelském kontextu vytvořeny startovací skripty pro spuštění nejpoužívanějších démonů za pomoci programu chbind. Těmito skripty jsou:

chbind používáme pro navázání služeb na servery. Implicitně se totiž využívá IP adresa 0.0.0.0, což proces naváže na síťová rozhraní všech kontextů. To však může být nežádoucí. Navázání můžeme upravit například pouze na hostitelském systému.

Volby programu chbind:

chbind [--silent] [--ip ip_number/interface] \
 [--bcast broadcast_address] <command arguments>

OpenVZ

Pro síťovou komunikaci mezi VPS navzájem a se serverem slouží virtuální síťová zařízení venet, které je starší a emuluje pouze komunikaci na IP vrstvě ISO-OSI modelu, a veth, které je prozatím pouze v testovacích verzích jádra a implementuje komplexní funkce síťového hardwaru. VPS tedy nekomunikuje přímo s fyzickým síťovým zařízením, i když systém OpenVZ k němu umožňuje nastavit exklusivní přístup. Můžeme tak přímo zpřístupnit například eth0 z určitého virtuálního serveru, avšak rozhraní poté není přístupné z jiných VPS a ani z hardwarového uzlu.

Takovým „přesunem“ do VPS však ztrácíme bezpečnostní omezení, která platí pro virtuální zařízení. Lze například přímo z VE přidělit rozhraní libovolnou IP adresu nebo přepnout zařízení do promiskuitního režimu atd.

Zařízení venet

Zařízení venet umožňuje přidělení IPv4 adres danému VPS. Konfiguruje virtuální zařízení pro VPS a obsluhuje komunikaci virtuálních serverů. Na straně hostitelského uzlu přeposílá pakety podle IP adresy.

Zpřístupnění zařízení eth0 ve VPS s číslem 101 provedeme příkazem:

# vzctl set 101 --netdev_add eth0 --save

Zařízení odebereme příkazem:

# vzctl set 101 --netdev_del eth0 --save

Nastavení síťového rozhraní provádíme pomocí utility vzctl s přepínačem set (s přepínačem --save pro uložení změn):

Síťové zařízení veth

Virtuální zařízení venet umožňuje přidělit VPS pouze IP adresu. V některých případech je však vyžadována vyšší míra virtualizace, kdy bychom chtěli mít plně virtualizované zařízení. V testovacích verzích jádra systému OpenVZ je implementováno zařízení veth. Toto zařízení má vlastní MAC adresu. Dovoluje také použití IPv6.

OpenVZ vytváří virtuální bridge propojující zařízení VPS veth s fyzickým zařízením. Správce VE může konfigurovat síť podle svého přání včetně IP adres, gateway, ...

Mechanismus je implementován jako dvě virtuální zařízení. Jedno v hostitelském uzlu a další ve VPS a obě jsou propojena. Pokud jej přijme jedna strana a je určený pro druhou, přeposílá se.

Nakonfigurovat jej pro VPS můžeme následujícím způsobem:

vzctl set VPS_ID --netif_add \
 <dev_name>,<dev_addr>,<ve_dev_name>,<ve_dev_addr>

kde:

MAC adresy jsou uvedeny ve tvaru XX:XX:XX:XX:XX:XX. Volba je připojena do seznamu již existujících záznamů.

Konkrétní natavení pak vypadá například takto:

# vzctl set 101 --netif_add \
> veth101.0,00:12:34:56:78:9A,eth0,00:12:34:56:78:9B --save

Poté bude vytvořeno pro VPS 101 zařízení veth a jeho konfigurace se uloží. Z pohledu hostitelského sytému bude mít ethernetové zařízení jméno veth101.0 a uvedenou MAC adresu. Uvnitř VPS se zařízení bude jmenovat eth0 s MAC adresou 00:12:34:56:78:9B.

Zařízení odebereme příkazem:

vzctl set <VEID> --netif_del <dev_name>

Utilita vzctl používala až do verze 3.0.14 (15. 1. 2007) přepínače --veth_add a --veth_del namísto současných --netif_add a --netif_del.

Protože je nastavení síťového zařízení složitější, uvedu krátký příklad.

Nejprve spustíme server s číslem 101:

# vzctl start 101

Přidělíme mu zařízení s názvem veth101.0 a MAC 00:12:34:56:78:9A z pohledu hostitelského serveru a eth0 s MAC 00:12:34:56:78:9B z pohledu virtuálního serveru a změnu v konfiguraci uložíme:

# vzctl set 101 --veth_add \
 veth101.0,00:12:34:56:78:9A,eth0,00:12:34:56:78:9B --save

Změníme nastavení rozhraní v hostitelském serveru, povolíme přeposílání paketů a proxy arp:

[host-node]# ifconfig veth101.0 0
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/forwarding
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/proxy_arp
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

Nakonfigurujeme síťové zařízení z pohledu VPS. Přidělíme mu adresu 192.168.0.101 a nastavíme směrovač.

[host-node]# vzctl enter 101
[vps-101]# /sbin/ifconfig eth0 0
[vps-101]# /sbin/ip addr add 192.168.0.101 dev eth0
[vps-101]# /sbin/ip route add default dev eth0

Posledním krokem je přidání cesty z hostitele do VPS.

[host-node]# ip route add 192.168.0.101 dev veth101.0

Více o nastavení sítě a o konfiguraci protokolu IPv6 naleznete na wiki projektu OpenVZ.

Shrnutí

OpenVZ nabízí širší služby a umožňuje širší nastavení síťového rozhraní. Na rozdíl od Linux-VServeru umí pracovat s IPv6. Systém dosahuje funkcí za cenu vyšších režijních ztrát, které však nejsou příliš patrné. Postačuje-li nám pouze směrování na úrovni IP vrstvy ve verzi IPv4, pak Linux-VServer nabízí dostatečnou funkčnost, avšak je třeba vyřešit problém vázání aplikací na různé IP adresy při vícenásobném spuštění ve více virtuálních serverech. U virtuálního síťového zařízení OpenVZ tento problém nenastává.

V Linux-VServer lze vázat procesy na IP adresy všech kontextů (IP 0.0.0.0). OpenVZ vytváří pro každý VPS virtuální síťový hardware, což podobné služby neumožňuje.

Vývojová větev Linux-VServer nabízí upravenou implementaci navazování soketů na IP adresy pomocí bind(2). Nová verze bude umožňovat navázání soketu na množinu určitých IP adres nebo masek. V současnosti by mělo být podporováno až 16 IP adres/masek na virtuální server.

Příště

Naše servery již umí komunikovat se světem. Od příštího dílu se budeme zabývat především přidělením hardwarových zdrojů a jejich limity. Začneme diskovými kvótami a několik odstavců věnujeme také virtuálnímu souborovému systému proc-fs.

Seriál Virtualizace na úrovni jádra (dílů: 8)

První díl: Virtualizace na úrovni jádra operačního systému, poslední díl: Linux-VServer - správa výpočetních zdrojů.
Předchozí díl: Linux-VServer a OpenVZ - speciál
Následující díl: Linux-VServer a OpenVZ - diskové limity

Související články

Jaderné noviny: Souborové kvalifikace
Jaderné noviny: KVM 15
Jaderné noviny: Vývoj KVM
Jaderné noviny: /dev/kvm
Jaderné noviny: Patche Xen
Jaderné noviny: Kontejnery procesů
Jaderné noviny: Připojení Linuxu k hypervisorům
Jaderné noviny: Virtualizační rozhraní VMI
Jaderné noviny: Kontejnery a odlehčená virtualizace
Jaderné noviny: API pro virtuální I/O: virtio
Jaderné noviny: Virtuální čas
Jaderné noviny: OpenVZ a checkpointing za běhu
Jaderné noviny: Zdroje: má dáti, dal
Chroot prostředí

Odkazy a zdroje

openvz.org
Linux-VServer.org

Další články z této rubriky

Úvod do Dockeru (1)
Paralelizace běžných činností v konzoli pomocí GNU Parallel
Unixové nástroje – 26 (triky pro práci v Bashi)
Unixové nástroje – 25 ((s,c)fdisk, gdisk, parted a findmnt)
Linux: systémové volání splice()

Diskuse k tomuto článku

5.9.2007 07:02 hele
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní
Odpovědět | Sbalit | Link | Blokovat | Admin
Nejsem si uplne 100% jisty, ale od poslednich verzi linux-vserveru je problem s bindovanim jiz vyresen a neni treba specialne bindovat jen na danou ip, ale funguje i bindovani na 0.0.0.0 coz zpusobi nabindovani na vsechny ip v danem vserveru. jinak predtim stacilo mit dobre nastavene Listen (u http), nebo u ssh kam se ma nabindovat a nebylo nutne nic slozite takhle delat.
5.9.2007 10:58 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní
Odpovědět | Sbalit | Link | Blokovat | Admin
[host-node]# vzctl enter 101
[vps-101]# /sbin/ifconfig eth0 0
[vps-101]# /sbin/ip addr add 192.168.0.101 dev eth0
[vps-101]# /sbin/ip route add default dev eth0

K čemu tam je dobrý ten ifconfig? To je náhražka za 'ip addr flush dev eth0'?

9.9.2007 22:16 Cunha
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní
Ano
6.9.2007 10:39 Peter D.
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní
Odpovědět | Sbalit | Link | Blokovat | Admin
Mna by zaujimalo, co presne znamena tento parameter pri vserver:
dev – Nastavuje přidělení fyzického síťového zařízení

Ide o pridelenie fyzickeho sietoveho zariadenia z hostujuceho stroja do niektoreho virtualneho vservera? Napriklad budem mat v hostujucom stroji eth0 s IP adresou 62.10.10.10/24. Virtualny stroj si vytvorim so sietovym rozhranim, ktore sa bude volat takisto eth0 a dam mu samostatnu ip adresu 62.10.10.20/24. Potom 62.10.10.20 sa bude vlastne tvarit ako alias na fyzickom sietovom rozhrani eth0 hostujuceho stroja ?
9.9.2007 22:15 Cunha
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní
V podstate ano
17.9.2007 00:42 Josef Masek
Rozbalit Rozbalit vše Re: Linux-VServer a OpenVZ - síťová rozhraní - IP vrstva ISO/OSI
Odpovědět | Sbalit | Link | Blokovat | Admin
Jenom jeden malej detail - sitovy model ISO/OSI nema IP vrstvu, ale ma sitovou vrstvu (network layer), jiz v TCP/IP modelu/zasobniku odpovida IP vrstva.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.