家用小服务器 篇四:0元实现外网HTTPS访问局域网NAS
0. 前言
本文实现在外网访问家里局域网的NAS,并通过HTTPS对访问安全性进行加固。具体设备包括一台小主机(非必要),一台NAS。家用小服务器(小主机)在之前介绍过了,为J4105工控板,安装ubuntu server 20.04系统,在本文场景中作为跳板机。这台小主机也不是必需的,如果没有则将正文操作全部放到NAS也能实现相同功能。小主机存在的意义在于避免直接将NAS暴露到互联网,为下一步在小主机上做一些安全加固或者灵活配置提供一个平台。系统架构如下图,涉及两个网络,一个是家里局域网,另一个是vlan,小主机既有局域网IP又有vlan的IP,起到转发的作用。
1. 外网访问
采用Zerotier进行异地组网,实现从互联网直接穿透访问局域网设备,具体方法站内已有经验分享了,下面简单介绍下。
首先需要到Zerotier官网注册一个账号
注册完成后,需要创建一个网络。下面图中我已经建好了一个网络。
Zerotier会分配一个network id,这个id在设备加入这个虚拟网络时需要用到。免费用户可以有25个设备加入到这个网络,在一个网络里的设备可以互相访问。因为免费,所以带宽并不是那么理想,但是对于我日常操作NAS或者访问我小主机上的应用来说够用了。
Zerotier提供了Windows/Linux/Android等平台的客户端,用于各种设备加入,也支持通过docker容器部署客户端。我的J4105设备安装的是Ubuntu,自然采用docker来部署。在小主机上启动zerotier容器:
docker run -d --name myzerotier --cap-add NET_ADMIN
--network=host --device /dev/net/tun
zerotier/zerotier
注意,必须有--network=host,否则下面的联网可能失败。
然后加入zerotier网络,下面的字符串就是前面提到的network id。当然和前面启动容器合起来一行脚本执行。
docker exec myzerotier zerotier-cli join dxxxxxxxxxxxxxxxxx0
上面脚本执行完成后,需要到zerotier网站,登录自己用户,进入到network页面。这时可以看到你的设备已经出现在“Members”列表中,将前面的√选上,其他都不用操作(没有confirm 之类的按钮),过一会设备就会实际加入到网络中。
也可以直接把zerotier容器部署在nas上,让nas直接加入到zerotier虚拟网络中,我这里并没有这么做。
2. 配置转发
本节操作都在小主机上进行。
2.1 签发SSL证书
获取证书途径一般有两种:向CA认证商购买或者使用OpenSSL自签证书。在linux下可以使用openssl工具自签证书用于HTTPS,在小主机上执行以下脚本。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /home/ssl/server.key -out /home/ssl/server.crt
# crt文件转换成pem文件
openssl x509 -in server.crt -out server.pem -outform PEM
以上操作生成两个文件server.perm和sever.key
2.2 部署nginx
Nginx是一款开源、高性能、可靠的 Web 和反向代理服务器,可以在windows和linux上部署。在小主机上启动nginx,实现转发。Nginx以docker方式部署,将宿主机上的配置文件和证书映射到容器内部,实现nginx配置。
docker run -d --restart=always --name nginx-test -p 8580:80 -p 443:443
-v /home/containers/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /home/containers/nginx/logs:/var/log/nginx
-v /home/containers/nginx/ssl/server.pem:/etc/nginx/server.pem
-v /home/containers/nginx/ssl/server.key:/etc/nginx/server.key nginx
以下格式更易读
解释下上面的docker命令,-p 8580:80表示宿主机的8580映射到docker容器的80端口,因此nginx实际监听的是宿主机的8580端口, -p 443:443表示443也做了映射(端口号不变)。-v参数将宿主机上的nginx.conf文件映射到容器内目录,这样方便修改配置,后面几个-v参数的映射了logs目录以及将ssl证书载入到容器内。配置文件nginx.conf是nginx实现网络转发的关键,它的内容如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.0.105:5000;
# proxy_redirect default;
}
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate server.pem;
ssl_certificate_key server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://192.168.0.105:5001;
}
}
}
解释下上面的nginx配置文件:(1)监听80端口转发到 http://192.168.0.105:5000,这个地址是威联通NAS的http登陆地址;(2)监听443端口,启用ssl证书,证书地址 (相对nginx.conf的地址) 分别由ssl_certificate和ssl_certificate_key指定,转发到https://192.168.0.105:5001,这是威联通https的登陆地址和端口。如果NAS本身是不带SSL证书的(威联通自带,端口号5001是https),那么监听443端口的server{}下的proxy_pass也指向http地址。
到此,Zerotier组网和nginx+https转发的配置都完成了,找一台外网设备加入这个vlan,然后访问小主机的zerotier IP (https://vlan-ip) 就会跳转到NAS登陆的页面,效果如下。
首次登录浏览器会出现“使用了无效的安全证书”之类的提示,这是因为证书是自签的不是CA机构认证的,可以无视这类提示。
使用QNAP app也可以在外网正常访问,前提是手机下载zerotier app,连上虚拟网络。在页面中填入小主机的zerotier网络IP,选择SSL安全登录,端口号443,就可以在互联网上访问家中NAS了。注意,以上IP及端口需要按自己的环境设置。
3. 总结
至此,外网通过HTTPS协议访问家里NAS的配置全部介绍完了。回顾主要步骤:(1)创建Zerotier虚拟网络,(2)小主机使用Zerotier客户端(或者docker)加入虚拟网络,(3)生成SSL自签证书,(4)小主机部署nginx做网络转发。本方案的特点在于NAS作为局域网设备没有部署额外的服务,也不参加vlan组网,自认为可以一定程度上提升安全性。此外重要的一点是,本方案完全免费,且不局限于品牌NAS。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
nqiang
校验提示文案
塞北的雪
校验提示文案
sunlw128
校验提示文案
alonewoo
校验提示文案
焱炎火
校验提示文案
Ho---
校验提示文案
蓝牙e族
校验提示文案
蓝牙e族
校验提示文案
Ho---
校验提示文案
焱炎火
校验提示文案
alonewoo
校验提示文案
sunlw128
校验提示文案
nqiang
校验提示文案
塞北的雪
校验提示文案