Конфигурация Android VpnService

Я пытаюсь использовать VpnService от Android для настройки простого устройства tun на стороне клиента, а на принимающей стороне у меня работает сервер С++.

У меня много проблем с VpnService. Это то, что мне нужно, мне нужно, чтобы ВСЕ пакеты, исходящие от телефона Android, направлялись на устройство tun, а в программе я маршрутизировал их через канал Datagram на сервер. Когда я отправляю строку, она работает нормально, но когда я отправляю другие данные через этот канал дейтаграммы, я не вижу пакетов UDP в Wireshark:\

Кроме того, я новичок в каналах Java и Datagram. Вот мой код

//To establish the tunnel
builder.setSession("MyVPNService")
            .addAddress("192.168.56.0", 32)
            .addDnsServer("8.8.8.4")
            .addRoute("0.0.0.0", 1);

mInterface=builder.establish();

Что именно делают вышеуказанные конфигурации? Разве устройство tun не должно иметь ОДИН IP-адрес (по моему опыту работы с Linux), тогда что такое «192.168.56.0», 32». Также, когда я пытаюсь добавить маршрут «0.0.0.0», 0 весь телефон Android зависает и перезагружается: \

while (true) {
                int length;
                // Read the outgoing packet from the input stream.

                length=in.read(packet_bytes);
                //int length = in.read(packet.array());
                if (length > 0) {
                    // Write the outgoing packet to the tunnel.
                    //packet.limit(length);
                    //tunnel.send(packe,server);
                    tunnel.send(packet,server);
                    packet.put(packet_bytes,0,length);

                    tunnel.write(packet);

                    packet.clear();
                }
                Thread.sleep(200);
                // Read the incoming packet from the tunnel.

                length = tunnel.read(packet);
                if (length > 0) {

                    out.write(packet.array(), 0, length);

                    packet.clear();

                    // If we were sending, switch to receiving.
                }
                Thread.sleep(200);
            }

Это та часть, где я беру его из интерфейса и помещаю в другой.


person Abhishek Vasisht    schedule 22.04.2015    source источник
comment
Это поможет [1]: поток не дает ответа%5b1%5d">stackoverflow.com/questions/20269283/   -  person M Bilal    schedule 07.07.2015
comment
Столкнулись с похожей проблемой? Вы смогли решить проблему?   -  person thedarkpassenger    schedule 20.02.2016


Ответы (1)


Во-первых, позвольте мне начать с объяснения Builder конфигурация выше.

builder.setSession("MyVPNService") // This one is optional. 

.addAddress("192.168.56.0", 32) // This is used to assign interface address. First param is IP address, and second in prefix length. "Prefix" length is also commonly known as subnet mask.

.addDnsServer("8.8.8.4") // This configures the DNS network for VPN network. For ex - All DNS resolutions would go to 8.8.8.4:53. Note that the DNS request packets gets routed through the tun interface.

.addRoute("0.0.0.0", 1); // This controls the IP addresses which gets routed through tun interface.

Обратите внимание: этот интерфейс tun может поддерживать несколько семейств адресов (IPv4/IPv6). Например, вы можете назначить несколько адресов интерфейса (скажем, v4, v6 или два адреса v6 или любое другое сочетание).

Точно так же вы можете добавить маршруты, которые должна обрабатывать ваша VPN. Теперь главный вопрос: как вы решаете, какие маршруты должна обрабатывать моя VPN?

Ну вариантов куча.

  1. Маршрутизировать все — добавление 0.0.0.0/0 (для IPv4) и ::/0 (для IPv6) приведет к маршрутизации трафика для всех пунктов назначения через VPN (Примечание: 0.0.0.0/0 представляет весь диапазон IPv4, т. е. от 0.0.0.0 до 255.255. 255.255).
  2. Маршруты для конкретных маршрутов. Обычно вы замечали, что общение с устройствами IoT не работает, когда работает VPN. Обычно это происходит из-за настройки конфигурации «маршрутизировать все», которая нарушает локальную сеть (например, chromecast). Таким образом, исключение локального трафика канала требует выполнения некоторых математических действий, которые включают вычитание локальных подсетей канала из указанных выше подсетей (0.0.0.0/0, ::/0 (для локальных подсетей версии 6)). Используемая математика не очень проста, что делает этот вариант намного более сложным. Что касается локальных подсетей ссылок, вот список из википедии и из IETF для IPv4 и IPv6 специальные адреса.

Тем не менее, вот несколько ответов на ваши вопросы.

Мне нужно, чтобы ВСЕ пакеты, исходящие с телефона Android, направлялись на устройство tun.

См. «маршрутизировать все» выше.

Разве устройство tun не должно иметь ОДИН IP?

Интерфейсу в Linux может быть назначено несколько адресов интерфейса из разных семейств адресов.

Тогда что такое "192.168.56.0", 32".

Как объяснялось выше, первая часть — это IP-адрес, а вторая определяет маску подсети. См. также нотацию CIDR.

Также, когда я пытаюсь добавить маршрут «0.0.0.0», 0, весь телефон Android зависает и перезагружается.

0.0.0.0/0 означает, что все адресное пространство IPv4 будет маршрутизироваться через VPN. Как правило, VPN не может обрабатывать локальный трафик канала, как я уже упоминал выше. Итак, вам придется исключить определенные локальные подсети (см. ссылки выше). Что касается зависания и перезапуска телефона, я не уверен, имеет ли это какое-либо отношение к VPN, если только VPN не обрабатывает трафик правильно (что может привести к сбою приложений, связанных с сетью).

person AllThatICode    schedule 23.10.2018