Android Local VPN Service: не может пересылать пакеты

Я пытаюсь реализовать простое приложение брандмауэра Android через службу VPN.

Основная схема выглядит так:

введите описание изображения здесь

Я пытаюсь просто пересылать пакеты через свой VPN-сервис. Поэтому я начал с реализации примера Google ToyVpn Google (время от времени рассматривая этот пример) для моих целей, но он не работает: когда моя VPN работает, я вижу, что пакеты отправляются, но ответа у меня нет.

Приложение написано на Kotlin, но это не сложно для любителей Java.

My Builder настроен с использованием IP и маршрута, как показано ниже:

val builder = Builder() builder.addAddress("10.0.0.2", 32).addRoute("0.0.0.0", 0) mInterface = builder.establish() 

После этого я настраиваю туннель так, как это показано в ToyVpn, но мой IP-адрес назначения VPN-сервера является локальным:

 val tunnel = DatagramChannel.open() if (!protect(tunnel.socket())) { throw IllegalStateException("Cannot protect the tunnel"); } tunnel.connect(InetSocketAddress("127.0.0.1", 55555)) tunnel.configureBlocking(false) protect(tunnel.socket()) 

После этого я пытаюсь пересылать пакеты из и out FileInputStream (также из ToyVpn):

 val `in` = FileInputStream(mInterface!!.fileDescriptor) val out = FileOutputStream(mInterface!!.fileDescriptor) var timer = 0 while (true) { var idle = true var length = `in`.read(packet.array()) if (length > 0) { packet.limit(length) tunnel.write(packet); packet.clear() idle = false if (timer < 1) { timer = 1 } } length = tunnel.read(packet) if (length > 0) { if (packet.get(0).toInt() !== 0) { out.write(packet.array(), 0, length) } packet.clear() idle = false if (timer > 0) { timer = 0 } } if (idle) { Thread.sleep(100) timer += if (timer > 0) 100 else -100 if (timer < -15000) { packet.put(0.toByte()).limit(1) for (i in 0..2) { packet.position(0) tunnel.write(packet) } packet.clear() timer = 1 } if (timer > 20000) { throw IllegalStateException("Timed out") } } Thread.sleep(50) } 

Мой первый вопрос: что я делаю неправильно? Код ясен и должен работать правильно, но это не так!

В основном, я хочу, чтобы мой сервис соответствовал пакетам по IP-адресу. Я знаю, что огромные приложения, такие как tPacketCapture, анализируют пакеты с нуля и восстанавливают их.

Мой второй вопрос: есть ли способ упростить фильтрацию пакетов, если я хочу получить только IP-адрес?

PS: Actualy Я уже задал аналогичный вопрос об этом здесь несколько дней назад, но ошибка имела другой характер, связанный с языком Kotlin, на котором разрабатывается приложение. Также я видел этот и эти вопросы, но ответы там мне не помогли.

Intereting Posts
Dagger2 и Kotlin запускают неудачные причины: app: compileDebugKotlinAfterJava Создание нового проекта в Android studio-Kotlin Gradle sinc не удалось с расширением kotlin. для строки ввода: "" в файле build.gradle file module (app) Фрагмент в котлине Kotlin: Как заменить уже открытый фрагмент на новый фрагмент в студии Android? Классный класс Kotlin бросает ClassNotFoundException Можно ли добавить «статическую» функцию расширения для Java-класса? Доступ к атрибуту карты Entry (Kotlin) Kotlin: Обновление элемента неизменяемого списка JavaRX: как вернуть кешированное значение немедленно и параллельно выполнить сетевой запрос Как преобразовать выражение назначения Java в Kotlin Переопределяющая переменная создает NPE, когда переменная используется при инициализации в суперклассе Обработка аннотации kotlin: проверьте, задан ли TypeElement из класса kotlin стандартная двоичная функция maxBy Как я могу использовать обратный вызов в Котлине?