Configurar iptables
Una vez instalado y configurado OMV 8 y Nginx Proxy Manager, asegurar el acceso a OMV con el cortafuego.
Se utilizará iptables para:
Permitir el acceso desde internet exclusivamente por los puertos 80 y 443
Permitir desde el entorno de la LAN el acceso exclusivamente a los puertos que se han configurado para los servicios instalados.
Precaución: Antes de realizar cambios en las iptables, iniciar una sesión ssh desde la que se pueda crear una copia de seguridad y restaurarla de ser necesario.
OMV gestiona el firewall mediante su propio script /etc/iptables/openmediavault-firewall.sh y el servicio openmediavault-firewall.service, que se ejecuta en cada arranque y regenera las reglas basándose únicamente en lo que esté guardado en la configuración del panel Network → Firewall.
El script está diseñado para ser llamado por el openmediavault-firewall.service con el modo star cada vez que se inicia el sistema.
El modo stop del script desactiva completamente el firewall (todo permitido).
Este modo stop se invoca tanto al ejecutar sudo systemctl stop openmediavault-firewall.service (asumiendo que ExecStop está definido así) como si se llama al script manualmente con el argumento stop.
Las Iptables está compuestos por varias tablas, un resumen de las mismas, sus funciones y de aquello que OMV gestiona es el siguiente:
Tabla filter
Decide qué paquetes se aceptan/rechazan (INPUT, OUTPUT, FORWARD)
OMV gestiona solo las cadenas INPUT y OUTPUT
Tabla nat
Traducción de direcciones/puertos (PREROUTING, POSTROUTING)
OMV NO la gestiona
Tabla raw
Excepciones de seguimiento de conexión, anti-spoofing (PREROUTING, OUTPUT)
OMV NO la gestiona
Tabla mangle
Modificación de paquetes (marcado, TTL, etc.)
OMV NO la gestiona
Se realizará en Red - FirewaLL
| # | Chain | Acción | Protocolo | Origen | Puerto Destino | Descripción |
|---|---|---|---|---|---|---|
| 1 | INPUT | ACCEPT | all | — (interfaz lo) |
— | Loopback |
| 2 | INPUT | ACCEPT | all | — | — | conntrack RELATED,ESTABLISHED (tráfico de retorno) |
| 3 | INPUT | ACCEPT | tcp | cualquiera | 80 | HTTP público (proxy) |
| 4 | INPUT | ACCEPT | tcp | cualquiera | 443 | HTTPS público (proxy) |
| 5 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 81 | NPM — panel admin |
| 6 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 30080 | OMV — Web Admin HTTP |
| 7 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 30443 | OMV — Web Admin HTTPS |
| 8 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 3670 | Plugin FileBrowser |
| 9 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 22 | SSH |
| 10 | INPUT | ACCEPT | udp | 192.168.0.0/24 | 1900 | DLNA — descubrimiento SSDP |
| 11 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 8200 | DLNA — interfaz web |
| 12 | INPUT | ACCEPT | tcp | 192.168.0.0/24 | 2342 | PhotoPrism |
| 13 | INPUT | DROP | all | cualquiera | — | Rechazo final (catch-all) |
Leer información sobre
192.168.0.0/24

La primera regla tiene por objeto permitir todo el tráfico que circule a través de la interfaz loopback (lo).
Se establece indicando en Opciones extra : -i lo
La interfaz loopback es fundamental para el funcionamiento del sistema:
Permite que aplicaciones locales se comuniquen entre sí (ej: un cliente conectándose a localhost)
Es necesaria para servicios internos como DNS local, bases de datos, etc.
Si bloquearas el tráfico loopback, muchos servicios del sistema dejarían de funcionar
Esta regla:
Permite la comunicación local necesaria
Está al inicio de la cadena INPUT (se evalúa primero)
Es muy permisiva pero solo afecta al tráfico interno del sistema, no a la red externa
La segunda regla permite el tráfico de conexiones ya establecidas o relacionadas con conexiones previas.
Se establece indicando en Opciones extra : -m conntrack --ctstate ESTABLISHED,RELATED
Qué significa ctstate RELATED,ESTABLISHED:
ESTABLISHED: Tráfico de conexiones que ya existen y están activas (ej: respuestas a peticiones que iniciaste)
RELATED: Tráfico asociado a conexiones activas (ej: transferencias FTP que abren conexiones secundarias)
Utilidad práctica:
Si el servidor inicia una conexión HTTP hacia afuera, permite que reciba la respuesta
Permite respuestas a conexiones entrantes previas
Proporciona seguridad permitiendo solo tráfico "contextual"
Permitir el acceso desde internet por el puerto 80
Permitir el acceso desde internet por el puerto 443
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 81 asigando a la interfaz web de Nginx Proxy Manager
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 30080 que está asignado a la interfaz gráfica de OMV 8
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 30443 que está asignado a la interfaz gráfica de OMV 8
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 3670 que está asignado a la interfaz gráfica de FileBrowser Quantum
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 22 que está asignado al posible acceso por SSH
Permitir el acceso desde la LAN (rango: 192.168.0.0/24) por el puerto 51413 que está asignado a la interfaz web de transmission
Denegar cualquier otro acceso desde internet
El 24 en la notación 192.168.0.0/24 se llama máscara de red en notación CIDR (Classless Inter-Domain Routing) y representa algo muy importante: cuántos bits de la dirección IP están dedicados a identificar la red.
Una dirección IP tiene 32 bits en total. El número después de la barra (/) indica cuántos de esos 32 bits se usan para la parte de red, y el resto se usa para la parte de host (dispositivos individuales).
En el caso de 192.168.0.0/24:
24 bits = identifican la red
32 - 24 = 8 bits = identifican los hosts (dispositivos)
Traducción a máscara tradicional
Ese /24 equivale a la máscara de subred tradicional 255.255.255.0, que visto en binario es:
Binario 11111111.11111111.11111111.00000000
Decimal 255.255.255.0
Los 1s representan la parte de red, los 0s representan la parte de hosts.
Con 8 bits disponibles para hosts, tienemos 2^8 = 256 direcciones totales, pero:
192.168.0.0 = dirección de red (reservada)
192.168.0.255 = dirección de broadcast (reservada)
Rango útil = 192.168.0.1 a 192.168.0.254 → 254 dispositivos
# Exporta para IPv4 / IPv6:
sudo iptables-save > reglas-iptables.txt
sudo ip6tables-save > reglas-ip6tables.txt
# Importar Para IPv4 / IPv6:
sudo iptables-restore < reglas-iptables.txt
sudo ip6tables-restore < reglas-ip6tables.txt
Tener en cuenta que iptables-restore reemplaza las reglas existentes. Para conservarlas y añadir las del archivo, usa la opción --noflush:
sudo iptables-restore --noflush < reglas-iptables.txt
Atención:
iptables-restorecarga las reglas en memoria, en tiempo real, para la sesión actual del kernel en ejecución — funciona de inmediato, pero no queda vinculado a ningún mecanismo de arranque. Cuando se reinicie el servidor, el kernel arranca con las tablas de iptables completamente vacías (o con la política por defecto), y nada volverá a ejecutar iptables-restore automáticamente salvo que exista un servicio/script que lo haga — que en tu sistema es precisamente el papel que ya cumple openmediavault-firewall.service.
Las iptables hay que cargarlas desde la interfaz de OMV para que sean persistentes.
# Generated by iptables-save v1.8.11 (nf_tables) on Thu Aug 20 13:46:36 2026
*raw
:PREROUTING ACCEPT [80362:231453148]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 172.18.0.2/32 ! -i br-a33701eb0b39 -j DROP
-A PREROUTING -d 172.20.0.2/32 ! -i br-178dff5df0b2 -j DROP
-A PREROUTING -d 172.19.0.2/32 ! -i br-007a63024f65 -j DROP
-A PREROUTING -d 172.19.0.3/32 ! -i br-007a63024f65 -j DROP
-A PREROUTING -d 172.18.0.3/32 ! -i br-a33701eb0b39 -j DROP
-A PREROUTING -d 172.18.0.4/32 ! -i br-a33701eb0b39 -j DROP
COMMIT
# Completed on Thu Aug 20 13:46:36 2026
# Generated by iptables-save v1.8.11 (nf_tables) on Thu Aug 20 13:46:36 2026
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [417:72573]
:DOCKER - [0:0]
:DOCKER-BRIDGE - [0:0]
:DOCKER-CT - [0:0]
:DOCKER-FORWARD - [0:0]
:DOCKER-INTERNAL - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 81 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 30080 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 30443 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 3670 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 51413 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 8096 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-FORWARD
-A DOCKER -d 172.19.0.3/32 ! -i br-007a63024f65 -o br-007a63024f65 -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER -d 172.19.0.3/32 ! -i br-007a63024f65 -o br-007a63024f65 -p tcp -m tcp --dport 81 -j ACCEPT
-A DOCKER -d 172.19.0.3/32 ! -i br-007a63024f65 -o br-007a63024f65 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -d 172.20.0.2/32 ! -i br-178dff5df0b2 -o br-178dff5df0b2 -p udp -m udp --dport 51413 -j ACCEPT
-A DOCKER -d 172.20.0.2/32 ! -i br-178dff5df0b2 -o br-178dff5df0b2 -p tcp -m tcp --dport 51413 -j ACCEPT
-A DOCKER -d 172.20.0.2/32 ! -i br-178dff5df0b2 -o br-178dff5df0b2 -p tcp -m tcp --dport 9091 -j ACCEPT
-A DOCKER ! -i br-007a63024f65 -o br-007a63024f65 -j DROP
-A DOCKER ! -i br-178dff5df0b2 -o br-178dff5df0b2 -j DROP
-A DOCKER ! -i br-a33701eb0b39 -o br-a33701eb0b39 -j DROP
-A DOCKER ! -i docker0 -o docker0 -j DROP
-A DOCKER-BRIDGE -o br-007a63024f65 -j DOCKER
-A DOCKER-BRIDGE -o br-178dff5df0b2 -j DOCKER
-A DOCKER-BRIDGE -o br-a33701eb0b39 -j DOCKER
-A DOCKER-BRIDGE -o docker0 -j DOCKER
-A DOCKER-CT -o br-007a63024f65 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o br-178dff5df0b2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o br-a33701eb0b39 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-FORWARD -j DOCKER-CT
-A DOCKER-FORWARD -j DOCKER-INTERNAL
-A DOCKER-FORWARD -j DOCKER-BRIDGE
-A DOCKER-FORWARD -i br-007a63024f65 -j ACCEPT
-A DOCKER-FORWARD -i br-178dff5df0b2 -j ACCEPT
-A DOCKER-FORWARD -i br-a33701eb0b39 -j ACCEPT
-A DOCKER-FORWARD -i docker0 -j ACCEPT
COMMIT
# Completed on Thu Aug 20 13:46:36 2026
# Generated by iptables-save v1.8.11 (nf_tables) on Thu Aug 20 13:46:36 2026
*nat
:PREROUTING ACCEPT [12386:1509487]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [1665:112645]
:POSTROUTING ACCEPT [3364:204453]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-a33701eb0b39 -j MASQUERADE
-A POSTROUTING -s 172.20.0.0/16 ! -o br-178dff5df0b2 -j MASQUERADE
-A POSTROUTING -s 172.19.0.0/16 ! -o br-007a63024f65 -j MASQUERADE
-A DOCKER -d 192.168.0.20/32 ! -i br-178dff5df0b2 -p tcp -m tcp --dport 9091 -j DNAT --to-destination 172.20.0.2:9091
-A DOCKER ! -i br-178dff5df0b2 -p tcp -m tcp --dport 51413 -j DNAT --to-destination 172.20.0.2:51413
-A DOCKER ! -i br-178dff5df0b2 -p udp -m udp --dport 51413 -j DNAT --to-destination 172.20.0.2:51413
-A DOCKER ! -i br-007a63024f65 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.19.0.3:80
-A DOCKER ! -i br-007a63024f65 -p tcp -m tcp --dport 81 -j DNAT --to-destination 172.19.0.3:81
-A DOCKER ! -i br-007a63024f65 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.19.0.3:443
COMMIT
# Completed on Thu Aug 20 13:46:36 2026
# Generated by ip6tables-save v1.8.11 (nf_tables) on Thu Aug 20 13:46:31 2026
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-BRIDGE - [0:0]
:DOCKER-CT - [0:0]
:DOCKER-FORWARD - [0:0]
:DOCKER-INTERNAL - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-FORWARD
-A DOCKER-FORWARD -j DOCKER-CT
-A DOCKER-FORWARD -j DOCKER-INTERNAL
-A DOCKER-FORWARD -j DOCKER-BRIDGE
COMMIT
# Completed on Thu Aug 20 13:46:31 2026
# Generated by ip6tables-save v1.8.11 (nf_tables) on Thu Aug 20 13:46:31 2026
*nat
:PREROUTING ACCEPT [102:11873]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [11:803]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d ::1/128 -m addrtype --dst-type LOCAL -j DOCKER
COMMIT
# Completed on Thu Aug 20 13:46:31 2026