向 OpenVPN 客户端配置添加路由
OpenVPN 在客户端配置中支持按子网的 route 指令。NetRoute Pro 从任何网站的域名生成这些指令 — 添加到 .ovpn 中,几分钟内即可实现分流。
命令语法
语法:
route <NETWORK> <NETMASK>
示例:
route 1.1.1.0 255.255.255.0
将这些指令添加到客户端的 .ovpn 文件。配合 route-nopull 仅这些路由通过 VPN。参见 OpenVPN 2.6 手册。
准备工作
- OpenVPN 2.4 或更高版本(客户端和服务器)
- 对
.ovpn配置文件的编辑权限 - 任何 OpenVPN 客户端:官方 OpenVPN Connect、Tunnelblick、Viscosity、openvpn CLI 等
- 已安装 NetRoute Pro Chrome 扩展
步骤 1. 在 NetRoute Pro 中生成 route 指令
- 在 Chrome 中打开目标网站
- 启动 NetRoute Pro,选择 OpenVPN 平台
- 点击 Analyze Website
- 复制输出 — 格式:每行一个 route 指令
route 104.21.32.0 255.255.255.0
route 172.67.0.0 255.255.0.0
route 198.41.128.0 255.255.128.0
步骤 2. 编辑 .ovpn
- 用文本编辑器打开您的
.ovpn文件 - 删除
redirect-gateway def1(如果存在)— 该指令将所有流量路由到 VPN,会破坏分流 - 删除
push "redirect-gateway def1"(如果有) - 粘贴 route 指令到文件末尾 — 在
<cert>/<key>/<ca>块之前 - 保存文件
配置应类似:
client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
# 选择性路由(由 NetRoute Pro 生成)
route 104.21.32.0 255.255.255.0
route 172.67.0.0 255.255.0.0
<ca>
...
</ca>
步骤 3. 重新连接 VPN
断开并重新连接客户端以应用新路由。OpenVPN 仅在连接时读取 route 指令 — 运行时更改不会生效。
替代方案:服务器端路由(用于管理员)
如果您控制 OpenVPN 服务器,可以将路由推送到所有客户端。在服务器配置中:
push "route 104.21.32.0 255.255.255.0"
push "route 172.67.0.0 255.255.0.0"
客户端连接时自动接收路由 — 无需编辑每个 .ovpn。
DNS 泄漏 — 必读
本指南按 IP 路由流量。它不路由 DNS。浏览器仍然向系统解析器(通常是 ISP 的)询问 example.com 的 IP — 只有结果 IP 流量才通过隧道。使用 route-nopull 时情况更糟:服务端推送的 DNS 也被丢弃,所有 DNS 走默认解析器。
根据你的威胁模型,三种选择:
- 使用 VPN 解析器对 ISP 隐藏 DNS。用选择性
pull-filter替代完整的route-nopull— 仅丢弃 redirect-gateway,保留 DNS 推送:
在 Windows 上,同时添加pull-filter ignore "redirect-gateway" pull-filter accept "dhcp-option DNS"block-outside-dns防止系统并行向 DHCP 提供的 DNS 发起查询。 - 降低 ISP 可见性(公共 DoH/DoT)。在系统级配置公共加密解析器(Cloudflare 1.1.1.1、AdGuard、Quad9)。ISP 不再看到域名查询;公共解析器会看到。
- 接受泄漏。如果你的目标是访问内容而非规避监控,这没问题 — 数据路径仍然加密。
用 dnsleaktest.com 或 browserleaks.com/dns 验证 — 显示的解析器应与你配置的一致,而非 ISP。
IPv6 双栈绕过
OpenVPN 的 route 指令仅适用于 IPv4。如果目标有 AAAA 记录(大多数热门站点都有),系统按 RFC 6724 优先选择 IPv6 — 该流量绕过隧道,从 ISP 默认 v6 路由出去。
两种解决方案:
- 为 v6 镜像路由(如果 VPN 支持 IPv6)使用
route-ipv6:
全部 v6 流量走隧道:添加route-ipv6 2606:4700::/32 route-ipv6 2001:4860::/32redirect-gateway ipv6(或服务端推送)。 - 完全阻止 v6,如果 VPN 没有 IPv6 端点 — 在系统上禁用 IPv6 或用防火墙规则拒绝 v6 出站。否则双栈站点会静默泄漏。
验证
连接后检查路由表:
- Windows:
route print - Linux / macOS:
ip route或netstat -rn
您应该看到子网指向 VPN tun 接口。
常见问题
--route 指令被忽略
常见原因:
- 服务端推送
redirect-gateway def1— 这会覆盖你本地的route行(所有流量都走 VPN)。在客户端配置中加入pull-filter ignore "redirect-gateway",仅丢弃此推送而保留其他服务端推送。 - 你的
route指令放在了<cert>、<key>等内联块内 — 移到外面。 - 语法错误 — 该指令使用
NETWORK NETMASK点分十进制,不是 CIDR。应使用route 1.1.1.0 255.255.255.0,不是route 1.1.1.0/24。
注意: route-nopull 不会导致本地 route 指令被忽略 — 它只会丢弃服务端推送的路由。客户端配置中的本地 route 行仍会生效,这正是 split tunneling 所需要的。
DNS 泄漏(Windows)
添加以下指令以防止 DNS 查询绕过 VPN:
block-outside-dns
路由已添加但流量未通过 VPN
通常表示 VPN 接口上没有 NAT — 需在服务器端修复。验证服务器配置中存在 push "route ..." 且 iptables/防火墙上启用了相应子网的 masquerade。
配置文件示例
带注释的可编辑模板。将示例路由替换为 NetRoute Pro 为目标网站生成的输出。
openvpn-routes.ovpn— OpenVPN 客户端配置片段,包含route指令
# Example OpenVPN client config snippet for split tunneling.
# Generated by NetRoute Pro: https://alexander2k.github.io/netroute-site/
#
# Append these directives to your existing client .ovpn file. With route-nopull
# the server's pushed routes are ignored — only the explicit `route` lines below
# go through the VPN. Reconnect the client after editing.
route-nopull
# Format: route <NETWORK> <NETMASK>
# Replace these example networks with output from NetRoute Pro.
route 1.1.1.0 255.255.255.0
route 8.8.8.0 255.255.255.0
route 162.159.0.0 255.255.0.0
# Verify after reconnect: openvpn3 sessions-list (or) netstat -rn
提示:需要不带注释行的配置?在 NetRoute Pro 选项中取消勾选 「在导出文件中包含注释」,扩展将仅导出路由命令。适用于不支持注释的路由器。