在实际场景中,我们常需要 OpenVPN 仅对特定内网网段生效,而浏览外网、访问其他资源时仍使用本地网络,避免所有流量都经过 VPN 隧道。本文基于kylemanna/openvpn镜像,详细讲解 Docker 部署 OpenVPN 的完整流程,并重点说明如何配置 “特定网段走 VPN,默认走本地网关”。
一、环境准备与初始化
1. 创建数据存储目录
首先创建用于挂载 OpenVPN 配置、证书的目录(确保权限正确):
♾️ bash 代码:mkdir -p /vol1/1000/Docker/openvpn
chmod 755 /vol1/1000/Docker/openvpn # 避免容器内权限不足2. 生成服务器基础配置
使用镜像自带的ovpn_genconfig工具生成初始配置,需指定公网访问地址(域名或 IP):
docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://[此处填写ddns域名或者公网IP]
执行说明:
- 命令会在
/vol1/1000/Docker/openvpn目录生成openvpn.conf(主配置)、ovpn_env.sh(环境变量)等文件。 - 初始配置默认会推送 “全量路由”(所有流量走 VPN),后续需修改此行为。
操作步骤:
输入 CA 证书的密码(牢记,后续生成客户端证书时需用到)。

输入 Common Name(自定义名称,如
openvpn-server),直接回车默认即可。
等待工具自动生成 CA、服务器证书、DH 参数等(生成过程可能需要几分钟)。

二、核心配置:仅特定网段走 VPN
默认配置会让所有流量通过 VPN,需修改环境变量和服务器配置,实现 “仅指定网段走 VPN,其他流量走本地网关”。
1. 修改环境变量(ovpn_env.sh)
环境变量文件控制路由推送、NAT 等核心功能:
♾️ bash 代码:# 在宿主机编辑文件
nano /vol1/1000/Docker/openvpn/ovpn_env.sh替换为以下内容(关键修改已标注):
♾️ bash 代码:# 基础配置(保留默认值,修改以下关键项)
export OVPN_DEFROUTE=0 # 禁用默认路由推送(核心:避免所有流量走VPN)
export OVPN_NAT=1 # 启用NAT转换(解决目标网段回程流量问题)
# 仅推送以下网段走VPN(用空格分隔,替换为你的实际网段)
export OVPN_ROUTES="10.1.0.0/16 192.168.1.0/24 192.168.40.0/24 192.168.50.0/24 192.168.97.0/24"
# 其他默认配置保持不变(如端口、DNS等)
export OVPN_DNS=1
export OVPN_DNS_SERVERS="8.8.8.8 8.8.4.4" # 按需保留或删除
export OVPN_PORT=1194
export OVPN_PROTO=udp
export OVPN_SERVER=192.168.255.0/24 # VPN虚拟网段(默认即可)保存后设置权限:
♾️ bash 代码:chmod +x /vol1/1000/Docker/openvpn/ovpn_env.sh # 赋予执行权限2. 调整服务器配置(openvpn.conf)
确保配置与环境变量协同,避免冲突:
♾️ bash 代码:# 在宿主机编辑
nano /vol1/1000/Docker/openvpn/openvpn.conf添加 / 修改以下内容:
♾️ bash 代码:# 禁用客户端拉取默认路由(与OVPN_DEFROUTE=0呼应)
push "route-nopull"
# 保留服务器端对目标网段的路由(确保服务器能访问这些网段)
route 10.1.0.0 255.255.0.0
route 192.168.1.0 255.255.255.0
route 192.168.40.0 255.255.255.0
route 192.168.50.0 255.255.255.0
route 192.168.97.0 255.255.255.0
# 其他默认配置保持不变(证书路径、端口等)三、启动 OpenVPN 服务器
使用以下命令启动容器,确保赋予网络管理权限和 IP 转发能力:
♾️ bash 代码:docker run -d \
-v /vol1/1000/Docker/openvpn:/etc/openvpn \
-p 1194:1194/udp \
--cap-add=NET_ADMIN \ # 必需:允许容器管理网络(路由、NAT等)
--sysctl net.ipv4.ip_forward=1 \ # 启用IP转发(关键:允许流量中转)
--name openvpn-server \
--restart=always \
kylemanna/openvpn四、生成客户端配置文件
1. 生成客户端证书
为用户(如admin)生成证书(需输入 CA 密码和客户端证书密码):
docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full admin
操作说明:
- 将上述命令中的
admin替换为你要新增的实际用户名 - 执行第一条命令时,会提示输入 PEM 密码(用于保护客户端证书),以及 CA 的密码(初始化时设置的)
2. 导出客户端配置(.ovpn)
生成可直接导入 OpenVPN 客户端的配置文件:
♾️ bash 代码:docker run --rm -v /vol1/1000/Docker/openvpn:/etc/openvpn kylemanna/openvpn ovpn_getclient admin > /vol1/1000/Docker/openvpn/admin.ovpn
打开配置文件,admin.ovpn
说明:生成的admin.ovpn已包含证书、密钥及服务器推送的路由配置,无需额外修改。
五、验证配置是否生效
1.客户端连接后验证路由
客户端导入admin.ovpn并连接,执行以下命令检查路由表:
- Windows:
route print,确认10.1.0.0/16、192.168.1.0/24等网段的网关为 VPN 分配的虚拟 IP(如192.168.255.x),而0.0.0.0默认路由的网关仍为本地路由器 IP(如192.168.31.1)。 - Linux/macOS:
ip route或route -n,验证逻辑同上。
2.测试连通性
- 访问
OVPN_ROUTES中的网段(如192.168.1.1),应能正常通信(走 VPN)。 - 访问外网(如
ping 8.8.8.8),应通过本地网关(可在路由器后台查看流量走向)。
通过以上步骤,即可实现 “仅特定网段走 VPN,默认流量保留本地网关” 的需求,兼顾内网访问和外网速度。










多吃一点点
渝公网安备50022202000535号


