背景

  • 自建一台 NAS,系统为 FNOS,位于家中内网;

  • 有一台具备公网 IP 的云服务器;

  • 云服务器上禁用了 FRP 等端口映射工具;

  • 目标:通过 OpenVPN 组建一个安全的虚拟内网,通过 NGINX 反向代理访问 NAS 提供的服务(如 Web UI、文件服务等)。

  • FNOS 是指的飞牛nas

网络结构概览

1
2
3
4
5
6
7
8
9
10
11

+------------------------+ OpenVPN +----------------------+
| 云服务器(VPN 服务端) |<------------------->| 家中 NAS(VPN 客户端) |
| 公网 IP,可开放端口 | | FNOS,可 ssh 操作 |
+------------------------+ +----------------------+
|
| NGINX 反向代理
|
+------------------------+ 公网 +----------------------+
| 访问者浏览器(外网) |<--------------->| uptime-健康检查 |
+------------------------+ (可选) +----------------------+

云服务器安装并配置 OpenVPN 服务端(Docker Compose)

  1. 创建 VPN 配置目录

    1
    2
    mkdir -p /data/openvpn-data
    cd /data/openvpn-data
  2. 使用 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 尽量在启动前修改为非默认端口
  1. 创建 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
  2. 启动 OpenVPN 服务端

    1
    docker-compose up -d
  3. 适当修改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"

    ... 其他块目前看不需要改动
  4. 配置完成后,重启服务端容器

    1
    2
    docker-compose down
    docker-compose up -d

在服务端生成客户端配置文件

1
2
docker-compose run --rm openvpn easyrsa build-client-full nas nopass
docker-compose run --rm openvpn ovpn_getclient myclient > nas.ovpn

修改nas.ovpn,达到以下目的:
1、只需要从公网访问到内网对应的服务即可
2、不需要将内网的所有流量都切到公网
3、增加心跳充实,增加健壮性。

修改完的nas.oppn如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
client
nobind
dev tun
remote-cert-tls server

pull-filter ignore "redirect-gateway"

route 服务端的内网网段 255.255.255.0

remote 公网IP或者域名 端口 udp
resolv-retry infinite
connect-timeout 10
connect-retry 5

<key>
</key>
<cert>
</cert>
<ca>
</ca>
key-direction 1
<tls-crypt>
</tls-crypt>

FNOS NAS 安装并配置 OpenVPN 客户端

  1. 安装OpenVPN
    1
    2
    sudo apt update
    sudo apt install -y openvpn
  2. 上传并放置配置文件
    nas.ovpn 上传到 NAS,例如放在 /etc/openvpn/client/nas.ovpn
    1
    2
    sudo mkdir -p /etc/openvpn/client
    sudo mv nas.ovpn /etc/openvpn/client/
  3. 自动启动 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
    4
    sudo systemctl daemon-reload
    sudo systemctl start openvpn-nas
    sudo systemctl enable openvpn-nas
    sudo systemctl status openvpn-nas
    查看日志中是否有
    1
    2
    net_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 服务

  1. 确保 NAS 在 VPN 内的地址(例如 10.0.1.11)
    1
    ping 10.0.1.11
  2. 编辑 NGINX 配置
    1
    vi /etc/nginx/conf.d/nas.conf
    内容示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    server {
    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;
    }
    }

  3. 重载 NGINX 配置
    1
    2
    nginx -t && sudo systemctl reload nginx

  4. 配置域名解析(例如 Cloudflare 或 DNSPOD)

将 nas.yourdomain.com 指向你的云服务器公网 IP。

效果验证

  • 在本地浏览器访问 http://nas.yourdomain.com,即可访问 NAS 的 Web 服务;

  • 通信通过 OpenVPN 虚拟专网实现,外部无需暴露 NAS 端口;

  • 安全性大大提升。

安全建议

  • 建议开启 HTTPS(通过 Let’s Encrypt + Certbot 自动签发);
  • OpenVPN 建议只允许特定 IP 或客户端证书;
  • 及时更新 Docker 镜像和 OpenVPN 安全补丁。