Android中如何将指定网站从VPN tun0接口排除并走wlan0
VPN分流排除特定网站失效的修正方案
修复重复解析IP的冗余逻辑
你当前代码里重复调用InetAddress.getByName(address)完全没必要,直接用循环中已拿到的ipAddress即可,多余的解析操作可能导致IP不匹配,修正后代码:InetAddress[] inetAddresses = InetAddress.getAllByName("www.speedtest.net"); for (InetAddress ipAddress : inetAddresses) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { builder.excludeRoute(new IpPrefix(ipAddress, 32)); } }调整配置顺序
排除路由的代码必须放在addAllowedApplication()之后执行。如果先设置排除路由再添加允许应用,规则会被覆盖,导致排除失效。兼容IPv6地址
若域名解析出IPv6地址,32位前缀不适用,需要根据IP类型设置对应前缀长度:InetAddress[] inetAddresses = InetAddress.getAllByName("www.speedtest.net"); for (InetAddress ipAddress : inetAddresses) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { int prefixLength = ipAddress instanceof Inet6Address ? 128 : 32; builder.excludeRoute(new IpPrefix(ipAddress, prefixLength)); } }处理IP动态变化问题
像speedtest这类网站的IP可能动态更新,单次解析的IP可能覆盖不全。可以定期重新解析域名并更新排除路由,确保所有对应IP都被排除。验证VPN权限与状态
确认VPN服务已正确启动,持有android.permission.BIND_VPN_SERVICE权限,且系统已授予VPN连接权限,权限不足会导致路由规则无法生效。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

