KVM: Cómo crear una DMZ de dos niveles y no morir en el intento

Escrito por coder el 14 de mayo de 2008

Sí amigos, es posible y, al menos en Gentoo (¿quién dijo que abandonaría Gentoo? ;_)) se puede llevar a cabo sin apenas guarrear con scripts adicionales. Es más, desde mi punto de vista no he cometido ninguna guarrada.

Bien, supongamos que, al igual que yo, estáis majaras y adquirís un PC para casa tipo el Dell Optiplex 755 que yo me compré en noviembre. Al ser un Core 2 Duo con VT-d gracias a la magia de Intel y su placa ICH9, podemos virtualizar como Zeus manda. A ese PC le añadí dos ethernets adicionales para poder crear el invento este y que funcionara bien. Muchos de los miles de lectores que por aquí se pasan estarán pensando 'oye McFly, hasta donde yo sé, no hace falta tener tarjetas adicionales para que el SO virtualizado pueda tener red'. Cierto, basta con crear un bridge al que añadirle el interfaz del host en modo promiscuo y ya lo tendremos. Es lo que se hace con VMware y también con KVM, pero el quiz de la cuestión es: ¿cómo hacer lo mismo pero teniendo los SOs virtualizados aislados? Los avispados ya sabrán la respuesta: usando las VLANs que trae KVM. Cierto... pero no es suficiente. Quizá con el esquema siguiente se vea mejor. Abróchense los cinturones para una dosis de ASCII:



 __________________________________________
|             HOST (Gentoo)                |
|                                          |
|   eth0      | eth1         | eth2        |
|10.12.34.250 | no IP        | no IP       |
--------------------------------------------
     |        | guest1       | guest2      |
     |        | netbsd4      | w2k8        |
     |        | 192.168.34.2 | 172.29.19.1 |
     |        -----------------------------
     |             |               |
     |             |               |
  -----------   ---------      -----------
 | SWITCH 1  | |SWITCH 2 |    | SWITCH 3  |
  -----------   ---------      -----------
  (network 1)  (network 2)     (network 3)

Así podemos tener una DMZ de dos niveles _real_, aislando al host de sus dos guests, sin el truquito de las VLANs y, lo que es más importante, dotando a cada guest de su propia ethernet para que pueda aprovecharla sin compartirla. Obviamente, si no tenemos más equipos (es decir, si estamos trasteando en casa o en nuestro laboratorio en la ofi) no tenemos por qué tener ningún switch, por lo que la gestión de las subredes y sus firewalls podremos hacerla con ebtables e iptables.

Bueno, y ahora el regalito: la config. Por un lado, en /etc/conf.d/net creamos los bridges y los taps (recuerden que KVM funciona con taps), y asignamos cada una de las dos ethernets a los bridges:

config_eth0=( "10.12.34.250/24" )
routes_eth0=( "default via 10.12.34.234" )

config_eth1=( "null" )
config_eth2=( "null" )

tuntap_tap0="tun"
tuntap_tap1="tun"

config_tap0=( "null" )
config_tap1=( "null" )

bridge_br0="eth1"
config_br0=( "null" )
brctl_br0=( "stp on" )

bridge_br1="eth2"
config_br1=( "null" )
brctl_br1=( "stp on" )

Comprobamos que cada cosa está en su sitio:



probeta ~ # brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.0001021929ec       yes             eth1
br1             8000.0048548867f6       yes             eth2
probeta ~ #


Bien, lo están. Ahora la key está en que en el momento de levantar una máquina virtual le especificaremos a KVM el script para levantar el interfaz. Pongo un ejemplo de una imagen de Windows 2008 asignando el tap0 al bridge0:

# kvm -hda w2k8-i686.img -bootc -m 1024 -smp 2 -vnc :1 -k es-usbdevice tablet -net nic,vlan=0,type=rtl8139 -net tap,vlan=0,ifname=tap0,script=/etc/kvm/qemu-ifup-tap0


Y este es el script /etc/kvm/qemu-ifup-tap0:

probeta ~ # cat /etc/kvm/qemu-ifup-tap0 
#!/bin/bash

ifconfig $1 up
brctl addif br0 $1
probeta ~ #


Y con eso ya lo tenemos en su bridge:

probeta ~ # brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.0001021929ec       yes             eth1
                                                        tap0
br1             8000.0048548867f6       yes             eth2
probeta ~ #



Ahí está, ya se ha asignado al bridge que toca.

No os quejaréis, ¡os lo doy todo hecho!



         

« Ejecutar Xorg como usuario no privilegiado

VCF: Desmantelar o morir »



Comentarios

  • El 2008-05-14 18:26:57, GLurPS (196.217.38.105) dijo:

    Guapo, guapo, guapo. Y limpio, si señor. McFly, a ti no te tenemos que pasar la prueba del algodon.

    Bromas aparte. Me parece de una elegancia superlativa. Me quito el Hat (White, por supuesto).

    [Si te quieres reir, entra en la web del CNI con Firefox. ¡En que manos está la Seguridad Nacional, poddios! Nostaria mal explicarles algo de Autoridades Certifcadores... y de paso a la FNMT]

  • El 2008-05-14 19:51:44, vierito5 (81.202.7.162) dijo:

    Interesante y elegante! Bendita Gentoo

[ Comentar la jugada ]