sábado, 21 de abril de 2012

CentOS / Red Hat: Making a persistent KVM network bridge

Hoy en día cuando la virtualización se a convertido en una tecnología de facto en la mayoría de los datacenter existen numerosas soluciones compitiendo en el mercado. En mi caso si me dan a elegir entre las distintas soluciones de pago para Linux, elijo una gratuita (y libre), KVM.
KVM (Kernel-based Virtual Machine), es una solución que nos provee full virtualización, haciendo uso de qemu como hypervisor, la cual se encuentra integrada dentro del propio kernel de Linux de manera modular, mediante el módulo del kernel kvm.ko. Esto nos provee cierta compatibilidad y performance que la ponen prácticamente a la par de otras soluciones de virtualización.
Una de las tareas comunes al crear una nueva maquina virtual, es integrar a esta con la red existente, ya que la virtualización nos provee la posibilidad de hostear múltiples servidores en un solo equipo físico.

La configuración en RHEL o CentOS es muy sencilla, para ello debemos crear un bridge, quien será el responsable de interactuar con la red física. Para hacer esto, al momento de booteo y cuando los scripts SYSV de RC configuran la red (mediante el servicio network), el bridge es configurado utilizando brctl, y la configuración leída de aquellos archivos de interfaces los cuales son definidos como bridge.
En nuestro ejemplo tendremos dos Una NIC física (eth0), en la cual crearemos el bridge y lo configuraremos acorde a los paramétros de networking que necesitemos asignarle al servidor.

El primer paso, será crear el archivo /etc/sysconfig/network-scripts/ifcfg-br0, el cual será nuestro bridge y tendrá el siguiente contenido:
DEVICE="br0"
BOOTPROTO="static"
IPADDR="192.168.0.215"
NETMASK="255.255.254.0"
BROADCAST="192.168.1.255"
ONBOOT="yes"
TYPE="Bridge"
En este ejemplo, le asignamos a br0 la dirección IP 172.16.8.50 y una netmask de 24 bits (255.255.255.0). Además es importante el parámetro TYPE, el cual define a la misma como bridge. Si necesitamos configurar la misma mediante DHCP, en nuestra configuración tendríamos:
DEVICE="br0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Bridge"
Ahora solo resta configurar la interfaz de red eth0 y decirle que la misma es parte del bridge:
DEVICE="eth0"
HWADDR="00:1E:67:1D:0C:88"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE="br0"
Y ahora solamente debemos reiniciar el servicio network:
[root@kvm ~]# service network restart
Shutting down interface br0:                               [  OK  ]
Shutting down interface eth0:                              [  OK  ]
Shutting down interface eth1:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface eth1:                                [  OK  ]
Bringing up interface br0:                                 [  OK  ]
[root@kvm ~]# 
Para asegurarnos que todo salio bien, podemos revisar la configuración de br0 mediante ifconfig(1) y brctl(1):
[root@kvm ~]# ifconfig br0
br0       Link encap:Ethernet  HWaddr 00:1E:67:1D:0C:88  
          inet addr:172.16.8.50  Bcast:172.16.8.50  Mask:255.255.255.0
          inet6 addr: fe80::21e:67ff:fe1d:c88/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:10872 (10.6 KiB)  TX bytes:3411 (3.3 KiB)

[root@kvm ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001e671d0c88       no              eth0
                                                        vnet0
A este mismo bridge podemos real izarlo manualmente usando ifconfig(1) y brctl, pero como saben, la configuración no quedará persistente.
Existen dos sysctl que pueden resultar interesantes si además realizamos filtrado mediante iptables, ip6tables o arptables, ellas son: net.bridge.bridge-nf-call-ip6tables net.bridge.bridge-nf-call-iptables y net.bridge.bridge-nf-call-arptables. Las cuales desactivan Netfilter en el brige anteriormente creado. Para activar Netfilter y poder filtrar en nuestras interfaces debemos configurar en el archivo /etc/sysctl.conf, lo siguiente:
# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 0
Y luego ejecutar lo siguiente:
[root@kvm ~]# sysctl -p

No hay comentarios:

Publicar un comentario