一、背景与需求

  • 联通1000M宽带 带公网IP
  • 需要在Home 中搭建部署一个VPN,实现在外能访问家中的学习资源

image-20250205141226691

二、实现方式

通过openvpn+ 动态DDNS域名 的方式来实现,通过绑定公网IP地址在域名上,实现VPN 的访问。

2.1 OpenVPN Access Server (OpenVPN-AS)

OpenVPN Access Server 是一个基于 OpenVPN 技术构建的企业级虚拟私人网络(VPN)解决方案。它提供安全的远程访问功能,使员工或用户能够通过互联网安全地连接到公司内部网络,确保数据传输的安全性和隐私。

  • 官网: https://github.com/OpenVPN/as-docker?tab=readme-ov-file
  • docker镜像地址:https://hub.docker.com/r/openvpn/openvpn-as
  • 本篇镜像加速地址: docker.cnb.cool/srebro/docker-images/openvpn-openvpn-as:latest
  • 默认免费支持2个客户端同时连接

2.1.1 主要功能:

  1. 安全的远程访问:通过加密隧道技术,保证远程用户与公司网络之间的数据传输安全。
  2. 跨平台支持:支持 Windows、Mac、Linux、iOS 和 Android 等多个操作系统,确保各类设备都能顺畅连接。
  3. 易于管理:通过一个直观的 Web 界面来配置和管理 VPN 连接,无需复杂的命令行操作。
  4. 用户管理:支持多用户、组管理,管理员可以控制访问权限和连接策略。
  5. 高可扩展性:可以通过配置集群和负载均衡来满足大规模企业的需求。
  6. 集成认证:支持与 LDAP、Active Directory 等目录服务集成,简化用户管理和认证流程。

简单来说,OpenVPN Access Server 是一个专为企业设计的 VPN 解决方案,它既安全又易于管理,适用于需要远程访问的公司和团队。

2.1.2 Docker-compose 部署OpenVPN-AS

  • 下载镜像
docker pull docker.cnb.cool/srebro/docker-images/openvpn-openvpn-as:latest
  • 编写Docker-compose 文件

-cap-add=NET_ADMIN:对容器赋予NET_ADMIN权限,容器可以配置和管理的控制网络配置权限;容器内的 /openvpn目录通常保存 OpenVPN 服务相关的配置文件和密钥,这里需要数据卷持久化挂载;

映射容器的943 端口 1194 (tcp) 端口到宿主机的 943 端口 1194 (tcp) 端口

version: '3'
services:
  openvpn-as:
    image: docker.cnb.cool/srebro/docker-images/openvpn-openvpn-as:latest
    container_name: openvpn-as
    restart: always
    cap_add:
      - NET_ADMIN
    ports:
      - "943:943"
      - "1194:1194/udp"
    volumes:
      - /home/application/openvpn:/openvpn   #数据卷持久化挂载
  • 运行容器
docker-compose up -d
  • 进入容器,修改web管理员的账号和密码(默认只有openvpn用户有管理员权限)
docker exec -it openvpn-as bash

sacli --user "openvpn" --new_pass "srebro@2024" SetLocalPassword

2.2 配置动态DDNS域名&配置映射端口

之前有分享过如何 使用 DNSpod来 实现动态域名解析、本文不再细说

具体参考见: https://srebro.cn/archives/1721891072677

  • 端口映射 【只需要映射 udp 1194 端口】

image-20250205155148437

2.3 可视化配置OpenVPN-AS服务端

有了域名之后,我们就可以去配置openvpn 的配置,把他监听在域名上,这里演示的域名是 vpn.srebro.cn

2.3.1 登录openvpn-as 后台管理端

  • https://192.168.31.27:943/admin

Username: openvpn

Password: srebro@2024

image-20250205145622598

2.3.2 配置openvpn监听在域名上

填写配置好的DDNS 域名;

image-20250205145917463

2.3.2 配置openvpn内网IP

根具自己的配置自定义openvpn 的内网IP段,我这里演示的是 192.168.66.0/24 子网段

image-20250205150321091

2.3.3 设置允许访问VPN内网的地址 | 禁止客户端互联网流量通过VPN路由出去上网| 允许客户端访问VPN网关IP地址上的网络服务

我家中网络都是192.168.31.0 网段,这里需要填写需要下发的子网地址 (一行写一个网段)

image-20250205150730844

2.3.4 设置推送指定的DNS地址给客户端

指定DNS 地址为 114.114.114.114

image-20250205150925516

2.3.5 保存设置重启服务

image-20250205151235140

image-20250205151302226

2.4 下载客户端和配置文件

  • https://192.168.31.27:943/admin

Username: openvpn

Password: srebro@2024

  • 下载对应的客户端,下载客户端配置文件

image-20250205143356156

  • 导入配置文件

image-20250205155304521

2.5 客户端访问&测试

  • 登录客户端

image-20250205155331658

  • 访问openvpn 后端资源

image-20250205155507814

image-20250205155538929

  • 在线观看内网NAS 资源

image-20250205160240867

三、常见问题

(1)、连上openvpn后,本地内网ip却ping不通了

禁止客户端互联网流量通过VPN路由出去上网,即可解决。

(2)、连上openvpn后,无法上网,但可以ping外网IP

设置推送指定的DNS地址给客户端

(3)、连上openvpn后,无法访问服务器资源

没有设置允许访问VPN内网的地址