文章介绍:使用Docker和Docker-Compose一键部署OpenVPN,与传统相比多了Web管理平台,利于管理员编辑server配置文件,创建用户,查看用户在线状态,高级用法ccd指定用户下发指定路由等。

一、项目来源

1、北京元枢科技有限公司-OpenVPN搭建指南

2、北京元枢科技有限公司-OpenVPN搭建指南B站视频教程

3、北京元枢科技有限公司-Gitee项目地址

二、部署前准备

1、一台部署了docker和docker-compose的linux系统

点我:可以参考linux脚本大全第六部分,有linux安装docker和docker-compose的脚本

2、配置好系统时间

sudo apt update
sudo apt install ntpdate
sudo timedatectl set-timezone Asia/Shanghai
sudo timedatectl set-ntp true
sudo systemctl stop systemd-timesyncd.service
sudo ntpdate ntp1.aliyun.com
sudo systemctl start systemd-timesyncd.service
sudo systemctl enable systemd-timesyncd.service
timedatectl status
date

3、SSH管理工具

点我:可以下载MobaXterm中文最新版本(可以激活,激活方法可以见跳转博客)

4、OpenVPN客户端

点我:可以跳转OpenVPN官方下载页面

三、部署OpenVPN

提醒:操作本步骤前,您的系统需要安装好docker和docker-compose,不然接下来的部分命令无法执行。

说明:项目来源中原作者是用CentOS部署的,我是用Ubuntu部署的,所以部分命令可能不同,另外有部分是我自己添加的优化命令,可以简单自定义Web前端显示,我会在后面的命令中说明。

3.1、安装git

sudo apt install -y git

3.2、拉取项目

提醒:我是直接拉取项目openvpn文件夹直接到root根目录,后面的代码会跟路径有关,如果你不太懂linux,请把项目拉取到/root目录下,以防后面的命令复制粘贴报错。

git clone https://gitee.com/yuanshukeji/openvpn

3.3、进入目录

cd openvpn

3.4、拉取容器

docker-compose pull

yydy_2024-02-29_21-35-13

3.5、运行容器

docker-compose up -d

yydy_2024-02-29_21-36-16

3.6、查看容器运行状态

docker-compose ps

yydy_2024-02-29_21-36-36

docker ps

yydy_2024-02-29_21-37-51

3.7、打开Web

浏览器打开服务器IP+9998端口号,http://ip:9998

yydy_2024-02-29_21-42-31

3.8、自定义前端一

说明:这一步是我自己添加的,原作者中并没有这一步的修改,直接部署完会显示元枢科技的字样和logo,如果您觉得无所谓可以不改,直接跳过3.8看3.9,如果想改成自己的名字和图片,请继续下面的操作。

3.8.1、修改图片:①

准备好一张宽420左右像素,高600左右像素,上下误差小于5的图片,并完成抠图,比如我下面的这张图片,宽是419像素,高是596像素,文件名称改成:logo-e1197e99.webp

logo-e1197e99

3.8.1.1、修改原图名称

cd /root/openvpn/vpnui/dist/assets #进入上图中①图的文件路径
mv logo-e1197e99.webp logo-e1197e99.webp.backup #修改原图后缀为.backup

3.8.1.2、上传图片

通过mobaxterm左侧SFTP工具上传到容器目录,位置如下:/root/openvpn/vpnui/dist/assets,如果你的安装路径不是根目录请自行修改openvpn前面的路径。

yydy_2024-02-29_21-53-59

3.8.1.3、赋予权限

chmod +x logo-e1197e99.webp

3.8.1.4、刷新页面

yydy_2024-02-29_21-59-53

3.8.2、修改文字:②③

可以把:杨杨得亿,改成自己的名称,然后直接运行代码即可。

3.8.2.1、文字替换

find /root/openvpn/ -type f -exec sed -i 's/元枢科技/杨杨得亿/g' {} +

yydy_2024-02-29_22-10-38

3.8.2.2、刷新页面

yydy_2024-02-29_22-11-07

3.9、登录系统

说明1:用户名默认是:admin,密码默认是:Xxxxx.ai@123,二次密钥其实是TOTP动态令牌可以使用微软的Authenticatir软件,或者谷歌的Authenticatir软件,再或者Authy软件扫描下面的二维码即可获取二次密钥。

admin
Xxxxx.ai@123

说明2:二次密钥其实是TOTP动态令牌可以使用微软的Authenticatir软件,或者谷歌的Authenticatir软件,再或者Authy软件扫描下面的二维码即可获取二次密钥,再或者可以用微信小程序搜索,二次验证码,扫描以下图片。

yydy_2024-02-29_22-19-21

yydy_2024-02-29_22-26-12

yydy_2024-02-29_22-26-56

yydy_2024-02-29_22-27-38

3.10、自定义前端二

同3.8步骤一样,根据自己情况修改,不修改请直接看3.11步骤。
准备一张自己的头像,名称改成:logo-c1f5a41d.jpg。

3.10.1、修改原图

cd /root/openvpn/vpnui/dist/assets #进入admin的logo文件路径
mv logo-c1f5a41d.jpg logo-c1f5a41d.jpg.backup #修改原图后缀为.backup

3.10.2、上传图片

通过mobaxterm左侧SFTP工具上传到容器目录,位置如下:/root/openvpn/vpnui/dist/assets,如果你的安装路径不是根目录请自行修改openvpn前面的路径。

3.10.3、赋予权限

chmod +x logo-c1f5a41d.jpg

3.10.4、刷新页面

yydy_2024-02-29_22-37-59

四、配置OpenVPN

点击右上角的:配置管理-参数配置。
yydy_2024-02-29_22-40-03

4.1、修改地址和端口

yydy_2024-02-29_22-50-35

4.2、服务端参数说明

默认OpenVPN 服务器配置文件说明,参考如下

  1. login_url http://vpnapi:29091/vpnlogin: 这个配置指定了用于用户登录的 URL。当用户尝试连接 VPN 时,可能需要提供用户名和密码进行认证,这个 URL 就是用于处理用户登录的页面或服务。
  2. log_url http://vpnapi:29091/vpnlog: 这个配置项指定了用于查看日志的 URL。管理员可以通过访问此 URL 来查看 OpenVPN 服务器的日志信息,从而监控连接活动、故障排除等。
  3. ws_url ws://vpnapi:29091/vpnws: 这个配置项指定了 WebSocket 的 URL,用于支持通过 WebSocket 连接的 VPN 客户端。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,通过此 URL,客户端可以建立到服务器的 WebSocket 连接。
  4. management 127.0.0.1 1112: 这个配置项指定了 OpenVPN 服务器的管理接口的地址和端口。通过管理接口,管理员可以远程控制和监视 OpenVPN 服务器的运行状态,包括连接管理、配置更改、查看状态信息等。在此处配置的地址和端口是用于本地管理,因此只能从本地访问。
  5. port 20005: 指定 OpenVPN 服务器监听的端口号。
  6. proto tcp: 指定 OpenVPN 服务器使用的协议是 TCP。
  7. dev tun: 指定设备类型为 tun,这是 OpenVPN 默认的虚拟隧道设备类型。
  8. max-clients 60000: 设置允许连接到服务器的最大客户端数量。
  9. client-config-dir /etc/openvpn/ccd: 指定一个目录,用于存放客户端特定的配置文件。
  10. ca /etc/openvpn/easy-rsa/pki/ca.crt: 指定证书授权机构 (CA) 的证书文件路径。
  11. cert /etc/openvpn/easy-rsa/pki/issued/server.crt: 指定服务器的证书文件路径。
  12. key /etc/openvpn/easy-rsa/pki/private/server.key: 指定服务器的私钥文件路径。
  13. dh /etc/openvpn/easy-rsa/pki/dh.pem: 指定 Diffie-Hellman 参数文件路径,用于密钥交换。
  14. crl-verify /etc/openvpn/easy-rsa/pki/crl.pem: 指定证书吊销列表 (CRL) 文件的路径,用于检查证书的有效性。
  15. tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0: 启用 TLS 认证,并指定 TLS 认证密钥文件的路径。
  16. server 10.254.253.0 255.255.255.0: 指定 VPN 服务器的虚拟 IP 地址池。
  17. ifconfig-pool-persist ipp.txt: 指定持久化保存虚拟 IP 地址分配的文件路径。
  18. push "route 192.168.1.1 255.255.255.255": 向客户端推送路由信息,告诉客户端如何路由到指定的目标网络。
  19. push "route 18.18.1.0 255.255.255.0": 同上,推送另一个路由信息。
  20. reneg-bytes 0reneg-sec 0: 关闭重协商功能,确保在连接期间不会重复协商密钥。
  21. keepalive 10 600: 设置保持活动连接的参数。
  22. comp-lzo: 启用数据压缩。
  23. client-to-client: 允许客户端之间进行直接通信。
  24. persist-keypersist-tun: 持久化存储密钥和虚拟隧道设备。
  25. status /etc/openvpn/log/openvpn-status.log: 指定状态文件的路径。
  26. loglog-appendverb 3: 配置日志相关选项,包括日志文件路径和详细程度。
  27. script-security 3: 设置脚本安全性级别。
  28. auth-user-pass-verify /etc/openvpn/check.sh via-envusername-as-common-name: 配置用户认证,使用指定的脚本进行验证,并将用户名作为通用名称使用。

4.3、修改服务端参数

1、以下参数建议修改和添加,具体修改步骤,看下图,①:打开编辑开关,②:修改参数,③:修改服务端配置

yydy_2024-02-29_23-25-40
yydy_2024-02-29_23-28-25

2、重新打开编辑开关,然后点击左下角:重启reload,重载配置

yydy_2024-02-29_23-29-39

4.3.1、修改客户端IP

如果默认的10.254.253.0/24位地址池被内网暂用,请修改其他网段,比如下面的:100.255.255.0/24

server 100.255.255.0 255.255.255.0

重点!!!,修改客户端IP,只在控制台改上面的server后面的参数还不行,还需要去底层修改下面配置文件的参数

nano /root/openvpn/run/start.sh

重点!!!,添加如下参数,不然会导致拨号成功之后,与内网无法通信

  • iptables: 使用iptables命令进行防火墙规则的设置。
  • -t nat: 指定规则类型为 NAT 表,即网络地址转换表,用于配置网络地址转换规则。
  • -A POSTROUTING: 在POSTROUTING链中添加一条规则,该链用于在数据包离开系统后对其进行处理。
  • -s 100.255.255.0/24: 指定源 IP 地址为 100.255.255.0/24,即从该子网发出的数据包将受到此规则的影响。
  • -o eth0: 指定输出接口为 eth0,即数据包通过 eth0 接口离开系统时将受到此规则的影响。
  • -j MASQUERADE: 指定动作为 MASQUERADE,即对匹配的数据包进行源地址伪装,使得数据包看起来来自于该路由器本身,而不是来自于内部网络中的某个具体主机。
iptables -t nat -A POSTROUTING -s 100.255.255.0/24 -o eth0 -j MASQUERADE

yydy_2024-03-02_13-44-08

4.3.2、修改协议

测试发现不能修改协议为udp,不然会导致:openvpn未启动,或openvpn和api之间还未建立连接这个报错,这一步先忽略,等我知道怎么处理,再来更新。

proto udp

proto tcpproto udp 是 OpenVPN 配置文件中用于指定通信协议的选项,它们分别代表了 TCP 和 UDP 协议。

  1. 可靠性

    • TCP(传输控制协议)是面向连接的,提供可靠的数据传输,会保证数据的顺序和完整性。它使用三次握手建立连接,以及应答确认(ACK)和重传机制来确保数据的可靠传输。
    • UDP(用户数据报协议)是面向无连接的,不保证数据传输的可靠性,也不保证数据包的顺序。它更加简单高效,不需要建立连接,没有握手和确认机制。
  2. 性能

    • TCP 的可靠性和保证顺序的特性使得它在网络环境较差或者对数据完整性要求较高的情况下更适用,但由于其额外的开销(如握手、确认、重传等),可能会影响性能。
    • UDP 则更轻量级,不需要维护连接状态,传输效率较高,适合实时性要求高、容忍少量丢包的应用场景。
  3. 适用场景

    • TCP 适用于需要可靠传输、对数据完整性要求高、可以容忍一定延迟的场景,如文件传输、网页访问等。
    • UDP 适用于对实时性要求高、可以容忍少量丢包的场景,如音频、视频流传输、在线游戏等。 -

建议选用:

  • 如果你的应用对数据完整性要求较高,可以容忍一定的延迟,并且不在乎额外的开销,那么选择 TCP 是一个不错的选择。
  • 如果你的应用对实时性要求高,可以容忍少量丢包,并且希望减少传输延迟,那么选择 UDP 更为合适。

4.3.2、修改路由

修改Web这里的配置文件,一经修改全员匹配,但是可以通过ccd来精准控制单个人的路由。

4.3.2.1、下发指定路由

push "route 192.168.6.0 255.255.255.0" #下发指定内网路由

4.3.2.2、下发全局路由

把指定路由全部用#注释掉,然后删掉下面代码的注释即可。

push "redirect-gateway def1 bypass-dhcp"

4.3.4、修改DNS一

让拨号用户不使用OpenVPN下发的DNS解析域名,使用本地有线或者无线网卡获取的DNS解析域名。

push "redirect-gateway def1 bypass-dns"

4.3.5、修改DNS二

指定拨号用户使用OpenVPN下发的DNS解析域名(使用场景:内网有绿色DNS或者需要解析内网域名)。

push "dhcp-option DNS 192.168.1.100" #填写自己内网的DNS服务器IP

4.4、创建用户

yydy_2024-03-02_14-47-49
yydy_2024-03-02_14-50-48

4.5、修改用户密码

yydy_2024-03-02_14-51-53
yydy_2024-03-02_14-52-17

4.6、下载用户配置文件

yydy_2024-03-02_14-52-50

五、客户端连接测试

Image 1 Image 2 Image 3

5.1、前后路由对比

测试server.conf文件中定义全部用户全局走VPN,所以可以看到有0.0.0.0的路由。

yydy_2024-03-02_15-01-20

5.2、tracert路径对比

yydy_2024-03-02_15-02-40

六、Web日志查看

6.1、首页

yydy_2024-03-02_15-22-02

6.2、会话管理

yydy_2024-03-02_15-22-43

6.3、日志管理

yydy_2024-03-02_15-23-25
yydy_2024-03-02_15-23-35

七、CCD自定义路由

说明1:所有用户默认都是使用参数配置里面的配置连接,默认配置如果是全局路由(push "redirect-gateway def1 bypass-dhcp")情况,则所有用户都是全局走VPN,默认配置如果是明细路由(push "route 8.8.8.8 255.255.255.255" )情况,则用户只走明细路由。当前默认配置是明细路由走VPN,可以通过ccd配置文件,自定义单个用户下发全局路由表,以达到控制单用户访问权限。

说明2:免费版不支持web配置ccd,企业版支持,如果需要可以为知识付费,下面介绍免费版配置方法,需要进入底层配置。

7.1、进入目录

/root/openvpn/run/ccd

7.2、创建配置文件

上面我们创建了一个young用户,这里我们就指定该用户下发自定义全局路由。

nano young
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.100" #可选,全局走VPN,如果内网有绿色DNS则添加

7.3、分流路径测试

明细情况下,谷歌dns分流走VPN,阿里云dns分流走本地。

yydy_2024-03-02_16-46-50

7.4、验证ccd配置

保存ccd中young的配置文件后,客户端重新连接发现谷歌和阿里dns全走VPN。

yydy_2024-03-02_16-49-42

八、谷歌微软路由表

OpenVPN格式-谷歌+微软路由表