Voy a asumir que su enrutador no es lo suficientemente inteligente como para configurar un proxy inverso cifrado por sí mismo.
Convenciones utilizadas a continuación
- Dirección IP del hogar: 1.2.3.4 ( buscar en mi ip para encontrar la tuya )
- Dirección IP / puerto de la cámara web:
192.168.0.123
en el puerto 456.
- Computadora Linux / Unix ejecutando proxy inverso:
192.168.0.101
Comprobaciones iniciales
En la red local, ¿puedes ver la cámara web en http://192.168.0.123:456
? Genial. ¿No puede conectarse a una cámara web desde el mundo exterior (es decir, http://1.2.3.4:456
está desactivado mediante firewall)? Genial. Si no reconfigura su cámara web y las reglas de reenvío de puerto / firewall en su enrutador.
A continuación, instale un servidor web en una computadora en su red local que esté encendida cada vez que desee conectarse a su cámara web. Voy a asumir linux / unix y daré instrucciones para nginx.
Como prueba inicial, configure un proxy inverso sin cifrado. Instale la última versión de nginx, edite el archivo de configuración ( /etc/nginx/conf.d/default.conf
) y agregue líneas similares a:
server {
listen 8080;
location / {
proxy_pass http://192.168.0.123:456;
} # replace with your webcam's local IP address and port.
}
Ahora reinicie nginx ( sudo /etc/init.d/nginx restart
) e intente conectarse al proxy ( http://192.168.0.101:8080
) y debería funcionar como si fuera a http://192.168.0.123:456
. Si tiene problemas, vuelva a revisar todo o consulte la documentación de nginx .
Cómo obtener un certificado TLS / SSL
Ahora debe agregar un certificado SSL y la clave privada asociada. Puede generar uno firmado por una autoridad de certificación (por ejemplo, de startssl.com de forma gratuita) o generar uno que tenga su propia firma (y que los navegadores web no confiarán inicialmente). La configuración de un certificado firmado por una CA será más complicada para una red doméstica en la que tendrá que obtener un nombre de dominio (que puede demostrar a la CA que posee), configurar un DNS dinámico para ese nombre de dominio, etc. está intentando comenzar con el DNS dinámico: enlace es un excelente lugar para comenzar).
Para generar un certificado autofirmado, primero use openssl para crear una clave privada (en este caso, una clave privada RSA de 4096 bits):
# openssl genrsa -out private.key 4096
Si tienes curiosidad, puedes ver los contenidos con openssl rsa -in private.key -text -noout
. A continuación, debe generar un certificado basado en esa clave privada, que se puede hacer con:
# openssl req -new -x509 -key private.key -out yourcert.crt -days 3650
El 3650 dice que vencerá en 3650 días (~ 10 años). Openssl le solicitará más detalles, siéntase libre de dejarlos en blanco o ingrese cualquier información allí. (Puede ver el contenido de su certificado con openssl x509 -in yourcert.crt -text -noout
).
Ahora ponga su clave privada y su certificado en un lugar seguro (por ejemplo, en /etc/ssl/private/private.key
y /etc/ssl/certs/yourcert.crt
), restrinja sus permisos (asegúrese de que sean propiedad de la raíz y que nadie más tenga permisos de lectura / escritura).
Activar SSL en proxy inverso
Luego edite el archivo de configuración de su servidor nginx para habilitar SSL de la siguiente manera:
server {
listen 443; # doesn't have to be port 443 - could be any port (say 8080) if you
# connect via https://192.168.0.101:8080 . But on port 443
# you can just use https://192.168.0.101
ssl on;
ssl_certificate /etc/ssl/certs/yourcert.crt;
ssl_certificate_key /etc/ssl/private/private.key;
# certificate and private key where you just placed them
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
# reasonable SSL configuration, disable some known weak ciphers.
location / {
proxy_pass http://192.168.0.123:456;
proxy_redirect http://192.168.0.123:456/ $scheme://$host:$server_port/;
# If your webcam (or other proxied application) ever gives URLs in the HTTP headers
# (e.g., in a 302 or 304 HTTP redirect),
# the proxy_redirect line changes the URL in the HTTP header field
# from http://192.168.0.123:456/some/path to https://192.168.0.1:8080/some/path
}
}
Reinicie nginx, y ahora debería poder conectarse a su cámara web en su red local en https://192.168.0.101
(obtendrá advertencias sobre la falta de confianza del certificado, ya que es un certificado autofirmado).
Configura el reenvío de puerto en tu enrutador
El último paso es configurar el enrutador para que realice el reenvío de puertos. Esto es cuando se conecta a https://1.2.3.4
(puerto 443) desde el mundo exterior, configúrelo para que reenvíe a 192.168.0.101
(puerto 443). Posiblemente configure DNS dinámico para que si la dirección IP de su hogar cambia, todavía apunte al lugar correcto. Algunos ISP bloquean los puertos 80 y 443, por lo que es posible que tenga que cambiarlo a otro puerto.
Ten cuidado con cómo te conectas. He notado que muchos programas de cámaras IP no comprueban la confianza de los certificados (ya que a menudo son autofirmados), por lo que un atacante podría posiblemente realizar un ataque MitM insertando un certificado autofirmado diferente. Es mejor si agrega su certificado autofirmado para que sea de confianza en sus propios navegadores y lo rechace si cambia.