Blackhold

Proxmox + nat + iptables

Posted on gener 25th, 2016 by admin

Acabo de contratar un servidor en un datacenter y sólo me dan una sola ip.
Como me gusta tener los servicios separados y todo bien ordenadito le he instalado proxmox 4, con soporte LXC, pero necesito que el host se comunique con los contenedores de alguna forma.

Lo que vamos a crear va a ser una interfaz virtual nueva, donde crearemos nuestra subred y luego redigiremos los puertos con iptables. Esto es lo que se llama hacer nat y redirección de puertos :P

Lo primero será crear des del interfaz de proxmox (no hacerlo desde ssh porque proxmox puede no enterarse del nuevo bridge :P). Para ello vamos al nombre del servidor y pestaña network y crear linux bridge.
Lo vamos a llamar vmbr1. Definimos la ip, por ejemplo 192.168.1.1 y la mascara 255.255.255.0.

Reiniciamos el server y una vez reiniciado editamos el fichero /etc/network/interfaces y en el bridge que acabamos de crear añadimos la última línea de la caja de código

auto vmbr1
iface vmbr1 inet static
        address  192.168.1.1
        netmask  255.255.255.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward

Creamos nuestro contenedor y le asignamos por ejemplo la ip 192.168.1.2.

En nuestro caso vamos a montar un servidor de correo en el contenedor y tendremos que redirigir los puertos del host al contenedor. Para ello creamos las reglas iptables siguientes

iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
iptables -A FORWARD -i vmbr1 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 25 -i vmbr0 -j DNAT --to 192.168.1.2:25
iptables -t nat -A PREROUTING -p tcp --dport 80 -i vmbr0 -j DNAT --to 192.168.1.2:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -i vmbr0 -j DNAT --to 192.168.1.2:443
iptables -t nat -A PREROUTING -p tcp --dport 587 -i vmbr0 -j DNAT --to 192.168.1.2:587
iptables -t nat -A PREROUTING -p tcp --dport 465 -i vmbr0 -j DNAT --to 192.168.1.2:465
iptables -t nat -A PREROUTING -p tcp --dport 993 -i vmbr0 -j DNAT --to 192.168.1.2:993
iptables -t nat -A PREROUTING -p tcp --dport 995 -i vmbr0 -j DNAT --to 192.168.1.2:995
iptables -t nat -A PREROUTING -p tcp --dport 110 -i vmbr0 -j DNAT --to 192.168.1.2:110
iptables -t nat -A PREROUTING -p tcp --dport 2000 -i vmbr0 -j DNAT --to 192.168.1.2:2000
iptables -t nat -A PREROUTING -p tcp --dport 386 -i vmbr0 -j DNAT --to 192.168.1.2:386
iptables -t nat -A PREROUTING -p tcp --dport 143 -i vmbr0 -j DNAT --to 192.168.1.2:143
iptables -t nat -A PREROUTING -p tcp --dport 22109 -i vmbr0 -j DNAT --to 192.168.1.2:22

Las dos primeras son el masquerade y las otras los puertos que redirigimos. Es importante añadir la interfaz de entrada (-i vmbr0) para que la comunicación del contenedor con el exterior sea correcta. Por ejemplo, sin esto y si dirigimos el puerto 80, no funcionará apt :(

Una vez verificamos que las reglas son correctas, vamos a hacer que se carguen al arrancar el sistema. Para ello usaremos iptables-save para generar el fichero de configuración que cargará iptables al arrancar

# iptables-save > /etc/firewall.conf

Y ahora le indicamos que al levantar el interfaz de red, cargue las reglas de iptables

# vi /etc/network/if-up.d/iptables
#!/bin/sh
iptables-restore < /etc/firewall.conf

Guardamos y le damos permisos de ejecución

# chmod +x /etc/network/if-up.d/iptables

Y reiniciamos el servidor para verificar que todo es correcto :)

« »

guy fawkes