Android WireGuard VPN客户端中OkHttp请求未走VPN的问题排查
Android WireGuard VPN下Retrofit请求不路由问题解决
核心问题
Android系统默认会将发起VPN的应用自身流量排除在VPN路由之外,这就是为什么你的Retrofit请求不走VPN,但其他应用(如浏览器)正常的原因。
解决步骤
1. 允许本应用流量通过VPN
在你的WireGuard VPN服务初始化代码中,显式添加当前应用包名到允许列表:
val vpnBuilder = VpnService.Builder() // 已有的配置:设置地址、DNS、路由等 .addAllowedApplication(packageName) // 关键:允许本应用流量走VPN // 完成其他配置并启动VPN连接
2. 绑定OkHttpClient到VPN接口
如果第一步后问题仍存在,需要让OkHttpClient使用VPN创建的网络Socket:
// 在你的VPN服务实例中获取受保护的SocketFactory val vpnSocketFactory = run { val socket = Socket() vpnService.protect(socket) // 保护Socket使其走VPN socket.factory } // 构建OkHttpClient时使用该SocketFactory val httpClient = OkHttpClient.Builder() .socketFactory(vpnSocketFactory) .build()
3. 强制刷新连接(可选)
若存在旧连接复用问题,禁用连接池确保每次请求使用新连接:
val httpClient = OkHttpClient.Builder() .connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS)) .build()
验证
修改后重新启动VPN,调用getPublicIPAddress()方法,此时返回的IP应该是VPN服务器的IP,与浏览器请求结果一致。
内容的提问来源于stack exchange,提问作者Ehab24
相关产品推荐
相关产品推荐

