Pasos para montar y probar un servicio
Este articulo esta basado en un caso real, en el cual se implementó un contenedor de maquinas virtuales XEN usando LVM.
Datos Iniciales
*Equipo fisico
160 Disco duro
2 Ram
*Instalar la versión de debian estable del momento
debian-x.x.x-amd64-i386- netinst.iso
Nombre del equipo: nombre_server
Nombre del usuario: soporte
Password: xxxxx
Nombre del usuario root: soporte
Password: xxxxx
Preparando el servidor
Particiones del disco
Primaria /boot ext2 : 256mb
Logica Swap : 2GB
Logica / ext4 : 10GB
Logica /var etx4 : 7GB
Primaria LVM : 280,7GB (lo quedo)
Como se puede observar hay una partición muy grande en comparación a las demás y es una LVM, esto se debe a que esta servirá como contenedor de todos los volúmenes lógicos que se creen, por ejemplo: maquinas virtuales, particiones, entre otros.
Actualizar
aptitude update
Instalación de paquete principal
aptitude install ssh
*Virtualizar con xen
Instalación
aptitude install xen-linux-system-amd64 xen-tools
xen-linux-system-3.2.0-4-amd64 ------> Varia segun el kernel que tengas SO
Para Debian jessie deben estar instalado los siguientes paquetes:
grub-xen-bin grub-xen-host libxen-4.4 libxenstore3.0 xen-hypervisor-4.4-amd64 xen-linux-system-3.16.0-4-amd64 xen-system-amd64 xen-utils-4.4 xen-utils-common xenstore-utils xen-tools
Para Debian jessie deben estar instalado los siguientes paquetes:
grub-xen-bin grub-xen-host libxen-4.4 libxenstore3.0 xen-hypervisor-4.4-amd64 xen-linux-system-3.16.0-4-amd64 xen-system-amd64 xen-utils-4.4 xen-utils-common xenstore-utils xen-tools
También se instalará fail2ban
aptitude install fail2ban
Se explicara su utilidad mas adelante
*Un briege en la interfaz de red
Una vez instalados los paquetes, se debe configurar la interfaz de red para que actué como puente (bridge), de la siguiente manera:
root@plataforma-prueba:/etc/xen# nano /etc/network/interfaces
Se observará algo como esto:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Modifica y comenta estas dos líneas:
auto eth0
iface eth0 inet dhcp
# The primary network interface
#iface eth0 inet static
# address 10.16.106.136
# netmask 255.255.255.128
# network 10.16.1.0
# gateway 10.16.1.1
# dns-nameservers 200.44.32.12
# This is an autoconfigured IPv6 interface
iface eth1 inet6 auto
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports none
iface eth0 inet dhcp
# The primary network interface
#iface eth0 inet static
# address 10.16.106.136
# netmask 255.255.255.128
# network 10.16.1.0
# gateway 10.16.1.1
# dns-nameservers 200.44.32.12
# This is an autoconfigured IPv6 interface
iface eth1 inet6 auto
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports none
Eth0: Puede contener una dirección IP pública (estática o dinámica). Ej.: 200.11.10.25
Br0: Nos ayuda a tener una red privada dentro del contenedor y así es posible asignar direcciones IP a las maquinas virtuales como por ejemplo: 192.168.1.16.
IPTable: Gracias a esto es posible hacer el reenvío de trafico que entra por eth0 y luego es enviado a cualquiera de las maquinas virtuales.
Eth0_V: Son interfaces de red virtuales que se crean al momento de hacer la maquina virtual.
MV1, MV2 y MV3: Son las maquinas virtuales.
*Un cortafuego con iptable
Para qué IPTable?
Como se mencionó anteriormente este servirá para hacer el reenvío de trafico hacia las maquinas virtuales, primero se debe coloca un “1” al archivo ip_forward que está en la ruta /proc/sys/ipv4/net/ip_forward para que el contenedor sea capaz de hacer reenvío de trafico y por medio de reglas de PREROUTING el trafico se envía a cada maquina virtual. A continuación se presentará un pequeño ejemplo:
Se debe crear el script de IPTable y se guarda en /root/nombre_que_quieran.sh
En este caso lo llamare cortafuego.sh
root@plataforma-prueba:/etc/xen# nano /root/cortafuego.sh
Luego agrega las siguientes lineas:
#!/bin/sh
# Creado por personal de Plataforma
# variables globales
ETH="eth0"
# se blanquean reglas de iptables
iptables -t nat -X
iptables -t nat -F
iptables -t nat -Z
iptables -F
iptables -Z
# se habilita el reenvio de paquetes
echo "1" > /proc/sys/net/ipv4/ip_forward
# se activa el modulo para funcion de 'nateo'
/sbin/modprobe iptable_nat
# se 'natea'
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o $ETH -j MASQUERADE
## mv1 monitoreo zabbix ##
## basada en paradigma de lvm
## Admnistrador: personal de Plataforma
iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 22101 -j DNAT --to 192.168.1.101:22
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 22101 -j DNAT --to-destination 192.168.1.101:22
## Puertos para servicio de correo electrónico
iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 25 -j DNAT --to 192.168.1.101:25
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 25 -j DNAT --to-destination 192.168.1.101:25
#########
## mv2 nombre_maquina - descripcion_del_servicio ##
## basada en paradigma de lvm
## Admnistrador: personal de Plataforma
#####
## se reinicia el bloqueador de intentos de fuerza bruta 'fail2ban'
/etc/init.d/fail2ban restart
# Creado por personal de Plataforma
# variables globales
ETH="eth0"
# se blanquean reglas de iptables
iptables -t nat -X
iptables -t nat -F
iptables -t nat -Z
iptables -F
iptables -Z
# se habilita el reenvio de paquetes
echo "1" > /proc/sys/net/ipv4/ip_forward
# se activa el modulo para funcion de 'nateo'
/sbin/modprobe iptable_nat
# se 'natea'
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o $ETH -j MASQUERADE
## mv1 monitoreo zabbix ##
## basada en paradigma de lvm
## Admnistrador: personal de Plataforma
iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 22101 -j DNAT --to 192.168.1.101:22
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 22101 -j DNAT --to-destination 192.168.1.101:22
## Puertos para servicio de correo electrónico
iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 25 -j DNAT --to 192.168.1.101:25
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 25 -j DNAT --to-destination 192.168.1.101:25
#########
## mv2 nombre_maquina - descripcion_del_servicio ##
## basada en paradigma de lvm
## Admnistrador: personal de Plataforma
#####
## se reinicia el bloqueador de intentos de fuerza bruta 'fail2ban'
/etc/init.d/fail2ban restart
IMPORTANTE: Luego que guardamos el archivo corremos el script cortafuego.sh
sh /root/cortafuego.sh
Al principio dije que explicaría porque instalar fail2ban, como se puede observar se está usando en IPTable, su función es una sencilla manera de protegernos de ataques a fuerza bruta
Probando XEN
Para comprobar que el contenedor de maquinas virtuales xen (dum0) esta funcionando bien, se corre el siguiente comando.
root@plataforma-prueba:/etc/xen# xm list
La respuesta esperada es la siguiente:
Name ID Mem VCPUs State Time(s)
Domain-0 0 6145 8 r----- 28365.3
Sí sale un error como este
root@server-soporte:/etc/xen# xm list
WARING! Can't find hypervisor information in sysfs!
Error: Unable to connect to xend: No such file or directory. Is xend running?
Esto se debe a que wheeze utiliza grub2 y los valores de inicio están equivocados para xen, para corregir este error hacemos lo siguiente:
#mv -i /etc/grub.d/10_linux /etc/grub.d/50_linux
#update-grub2
Luego reinicias el contenedor y comprobamos otra vez
root@plataforma-prueba:/etc/xen# init 6
Luego
root@plataforma-prueba:/etc/xen# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 6145 8 r----- 28365.3
¡Todo esta funcionado bien!
Creación de un grupo de volúmenes
Ahora es momento de crear un grupo de volúmenes, quien contendrá todos los volúmenes lógicos que se creen. La siguiente imagen puede aclarar un poco la idea:
Explicando el escenario se adjunta imagen.
- El área en azul representa el LVM que se creo al principio de la instalación del sistema operativo.
- El área en gris representa el grupo de volumen, este es quien contendrá a los volúmenes lógicos como ya se mencionó anteriormente. Para este caso lo llamaremos vg0.
- Las áreas verdes representan a cada volumen lógico, que pudieran ser maquinas virtuales, particiones de maquinas virtuales, discos, etc.
Para crear el grupo de volúmenes ejecuta los siguientes comandos:
root@plataforma-prueba:/etc/xen# fdisk -l
Con esto vemos cual es la partición que se dejo para LVM
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, 312581808 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x000ca6be
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 2048 499711 248832 83 Linux
/dev/sda2 501758 39172095 19335169 5 Extendida
/dev/sda3 * 39172096 312580095 136704000 8e Linux LVM
/dev/sda5 501760 4405247 1951744 82 Linux swap / Solaris
/dev/sda6 4407296 23937023 9764864 83 Linux
/dev/sda7 23939072 39172095 7616512 83 Linux
La que posee el asterisco es la que se dejo para LVM, para este caso es /dev/sda3.
Antes de crear un volumen se debe instalar el siguiente paquete.
root@plataforma-prueba:/etc/xen# aptitude install lvm2
Luego se procede a crear un volumen físico, que pudiera ser un disco duro real o un arreglo RAID. Para ello ejecutamos el siguiente comando:
root@plataforma-prueba:/etc/xen# pvcreate /dev/sda3
Writing physical volume data to disk "/dev/sda3"
Physical volume "/dev/sda3" successfully created
Sí todo a salido bien podemos continuar. Ahora vamos a crear el grupo de volúmenes vg0, para ello ejecuta el siguiente comando:
root@plataforma-prueba:/etc/xen# vgcreate -s 32M vg0 /dev/sda3
Volume group "vg0" successfully created
El parámetro -s se usa para insertar extensiones físicas que pudieran ser 4M, 8M, 16M o 32M. Esto quiere decir lo siguiente:
-s = 4M —––> vg0 como máximo va ser de 256Gb.
-s = 4M —––> vg0 como máximo va ser de 256Gb.
-s = 8M —––> vg0 como máximo va ser de 512Gb.
-s = 16M —–> vg0 como máximo va ser de 1Tb.
-s = 32M —–> vg0 como máximo va ser de 2Tb.
-s = 16M —–> vg0 como máximo va ser de 1Tb.
-s = 32M —–> vg0 como máximo va ser de 2Tb.
Crear nuestra primera maquina virtual usando xen-tools y LVM
Primero debemos editar el archivo de xen-tools que se encuentra en /etc/xen-tools/xen-tools.conf
root@plataforma-prueba:/etc/xen# nano /etc/xen-tools/xen-tools.conf
Para este caso editaremos las siguientes lineas:
lvm = vg0
install-method = debootstrap
size = 20Gb # Disk image size.
memory = 1Gb # Memory size
swap = 512Mb # Swap size
# noswap = 1 # Don't use swap at all for the new system.
fs = ext4 # use the EXT3 filesystem for the disk image.
dist = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
image = sparse # Specify sparse vs. full disk images.
gateway = 192.168.1.1
netmask = 255.255.255.0
broadcast = 192.168.1.255
nameserver = 200.44.32.12
bridge = br0
passwd = 1
accounts = 1
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = `xt-guess-suite-and-mirror --mirror`
ext3_options = noatime,nodiratime,errors= remount-ro
ext2_options = noatime,nodiratime,errors= remount-ro
xfs_options = defaults
reiserfs_options = defaults
btrfs_options = defaults
boot = 1
output = /etc/xen
extension = .cfg
Mi Configuración quedo asi:
install-method = debootstrap
size = 20Gb # Disk image size
memory = 1Gb # Memory size
swap = 512Mb # Swap size
# noswap = 1 # Don't use swap at all for the new system.
fs = ext4 # use the EXT3 filesystem for the disk image.
dist = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
image = sparse # Specify sparse vs. full disk images.
gateway = 192.168.1.1 #IMPORTANTE COLOCARLO
netmask = 255.255.255.0 #IMPORTANTE COLOCARLO
broadcast = 192.168.1.255 #IMPORTANTE COLOCARLO
nameserver = 200.44.32.12
bridge = br0 #PUEDE SER EL NOMBRE DE TU PREFERENCIA YO COLOQUE br0
passwd = 1
accounts = 1
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = `xt-guess-suite-and-mirror --mirror`
ext3_options = noatime,nodiratime,errors=remount-ro
ext2_options = noatime,nodiratime,errors=remount-ro
xfs_options = defaults
reiserfs_options = defaults
btrfs_options = defaults
boot = 1
output = /etc/xen
extension = .cfg
Ya es hora de crear nuestra primera maquina virtual, para ello ejecutamos el siguiente comando:
root@plataforma-prueba:/etc/xen# xen-create-image --force --hostname=nombre_mv --lvm=vg0 --ip=192.168.1.101
root@plataforma-prueba:/etc/xen# xen-create-image --force --hostname=monitoreo --lvm=vg0 --ip=192.168.1.101
- Hostaname es el nombre de la maquina virtual.
- Lvm es para especificar el grupo de volúmenes que se va a utilizar y esto especifica que la maquina virtual será creada bajo el paradigma de LVM.
- Ip es la dirección ip que le asignaremos a la maquinas virtual.
También pueden agregar otros parámetros para la creación de la maquina virtual, como por ejemplo:
–fs Especifica el sistema de ficheros a utilizar, en nuestro caso ext3
–fs Especifica el sistema de ficheros a utilizar, en nuestro caso ext3
–image Especifica como crear las imagenes, si al completo full o en parte de la particion sparse
–kernel La dirección del kernel de domU que creamos en los primeros pasos
–memory La memoria de que va a disponer la maquina
–passwd Que solicite el password de root para la maquina en el momento de creación
–size Tamaño del disco
–swap Tamaño de la swap
–copy Instala la nueva imagen copiada de otro directorio
–dist Especifica la distribución a instalar (nosotros, sarge)
–debootstrap Para utilizar debootstrap si usamos –dist.
–tar Obtiene las imagenes de un archivo previamente empaquetado
–dhcp obtiene la ip por dhcp
–gateway define el gateway
–netmask define la mascara de red
–copy copia la imagen de un directorio
Luego hay que esperar que el sistema cree nuestra primera maquina virtual. Al terminar el proceso nos pedirá la clave de root que se le asignará a la maquina virtual.
Luego hay que esperar que el sistema cree nuestra primera maquina virtual. Al terminar el proceso nos pedirá la clave de root que se le asignará a la maquina virtual.
root@plataforma-prueba:/etc/xen# xm create /etc/xen/nombre_mv.cfg -c
En el caso de la que acabamos de crear que se llama monitoreo, seria de la siguiente forma:
root@plataforma-prueba:/etc/xen# xm create /etc/xen/monitoreo.cfg -c
Luego para comprobar que la maquina virtual arrancó sin problemas ejecuta:
root@plataforma-prueba:/etc/xen# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 6145 8 r----- 28827.1
nombre_mv 10 256 1 -b---- 68.9
Para entrar a la maquina virtual creada se coloca el siguiente comando:
root@plataforma-prueba:/etc/xen#
En el caso de la que acabamos de crear que se llama monitoreo, seria de la siguiente forma:
root@plataforma-prueba:/etc/xen#
Pedirá el password de root que se colocó al culminar el proceso de creación de la maquina virtual.
Para salir de las maquinas virtual una vez que entro con ese comando, se debe presionar CTRL + 5
Datos importantes
Al crear una maquina virtual se crean dos volúmenes lógicos, uno para la partición raíz / y otro para el swap. (ambos parámetros se especifican en el archivo de configuración de xen-tools, que está en /etc/xen-tools/xen-tools.conf) .
Para comprobarlo ejecuta el siguiente comando:
root@debian:/etc/xen#lvdisplay
--- Logical volume ---
LV Name /dev/vg0/maquina_mv-swap
VG Name vg0
LV UUID ctMlN2-u7Vq-kGCs-wXVE-keYW- f4Rl-fDeSAz
LV Write Access read/write
LV Status available
# open 1
LV Size 256,00 MiB
Current LE 8
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:16
--- Logical volume ---
LV Name /dev/vg0/maquina_mv-disk
VG Name vg0
LV UUID sqfHvB-Ky1e-nCie-ZNU9-1tvB- fg3V-lRacdL
LV Write Access read/write
LV Status available
# open 1
LV Size 4,00 GiB
Current LE 640
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:17
LV Name: es el nombre del volumen lógico de la maquina virtual que pudiese ser / o swap.
VG Name: nos dice el grupo de volumen donde se aloja el volumen logico.
LV Size: nos indica el tamaño del volumen lógico.
Como se puede obsevar ya existen dos volumenes lógicos, el primero representa la swap de la maquina virtual (/dev/vg0/maquina_mv-swap) y el segundo la partición / ( /dev/vg0/maquina_mv-disk). Realmente esta ultima es el disco de la maquina virtual, es equivalente al archivo .img que se genera al crear una maquina virtual xen basada en dd.
Lista de Subcomandos.
xm full list of subcommands:
console Attach to <Domain>'s console.
vncviewer Attach to <Domain>'s VNC server.
create Create a domain based on <ConfigFile>.
new Adds a domain to Xend domain management
delete Remove a domain from Xend domain management.
destroy Terminate a domain immediately.
domid Convert a domain name to domain id.
domname Convert a domain id to domain name.
dump-core Dump core for a specific domain.
list List information about all/some domains.
mem-max Set the maximum amount reservation for a domain.
mem-set Set the current memory usage for a domain.
migrate Migrate a domain to another machine.
pause Pause execution of a domain.
reboot Reboot a domain.
rename Rename a domain.
reset Reset a domain.
restore Restore a domain from a saved state.
resume Resume a Xend managed domain
save Save a domain state to restore later.
shutdown Shutdown a domain.
start Start a Xend managed domain
suspend Suspend a Xend managed domain
sysrq Send a sysrq to a domain.
trigger Send a trigger to a domain.
top Monitor a host and the domains in real time.
unpause Unpause a paused domain.
uptime Print uptime for all/some domains.
usb-add Add the usb device to FV VM.
usb-del Delete the usb device to FV VM.
domstate get the state of a domain
vcpu-list List the VCPUs for all/some domains.
vcpu-pin Set which CPUs a VCPU can use.
vcpu-set Set the number of active VCPUs for allowed for the domain.
debug-keys Send debug keys to Xen.
dmesg Read and/or clear Xend's message buffer.
info Get information about Xen host.
log Print Xend log
serve Proxy Xend XMLRPC over stdio.
sched-credit2 Get/set credit2 scheduler parameters.
sched-credit Get/set credit scheduler parameters.
sched-sedf Get/set EDF parameters.
block-attach Create a new virtual block device.
block-detach Destroy a domain's virtual block device.
block-list List virtual block devices for a domain.
block-configure Change block device configuration
network-attach Create a new virtual network device.
network-detach Destroy a domain's virtual network device.
network-list List virtual network interfaces for a domain.
network2-attach Create a new version 2 virtual network device.
network2-detach Destroy a domain's version 2 virtual network device.
network2-list List version 2 virtual network interfaces for a domain.
vtpm-list List virtual TPM devices.
pci-attach Insert a new pass-through pci device.
pci-detach Remove a domain's pass-through pci device.
pci-list List pass-through pci devices for a domain.
pci-list-assignable-devices List all the assignable pci devices
scsi-attach Attach a new SCSI device.
scsi-detach Detach a specified SCSI device.
scsi-list List all SCSI devices currently attached.
usb-attach Attach a new USB physical bus to domain's virtual port.
usb-detach Detach a USB physical bus from domain's virtual port.
usb-list List domain's attachment state of all virtual port .
usb-list-assignable-devices List all the assignable usb devices
usb-hc-create Create a domain's new virtual USB host controller.
usb-hc-destroy Destroy a domain's virtual USB host controller.
vnet-list List Vnets.
vnet-create Create a vnet from ConfigFile.
vnet-delete Delete a Vnet.
setpolicy Set the policy of the system.
labels List <type> labels for (active) policy.
addlabel Add security label to domain.
rmlabel Remove a security label from domain.
getlabel Show security label for domain or resource.
dry-run Test if a domain can access its resources.
resources Show info for each labeled resource.
dumppolicy Print hypervisor ACM state information.
resetpolicy Set the policy of the system to the default policy.
getpolicy Get the policy of the system.
getenforce Returns the current enforcing mode for the Flask XSM module (Enforcing,Permissive)
setenforce Modifies the current enforcing mode for the Flask XSM module
tmem-list List tmem pools.
tmem-thaw Thaw tmem pools.
tmem-freeze Freeze tmem pools.
tmem-destroy Destroy tmem pools.
tmem-set Change tmem settings.
tmem-shared-auth De/authenticate shared tmem pool.
cpupool-create Create a CPU pool based an ConfigFile.
cpupool-new Adds a CPU pool to Xend CPU pool management
cpupool-start Starts a Xend CPU pool
cpupool-list List CPU pools on host
cpupool-destroy Deactivates a CPU pool
cpupool-delete Removes a CPU pool from Xend management
cpupool-cpu-add Adds a CPU to a CPU pool
cpupool-cpu-remove Removes a CPU from a CPU pool
cpupool-migrate Moves a domain into a CPU pool
shell Launch an interactive shell.
shell Launch an interactive shell.
Si queremos ver más opciones, consultamos el manual.
# man xen-create-image
Para arrancar nuestro nuevo host, ejecutamos el siguiente comando.
# xm create /etc/xen/nombre.example.com.cfg
Ya podemos acceder a la nueva máquina de la siguiente manera.
# xm console nombre.example.com
Si queremos que la máquina, se arranque automaticamente en el próximo reinicio.
# ln -s /etc/xen/nombre.example.com.cfg /etc/xen/auto
Comandos utiles:
Muestra las máquinas que están ejecutandose
# xm list
Apaga la máquina
# xm shutdown nombre.example.com
Fuerza el apagado de la máquina virtual
# xm destroy nombre.example.com
Muestra todos los comandos disponibles.
# xm help
No hay comentarios:
Publicar un comentario