Proxmox + nat + iptables

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 :)

9 Comments

  1. hace poco tuve que hacer lo mismo, opté por virtualizar un pfsense dentro del proxmox y desde alli administro el firewall..

    Respon
  2. Estuve siguiendo este tutorial, mi mayor problema es como el tuyo, mi datacenter solo me entrega 1 ip.

    Entonce syo necesito poner la IP publica al Proxmox para poder administralo sin problemas.

    la distribucion seria asi.

    Proxmox ip publi 181.x.x.x/x
    Vm1 192.168.1.2
    VM2 192.168.1.3
    Vm3 192.168.1.4

    Lo que he logrado hacer, es que tengan internet… pero necesito habilitar puertos los cuales yo pueda acceder… segui la guia paso a paso, pero no he podido econtrar lo siguiente para modificar.

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

    cuando abro con nano o con vi el directorio /etc/network/if-up.d/iptables me da para crear un archivo nuevo.

    Respon
  3. primero tienes que aplicar las reglas de firewall correspondientes y luego iptables-save sobre el fichero en el que guardes las reglas de iptables que quieres que se carguen por defecto.

    sino aquí tienes el contenido de mi fichero firewall.conf

    root@electra:/etc# cat firewall.conf
    # Generated by iptables-save v1.4.21 on Thu Jan 28 02:47:44 2016
    *filter
    :INPUT ACCEPT [188150:64895564]
    :FORWARD ACCEPT [88691:307396410]
    :OUTPUT ACCEPT [138774:81125716]
    -A FORWARD -i vmbr1 -j ACCEPT
    COMMIT
    # Completed on Thu Jan 28 02:47:44 2016
    # Generated by iptables-save v1.4.21 on Thu Jan 28 02:47:44 2016
    *nat
    :PREROUTING ACCEPT [3:180]
    :INPUT ACCEPT [3:180]
    :OUTPUT ACCEPT [1:60]
    :POSTROUTING ACCEPT [1:60]
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 25 -j DNAT –to-destination 192.168.1.2:25
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.1.3:80
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 443 -j DNAT –to-destination 192.168.1.3:443
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 587 -j DNAT –to-destination 192.168.1.2:587
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 465 -j DNAT –to-destination 192.168.1.2:465
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 993 -j DNAT –to-destination 192.168.1.2:993
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 995 -j DNAT –to-destination 192.168.1.2:995
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 110 -j DNAT –to-destination 192.168.1.2:110
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 2000 -j DNAT –to-destination 192.168.1.2:4190
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 22109 -j DNAT –to-destination 192.168.1.2:22
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 386 -j DNAT –to-destination 192.168.1.2:386
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 143 -j DNAT –to-destination 192.168.1.2:143
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 4190 -j DNAT –to-destination 192.168.1.2:4190
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 8080 -j DNAT –to-destination 192.168.1.5:8080
    -A PREROUTING -i vmbr0 -p tcp -m tcp –dport 22110 -j DNAT –to-destination 192.168.1.4:22
    -A POSTROUTING -o vmbr0 -j MASQUERADE
    COMMIT
    # Completed on Thu Jan 28 02:47:44 2016

    Respon
  4. Buenas, tengo una consulta… mi problema esta, que las reglas funcionan cuando las escribo, pero no se estan guardando. Cuando reinicio el servidor, se borran todas las reglas del iptables.
    Que estoy haciendo mal?

    Respon
  5. Hola, antes que nada gracias por el post, esto es mas o menos lo que había imaginado, dado un escenario parecido.

    En este caso que planteas configuraría directamente la ETH0 con la IP publica, y las vmbr con las privadas pero sin asignarles la eth0 a dichas vmbr ,verdad?

    En mi caso, tengo corriendo dentro de una de las virtuales una app, la misma supongamos trabaja sobre el puerto 9999, en las terminales que se conectan a dicha app esta configurada con una IP privada (ahora esta interno el srv) 192.168.0.15, por lo que no quisiera tener que reconfigurar todo, es posible conectar el proxmox a una vpn?.

    Gracias!

    Respon
  6. Una pregunta esto funciona asi uno tenga la vmbro como dhcp o tiene que ser una ip fija publica hago todo los pasos pero llego hasta la parte que las vm tienen internet pero no puedo comunicarme con ellas de afuera

    Respon
  7. Pingback: Redirección de puertos con iptables + contrack – Blackhold

Respon a Facundo Cancel·la les respostes

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir el correu brossa. Aprendre com la informació del vostre comentari és processada