私のアプリは、トラフィックの傍受に 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 状態にあることがわかり、その理由を理解できます。これらの SYN パケットを受信できないため、コードから ACK を受信できません。
問題は、それは何でしょうか? TUN デバイスがこのように動作するのはいつですか?