使用 OpenVPN 实现 NAS 的安全外网访问
背景
- 自建一台 NAS,系统为 FNOS,位于家中内网; 
- 有一台具备公网 IP 的云服务器; 
- 云服务器上禁用了 FRP 等端口映射工具; 
- 目标:通过 OpenVPN 组建一个安全的虚拟内网,通过 NGINX 反向代理访问 NAS 提供的服务(如 Web UI、文件服务等)。 
- FNOS 是指的飞牛nas 
网络结构概览
| 1 | 
 | 
云服务器安装并配置 OpenVPN 服务端(Docker Compose)
- 创建 VPN 配置目录 - 1 
 2- mkdir -p /data/openvpn-data 
 cd /data/openvpn-data
- 使用 - ssliunian/openvpn(源自:kylemanna/openvpn)镜像初始化配置- 1 
 2
 3- docker run -v /data/openvpn-data:/etc/openvpn --rm ssliunian/openvpn ovpn_genconfig -u udp://your.public.ip 
 docker run -v /data/openvpn-data:/etc/openvpn --rm -it ssliunian/openvpn ovpn_initpki
- 注意:将 your.public.ip 替换为你的云服务器公网 IP或者域名。
- 运行过程中的ca是强制要求密码的,密码自己输入,不要忘记
- 此时生成的配置文件,默认端口是UDP:1194 尽量在启动前修改为非默认端口
- 创建 - docker-compose.yml- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- --- 
 version: '3.3'
 services:
 openvpn:
 image: ssliunian/openvpn:latest
 container_name: openvpn
 cap_add:
 - NET_ADMIN
 network_mode: host
 restart: unless-stopped
 volumes:
 - /data/openvpn-data:/etc/openvpn
 healthcheck:
 disable: false
 environment:
 - TZ=Asia/Shanghai
- 启动 OpenVPN 服务端 - 1 - docker-compose up -d 
- 适当修改OpenVPN配置文件 - vi /data/openvpn-data/openvpn.conf
 查看配置文件:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40- # 端口,可修改为不常用端口,例如5994 
 port 1194
 proto udp
 dev tun
 # 证书和密钥
 ca /etc/openvpn/pki/ca.crt
 dh /etc/openvpn/pki/dh.pem
 ... 不用动
 # 服务地址范围(VPN 客户端的内网地址段,启动完看下容器的日志)
 # 10.0.1.0 要修改成openvpn已经虚拟好的网段
 server 10.0.1.0 255.255.255.0
 # 路由相关
 # 10.0.1.0 要修改成 openvpn已经虚拟好的网段
 push "route 10.0.1.0 255.255.255.0"
 client-to-client
 # 保持连接
 keepalive 10 120
 # 允许客户端连接多个服务
 persist-key
 persist-tun
 # 日志
 status /etc/openvpn/openvpn-status.log
 log /etc/openvpn/openvpn.log
 verb 3
 # 用户,不需要改动
 user nobody
 group nogroup
 # DNS 推送(如需将客户端的 DNS 也路由到服务端,这个dns是阿里的dns)
 push "dhcp-option DNS 223.5.5.5"
 push "dhcp-option DNS 223.6.6.6"
 ... 其他块目前看不需要改动
- 配置完成后,重启服务端容器 - 1 
 2- docker-compose down 
 docker-compose up -d
在服务端生成客户端配置文件
| 1 | docker-compose run --rm openvpn easyrsa build-client-full nas nopass | 
修改nas.ovpn,达到以下目的:
1、只需要从公网访问到内网对应的服务即可
2、不需要将内网的所有流量都切到公网
3、增加心跳充实,增加健壮性。
修改完的nas.oppn如下:
| 1 | client | 
FNOS NAS 安装并配置 OpenVPN 客户端
- 安装OpenVPN1 
 2sudo apt update 
 sudo apt install -y openvpn
- 上传并放置配置文件
 将nas.ovpn上传到 NAS,例如放在/etc/openvpn/client/nas.ovpn1 
 2sudo mkdir -p /etc/openvpn/client 
 sudo mv nas.ovpn /etc/openvpn/client/
- 自动启动 OpenVPN 客户端服务
 创建 systemd 服务:内容如下:1 vi /etc/systemd/system/openvpn-nas.service 启动并设置开机自启:1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11[Unit] 
 Description=OpenVPN connection to server for NAS
 After=network.target
 [Service]
 ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/nas.ovpn
 Restart=on-failure
 [Install]
 WantedBy=multi-user.target查看日志中是否有1 
 2
 3
 4sudo systemctl daemon-reload 
 sudo systemctl start openvpn-nas
 sudo systemctl enable openvpn-nas
 sudo systemctl status openvpn-nas1 
 2net_addr_ptp_v4_add: 10.0.1.11 peer 10.0.1.5 dev tun0 
 Initialization Sequence Completed
- 10.0.1.11就是当前内网的内网IP,可在云服务器上直接访问
- Completed说明启动成功
云服务器配置 NGINX 反向代理访问 NAS 服务
- 确保 NAS 在 VPN 内的地址(例如 10.0.1.11)1 ping 10.0.1.11 
- 编辑 NGINX 配置内容示例:1 vi /etc/nginx/conf.d/nas.conf 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11server { 
 listen 80;
 server_name nas.yourdomain.com;
 location / {
 proxy_pass http://10.0.1.11:5661; # NAS 的 Web 端口
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 }
 }
- 重载 NGINX 配置1 
 2nginx -t && sudo systemctl reload nginx 
- 配置域名解析(例如 Cloudflare 或 DNSPOD)
将 nas.yourdomain.com 指向你的云服务器公网 IP。
效果验证
- 在本地浏览器访问 - http://nas.yourdomain.com,即可访问 NAS 的 Web 服务;
- 通信通过 OpenVPN 虚拟专网实现,外部无需暴露 NAS 端口; 
- 安全性大大提升。 
安全建议
- 建议开启 HTTPS(通过 Let’s Encrypt + Certbot 自动签发);
- OpenVPN 建议只允许特定 IP 或客户端证书;
- 及时更新 Docker 镜像和 OpenVPN 安全补丁。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星空!
 评论
