我的应用正在使用 VpnService 进行流量拦截。
它的作用:
1.从 Tun 设备循环读取:
while (started && tunDevice.valid()) {
final byte[] bytes = tunDevice.read();
IpPacket packet = PacketFactory.createPacket(bytes);
if (packet == null) {
Thread.yield();
} else {
proxyService.handlePacket(packet);
}
}
TunDevice.read:
@Override
public byte[] read() throws IOException {
if (!valid()) {
LOG.warn("TUN: file descriptor is not valid any more");
return null;
}
int length = tunInputStream.read(readBuffer);
LOG.debug("TUN: Received packet length={}", length);
if (length < 0) {
throw new IOException("Tun device is closed");
}
if (length == 0) {
return null;
}
return Arrays.copyOfRange(readBuffer, 0, length);
}
2.将数据代理到受保护的套接字。
问题是一段时间后它停止从 TUN 设备读取。读取方法只是挂起并等待一段时间(如 3-5 分钟)。
使用 netstat 我看到所有新连接都处于 SYN_SENT 状态,我可以理解原因 - 它们无法从我的代码中接收 ACK,因为我无法接收这些 SYN 数据包。
问题是:它可能是什么?TUN 设备什么时候可以这样?