Я изучаю возможности Android VpnService. В настоящее время я создал очень рудиментарный запрос-экспедитор, по существу перестраивая IP-стек в пространстве пользователя: я читаю IP-пакеты из входного потока VpnService, разбираю их и для соединений, которые я не хочу пересылать, я пытаюсь воссоздать те сокетов за пределами 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.
В то время как вышеприведенный код просто блокирует и, в конечном итоге, время ожидания, я наблюдаю loopback, вызывая Socket.connect(InetSocketAddress)
из отдельного потока; соединение возвращается прямо в поток ввода VpnService, и процесс повторяется.
Излишне говорить, что это вызывает цикл. У меня возникает ощущение, что причина этого в том, что во время создания сокета (а затем и на вызов VpnService.protect(Socket)
) я еще не установил IP-адрес и порт назначения.
Это действительно так, потому что, переопределяя VpnService.protect(Socket)
и VpnService.protect(int)
в моей реализации VpnService и вызывая supers в обоих случаях, возвращает false.
Как правильно защитить соединение сокета?