OpenVZ · 7 min read · Jan 17, 2026
Algunos Consejos Sobre el Despliegue de OpenVZ
Algunos Consejos Sobre el Despliegue de OpenVZ
Confío mucho en OpenVZ. En este artículo me gustaría compartir algunas de mis experiencias personales en el despliegue de OpenVZ. Asumo que los lectores ya saben cómo instalar OpenVZ y los conceptos básicos de OpenVZ. Este artículo describe algunos consejos sobre el uso de OpenVZ a través de la línea de comandos. Si prefieres GUI a la línea de comandos, por favor consulta cómo instalar WebVZ.
La configuración descrita aquí sigue estas pautas:
- el servidor real tiene el software mínimo instalado (uso debian Etch con instalación mínima) como punto de partida. Se instalan aplicaciones adicionales según sea necesario a lo largo del despliegue.
- el servidor real debe ser lo más seguro posible. Por otro lado, quiero mantenerlo simple y fácil de configurar/mantener. Así que elegí un compromiso: confío solo en lo que se puede desplegar fácilmente con debian y no busco cosas de seguridad extra como openwall, selinux, grsecurity, etc.
- cada servicio necesario se despliega en un contenedor separado, de modo que interfieran entre sí lo menos posible
- La Detección de Intrusiones para el servidor real así como para los contenedores se despliega en el servidor real usando OSSEC
- el cortafuegos (iptables) se realiza en el servidor real; los contenedores solo ejecutan los servicios
- confío en ssh como el único medio para acceder y mantener el servidor real y los contenedores.
Seguridad Básica
Antes de desplegar cualquier contenedor ovz, hago algunos cambios en la configuración del servidor real para hacerlo más seguro:
- deshabilitar la contraseña de root
- agregar un usuario admin-user que puede sudo todo; este usuario tiene una contraseña simple
- agregar un usuario ssh-user que puede ssh al servidor real; después de subir la clave ssh para este usuario, cambio la línea en .ssh/authorized_keys para que lea:
command="/bin/su - admin-user" ssh-rsa AAAA...y cambio /etc/pam.d/su para permitir solo a este usuario hacer su:auth required pam_wheel.so group=ssh-user - para copiar archivos desde/hacia el servidor real, creo otro usuario sftp-user e instalo MySecureShell
- cambiar sshd_config para que: - solo ssh-user y sftp-user estén permitidos para conectarse
- la autenticación por contraseña está deshabilitada (después de subir las claves ssh para ssh-user y sftp-user)
- sshd se ejecuta en un puerto no estándar
El esquema anterior funciona de la siguiente manera: para conectarse al servidor real, nos conectamos como ssh-user. Luego debemos escribir la contraseña para admin-user. Si alguien obtiene la clave ssh para ssh-user, aún debe conocer la contraseña para admin-user para poder acceder al servidor (el fallo de /bin/su - admin generará inmediatamente una alerta por correo electrónico de OSSEC).
Para copiar archivos desde/hacia el servidor, usamos sftp con la cuenta sftp-user. Si alguien obtiene la clave ssh para este usuario, no es un gran problema, ya que solo puede acceder a los archivos bajo su $HOME.
Creando Contenedores OpenVZ
Encuentro más cómodo crear una plantilla para todos los contenedores, de modo que cuando necesite un nuevo contenedor, simplemente haga un clon de la plantilla. Uso solo debian estable para el servidor real así como para los contenedores. Así que, el primer paso es crear una plantilla y ajustarla a mi gusto:
crear un nuevo contenedor:
vzctl create 2002 --ostemplate debian-4.0-amd64-minimalestablecer algunos parámetros básicos:
vzctl set 2002 --ipadd 192.168.100.2 --nameserver 1.2.3.4 --hostname host2 --saveiniciar el contenedor:
vzctl start 2002entrar en el contenedor:
vzctl enter 2002Prefiero mantener todo al mínimo, y agregar cosas según sea necesario. Dado que instalar un paquete con debian es tan fácil, se requiere muy poco esfuerzo para instalar cualquier paquete que necesitemos. Así que hago los siguientes cambios para la plantilla: - ejecutar aptitude y desmarcar Opciones/Manejo de dependencias/Instalar paquetes recomendados automáticamente
eliminar algunos paquetes que no quiero en la plantilla:
bsdmainutils ed groff-base info iptables libconsole libgdbm3 man-db manpages nano netcat openssh-client openssh-server quota ssh tracerouteeditar /etc/apt/sources.list para ajustarlo a mis preferencias
luego detengo la plantilla:
vzctl stop 2002
Luego, cada vez que necesito un nuevo contenedor, uso un script vz-clone de la siguiente manera:
#!/bin/bash
# script para clonar un VE de openvz
set -e
if [ -z "$2" ]; then
echo "Uso: $0 "
exit 1
fi
cfg="/etc/vz/conf/$1.conf"
newcfg="/etc/vz/conf/$2.conf"
if [ ! -e $cfg ]; then
echo $cfg no encontrado!
exit 1
fi
VEID=$1
. $cfg
veprivate="$VE_PRIVATE"
VEID=$2
. $cfg
newveprivate="$VE_PRIVATE"
if [ -e $newcfg ]; then
echo $newcfg ya existe!
exit 1
fi
if [ -e $newveprivate ]; then
echo $newveprivate ya existe!
exit 1
fi
if vzlist | fgrep -w -q $1
then
vzctl stop $1
fi
echo "Clonando $cfg a $newcfg"
cp -a $cfg $newcfg
echo "Clonando $veprivate a $newveprivate"
mkdir -p $newveprivate
cd $veprivate
tar cf - . | (cd $newveprivate && tar xf -)
echo "No olvides editar $newcfg (necesitas editar al menos HOSTNAME y IP_ADDRESS)"
echo "También no olvides hacer un alias" Uso:
sudo sh vz-clone 2002 2010Clonando /etc/vz/conf/2002.conf a /etc/vz/conf/2010.conf
Clonando /vz/private/2002 a /vz/private/2010
No olvides editar /etc/vz/conf/2010.conf (necesitas editar al menos HOSTNAME y IP_ADDRESS)
También no olvides hacer un aliasDependiendo de tu /etc/vz/vz.conf, las rutas en lo anterior pueden ser diferentes. Yo uso la siguiente configuración:
VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEIDLuego necesitamos editar /etc/vz/conf/2010.conf, cambiar por ejemplo HOSTNAME a host10, IP_ADDRESS a 192.168.100.10 y estamos listos para comenzar con el nuevo contenedor. También haremos un alias para el nuevo contenedor, que se describirá en la siguiente sección.
Trabajando Con Contenedores OpenVZ
Los contenedores ovz se identifican por número. Encuentro más fácil referirme a ellos por nombre/alias, de modo que no tenga que recordar, por ejemplo, que 2010 es el id del contenedor que ejecuta el servicio dns. Aparte de eso, también quiero liberarme de recordar los diferentes comandos vzctl, vzlist, vzquota, etc. y sus parámetros. Así que creo algunos scripts simples para ayudarme.
- Primero creo una lista de alias /etc/vz-aliases:
# alias para los VE de openvz 2001 test 2002 template 2010 dns 2020 ldap 2030 mail 2040 web ... - Para traducir entre ID’s y alias, creo un script /usr/local/bin/vz-get-alias como el siguiente y hago vz-get-veid como un enlace simbólico a vz-get-alias:
#!/bin/sh vz_alias_file="/etc/vz-aliases" case $0 in *vz-get-alias) cat $vz_alias_file | egrep "^[[:space:]]*$1[[:space:]]" | awk '{print $2}' ;; *vz-get-veid) cat $vz_alias_file | egrep "[[:space:]]$1[[:space:]]*$" | awk '{print $1}' ;; esac - Luego pongo comandos frecuentes para manipular contenedores ovz en un script llamado /usr/local/bin/vz-cmd-generic:
#!/bin/sh set -e ## manejar vz-list primero, ya que no requiere ID/alias case $0 in *vz-list) sedfile=`mktemp` cat /etc/vz-aliases | egrep '^[0-9]' | \ sed 's/\([0-9]*\) *\([a-zA-Z0-9-]*\)/s,\1 .*,\&\2,/' > $sedfile sudo vzlist "$@" | sed 's/ $//' | \ sed -f $sedfile | \ sed '1s/$/ALIAS/' exit ;; esac ## los otros comandos requieren un ID o alias if [ -z "$1" ]; then echo "Uso: $0Y hago que todos los comandos vz-start, vz-stop, vz-exec, etc. sean enlaces simbólicos a este script vz-cmd-generic.| [ ]" exit 1 fi veid=`/root/bin/vz-get-veid $1` if [ -z "$veid" ]; then veid=$1 fi shift case $0 in *vz-start) sudo vzctl start $veid ;; *vz-restart) sudo vzctl restart $veid ;; *vz-stop) sudo vzctl stop $veid ;; *vz-enter) sudo vzctl enter $veid ;; *vz-exec) sudo vzctl exec $veid "$@" ;; *vz-edit) sudo vi /etc/vz/conf/$veid.conf ;; *vz-quota-ls) sudo vzquota stat $veid ;; *vz-ubc) sudo head -2 /proc/user_beancounters sudo cat /proc/user_beancounters | egrep -A23 "^[[:space:]]+${veid}:" ;; esac
El uso es entonces simple:
- para listar todos los contenedores en ejecución:
vz-listVEID NPROC ESTADO IP_ADDR HOSTNAME ALIAS 2010 15 en ejecución 192.168.100.10 host10 dns 2020 8 en ejecución 192.168.100.20 host20 ldap 2030 23 en ejecución 192.168.100.30 host30 mail 2040 11 en ejecución 192.168.100.40 host40 web - para listar todos los contenedores (incluyendo aquellos que no están en ejecución):
vz-list -aVEID NPROC ESTADO IP_ADDR HOSTNAME ALIAS 2002 - detenido 192.168.100.2 host2 template 2010 15 en ejecución 192.168.100.10 host10 dns 2020 8 en ejecución 192.168.100.20 host20 ldap 2030 23 en ejecución 192.168.100.30 host30 mail 2040 11 en ejecución 192.168.100.40 host40 web - para iniciar/detener/reiniciar un contenedor: -
vz-start dns vz-stop dnsvz-restart dns- para ejecutar un comando dentro de un contenedor:
vz-exec dns aptitude update - para verificar UBC de un contenedor:
vz-ubc dns - para verificar la cuota de un contenedor:
vz-quota-ls dns - también es posible usar un ID en lugar de un alias:
vz-ubc 2010
También es una buena idea mantener el alias único entre diferentes servidores reales, para que podamos compartir /etc/vz-aliases entre ellos sin conflictos.
Este artículo ya es bastante largo, así que dejemos aquí. Continuaremos en la próxima parte, donde discutiremos temas como cómo desplegar Detección de Intrusiones con OSSEC, cómo monitorear y establecer parámetros UBC para contenedores, etc.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.