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.

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

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.

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

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.

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.

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/hostnameEscribimos 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.

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.

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.

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 
Continuamos ....
La herramienta que nos hará el trabajo final será precisamente el IPTABLES. Para ello, tendremos que instalarla primero:
sudo apt install iptablesCuando termine podemos comprobar que no tenemos ninguna regla habilitada, por supuesto:
iptables -L
iptables -t nat -LAhora configuramos una regla de iptables como se muestra a continuación.
iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADEEsta 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.
POSTROUTINGes la cadena dentro de la tablanatque 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.
MASQUERADElo 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:

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.confEn el archivo agregar la línea en cuestión:
net.ipv4.ip_forward=1Para 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.serviceSin 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_forwardLimpiar reglas previas
iptables -F iptables -t nat -FHabilitar NAT en la interfaz de salida (WAN)
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADEPermitir 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 ACCEPTSi queremos hacer firme los cambios hacemos:
sudo apt install iptables-persistent -y
sudo netfilter-persistent savePaso 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
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:
Hacemos una copia manual de las reglas establecidas con el comando:
sudo iptables-saveInstalamos un nuevo paquete:
sudo apt install iptables-persistent -yDurante 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:

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.v6Con 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.serviceEn 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 = 1Y luego aplicar los cambios:
sudo sysctl -pCreando 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:80donde:
-t nat: Indica que estamos modificando la tabla NAT.-A PREROUTING: Añade una regla en la cadenaPREROUTING, 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ónDNAT(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 interno10.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
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 saveProbemos!!
Funciona, sin embargo he tenido que activar el reenvío de puertos en el adaptador NAT que conecta al Proxmox:

Links
https://www.youtube.com/watch?v=sGdhakDeQyo (excelente video)
OpenWebinars: Proxmox VE: Redes
Last updated
Was this helpful?
