Red Interna

Proxmox

He estado testeando Proxmox en diferentes condiciones pero siempre con las mínimas y me refiero a:

  • espacio en disco no más de 100GB.

  • una única interfaz de red.

  • en VM con VirtualBox como hipervisor.

Se trata de utilizar una única interfaz de red para tener acceso a Internet y una red interna para varias VM en Proxmox. Para ello, estuve siguiendo la guía de Proxmox en:

https://pve.proxmox.com/wiki/Network_Configuration

En esta guía que os recomiendo, una de las opciones es el enmascaramiento NAT con IPTABLES. Este enmascaramiento nos permite el acceso a la red utilizando la dirección IP del host para el tráfico saliente, teniendo una dirección IP privada, como es el caso.

Por tanto, la idea es utilizar IPTABLES para reescribir cada paquete saliente de modo que parezca que se origina en el host. Naturalmente, las respuestas se reescriben para enrutarse al remitente original.

Según la wiki de Proxmox el diagrama de red a simular es el siguiente:

NAT e IPTABLES

Antes de continuar hagamos una breve parada. En lo poco que he dicho anteriormente ya salieron dos términos que pudieran llamar la atención y le dan título a esta sección: NAT e IPTABLES.

En Cisco packet tracer vimos como implementar NAT en un router para que un equipo que está en una red interna tenga salida a Internet haciendo una "traducción" de la IP interna a la IP externa o pública.

La misma idea es la que vamos a configurar aquí pero esta vez utilizando Linux e IPTables, pero refresquemos algunos conceptos:

NAT - es un protocolo de red utilizado para modificar las direcciones IP privadas en públicas en los encabezados de los paquetes cuando pasan a través de un router o un firewall. Su propósito principal es permitir que varios dispositivos en una red local privada compartan una sola dirección IP pública para conectarse a Internet. Por tanto, lo que hace NAT es coger una dirección IP privada y traducirla a una dirección IP pública o viceversa. Si quieres leer algo más sobre NAT ve a la sección de NAT.

IPTables - es una herramienta de Linux que permite el filtrado de los paquetes de red, determinando qué paquetes de datos permitimos que lleguen hasta el servidor y cuáles no. Es una herramienta necesaria que facilita la administración de firewalls en sistemas Linux. Como otros firewall, funciona a través de reglas. Si quieres saber algo más del funcionamiento de iptables ve a la sección de IPTables.

¡Vamos a comenzar!

Configurando una red interna en Proxmox

Lo primero es tener bien claro qué es lo que queremos hacer:

  • Instalaremos dos VMs de Ubuntu: una servirá de router y la otra de cliente en nuestra red interna

  • El cliente estará conectada al linux bridge vmbr1 que es una red interna

  • El router estará conectada a los dos linux bridges: vmbr0 (que tiene salida a Internet a través de la interfaz física) y el vmbr1 que está conectado a la red interna.

  • Aplicaremos una regla NAT en IPTABLES para redirigir el tráfico del cliente hacia Internet a través del router.

La configuración inicial con la que estoy trabajando se muestra en el esquema siguiente.

Diagrama de la red

Recuerda que Proxmox es una VM en VirtualBox y las dos VM de Ubuntu se encuentran dentro de Proxmox. La tabla siguiente especifica las características iniciales de la infraestructura a montar:

Proxmox
VM Ubuntu Router
VM Ubuntu Cliente

IP (estática): 10.0.2.15/24

IP (dhcp): 10.0.2.16/24

IP (dhcp): 10.10.10.16/24

IP gateway: 10.0.2.2

IP gateway: 10.0.2.2

IP gateway: 10.10.10.1

Red: NAT

Red: vmbr0

Red: vmbr1

IP (static): 10.10.10.1/24

La VM de Proxmox tiene una IP estática configurada durante el proceso de instalación. Dicha VM está conectada en red NAT y como he dicho anteriormente, es el único modo en que he podido instalar VM o contenedores de Linux (LXC) y que todos tengan una IP y salida a Internet.

Paso 1: Nueva interfaz de red en Proxmox

Por defecto, tenemos el linux bridge virtual vmbr0 que es el que se conecta a nuestra interfaz de red física y que toma del router físico una IP por DHCP. Como queremos crear una red interna, tenemos que añadir una nuevo linux bridge vmbr1 al que conectaremos el equipo cliente. Para ello vamos al nodo pve - network - add (Linux Bridge).

Añadir un nuevo linux bridge: vmbr1

Lo único que tendremos que configurar es la IP de la red y, en mi caso, he utilizado la 10.10.10.253/24. No es necesario asignar una IP de gateway. De hecho, el gateway solo debe estar especificado una vez aunque tengamos configuradas varias interfaces de red.

La IP del Proxmox en el nuevo linux bridge es: 10.10.10.253/24

Una vez añadido el linux bridge vmbr1, nos debe quedar algo como lo siguiente:

Los dos linux bridge: vmbr0 y vmbr1

Paso 2: vmbr0 y vmbr1

La VM router estará conectada a los dos dos linux bridges: vmbr0 y vmbr1 . Recordemos que será esta VM la que le dará Internet al equipo cliente.

VM router conectada a los dos linnux bridge

En el caso de la VM cliente debemos conectarla a vmbr1, aunque bastaría con editar el linux bridge vmbr0 y modificarlo para que aparezca conectado al vmbr1 que es el switch de nuestra red interna.

Paso 3: Configurar las VM que harán de Router y de Cliente

Pasemos a las máquinas. Realmente las dos VM: router y cliente han sido clonadas de una VM de Ubuntu que tengo como plantilla.

Las dos VM Router y Cliente como clones "dependientes" de la plantilla "ubuse1"

Dado que las VM router y cliente son clones de la VM de Ubuntu Server (ubuse1) que tengo como plantilla, podríamos cambiarle el nombre de cada una. Para ello, iniciamos ambas VM y editamos el siguiente archivo en cada una:

nano /etc/hostname

Escribimos el nombre que le corresponda: router o cliente y reiniciamos para que se implementen los cambios correspondientes.

Una vez restablecidas las VM debemos ver algo como lo siguiente, en la VM router, donde todavía NO hemos configurado la IP de la interfaz de red que se conecta al vmbr1.

Configuración de red de la VM router. La interfaz ens18 es la que se conecta al vmbr0

A la VM cliente si que debemos configurarle la IP en modo estático porque no tenemos ningún servidor de DHCP que le brinde la IP. Tendría que hacerlo la VM router pero tampoco se lo hemos configurado. Por tanto, tenemos que asignarle una IP estática en la red interna y para ello utilizaremos la: 10.10.10.2/24 en la interfaz de red que se habilita: ens18 y el gateway que le asignamos será la IP del router: 10.10.10.1.

Configuración de red de la VM cliente en la red interna con la interfaz ens18

Paso 4: Configurando la red interna

Todo el trabajo de redirigir el tráfico de datos lo tiene que hacer la VM que hace de router así que volvamos a ella.

VM router - Lo primero es configurar la IP estática para la nueva interfaz de red que le hemos habilitado: en este caso es la ens19 y le asignamos la IP 10.10.10.1/24.

Configuración de la red para la VM router en la interfaz de red ens19 conectada al vmbr1

Todavía con esto no podemos hacer que el cliente tenga conexión a Internet.

Paso 5: IPTables 😄

Lo primero será habilitar el IP forwarding y para ello nos vamos a editar el archivo /etc/sysctl.conf y quitar el # en la línea: net.ipv4.ip_forward=1

nano /etc/sysctl.conf 
/etc/sysctl.conf

Continuamos ....

La herramienta que nos hará el trabajo final será precisamente el IPTABLES. Para ello, tendremos que instalarla primero:

sudo apt install iptables

Cuando termine podemos comprobar que no tenemos ninguna regla habilitada, por supuesto:

iptables -L
iptables -t nat -L

Ahora configuramos una regla de iptables como se muestra a continuación.

iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE

Esta regla nos quiere decir que:

-t nat: especifica la tabla a modificar. En este caso, la tabla NAT que es la tabla que gestiona la traducción de direcciones de red y se utiliza sobre todo para modificar las direcciones IP en los paquetes que atraviesan el firewall.

-A POSTROUTING: Agrega -A una regla al final de la cadena especificada.

  • POSTROUTING es la cadena dentro de la tabla nat que procesa los paquetes justo antes de que salgan de una interfaz de red. Las reglas en esta cadena se utilizan para modificar los paquetes después de que hayan sido enrutados.

-o ens18: Especifica la interfaz de salida.

-j MASQUERADE: Significa "saltar" (jump). Lo que hace es especificar el objetivo que debe ser alcanzado si el paquete coincide con la regla.

  • MASQUERADE lo que hace es ocultar la dirección IP del origen de los paquetes que salen por una interfaz de red. Esto es útil para compartir una conexión a Internet entre varios dispositivos en una red privada. Utiliza la dirección IP de la interfaz de salida como la dirección IP de origen del paquete.

En sentido general, la regla de IPTABLEs se utiliza para configurar una regla de enmascaramiento en la tabla nat, en la cadena POSTROUTING. De este modo todos los paquetes que salgan a través de la interfaz eth0, reemplaza la IP de origen del paquete con la IP de la interfaz de salida.

Podemos comprobar que efectivamente está habilitada la regla en la tabla NAT:

Regla habilitada en iptables

Debian

En Debian 13 Trixie tenemos las dos interfaces de red:

  • enp0s3 - LAN privada: 192.168.6.100/24

  • enp0s8 - WAN pública: con NAT 10.0.3.15

No tenemos el archivo /etc/sysctl.conf nos toca hacer lo siguiente:

sudo nano /etc/sysctl.d/99-forward.conf

En el archivo agregar la línea en cuestión:

net.ipv4.ip_forward=1

Para que los cambios se hagan persistentes debemos escribir:

sysctl -p 

pero como no tenemos el archivo /etc/sysctl.conf entonces hacemos:

systemctl restart systemd-sysctl.service

Sin embargo si tecleamos el siguiente comando, nos debe mostrar el valor 0 o 1 para mostrar si tenemos activada o no el ip_forward.

sysctl net.ipv4.ip_forward

Limpiar reglas previas

iptables -F iptables -t nat -F

Habilitar NAT en la interfaz de salida (WAN)

iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE

Permitir reenvío entre LAN → WAN

iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT 
iptables -A FORWARD -i enp0s8 -o enp0s3 -m state --state RELATED,ESTABLISHED -j ACCEPT

Si queremos hacer firme los cambios hacemos:

sudo apt install iptables-persistent -y
sudo netfilter-persistent save

Paso 6: Testeando la conexión

Este es el momento en que debemos testear la conexión de la VM cliente a Internet a través de la VM router. Si hacemos un ping a google:

ping google.com
ping amazon.es
Ping desde la Vm cliente a google.com en Internet

Como se puede ver ya tenemos salida desde el equipo cliente hacia Internet a través de la VM router.

¿Hemos acabado? Pues no.

Paso 7

Las reglas de iptables que vayamos creando se almacenan en memoria, y cada vez que reiniciemos el servidor, se perderían y tendríamos que volver a crearlas. Para evitar que esto ocurra, tenemos dos opciones:

  1. Hacemos una copia manual de las reglas establecidas con el comando:

sudo iptables-save
  1. Instalamos un nuevo paquete:

sudo apt install iptables-persistent -y

Durante el proceso de instalación nos preguntará si queremos guardar las reglas de IPv4 existentes en el archivo /etc/iptables/rules.v4 y las de IPv6 en el archivo /etc/iptables/rules.v6:

Reglas iptables almacenadas

Podemos ver como se almacenan las reglas haciendo un cat o more de los archivos en cuestión:

cat /etc/iptables/rules.v4
car /etc/iptables/rules.v6

Con esta opción le estamos indicando al sistema que almacene las reglas en el archivo /etc/iptables/rules.v4. La próxima vez que se inicie el sistema, el script de inicio de iptables volverá a cargar las reglas almacenadas en ese archivo.

Y con esto si tenemos almacenadas las reglas de iptables en la MV que hace de router y a partir de aquí ya podemos crear nuestra propia infraestructura.

¿Y si instalamos Nginx en el equipo cliente, cómo podemos acceder desde afuera?

Para probar lo primero que he hecho ha sido instalar Nginx en el equipo cliente, y comprobar que está el servicio activo, esto es:

En el cliente:

sudo apt install nginx
sudo systemctl status nginx.service

En el router:

Vamos a activar una regla NAT en IPTABLES que permita el acceso por el puerto 80. Recordemos que en mi caso tengo lo siguiente:

  • La IP pública del gateway es 10.0.2.2.

  • El Proxmox tiene la IP 10.0.2.15.

  • Tenemos como servidor web el cliente, en la red interna con la IP 10.10.10.16.

  • Queremos redirigir el tráfico que llega al puerto 80 - HTTP de la IP pública a la IP interna del servidor web en el mismo puerto 80.

Como ya creamos una regla NAT para permitir la salida a Internet del tráfico del equipo cliente, tenemos habilitado el reenvío de paquetes IP.

Recordemos que se trata de editar el archivo /etc/sysctl.conf y descomentar la línea:

net.ipv4.ip_forward = 1

Y luego aplicar los cambios:

sudo sysctl -p

Creando la regla NAT de entrada (DNAT)

El siguiente comando de iptables permite redirigir el tráfico que llega al puerto 80 en la IP pública hacia el servidor en la red interna:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.16:80

donde:

  • -t nat: Indica que estamos modificando la tabla NAT.

  • -A PREROUTING: Añade una regla en la cadena PREROUTING, que se encarga de redirigir el tráfico entrante antes de que llegue a cualquier proceso local.

  • -i ens18: Indica que esta regla se aplica a la interfaz de red externa.

  • -p tcp: Especifica que la regla aplica solo a paquetes TCP.

  • --dport 80: Indica que la regla se aplica al tráfico entrante en el puerto 80.

  • -j DNAT: Usamos la acción DNAT (Destination Network Address Translation) para redirigir el tráfico a otra IP.

  • --to-destination 10.10.10.16:80: Redirige el tráfico al servidor interno 10.10.10.16en el puerto 80.

3. Configurarando la regla de reenvío (FORWARD)

Debes permitir el reenvío de paquetes desde la red externa a la interna. Añade la siguiente regla a la cadena FORWARD:

sudo iptables -A FORWARD -p tcp -d 10.10.10.16 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Tengo reglas repetidas, no debería ser así

Guardamos las reglas

Para asegurarte de que las reglas de iptables persisten tras un reinicio, debes guardarlas. Dependiendo de la distribución de Linux, puedes usar:

sudo netfilter-persistent save

Probemos!!

Funciona, sin embargo he tenido que activar el reenvío de puertos en el adaptador NAT que conecta al Proxmox:

Reenvío de puertos en el adaptador "NAT"

Last updated

Was this helpful?