Configuración de los dispositivos de red físicos y virtuales en Xen

En esta sección veremos como configurar diferentes redes publicar y privadas para las maquinas virtuales, las configuraciones son basadas en switches virtuales o bridges, se usarán tanto herramientas de sistema como propias de xen para configurar el entorno de red virtual.

Introducción a los modos de red en Xen

Xen puede ser configurado para permitir que las maquinas virtuales puedan usar la infraestructura de red existente y los segmentos de red. Xen permite configurar la red tanto del Domain-0 como de las domUs, desde configuraciones básicas hasta otras más avanzadas usando bridges, STP, NAT, VLANs. En general, se puede configurar casi cualquier escenario que se pueda configurar en una red con Hosts no virtualizados.

La primer vez que se arranca el sistema con el kernel de Xen y sin tener definido un modo de configuración de red en Xen, se tiene un esquema similar al que se muestra en la siguiente figura:

Figura 3.1. Servidor Linux sin Xen

Servidor Linux sin Xen

Básicamente existen dos tipos de configuración de red en xen, configuración basada en bridge (bridged) y configuración enrutada (routed).

En este documento se describirá la configuración de red en Xen en modo bridge.

La configuración de red en modo bridge es la más simple y fácil de configurar dentro de Xen. Este tipo de red permite de forma simple y transparente a los DomU usar una interfaz de red virtual conectada a un switch virtual (bridge) creado y configurado en Dom0, la interfaz de red física eth0 en Dom0 esta conectada físicamente al switch de la empresa y esta misma a su vez esta conectada al switch virtual, por lo que toda la comunicación es transparente para todos los hosts ya que todos están conectados virtualmente a un mismo switch. Con una configuración en modo bridge nos permitirá:

  • Las maquinas virtuales podrán utilizar direcciones IP estáticas tal y como lo hacen las demás maquinas conectadas a tu red física, o incluso utilizar un servicio DHCP.

  • Quieres que las maquinas virtuales sean vistas de forma transparente desde las maquinas en la red física, es decir, que haya flujo entre las dos redes de forma transparente.

  • Incluso puede utilizar tecnologías como VLAN para crear redes locales virtuales y completamente aisladas unas de otras.

  • Su equipo Host puede tener varias interfaces de red físicas y quiere asignar o delegar una interfaz o más interfaces exclusivamente para un host, de esta forma puede tener DomU conectados a diferentes redes físicas, o incluso puede beneficiarse de las funcionalidades de VLAN y Bonding o Link Aggregation (Ether Channel).

En las siguientes secciones veremos como crear el o los bridges usando los scripts de xen y usando las herramientas de su distribución.

Configurando Xen en modo bridge

En esta sección veremos como configurar el servidor Xen para un entorno de red basado en bridges, estos bridges realizarán la funcion de switches virtuales para las maquinas virtuales e interfaces fisicas.

La configuración de los bridges la realiza xend a través del archivo de configuración /etc/xen/xend-config.sxp, en este archivo deben de haber dos lineas donde se define el script para la creación de bridges (network-script) y otra para la creación de las interfaces virtuales para los domUs (vif-script).

[Importante] Importante

Asegurese que solo haya una linea descomentada de network-bridge y una de vif-script.

Para configurar en entorno de red en el servidor Xen en modo bridge edite el archivo /etc/xen/xend-config.sxp y agregue las siguientes dos líneas:

(network-script network-bridge)

(vif-script vif-bridge)

Reinicie el sistema para que arranque con la configuración de red en bridge, esto es necesario para que se reconfigure la red del servidor Xen.

# shutdown -r now

Las configuraciones en modo bridge dependerá del numero de redes físicas a conectar y de el número de interfaces físicas en el Dom0, La configuración de Xen 3.2 en Ubuntu Hardy esta preconfigurada para sistemas con una sola interfaz física, y todas las los DomU utilizarán esta interfaz para el flujo de datos entre las diferentes redes, tanto de entrada como de salida,

Cuando Ubuntu inicia con xen en modo bridge se ejecuta el script /etc/xen/scripts/network-bridge realiza las siguientes tareas:

  • Crea un nuevo bridge llamado xenbr0 (xen 3.0) ó eth0 (xen 3.2)

  • La interfaz Ethernet real eth0 es desactivada

  • La dirección IP y MAC de eth0 es copiada a la interfaz de red virtual veth0

  • La interfaz real eth0 es renombrada a peth0

  • La interfaz virtual veth0 es renombrada a eth0

  • peth0 y vif0.0 son agregadas al bridge xenbr0/eth0

  • El bridge, peth0, eth0 y vif0.0 son activados

Después del procedimiento arriba descrito y una vez que el brid y las interfaces de red fueron configuradas, la red del servidor Xen se en modo bridge se debería de ver con en el siguiente figura:

Figura 3.2. Servidor Linux con Xen y un bridge

Servidor Linux con Xen y un bridge

Como vemos, la interfaz física peth0 esta conectada al switch de la red LAN y a su vez al bridge eth0, imagine peth0 como el puerto uplink entre switches L2, la interfaz eth0 del servidor Xen Dom0 es una interfaz virtual que también esta conectada al bridge de nombre eth0.

[Nota] Nota

La interfaz física que origialmente era eth0, que posteriormene se convirtio a peth0 también podría ser una interfaz física Ethernet con soporte VLAN trunk 802.1q, o un Ethernet Channel Bonding.

[Importante] Importante

En el ejemplo de arriba estamos hablando de dos switches conectados por un cable, tenga mucho cuidado de no conectar una segunda interfaz de red fisica, digamos eth1 y crear otro bridge sobre ella, esto y otros casos podrían causar lo que se llama un bridge loop, para más información al respecto leer la página del wiki http://wiki.xensource.com/xenwiki/XenBridgeLoop.

La interfaz de red eth0 del servidor Xen Dom0 se configura dentro del mismo Dom0 en el archivo de configuración /etc/network/interfaces, por ejemplo:

# Interfaz Local para red LAN
auto eth0
iface eth0 inet static
  address 192.168.221.10
  netmask 255.255.255.0
  gateway 192.168.221.254

Podemos ver información de la red así:

# ifconfig                                                   
eth0      Link encap:Ethernet  HWaddr 00:1d:7d:d4:09:74                      
          inet addr:192.168.221.10  Bcast:192.168.1.255  Mask:255.255.255.0    
          inet6 addr: fe80::21d:7dff:fed4:974/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1435 errors:0 dropped:0 overruns:0 frame:0
          TX packets:940 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1695569 (1.6 MB)  TX bytes:87112 (85.0 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

peth0     Link encap:Ethernet  HWaddr 00:1d:7d:d4:09:74
          inet6 addr: fe80::21d:7dff:fed4:974/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1443 errors:0 dropped:0 overruns:0 frame:0
          TX packets:978 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1716695 (1.6 MB)  TX bytes:95921 (93.6 KB)
          Interrupt:22 Base address:0x8000

Podemos ver el bridge y sus puertos con el siguiente comando:

# brctl show
bridge name     bridge id               STP enabled     interfaces
eth0            8000.001d7dd40974       no              peth0

Cuando creamos maquinas virtuales con xen-create-image solo le asignamos la configuración para la interfaz de red eth0 (predeterminada) en DomU, esto creará un nuevo puerto en el bridge, una interfaz vif1.0 la cual estará conectada a la interfaz virtual eth0 en el DomU, como se muestra en la siguiente imagen.

Figura 3.3. Servidor Linux con Xen, un bridge y un DomU

Servidor Linux con Xen, un bridge y un DomU

Si crea más DomU se crearán más interfaces vifX, por ejemplo el DomU 2 tendrá asignada una interfaz virtual eth0 la cual estará conectada al bridge mediante el puerto vif2.0, todas las maquinas DomU por default saldrán por la interfaz física peth0 para comunicarse con la demás red.

Configurando múltiples switches virtuales con Xen y bridges Linux

Habrá ocaciones en donde usted no quiere que todas sus maquinas salgan por una misma interfaz de red, ya se por cuestiones de rendimiento o de seguridad, en todo caso, usted puede agregar una interfaz de red física a su sistema y puede crear otro bridge a la que se conectará la maquina virtual, por ejemplo quiere tener una máquina virtual como firewall/router y quiere tener una interfaz conectada directamente el módem de internet o router y que además este conectado al primer bridge para que todas las demás maquinas en la red puedan usar este equipo como gateway para salir a Internet, en la sección se verá.

Figura 3.4. Servidor Linux con Xen, dos bridges, y dos Domu

Servidor Linux con Xen, dos bridges, y dos Domu

La configuración actual no nos sirve del todo ya que solo se crea un bridge al que se le conecta una sola interfaz física, en nuestro caso vamos a agregar una interfaz física al sistema, la cual queremos que sea usada exclusivamente por el firewall/gateway, para esta nueva configuración tendremos que crear un script wrapper para /etc/xen/scripts/network-bridge el cual lo ejecutará dos veces para crear dos bridges.

En Xen 3.2 cree el script /etc/xen/scripts/multi-network-bridge con el siguiente contenido:

#!/bin/sh
/etc/xen/scripts/network-bridge $1 netdev=eth0
/etc/xen/scripts/network-bridge $1 netdev=eth1

En Xen 3.4 cree el script /etc/xen/scripts/multi-network-bridge con el siguiente contenido:

#!/bin/sh
/etc/xen/scripts/network-bridge "$@" netdev=eth0 bridge=eth0
/etc/xen/scripts/network-bridge "$@" netdev=eth1 bridge=eth1

Guarde el archivo y asigne permisos de ejecución.

# chmod +x /etc/xen/scripts/multi-network-bridge

Configure la interfaz de red eth1 en modo manual en el archivo interfaces(5), por ejemplo:

# Interfaz fisica para bridge eth1
auto eth1
iface eth1 inet manual

Ahora tiene que cambiar la ruta del script para crear bridges en el archivo de configuración /etc/xen/xend-config.sxp, cambiar de:

(network-script network-bridge)

Por:

(network-script multi-network-bridge)

Como último paso reiniciamos el sistema para que los cambios tomen efecto.

Al iniciar Xend se ejecutará el script /etc/xen/scripts/multi-network-script y creará dos bridges, uno para eth0 y otro para eth1, como se muestra a continuación:

# ifconfig peth1
peth1 Link encap:Ethernet HWaddr 00:15:17:38:3e:28
UP BROADCAST PROMISC MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xece0 Memory:fe9e0000-fea00000

También podemos ver la información de los bridges:

# brctl show
bridge name bridge id STP enabled interfaces
eth0 8000.00188bfd7b7c no peth0
eth1 8000.001517383e28 no peth1

En la salida del comando anterior se nota lo siguiente:

  • eth0 de DomU2 estará conectada al bridge eth0

  • eth1 de Domu2 estará conectada al bridge eth1 que estará conectada directamente al módem de internet

Modificaremos el archivo de configuración /etc/xen/firewall.cfg y cambiaremos la linea vif para indicarle los bridges Por default está así:

vif = [ 'mac=00:16:3E:EF:91:2F' ]

Ese MAC address se genero automáticamente y por default quedamos que utiliza el primer bridge eth0, para agregarle otra interfaz a este DomU debemos de cambiar la linea a

vif = [
        'mac=00:16:3E:EF:91:2F, bridge=eth0',
        'mac=00:16:3e:07:31:85, bridge=eth1'
      ]

Se recomienda utilizar el rango de direcciones MAC reservadas para Xen, el rango es 00:16:3e:xx:xx:xx, puede utilizar un script para generar MAC de forma aleatoria: /usr/local/bin/macgen.py.

Como crear un bridge dummy para una red privada sin conexión física

Los dispositivos de red virtual dummy tienen todas las funcionalidades que una interfaz de red física, son usados para crear redes privadas que no tengan acceso a una red física.

Para crear una interfaz de red dummy, debe definir el nombre de la interfaz asociada al módulo y el número máximo de interfaces dummy que el kernel soporta. Edite las opciones para el módulo dummy, por ejemplo:

# vim /etc/modprobe.d/dummy

Con el siguiente contenido:

alias dummy0 dummy
options dummy numdummies=1
[Nota] Nota

Si va a crear más de un dispositivo dummy recuerde incrementar el número en la opción numdummies.

También debe habilitar la interfaz en interfaces(5), por ejemplo:

# Interfaz fisica para bridge dummy0
auto dummy0
iface dummy0 inet manual

Si quiere agregar un bridge a esta interfaz agregue:

/etc/xen/scripts/network-bridge $1 netdev=dummy0

Al archivo /etc/xen/scripts/multi-network-bridge y reincie el sistema.

Veamos como se vería un bridge privado y un switch físico:

Figura 3.5. Servidor Linux con Xen, dos bridges, uno dummy, y tres Domu

Servidor Linux con Xen, dos bridges, uno dummy, y tres Domu

En las siguientes secciones veremos como crear los bridges usando las herramientas del sistema operativo.

Creando los bridge Linux usando las herramientas del sistema operativo

Es posible prescindir del script /etc/xen/scripts/network-bridge para la creación del o los bridge y utilizar las herramientas de configuración de red propias de la distribución, por ejemplo, en Debian/Ubuntu es posible crear un bridge usando el archivo de configuración /etc/network/interfaces, por ejemplo, para crear un bridge para la interfaz física eth0 use:

# vim /etc/network/interfaces

Cambie la configuración para la interfaz eth0 así:

# The loopback network interface
auto lo
iface lo inet loopback

# WAN Bridge
auto xenbr0
iface xenbr0 inet static
  address 192.168.1.20
  network 192.168.1.0
  broadcast 192.168.1.255
  netmask 255.255.255.0
  gateway 192.168.1.1
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports eth0
  bridge_stp off
[Importante] Importante

Cuando cree bridges desde el archivo interfaces(5) asegurese de que no haya ninguna interfaz (iface) configurada para las interfaces conectadas al bridge (bridge_ports), por ejemplo, eth0 en el bridge de arriba.

Ya que ahora la configuración de el bridge fue delegada a las herramientas del OS, debemos comentar la línea del parámetro network-script en el archivo de configuración /etc/xen/xend-config.sxp para evitar que cuando el demonio xend sea iniciado cree el bridge y cause problemas.

# La configuracion del bridge se delego al OS
#(network-script network-bridge)

La creación de las interfaces virtuales vifX.X (o puertos virtuales) para las VMs seguirá siendo controlada por el script /etc/xen/scripts/vif-bridge, por lo que el parámetro vif-script del archivo xend-config.sxp debe seguir activa.

Además, si cambio el nombre del bridge debe asegurarse de cambiar el nombre del bridge en los archivos de configuración de sus maquinas virtuales, por ejemplo:

vif = [ 'mac=00:16:3E:EF:91:2F, bridge=xenbr0']

Después de reiniciar el sistema, y sin ninguna maquina virtual, el bridge quedaría así:

Figura 3.6. Servidor Linux con Xen, un bridge y un DomU vía OS

Servidor Linux con Xen, un bridge y un DomU vía OS

Veamos un ejemplo de la configuración con dos bridges físicos:

# The loopback network interface
auto lo
iface lo inet loopback

# WAN Bridge
auto xenbr0
iface xenbr0 inet static
  address 192.168.1.20
  network 192.168.1.0
  broadcast 192.168.1.255
  netmask 255.255.255.0
  gateway 192.168.1.1
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports eth0
  bridge_stp off

# LAN Bridge
auto xenbr1
iface xenbr1 inet manual
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports eth1
  bridge_stp off

Después de crear los switches y las VM el esquema se vería así:

Figura 3.7. Servidor Linux con Xen, dos bridges, y dos Domu vía OS

Servidor Linux con Xen, dos bridges, y dos Domu vía OS

Veamos un ejemplo para una mezcla entre bridges con interfaces físicas y bridges con interfaces dummy:

# The loopback network interface
auto lo
iface lo inet loopback

# WAN Bridge
auto xenbr0
iface xenbr0 inet static
  address 192.168.1.20
  network 192.168.1.0
  broadcast 192.168.1.255
  netmask 255.255.255.0
  gateway 192.168.1.1
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports eth0
  bridge_stp off

# LAN Bridge
auto xenbr1
iface xenbr1 inet manual
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports eth1
  bridge_stp off

# DMZ Bridge
auto xenbr2
iface xenbr2 inet manual
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_maxwait 0
  bridge_ports dummy0
  bridge_stp off
[Nota] Nota

Puede configurar una interfaz bridge en diferentes modos, por ejemplo: con dirección IP estática (static), DHCP (dhcp) o sin dirección IP (manual).

[Nota] Nota

Si desea crear un bridge sin ninguna interfaz conectada, use la opción none, por ejemplo: bridge ports none.

El diagrama de la red descrita arriba se vería así:

Figura 3.8. Servidor Linux con Xen, tres bridges, y cuatro Domu vía OS

Servidor Linux con Xen, tres bridges, y cuatro Domu vía OS

Una ventaja de realizar la configuración del bridge de esta forma es que puede usar los procedimientos probados y soportados por su distribución.

Como generar direcciones MAC únicas para Xen

Se recomienda que asigne direcciones MAC únicas a las maquinas virtuales, para asegurarse de que las direcciones MAC elegidas no causen conflictos con las tarjetas de red de algún fabricante o algún host interno, puede usar direcciones basadas en el espacio de direcciones asignadas por la IANA: 00:16:3e:xx:xx:xx, crearemos un script en python para semi automatizar la creación de nuevas direcciones MAC para asignar a las maquinas.

Cree el script /usr/local/sbin/macgen.py:

# vim /usr/local/sbin/macgen.py

Con el contenido:

#! /usr/bin/python
#
# macgen.py script to generate a MAC address for Red Hat Virtualization guests
#
import random
mac = [ 0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff) ]
print ':'.join(map(lambda x: "%02x" % x, mac))
[Nota] Nota

Aparentemente este script fue obtenido de algún documento de redhat,

Asigne privilegios de ejecución:

# chmod +x /usr/local/sbin/macgen.py

Pruebe generando una dirección:

# macgen.py 
00:16:3e:44:fb:ad

Recuerde que puede ejecutar el comando macgen.py desde el editor vim, recuerdelo cuando este editando archivos de configuración de las máquinas virtuales y defina un MAC Address único para la máquina en cuestion.