网站背景图
多吃一点点 有时候读书就是一种巧妙地避开思考的方法。——赫尔普斯
博主

9月16日在线

多吃一点点
对自我不满是任何真正有才能的人的根本特征之一。──契诃夫
博主 多吃一点点
本网站由 又拍云图标 提供cdn加速/云存储服务器
博主 9月16日 在线自豪地使用 Typecho 建站搭配使用 🌻Sunny 主题当前在线 3 人

ICP备案图标 渝ICP备2025049634号

公安备案图标 渝公网安备50022202000535号

本网站由

又拍云图标

提供cdn加速/云存储服务器

Powered by Typecho & Sunny

4 online · 1.487 s

Title

Docker 部署 OpenVPN:仅特定网段走 VPN,默认流量保留本地网关

多吃一点点

·

网络分享

·

Article

在实际场景中,我们常需要 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):

♾️ bash 代码:
docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://[此处填写ddns域名或者公网IP]
2025-09-12T05:55:47.png
执行说明

  • 命令会在/vol1/1000/Docker/openvpn目录生成openvpn.conf(主配置)、ovpn_env.sh(环境变量)等文件。
  • 初始配置默认会推送 “全量路由”(所有流量走 VPN),后续需修改此行为。

操作步骤

  1. 输入 CA 证书的密码(牢记,后续生成客户端证书时需用到)。

    2025-09-12T05:56:59.png

  2. 输入 Common Name(自定义名称,如openvpn-server),直接回车默认即可。

    2025-09-12T05:57:12.png
  3. 等待工具自动生成 CA、服务器证书、DH 参数等(生成过程可能需要几分钟)。

    2025-09-12T05:57:21.png

二、核心配置:仅特定网段走 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 密码和客户端证书密码):

♾️ bash 代码:
docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full admin

2025-09-12T05:57:47.png
操作说明:

  1. 将上述命令中的admin替换为你要新增的实际用户名
  2. 执行第一条命令时,会提示输入 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

2025-09-12T05:58:04.png
打开配置文件,admin.ovpn
2025-09-12T05:58:18.png
说明:生成的admin.ovpn已包含证书、密钥及服务器推送的路由配置,无需额外修改。

五、验证配置是否生效

1.客户端连接后验证路由

客户端导入admin.ovpn并连接,执行以下命令检查路由表:

  • Windowsroute print,确认10.1.0.0/16192.168.1.0/24等网段的网关为 VPN 分配的虚拟 IP(如192.168.255.x),而0.0.0.0默认路由的网关仍为本地路由器 IP(如192.168.31.1)。
  • Linux/macOSip routeroute -n,验证逻辑同上。

2.测试连通性

  • 访问OVPN_ROUTES中的网段(如192.168.1.1),应能正常通信(走 VPN)。
  • 访问外网(如ping 8.8.8.8),应通过本地网关(可在路由器后台查看流量走向)。

通过以上步骤,即可实现 “仅特定网段走 VPN,默认流量保留本地网关” 的需求,兼顾内网访问和外网速度。

现在已有 265 次阅读,0 条评论,0 人点赞
Author:多吃一点点
作者
Docker 部署 OpenVPN:仅特定网段走 VPN,默认流量保留本地网关
当前文章累计共 4181 字,阅读大概需要 3 分钟。
群晖NAS搭建VPN Server ——L2TPIPSEC
2025年8月6日 · 0评论
ZABBIX-监控华为无线AP
2025年7月30日 · 0评论
Cisco Nexus VPC配置向导
2025年8月14日 · 0评论
Comment:共0条
发表
搜索 消息 足迹
你还不曾留言过..
你还不曾留下足迹..
博主 不再显示
博主
未知作品 歌曲封面
博主 立即安装
前往评论 切换字号