TUN绕过路由的核心功能定义与工作位置
在系统路由表层面实施流量豁免的底层机制
tun-excluded-routes是Shadowrocket配置文件[General]段落中的一项高级路由控制参数,它允许用户定义一组特定的IP地址段或子网,这些目标网络在VPN隧道激活时将完全绕过虚拟网卡的转发路径,直接通过设备的物理网络接口发出。与常规的分流规则不同,该参数作用于系统路由表的最底层,在数据包进入Shadowrocket的网络扩展进程之前就已经被排除在外,因此其优先级高于配置文件中的任何规则列表和策略组定义。当用户需要确保某些关键网络流量绝对不经过代理通道且不受任何规则干扰时,通过该参数实现的路由级别直连是最可靠且最高效的手段。
与分流规则中DIRECT策略的本质优先级差异
配置文件中通过DOMAIN-SUFFIX,DIRECT或IP-CIDR,DIRECT等规则实现的直连是在应用层规则引擎内完成的,数据包需要经过完整的规则匹配遍历才能最终被标记为直连并放行。而tun-excluded-routes是在系统路由层面将特定目标IP段直接排除在虚拟网卡之外,这些目标地址的数据包在源头处就被路由表导向物理网卡,完全绕过了Shadowrocket的网络扩展进程和规则引擎,匹配效率极高且不受任何配置文件加载状态的影响。这种底层的绕过机制使得即使在全局代理模式下,被排除的路由目标依然能够保持直连,其优先级高于任何应用层的策略配置。
该参数主要解决的关键使用场景问题
tun-excluded-routes的设计初衷是为了解决代理工具与企业内部网络、本地NAS存储或特定运营商服务之间的访问冲突,当用户需要访问公司内网的OA系统、家庭NAS设备或特定的本地服务器时,如果这些目标地址被VPN隧道拦截并尝试通过代理节点转发,访问将因路由不可达而完全失败。通过将这些内网地址段加入绕过路由列表,用户可以在保持Shadowrocket全程连接的同时,确保内网资源始终直连可达,无需在访问内网时手动断开VPN或切换路由模式。该参数同样是解决全局代理模式下国内网站访问因代理出口IP问题而无法正常加载的终极手段,通过将中国大陆IP段整体加入绕过列表,实现国内流量在路由层面的直接直连。
配置文件的编辑定位与参数语法规范
在[General]段落中正确添加参数行
tun-excluded-routes参数必须放置在Shadowrocket配置文件的[General]段落中,该段落通常位于配置文件的顶部区域,包含了日志级别、DNS超时和IPv6开关等全局基础设置。用户需要在[General]段落中新增一行“tun-excluded-routes = 目标地址段”,参数名与等号之间、等号与值之间各保留一个英文空格,多个地址段之间使用英文逗号分隔。如果配置文件中已经存在该参数行,则直接修改等号后的列表内容即可,如果不存在则添加新行,注意文件中只应保留一行该参数定义,避免多行定义导致解析引擎行为不确定。
多地址段的合并写法与CIDR格式要求
当用户需要绕过多个不同的IP地址段时,可以将所有子网地址以逗号分隔的形式写在同一行中,例如“tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12”。所有目标地址必须使用标准的CIDR(无类别域间路由)格式表示,单个IP地址后面必须跟随“/32”前缀以表示精确匹配该单一地址。地址段之间使用英文逗号分隔且逗号后留有一个空格是可读性优化的写法,引擎解析时能够正确处理该格式。如果列表过长,用户也可以将多个地址段分行书写,每行使用一个独立的tun-excluded-routes参数,引擎会将所有行的值合并处理。
配置文件保存与重载的生效前置条件
完成参数行的添加或修改后,用户需要点击配置文本编辑器的“保存”按钮将更改写入文件系统,然后返回Shadowrocket的配置页面,点击“重新加载”按钮执行配置重载操作。重载完成后,如果VPN连接处于已激活状态,建议用户手动断开并重新建立VPN连接,因为tun-excluded-routes参数的生效需要VPN隧道完全重建并重新分配路由表条目,单纯的配置重载不足以让新的路由排除规则生效。重新连接后,被排除的目标地址段应立即以直连方式访问,用户可通过ping或traceroute命令验证路由路径的变化。
内网与局域网地址段的典型排除配置
标准私有IP地址段的完整绕过方案
在绝大多数家庭和办公网络环境中,内网设备均使用私有IP地址段进行通信,包括192.168.0.0/16(常见于家用路由器)、10.0.0.0/8(常见于企业网络和大型局域网)以及172.16.0.0/12(部分企业网络使用的B类私有段)。将这些地址段整体加入tun-excluded-routes列表后,所有访问内网路由器、NAS存储、网络打印机和局域网其他设备的请求都将完全不经过VPN隧道,直接通过本地物理网络接口发出。这样配置后,用户即使在全局代理模式下也可以无障碍访问路由器管理页面,无需在每次需要配置网络时临时断开VPN。
链路本地与回环地址的必要排除
链路本地地址段169.254.0.0/16用于设备在没有DHCP服务器时自动分配的IP地址,本地回环地址127.0.0.0/8用于设备内部进程间的通信,这两个地址段虽然在实际使用中极少被用户直接访问,但将其加入tun-excluded-routes列表可以避免因路由错误导致的系统内部通信异常。某些系统服务和后台进程依赖于这些地址的正常可达性,如果它们被错误地导向VPN隧道,可能导致系统功能异常或应用启动失败。将这些保留地址段排除在VPN转发之外是最基础的安全配置,能够确保设备的核心网络功能在任何代理策略下均保持正常运行。
特定内网服务域名的IP段提前确认技巧
用户若不确定需要访问的内网服务具体属于哪个IP段,可以在连接内网WiFi后通过终端命令“ping 内网服务域名”或“nslookup 内网服务域名”获取其解析返回的IP地址,然后根据该IP所属的子网范围确定需要添加的CIDR地址段。例如企业OA系统的IP为10.2.3.45,则对应的子网可能是10.0.0.0/8或更精确的10.2.0.0/16,用户可以根据内网规划选择精确匹配的段或使用更宽泛的段进行覆盖。添加后通过访问该内网服务验证配置是否生效,如果依然无法访问则检查添加的地址段是否准确覆盖了目标IP。
运营商特定IP段与国内网站优化排除
将运营商网络设备地址排除避免隧道失效
当用户在移动网络或特定运营商的宽带网络下使用Shadowrocket时,运营商的网络探测或NAT服务节点可能使用特定IP段进行通信,如果这些地址被错误地导向VPN隧道,可能导致连接状态检测异常或网络质量评估失真。虽然这些IP段的具体范围因运营商而异且不对外公开,用户通常无需主动将其加入排除列表,因为默认的tun-excluded-routes配置已包含了所有标准私有地址段,足以覆盖绝大多数运营商内网通信场景。仅在访问运营商提供的特定服务(如IPTV、VoLTE)出现异常时,才需考虑通过抓包分析获取相关IP段并手动添加排除。
为国内主流CDN节点保留直连通道
中国境内的内容分发网络(CDN)节点IP地址段通常属于中国大陆的公共IP范围,这些地址在全球代理模式下如果被隧道拦截,可能导致国内网站的加载速度因代理绕路而急剧下降。虽然用户无法将全部中国大陆IP段完整罗列,但可以通过将已知的常用CDN段或特定运营商的AS号对应的IP段加入tun-excluded-routes列表,优化高频访问服务的直连体验。对于绝大多数用户而言,直接在分流规则中使用GEOIP,CN规则实现国内流量直连更为简便且覆盖面更广,tun-excluded-routes更适合处理那些无法通过规则引擎控制的路由层需求。
避免过度排除导致代理覆盖范围缩水
在将国内IP段或运营商段加入tun-excluded-routes时,用户应当注意不要将整个中国所有公网IP地址全部排除,否则VPN隧道的代理覆盖范围会被大幅缩减,导致大量原本需要代理访问的境外服务因IP段被误排除而无法走代理。更合理的做法是仅排除明确需要直连且不会被代理影响功能的内网和本地地址段,对于公网流量则交由配置文件中的规则引擎通过GEOIP和域名规则进行精细分流。过度使用tun-excluded-routes会削弱代理工具的整体效能,使Shadowrocket退化为一款单纯的VPN连接工具。
全局代理模式下的tun-excluded-routes关键作用
在强制全局代理中开辟直连豁免通道
当用户将Shadowrocket的路由模式切换为全局代理时,所有流量被强制走代理节点而完全忽略配置文件中的规则列表,此时如果用户需要访问内网NAS或路由器管理页面,常规的IP-CIDR直连规则已经失效,只有tun-excluded-routes中定义的地址段能够在路由层面实现直连。这一特性使得全局代理模式不再是与内网访问互斥的状态,用户可以在保持全局代理的同时通过预先配置的排除列表确保关键内网服务始终可访问。对于需要在全局代理下同时使用本地设备的企业用户来说,tun-excluded-routes是从全局代理中开辟局部直连通道的唯一合法手段。
解决全局代理下本地打印机和NAS无法访问的困境
在公司或家庭网络中,网络打印机、NAS存储设备和智能家居中枢通常位于私有IP地址段中,这些设备不支持也无法通过代理节点访问。当用户启用全局代理后,访问这些设备的请求会因尝试通过代理转发而超时,用户必须在访问内网设备时手动关闭VPN或切换至直连模式。将192.168.0.0/16和10.0.0.0/8等内网段加入tun-excluded-routes后,即使处于全局代理模式,访问这些内网设备的流量也会自动走本地物理网卡直连,实现了全局代理与内网访问的完美共存。
排除列表在全局代理下的优先级实测验证
用户可以通过在全局代理模式下访问一个已被加入tun-excluded-routes的内网设备,同时打开Shadowrocket的实时日志观察该请求是否在日志中出现任何匹配记录,如果日志中完全没有该请求的相关条目则证明该请求在路由层直接被排除,未经过任何应用层的处理。再访问一个未被排除的境外网站,日志中应正常显示该请求通过代理节点转发的完整流程,两者并行不悖地共存。这种对比测试直观证明了tun-excluded-routes在全局代理下的绝对优先权,确认其作为路由层排除机制而非应用层规则的独立地位。
配置后的验证方法、常见错误与回退方案
通过路由追踪命令确认排除是否生效
配置并重新连接VPN后,用户可在终端(通过iSH Shell或电脑)执行“traceroute 目标IP地址”命令查看数据包从设备到目标所经过的路由跳数,如果第一跳显示为本地网关地址而非VPN虚拟网卡地址,则说明该目标IP已被成功排除在VPN隧道之外。对于Windows用户可使用“tracert”命令,对于macOS用户使用“traceroute -n”命令,观察路由输出中的接口信息来判断流量是否绕过了虚拟网卡。如果路由追踪结果显示数据包仍然经过了VPN虚拟接口,则说明排除配置未正确生效,需要检查CIDR格式的准确性或重新加载配置文件。
排除列表格式错误导致的整行配置失效
用户最常见的配置错误是在地址段中遗漏了CIDR前缀(如“192.168.1.0”缺少“/24”),或使用了非标准的子网掩码格式导致引擎无法正确解析该条目。当配置文件中的任意一条tun-excluded-routes格式不正确时,引擎可能会跳过整行参数,导致所有排除规则均不生效。用户应在添加每个地址段时确认其书写格式符合CIDR标准,并在保存配置后立即通过重新连接VPN验证排除效果,若发现排除失效则首先检查参数行的拼写和格式是否规范,并使用在线CIDR计算器验证子网表述的正确性。
超出参数行长度限制的换行处理
配置文件中单行参数存在长度限制,当用户需要排除大量地址段导致单行过长时,引擎可能截断该行后面的内容。此时用户可将地址段分成多行书写,每行使用一个独立的“tun-excluded-routes = 地址段”参数,引擎会自动合并多个参数行的值。但需注意,不同版本的Shadowrocket对多行tun-excluded-routes的支持存在差异,最稳妥的方案是保持单行书写并使用英文逗号分隔,若长度超限则移除部分非必需段或使用更宽泛的CIDR段进行合并,减少条目总数。
常见问题FAQ
tun-excluded-routes添加后立即生效吗?
不立即生效。该参数在配置文件保存后需要用户手动断开并重新建立VPN连接才能生效,因为路由表的修改发生在VPN隧道重建时。配置重载不足以让新的排除规则写入系统路由表,必须执行完全的重连操作。
添加排除后如何确认该段确实绕过了VPN?
最可靠的方式是在连接VPN后执行路由追踪命令观察第一跳是否为本机网关,或访问该段内的目标IP并检查Shadowrocket日志中是否出现该请求的记录。若日志中完全没有该请求且访问成功,则证明排除已生效。
排除列表中的地址段优先级高于所有规则吗?
是的。tun-excluded-routes在路由层面工作,其优先级高于配置文件中的任何分流规则和策略组。一旦某个IP地址被加入排除列表,该地址的所有请求在系统路由层面就直接被指向物理网卡,规则引擎甚至不会处理该请求。
误加了错误的大段地址导致代理失效如何快速回退?
立即进入配置文件将tun-excluded-routes参数行删除或整行注释掉(在行首添加#号),保存后重新加载配置并重连VPN即可恢复所有流量的正常代理路径。若无法编辑配置文件,可临时切换至配置模式绕开全局代理的强制转发。
