返回文章列表

OpenVPN Split Tunnel:只让内网流量走 VPN

分流策略可以兼顾内网访问和公网直连体验,但必须补齐服务端路由、IP 转发和回程路由。

知识库依据

基于《来源_OpenVPN部署与内网分流》《概念_内网分流_Split_Tunnel》和工程基础设施平台实体页整理。

为什么要分流

全局 VPN 会让所有流量都经过公司网络,简单但影响体验,也可能让公网访问变慢。Split Tunnel 的目标是只让公司内网网段走 VPN,其他公网流量仍然走本地网络。

这种模式适合远程访问内网 GitLab、Jenkins、Wiki、测试服务等场景。

  • 保留公网直连体验。
  • 只推送公司内网网段路由。
  • 减少 VPN 服务器带宽压力。
  • 降低排障复杂度。

服务端配置要点

OpenVPN 服务端不要推送 redirect-gateway,而是 push 指定内网路由。服务器本身需要开启 IP 转发,防火墙允许转发,内网目标机器要知道如何把回包返回 VPN 客户端网段。

很多分流失败不是客户端问题,而是回程路由缺失。客户端能把包发进去,但内网机器不知道怎么回。

  • 关闭 redirect-gateway。
  • push route 只推送内网 CIDR。
  • 开启 net.ipv4.ip_forward。
  • 补齐 NAT 或内网回程路由。

验收方式

验收要同时看内网和公网。连接 VPN 后,内网服务应该可访问;访问公网查出口 IP,应该仍然是本地网络出口。再用 route 或 netstat 检查目标网段路由是否进入 tun 设备。

把这些检查写进 SOP,新成员接入时会省很多沟通。

  • ping 或 curl 内网服务。
  • 检查公网出口 IP 未变化。
  • 查看路由表是否包含内网网段。
  • 断开 VPN 后内网不可达。

分流的关键是路由,而不是客户端按钮

OpenVPN Split Tunnel 的核心不是客户端界面上选不选全局代理,而是服务端到底 push 了哪些 route。知识库里明确建议不要推送 redirect-gateway,而是只推送公司内网 CIDR。

这样连接 VPN 后,访问内网 GitLab、Jenkins、Wiki 会走 tun 设备,访问普通公网仍然走本地出口。

  • 不 push redirect-gateway。
  • 只 push 需要访问的内网网段。
  • 客户端路由表能看到内网 CIDR 指向 tun。
  • 公网出口 IP 不应因为连接 VPN 改变。

服务端必须能转发

客户端把包发到 VPN 服务端后,服务端还要能把包转发到内网目标机器。这需要开启 net.ipv4.ip_forward,并配置防火墙允许转发。

如果这一步缺失,客户端看起来连接成功,但访问内网服务会超时。

  • 开启 net.ipv4.ip_forward=1。
  • 防火墙放行 OpenVPN 端口,默认 UDP 1194。
  • 允许 tun 网段到内网网段转发。
  • 必要时配置 NAT。

回程路由经常被忽略

很多 Split Tunnel 失败是回程路由问题。内网目标机器收到来自 VPN 客户端网段的请求后,不知道如何回包。解决方式有两类:在内网网关添加回程路由,或在 VPN 服务端做 NAT。

前者更清晰,后者更容易快速落地。选择哪种取决于你是否能控制内网网关。

  • 能改内网网关时,添加 VPN 客户端网段回程路由。
  • 不能改网关时,在 VPN 服务端做 SNAT/MASQUERADE。
  • 用 tcpdump 分别看请求是否到达、回包是否返回。
  • 把路由拓扑写进部署文档。

新成员接入检查

OpenVPN 最好有一页新成员接入检查表。证书、配置文件、客户端版本、DNS、路由和内网服务列表都写清楚,可以减少大量重复沟通。

尤其是只让内网流量走 VPN 的场景,用户很容易误以为所有流量都被代理。文档里要明确这个设计目标。

  • 连接后能访问内网 GitLab/Jenkins/Wiki。
  • 公网出口 IP 保持本地网络。
  • 断开 VPN 后内网不可访问。
  • 证书丢失或离职时能及时吊销。