【发布时间】:2026-01-21 06:15:01
【问题描述】:
我正在探索 Android 的 VpnService 的功能。目前,我通过在用户空间中重建 IP 堆栈构建了一个非常基本的请求转发器:我从 VpnService 的输入流中读取 IP 数据包,解析它们,对于我不想转发的连接,我尝试重新创建那些套接字连接在 VPN 连接之外。
我了解到这最后一点是由VpnService.protect() 促成的,并尝试按如下方式实现它:
Socket socket = new Socket();
vpnService.protect(socket);
socket.connect(new InetSocketAddress(
header.getDestinationAddress(), // From my IP datagram header
body.getDestinationPort())); // From the TCP datagram header
不幸的是,这种方法会导致回环到 VPN 接口。
虽然上面的代码会简单地阻塞并最终超时,但我通过从单独的线程调用Socket.connect(InetSocketAddress) 来观察环回;连接直接返回到我的 VpnService 的输入流,然后重复该过程。
不用说,这会导致循环。我觉得这是因为在创建套接字时(以及随后调用VpnService.protect(Socket)),我还没有设置目标IP和端口。
情况似乎确实如此,因为在我的 VpnService 实现中覆盖 VpnService.protect(Socket) 和 VpnService.protect(int) 并在这两种情况下调用 supers 都会返回 false。
如何正确保护套接字连接?
【问题讨论】:
标签: android sockets android-4.0-ice-cream-sandwich vpn packet-capture