使用 OpenVPN 实现 NAS 的安全外网访问
背景
自建一台 NAS,系统为 FNOS,位于家中内网;
有一台具备公网 IP 的云服务器;
云服务器上禁用了 FRP 等端口映射工具;
目标:通过 OpenVPN 组建一个安全的虚拟内网,通过 NGINX 反向代理访问 NAS 提供的服务(如 Web UI、文件服务等)。
FNOS 是指的飞牛nas
网络结构概览
1 |
|
云服务器安装并配置 OpenVPN 服务端(Docker Compose)
创建 VPN 配置目录
1
2mkdir -p /data/openvpn-data
cd /data/openvpn-data使用
ssliunian/openvpn
(源自:kylemanna/openvpn)镜像初始化配置1
2
3docker 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
2docker-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 客户端
- 安装OpenVPN
1
2sudo apt update
sudo apt install -y openvpn - 上传并放置配置文件
将nas.ovpn
上传到 NAS,例如放在/etc/openvpn/client/nas.ovpn
1
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 许可协议。转载请注明来源 星空!
评论