🛡️ Securiza tu Circuito Cerrado: Cómo Configurar Nginx como Proxy Inverso para un DVR Hikvision vía VPN
Exponer directamente un DVR o cámara IP a Internet mediante la apertura de puertos (Port Forwarding) en tu router es, hoy en día, una invitación abierta a ciberataques, botnets y accesos no autorizados. La mejor práctica de la industria es clara: nunca expongas tus dispositivos IoT directamente a la web.
La solución ideal y más segura es utilizar una VPN (como WireGuard, OpenVPN o ZeroTier) combinada con un Proxy Inverso. En esta publicación, te mostraré cómo configurar Nginx para gestionar todo el tráfico de un DVR Hikvision de forma segura, permitiendo que tanto la interfaz web como las aplicaciones móviles (Hik-Connect) funcionen a la perfección.
🛠️ ¿Qué es Nginx y por qué usarlo como Proxy Inverso?
Nginx es mucho más que un simple servidor web. Es un software de código abierto diseñado para ofrecer el máximo rendimiento y estabilidad, actuando como balanceador de carga y, en nuestro caso de uso, como un Proxy Inverso.
Un proxy inverso es un servidor intermediario que se sitúa frente a tus servidores internos (backend). Cuando un cliente (tu teléfono móvil o navegador web) realiza una petición, el proxy la intercepta, decide qué hacer con ella y la reenvía al servidor correspondiente.
¿Por qué usarlo con un DVR?
- Control de Tráfico: Permite unificar el acceso a múltiples servicios internos bajo una sola dirección IP.
- Resolución de Conflictos: Puedes mapear puertos personalizados si los puertos estándar (como el 80 o 443) ya están ocupados por otros servicios en tu red.
- Optimización y Seguridad: Nginx maneja las conexiones concurrentes de manera mucho más eficiente que el modesto procesador de un DVR.
🏗️ La Arquitectura y los Puertos
Para este tutorial, asumiremos la siguiente topología de red virtual:
- Servidor Nginx (Proxy Inverso):
10.0.1.10 - DVR Hikvision (Backend):
10.0.1.20
Los equipos de CCTV, en particular Hikvision, utilizan varios protocolos simultáneamente. Aquí es donde Nginx brilla, ya que puede manejar tanto tráfico HTTP (Capa 7) como tráfico TCP puro (Capa 4).
Estos son los puertos que configuraremos:
| Puerto Nginx | Protocolo | Función |
|---|---|---|
| 980 | HTTP (Capa 7) | Interfaz Web de administración. (Nota: El estándar es el 80, pero utilizamos el 980 como ejemplo para evitar conflictos con otros sitios web que Nginx ya esté sirviendo). |
| 7681 | WebSocket | Transmisión de video en vivo (Live View) directamente hacia el navegador web. |
| 8000 | TCP (Capa 4) | Puerto SDK/Servicio. Obligatorio para que la App móvil (Hik-Connect) y el software de escritorio (iVMS) se comuniquen. |
| 554 | TCP (Capa 4) | Puerto RTSP. Transmisión del flujo de video crudo. |
⚙️ Configuración Paso a Paso
1. Instalación de Dependencias
Por defecto, Nginx está optimizado para tráfico web (HTTP/HTTPS). Como necesitamos enrutar tráfico TCP puro para los puertos 8000 y 554, necesitamos el módulo stream. En muchas distribuciones de Linux basadas en Debian/Ubuntu, este módulo requiere el paquete nginx-extras:
sudo apt-get update
sudo apt-get install nginx nginx-extras
2. Configuración Global (Tráfico TCP/Capa 4)
El tráfico de las aplicaciones móviles y el RTSP no es HTTP, por lo que no puede ir en los bloques habituales de Nginx. Debemos interceptarlo a nivel de red (Capa 4) editando el archivo de configuración global, generalmente ubicado en /etc/nginx/nginx.conf.
Añadimos el bloque stream al final del archivo:
# /etc/nginx/nginx.conf
# ... (configuraciones http habituales de nginx) ...
# El bloque STREAM maneja tráfico TCP/UDP puro (Capa 4).
# Vital para que la App de Android/iOS y los flujos RTSP funcionen.
stream {
# Puerto de datos/SDK de Hikvision
server {
listen 8000;
proxy_pass 10.0.1.20:8000;
}
# Puerto RTSP (Real Time Streaming Protocol)
server {
listen 554;
proxy_pass 10.0.1.20:554;
}
}
3. Configuración Web y WebSockets (Tráfico HTTP/Capa 7)
Ahora crearemos un archivo dedicado para la interfaz web, por ejemplo en /etc/nginx/sites-available/dvr.conf.
Este archivo manejará el puerto 980 para la carga de la página y el puerto 7681 para los WebSockets. El manejo de WebSockets y la transparencia de IPs son críticos aquí.
# /etc/nginx/sites-available/dvr.conf
# ---------------------------------------------------------
# SERVIDOR 1: Interfaz Web del DVR (HTTP)
# ---------------------------------------------------------
server {
# Usamos el puerto 980 para evitar conflictos con otros servicios en el puerto 80
listen 980;
location / {
proxy_pass http://10.0.1.20;
# Transparencia de IP: Envía la IP real del usuario al DVR
# Sin esto, los logs de seguridad del DVR registrarán que todos
# los inicios de sesión provienen de la IP del Proxy (10.0.1.10).
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
# ---------------------------------------------------------
# SERVIDOR 2: WebSockets (Transmisión de video web)
# ---------------------------------------------------------
server {
# Este puerto lo exige la interfaz de Hikvision para transmitir video al navegador
listen 7681;
location / {
proxy_pass http://10.0.1.20:7681;
# Configuraciones de Upgrade de conexión (Obligatorio para WebSockets)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Transparencia de IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Evita el lag en el video en vivo (Desactiva el buffering)
proxy_buffering off;
# Aumentamos los tiempos de espera para evitar que Nginx
# cierre el video si no hay interacción del usuario.
proxy_connect_timeout 5m;
proxy_send_timeout 5m;
proxy_read_timeout 5m;
}
}
4. Activar y Probar
Por último, activamos nuestro sitio creando un enlace simbólico y recargamos Nginx:
sudo ln -s /etc/nginx/sites-available/dvr.conf /etc/nginx/sites-enabled/
sudo nginx -t # Verifica que no haya errores de sintaxis
sudo systemctl reload nginx
🎯 Conclusión
Al aplicar esta configuración, habrás creado una barrera arquitectónica altamente eficiente. Para acceder a tus cámaras, ahora solo necesitas conectarte a tu VPN de preferencia e interactuar directamente con la IP de tu proxy Nginx (10.0.1.10).
Podrás abrir tu navegador web en http://10.0.1.10:980 o configurar tu aplicación Hik-Connect apuntando a la misma IP por el puerto 8000, todo mientras el DVR permanece completamente oculto y aislado del escrutinio de Internet.
¿Te ha servido este tutorial? ¡Déjame tus dudas o experiencias en los comentarios!