martes, 10 de enero de 2017

Openvswitch + Vlans

En la entrada anterior  escribía como usar openvswitch con xen y debian jessie, este software me permite crear la infraestructura virtual de red de forma rápida y sencilla. Pero, no solo me permite la conexión interna entre las maquinas virtuales, sino también hacia la red física. Es esta oportunidad vamos a usar openvswitch y configuraremos vlans de trabajo las cuales asociaremos  vlans existentes en los switch de nuestra red.

Esta entrada surge debido la siguiente situación, tengo un servidor el cual utilizaré para virtualizar, el mismo posee dos tarjetas físicas, una de las tarjetas la uso como acceso administrativo, quedando sólo una interfaz para crear maquinas virtuales que puedan conectarse a mi red DMZ, LAN y una que WAN que posee ip publica.



Para repasar, instalamos openvswitch con el comando

 
# apt-get install openvswitch-switch
 
una vez instalado verificamos que este corriendo con el comando


# ovs-vsctl show 
   e2ffe3b2-4224-443e-a939-21a5b2ca02e1
    ovs_version: "2.3.0"
 
vemos que esta instalado y debemos configurar según nuestra necesidad. Y hacemos lo siguiente.


configuramos la interfaz del servidor, editando el archivo interfaces



# vi /etc/network/interfaces
 
auto lo ovsbr0 eth0 eth1 vlan10
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
allow-hotplug eth1

iface eth0 inet static
address 172.31.91.164
netmask 255.255.252.0
gateway 172.31.91.2



##################bridge y vlans para XEN ######################
allow-ovs ovsbr0 eth1
iface ovsbr0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
ovs_type OVSBridge
ovs_ports eth1 vlan10 vlan215

allow-ovsbr0 eth1
iface eth1 inet manual
ovs_bridge ovsbr0
ovs_type OVSPort
#ovs_options tag=1 vlan_mode=native-untagged
# Alternatively if you want to also restrict what vlans are allowed through
# you could use:
ovs_options tag=1 vlan_mode=native-untagged trunks=10,215

allow-ovsbr0 vlan10
iface vlan10 inet manual
  ovs_type OVSIntPort
  ovs_bridge ovsbr0
  ovs_options tag=10
  ovs_extra set interface ${IFACE} external-ids:iface-id=$(hostname -s)-${IFACE}-vif
  up ifconfig $IFACE 0.0.0.0 up
  down ifconfig $IFACE down
 
En mi red la vlan10 tiene un segmento 172.16.x.x, la vlan 215 es un segmento de ip publicas 
y la vlan1 esta en un segmento 172.31.x.x configuraremos la vlan10 y la vlan1. En el archivo 
interfaces configuramos como normalmente lo hariamos pero la diferencia esta en las líneas.
 
ovs_ports eth1 vlan10 vlan215 
 
ovs_options tag=1 vlan_mode=native-untagged trunks=10,215 
 
 
aqui definimos las interfaces vlans y el tipo de acceso del puerto ovsbr0 que creamos, 
en nuestro caso seria un puerto troncal en le switch virtual (ovsbr0). 
Reiniciamos las interfaces
 
# /etc/init.d/networking restart 
 
verificamos con el comando ifconfig que todo este arriba 

# ifconfig
 
eth0      Link encap:Ethernet  HWaddr 98:4b:e1:65:93:84  
          inet addr:172.31.91.164  Bcast:172.31.91.255  Mask:255.255.252.0
          inet6 addr: fe80::9a4b:e1ff:fe65:9384/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:171184 errors:0 dropped:306 overruns:0 frame:0
          TX packets:51715 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:81121169 (77.3 MiB)  TX bytes:5696893 (5.4 MiB)
          Memory:c0400000-c041ffff 

eth1      Link encap:Ethernet  HWaddr 98:4b:e1:65:93:85  
          inet6 addr: fe80::9a4b:e1ff:fe65:9385/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:167684 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26302 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:69563654 (66.3 MiB)  TX bytes:1879692 (1.7 MiB)
          Memory:c0460000-c047ffff 

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:65536  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:944 (944.0 B)  TX bytes:944 (944.0 B)

ovsbr0    Link encap:Ethernet  HWaddr 98:4b:e1:65:93:85  
          inet6 addr: fe80::9a4b:e1ff:fe65:9385/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39286 errors:0 dropped:131 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2721632 (2.5 MiB)  TX bytes:648 (648.0 B)


vlan10    Link encap:Ethernet  HWaddr 2e:18:70:28:d7:aa  
          inet6 addr: fe80::2c18:70ff:fe28:d7aa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:520 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:64046 (62.5 KiB)  TX bytes:648 (648.0 B) 

 
Luego en el switch virtual hacemos 
 
# ovs-vsctl set port ovsbr0 trunks=1,10,215 

procedemos a revisar la configuración del switch virtual
 
# ovs-vsctl show 

9909c85f-5cbc-4b18-bdbd-bf0cab6ae1cf
    Bridge "ovsbr0"
        Port "ovsbr0"
            trunks: [1, 15, 215]
            Interface "ovsbr0"
                type: internal
        Port "eth1"
            tag: 1
            trunks: [1, 10, 215]
            Interface "eth1"
        Port "vlan10"
            tag: 10
            Interface "vlan10"
                type: internal
        ovs_version: "2.3.0"

Luego en las maquinas virtuales procedemos a configurar de la siguiente forma.
Veran que esta difindo el bridge con el tag de la vlan de la forma
 
bridge=ovsbr0.10 


 
 
 
 Iniciamos las maquinas virtuales 
 
 # xl create /etc/xen/siglas.conf 
 # xl create /etc/xen/atencionciudadano.conf  
 
podemos ver con el comando ifconfig la configuración de red de cada maquina.

 
 
 
 
 
 y verificamos como queda la configuración del switch luego de iniciar las maquinas virtuales
 
 
 
 
 Verificamos la salida a internet en las maquinas virtuales 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 y el acceso desde la red interna. 





 
 
 
 
 NOTA: Se deben realizar las respectivas configuraciones en los switch físicos.
 
 
 
Bibliografia:

http://blog.scottlowe.org/2013/05/28/vlan-trunking-to-guest-domains-with-open-vswitch/
http://blog.scottlowe.org/2012/11/07/using-vlans-with-ovs-and-libvirt/
http://docs.openvswitch.org/en/latest/faq/vlan/
http://blog.scottlowe.org/2012/10/04/some-insight-into-open-vswitch-configuration/
https://pve.proxmox.com/wiki/Open_vSwitch#VLANs_Host_Interfaces
http://wiki.flav.com/wiki/Open_vSwitch_Tutorial
 
 
 

sábado, 7 de enero de 2017

Debian Jessie + LVM + Xen 4.8 + Openvswitch

Hace aproximadamente 8 años realice esta guía en lo que fue los primeros pasos realizados con xen, esta guía la escribí para usar un firewall llamado brazilfw desde entonces es mucho lo que ha cambiado. Hoy vamos a configurar xen con debian usando lvm y openvswitch para el manejo de la red. 

Antes de instalar Xen deberás instalar Debian en la maquina principal (host). Esta instalación será de forma básica para el Domain 0. La instalación de Debian puede ser hecha de una manera normal usando el DebianInstaller. Asumiré que ya tienes instalado debian con una partición LVM que configuraremos mas adelante.

Instalación y configuración de LVM

Al momento de realizar la instalación de debian, se debe deja una partición tipo LVM, que es la que usaremos para crear las maquinas virtuales. Para usar lvm debemos instalar el paquete

 
 
#  aptitude install  lvm2 
 
# fdisk -l
Disco /dev/sda: 931,5 GiB, 1000204886016 bytes, 1953525168 sectores

Disposit.  Inicio   Comienzo      Final   Sectores Tamaño Id Tipo
/dev/sda1  *            2048     206847     204800   100M  7 HPFS/NTFS/exFAT
/dev/sda2             206848 1024002047 1023795200 488,2G  7 HPFS/NTFS/exFAT
/dev/sda3         1024004094 1953523711  929519618 443,2G  5 Extendida
/dev/sda5         1024004096 1123416063   99411968  47,4G 83 Linux
/dev/sda6         1951543296 1953523711    1980416   967M 82 Linux swap / Solaris
/dev/sda7         1123418112 1318727679  195309568  93,1G 83 Linux
/dev/sda8         1318729728 1951528959  632799232 301,8G 8e Linux LVM

en nuestro caso esta partición es /dev/sda8, ya con este dato ponemos a tono  el equipo.

1) Se crea un volumen físico
# pvcreate /dev/sda8
Physical volume "/dev/sda8" successfully created

si revisamos este punto podemos ver que se ha creado el volumen físico



 

2) creamos un grupo de volumenes

vgcreate nube /dev/sda8
Volume group "nube" successfully created

de igual forma podemos verificar que se creo el grupo de volumen.










Si deseas conocer mas a fondo el uso de LVM esta guia es muy completa en español y esta otra de la wiki debian.


Instalación inicial de XEN


 La instalación de xen es realmente sencilla, procedemos a realizar la misma de la siguiente forma

# aptitude install xen-linux-system-amd64 xen-tools
 

Configuración de xen

editamos el archivo xl.conf, como la idea es usar openvswitch cambiamos o agregamos  las lineas.

vif.default.script="vif-openvswitch"

y la otra 
vif.default.bridge="ovsbr0" 
puedes llamar al bridge como quieras. 
Pero debes tener en cuenta el nombre cuando configures openvswitch


Luego editamos el archivo xend-config.sxp

vi xend-config.sxp 

igual cambiamos vif-script vif-bridge por

vif-script vif-openvswitch

existen otros parámetros que podríamos configurar aquí como:

cantidad de CPUs asignados al Dom0
Dom0-cpus
total de memoria disponible
total_avaible_memory
memoria mínima asignada al Dom0
Dom0_min_mem
activar la conexion vnc (esta opción es muy recomendada si se va a virtualizar 
algún sistema operativo con núcleo no modificado, como windows)
vnc-listen 
Ahora editamos el archivo xen-tools.conf y configuramos lvm para usarlo por defecto 
para crear las MV.

descomentamos la opción lvm y le colocamos el nombre del volumen lvm creado.. en este caso nube
quedaría así..
Aquí podríamos cambiar muchas cosas y definir los parámetros a usar cuando creamos las MV
pero generalmente solo toco este punto y al momento de crear las MV por consola defino las características de la misma.
 

Buenas prácticas

Limitar y proteger el uso de memoria y CPUs de la dom0
Como usuario root editar el archivo /etc/default/grub, tal como se muestra a continuación. En el ejemplo, se limita el uso de memoria a 512 MB y a un solo núcleo
vi /etc/default/grub
Agregar la siguiente línea
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M,max:512M dom0_max_vcpus=1"
Según la wiki de Xen, se recomienda que se dedique explícitamente el núcleo del CPU a usar, sobre todo cuando los guest vayan a tener operaciones IO intensivas. En general, especificar el núcleo del CPU reduce los cambios de contextos, lo que supone alguna mejora en el rendimiento. En ese caso, la línea queda de la siguiente manera:
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M,max:512M dom0_max_vcpus=1 dom0_vcpus_pin"
Actualizar la configuración de GRUB ejecutando como root la siguiente orden.
update-grub2
En Debian  Jessie Como usuario root editar el archivo /etc/xen/xend-config.sxp, tal como se muestra a continuación.
vi /etc/xen/xend-config.sxp
Agregar o modificar las siguientes líneas
(dom0-min-mem 512)
(dom0-cpus 1)
 

Instalación y configuración de Openvswitch.

instalamos openvswitch con el siguiente comando

# aptitude install openvswitch-switch

vemos que openvswitch se ha instalado con el comando
# ovs-vsctl show
a319db3c-5ad9-4ac9-bdb9-d434b594b6bd
    Bridge "ovsbr0"
ovs_version: "2.6.2"

 ya tenemos lo que necesitamos listo. Procedemos a configurar openvswtich.

1) creamos el bridge ovsbr0 

# ovs-vsctl add-br ovsb0 

2) configuramos la interfaz de red física a usar. editando el archivo /etc/network/interfaces


# vi /etc/network/interfaces


 auto lo ovsbr0 enp5s0
 iface lo inet loopback 

allow-ovs ovsbr0 
iface ovsbr0 inet static (nota: también se puede configurar como dhcp) 
address 192.168.20.103
 netmask 255.255.255.0
 gateway 192.168.20.1
 ovs_type OVSBridge 
ovs_ports enp5s0 

allow-ovsbr0 enp5s0 
 iface enp5s0 inet manual 
ovs_bridge ovsbr0
 ovs_type OVSPort


Configuramos el bridge que habíamos definido en el archivo xl.conf de xen. Guardamos y salimos.
El próximo paso es agregar la interfaz al bridge en openvswitch 
# ovs-vsctl add-port ovsbr0 enp5s0 
hay que tener en cuenta que si se lanza este comando y estamos conectados al servidor con la interfaz asociada se perderá la conexión.
 
luego revisamos como ha quedado configurada la red.


 una vez terminado todo esto configuramos grub y reiniciamos

vi /etc/default/grub
# Disable OS prober
GRUB_DISABLE_OS_PROBER=true
#allocate memory to dom0
Guardamos y salimos, luego hacemos

mv -i /etc/grub.d/20_linux_xen /etc/grub.d/09_linux_xen
update-grub
shutdown -r now

Esto nos permite que se inicie el sistema con la imagen de xen por defecto. Al reiniciar el equipo
verificamos que este corriendo xen

# xl lis
Name                                        ID   Mem VCPUs State Time(s)
Domain-0                                     0  1018     1     r-----      41.5
 
 

 Creamos las Maquinas Virtuales.

 vamos a crea un maquina con el siguiente conmando

# xen-create-image  --hostname=siglas --ip=172.31.91.200  --memory=6GB  --size=50GB

xen-create-image: Comando que me permite crear la maquina virtual, esta maquina esta basada en linux, paravirtualizada y se "instala" con debootstrap.
--hostname: nombre de la maquina virtual, es mandatorio.
--ip: dirección que usara  la maquina virtual, es mandatorio, se puede usar esta opcion o la opcion --dhcp
--memory: Cantidad de memoria que se le asignara a la maquina virtual, si no se define aqui, se tomara por defecto la configurada en el archivo /etc/xen-tools/xen-toosl.conf
--size: Tamaño de la particion lvm que usará la maquina virtual, si no se define aqui, se tomara por defecto la configurada en el archivo /etc/xen-tools/xen-toosl.conf
 Tambien podriamos definir desde aqui la distribucion a usar, el tamaño de la memoria swap, etc. De no hacerlo en la linea de comando igual tomará por defecto lo configurado en el archivo xen-tools.conf 


veremos algo así (según la conexión, esto toma tiempo)


# xen-create-image  --hostname=siglas2 --ip=172.31.91.200 --memory=6GB  --size=50GB
WARNING:  No gateway address specified!
WARNING:  No netmask address specified!

General Information
--------------------
Hostname       :  siglas
Distribution   :  jessie
Mirror         :  http://ftp.de.debian.org/debian/
Partitions     :  swap            512M  (swap)
                  /               50GB  (ext4)
Image type     :  full
Memory size    :  6GB
Kernel path    :  /boot/vmlinuz-3.16.0-4-amd64
Initrd path    :  /boot/initrd.img-3.16.0-4-amd64

Networking Information
----------------------
IP Address 1   : 172.31.91.200 [MAC: 00:16:3E:22:07:40]


Creating swap on /dev/nube/siglas-swap
Done

Creating ext4 filesystem on /dev/nube/siglas-disk
Done
Installation method: debootstrap
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done

No role scripts were specified.  Skipping
Setting up root password
Generating a password for the new guest.
All done


Logfile produced at:
     /var/log/xen-tools/siglas.log

Installation Summary
---------------------
Hostname        :  siglas
Distribution    :  jessie
MAC Address     :  00:16:3E:22:07:40
IP Address(es)  :  172.31.91.200
RSA Fingerprint :  27:d1:95:2d:5c:aa:f8:b5:0b:0e:13:d6:08:ef:f0:b3
Root Password   :  9nVvYzLfYBQwGWRgAsqk5dr

Ya tenemos creada la maquina virtual si verificamos el volumen lógico de lvm, debemos tener creados los discos de dicha maquina virtual

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/nube/siglas-swap
  LV Name                siglas-swap
  VG Name                vg0
  LV UUID                wW7HwM-SVs9-0ZBM-WDpo-AQkV-FORR-mKB9eF
  LV Write Access        read/write
  LV Creation host, time kannon, 2017-01-06 21:32:03 -0400
  LV Status              available
  # open                 1
  LV Size                512,00 MiB
  Current LE             16
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0
  
  --- Logical volume ---
  LV Path                /dev/nube/siglas-disk
  LV Name                siglas-disk
  VG Name                vg0
  LV UUID                eW4mOM-HATa-eMQx-8RiK-6RvH-DGW8-xpTU0k
  LV Write Access        read/write
  LV Creation host, time kannon, 2017-01-06 21:32:04 -0400
  LV Status              available
  # open                 1
  LV Size                50,00 GiB
  Current LE             1600
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1
Ahora solo nos queda configurar la interfaz  bridge con la que iniciaremos la MV e iniciar la Maquina virtual con el comando xl
 vi /etc/xec/siglas.conf

vamos a la linea y agregamos el bridge

vif         = [ 'ip=172.31.91.200 ,mac=00:16:3E:72:B9:23, bridge=ovsbr0' ]
Guardamos y ahora si iniciamos la maquina virtual 
# xl create /etc/xen/siglas.conf  
si todo ha ido bien, podemos ver como la maquina virtual esta corriendo.
# xl list
Name                                        ID   Mem VCPUs    State    Time(s)
Domain-0                                  0    1018      1       r-----     251.4
siglas                                        2    6144     1       -b----     193.1

hacemos ping a la ip configurada

$ ping 172.31.91.200
PING 172.31.91.200 (172.31.91.200) 56(84) bytes of data.
64 bytes from 172.31.91.200: icmp_seq=1 ttl=63 time=0.768 ms
64 bytes from 172.31.91.200: icmp_seq=2 ttl=63 time=0.681 ms
64 bytes from 172.31.91.200: icmp_seq=3 ttl=63 time=0.497 ms
64 bytes from 172.31.91.200: icmp_seq=4 ttl=63 time=0.547 ms
64 bytes from 172.31.91.200: icmp_seq=5 ttl=63 time=0.642 ms
64 bytes from 172.31.91.200: icmp_seq=6 ttl=63 time=0.502 ms
64 bytes from 172.31.91.200: icmp_seq=7 ttl=63 time=0.481 ms
64 bytes from 172.31.91.200: icmp_seq=8 ttl=63 time=0.512 ms

--- 172.31.91.200 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 6997ms
rtt min/avg/max/mdev = 0.481/0.578/0.768/0.102 ms
Realizando pruebas con el navegador podemos chequear que la maquina virtual ya es parte de la red existente.