我将假设您的路由器不够智能,无法自行设置加密反向代理。
下面使用的约定
- 家庭IP地址:1.2.3.4(谷歌搜索我的IP找到你的)
- 网络摄像头 IP 地址/端口:
192.168.0.123
在端口 456 上。
- 运行反向代理的 Linux/Unix 计算机:
192.168.0.101
初步检查
在本地网络上,您可以看到网络摄像头http://192.168.0.123:456
吗?伟大的。您不能从外界连接到网络摄像头(http://1.2.3.4:456
即被防火墙关闭)吗?伟大的。如果不重新配置您的网络摄像头和路由器上的端口转发/防火墙规则。
接下来,在本地网络上的计算机上安装一个网络服务器,只要您想连接到网络摄像头,该计算机就会打开。我将假设 linux/unix 并为 nginx 提供说明。
作为初始测试,设置一个不加密的反向代理。安装最新版本的 nginx,编辑配置文件 ( /etc/nginx/conf.d/default.conf
) 并添加类似如下的行:
server {
listen 8080;
location / {
proxy_pass http://192.168.0.123:456;
} # replace with your webcam's local IP address and port.
}
现在重新启动 nginx( sudo /etc/init.d/nginx restart
) 并尝试连接到代理 ( http://192.168.0.101:8080
),它应该就像你去http://192.168.0.123:456
. 如果遇到问题,请再次检查所有内容或查阅 nginx 文档。
获取 TLS/SSL 证书
现在您需要添加 SSL 证书和关联的私钥。您可以生成一个由证书颁发机构签名的文件(例如,从startssl.com 免费)或自己生成一个自签名的文件(最初不会被Web 浏览器信任)。对于家庭网络,设置 CA 签名证书会更加复杂,您必须获得一个域名(您可以向您拥有的 CA 证明)、为该域名设置动态 DNS 等。(如果您正在尝试开始使用动态 DNS - https://freedns.afraid.org/是一个很好的起点)。
要生成自签名证书,首先使用 openssl 创建私钥(在本例中为 4096 位 RSA 私钥):
# openssl genrsa -out private.key 4096
如果您好奇,您可以使用 来查看内容openssl rsa -in private.key -text -noout
。接下来,您需要根据该私钥生成证书,可以通过以下方式完成:
# openssl req -new -x509 -key private.key -out yourcert.crt -days 3650
3650 表示它将在 3650 天(约 10 年)后到期。Openssl 将提示您提供更多详细信息,请随时将它们留空或将任何信息放在那里。(您可以使用 来查看您的证书内容openssl x509 -in yourcert.crt -text -noout
)。
现在将您的私钥和证书放在安全的地方(例如,在 /etc/ssl/private/private.key
and中/etc/ssl/certs/yourcert.crt
),限制他们的权限(确保由 root 拥有并且没有其他人具有读/写权限)。
在反向代理中打开 SSL
然后编辑您的 nginx 服务器配置文件以启用 SSL,如下所示:
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
}
}
重新启动 nginx,现在您应该能够连接到本地网络上的网络摄像头https://192.168.0.101
(您将收到有关证书不受信任的警告,因为它是自签名证书)。
在路由器中设置端口转发
最后一步是配置您的路由器进行端口转发。也就是当你https://1.2.3.4
从外界连接到(端口 443)时,将其设置为端口转发到192.168.0.101
(端口 443)。可能设置动态 DNS,因此如果您的家庭 IP 地址发生更改,它仍然指向正确的位置。一些 ISP 确实阻止了端口 80 和 443,因此您可能必须将其更改为其他端口。
小心你的连接方式。我注意到许多 IP 摄像头程序不会检查证书是否信任(因为它们通常是自签名的),因此攻击者可能会通过插入不同的自签名证书来进行中间人攻击。最好将您的自签名证书添加到您自己的浏览器上受信任并在更改时拒绝它。