Использование LWIP для отправки необработанных IP-пакетов

Я пытаюсь реализовать службу VPN на Android. Мне предоставляются необработанные IP-пакеты (интерфейс TUN, который работает на уровне 3), и я не уверен, как я должен отправлять пакеты. Я знаю, что могу разобрать IP-пакеты, чтобы извлечь данные транспортного уровня (TCP или UDP), а затем отправить их, но я надеялся, что есть способ просто отправить весь IP-пакет.

Сначала я пытался использовать необработанный сокет (https://man7.org/linux/man-pages/man7/raw.7.html) и отправить его таким образом, но узнал, что это невозможно из-за проблем с разрешениями. Чтобы открыть необработанный сокет, вам нужны права root, а приложения Android не могут запускаться с правами root.

Я нашел проект под названием LWIP (https://www.nongnu.org/lwip/2_1_x/index.html), в котором говорится, что это библиотека реализации стека TCP/IP, но после прочтения документации я не могу понять, как это сделать.

У LWIP есть собственные API-интерфейсы (https://www.nongnu.org/lwip/2_1_x/raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd), который выглядит многообещающе, но я не уверен, что это то, что мне нужно. По сути, мне просто нужен способ отправить необработанный IP-пакет, а затем получить ответ и записать его обратно в интерфейс TUN — по сути, сквозной прокси.

Любая помощь будет принята с благодарностью. Спасибо!


person Jon    schedule 07.03.2021    source источник


Ответы (1)


Вы пытаетесь изобрести велосипед. Существует несколько подходящих методов инкапсуляции, таких как GRE или IP-in-IP.

Отправка необработанного IP-пакета требует использования номера IP-протокола в любом случае, поэтому ваш получатель может получать пакеты после регистрации этого номера.

Для начала может быть проще использовать инкапсуляцию UDP.

person Zac67    schedule 08.03.2021
comment
Спасибо за предложение. Однако я не уверен, сработает ли инкапсуляция для меня, поскольку я привязан к тому, что позволит мне делать Android. Вот их документация по VPN-сервисам (developer.android.com/guide/topics/ подключение/vpn#service). По сути, все, что я получаю, это дескриптор файла (прикрепленный к интерфейсу TUN), и когда я читаю из него, я получаю необработанные IP-пакеты, и я должен отправить их как есть, обработать ответ, а затем записать ответ обратно в дескриптор файла. как необработанный IP-пакет. - person Jon; 08.03.2021
comment
Инкапсуляция необходима для VPN в любом случае. Вы пытаетесь создать решение VPN (клиент/сервер) или просто настроить клиент? В последнем случае просто установите туннель и используйте TUN в качестве локального интерфейса. lwip — это не просто API, а полный стек TCP/IP, предназначенный для встроенных устройств. - person Zac67; 08.03.2021