首页
/
排错调优
/

分流(Split Tunneling)的原理:用路由表决定哪些流量走隧道

排错调优

分流(Split Tunneling)的原理:用路由表决定哪些流量走隧道

分流不是一个独立功能,而是路由表的结果:目标地址匹配了隧道路由就进隧道,否则走本地网卡。本文从路由表讲起,给出各协议的写法和排错思路。

分流(Split Tunneling)的原理:用路由表决定哪些流量走隧道 封面

分流在客户端里常被做成一个开关,实际上它没有独立的实现,就是路由表的结果:目标地址匹配了隧道的路由就进隧道,匹配不到就走本地网卡。把这一点理解透,分流的大部分疑难都能用 route print 或 ip route 解决。

数据包如何选择网卡
数据包如何选择网卡

分流在哪一层实现

常见的分流粒度有三种:按目标地址分流(路由层)、按应用分流(系统提供的应用级 VPN 接口,如移动系统的按应用选择)、按域名分流(先解析再动态加路由)。后两种都依赖客户端自己的实现,路由层最基础也最可预测。

路由表怎么决定流量去向

系统在发包时按目标地址做最长前缀匹配,前缀越长越优先。所以即使隧道安装了 0.0.0.0/0,只要本地网卡上有一条更长的直连网段路由,该网段的流量仍然不会进隧道。

各协议的写法

WireGuard 用 AllowedIPs 指定要进隧道的网段:

[Peer]
AllowedIPs = 10.0.0.0/8, 192.168.50.0/24

OpenVPN 用 route-nopull 忽略服务端推送的路由,再自己列出要走隧道的网段;反过来,要让某个网段不走隧道,用 net_gateway 指向本地网关:

route-nopull
route 10.0.0.0 255.0.0.0
# 或者全局走隧道,只排除一个网段
route 203.0.113.0 255.255.255.0 net_gateway

Windows 手动加路由用 route add 10.0.0.0 mask 255.0.0.0 10.8.0.1,加 -p 可以让它在重启后保留。

AllowedIPs 为什么不能直接排除某个网段

AllowedIPs 是只能“包含”的列表,没有“减去”的语法。想要“除了 192.168.0.0/16 以外都走隧道”,需要把 0.0.0.0/0 拆成一组不包含该网段的 CIDR,比手工计算更稳妥的是用脚本生成,或用 Table = off 禁用 wg-quick 自动添加路由,再自己用 ip route 写。

本地网段和对端网段冲突怎么办

家用路由器常见的 192.168.1.0/24 和公司内网重叠时,访问内网的包会被本地网卡的直连路由拦下。最彻底的办法是改家里的网段;不能改时,可以在隧道两端做地址转换,或者提高隧道路由的前缀长度,例如把 /24 拆成两个 /25。

Linux 上的策略路由

需要按源地址或标记分流时,可以用策略路由:先建一张独立的路由表,再用 ip rule 让特定源地址或 fwmark 查这张表。

ip route add default dev wg0 table 100
ip rule add from 192.168.1.50 table 100

这样只有 192.168.1.50 这台机器的流量走隧道,其他机器不受影响。

分流方式对照

方式粒度适用场景
按目标网段CIDR只访问内网或固定服务器
按源地址 / 标记机器或进程路由器、网关场景
按应用单个应用手机、桌面客户端
按域名域名目标地址不固定的服务

按域名分流为什么不稳定

域名分流要先解析出地址再把地址加进路由。地址变化、CDN 轮换和 DNS 缓存都会让路由和实际访问的地址对不上,表现为同一个网站时好时坏。需要稳定时,优先使用目标网段或应用级分流。

分流不生效时的自查清单
分流不生效时的自查清单
分流
路由
AllowedIPs
OpenVPN
WireGuard

相关文章

链路笔记

链路笔记:分享网络与隐私工程的实践笔记,涵盖协议原理、加密与隐私、连接排错与性能调优。

© 2026 链路笔记