Я построил и реализовал исходный код OpenVpn для платформы IOS.
Эти источники поставляются без поддержки ios, потому что Apple не дает нам возможности настроить интерфейс tun на iPhone, но предоставляет нам некоторый API (PacketTunnelProvider). Теперь у меня есть расширение PacketTunnelProvider, которое корректно работает. Но мне нужно передать пакеты в клиентскую библиотеку OpenVpn и наоборот. Это можно сделать, связавшись через один файловый дескриптор, который должен быть передан в ovpn cli.
В обычной реализации библиотеки openvpn этот файловый дескриптор является файловым дескриптором интерфейса tun, но в этом случае мы не имеем к нему доступа (благодаря Apple). Итак, нам нужно «эмулировать» функциональность интерфейса tun с точки зрения связи через файловый дескриптор.
OpenVpn Lib использует boost :: asio :: posix :: stream_descriptor с методами «write_some ()» и «async_read_some ()» для чтения и записи пакетов в «дескриптор файла tun».
Я пытаюсь создать сокет датаграммы домена unix, но когда я или ovpn пытаемся записать несколько байтов, выдается ошибка -> «Требуется адрес назначения».
Где я не прав?
struct sockaddr_un addr;
ScopedFD fd(socket(AF_UNIX, SOCK_DGRAM, 0));
if (fd.defined()) {
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, socket_path);
unlink(socket_path);
if (bind(fd(), (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
}else{
boost::asio::io_service io_service;
stream = new boost::asio::posix::stream_descriptor(io_service, fd());
io_service.run();
}
}
Хорошо, я решил!
Проблема была в реализации сокета.
https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.13/gtpc1/unixsock.html
Других решений пока нет …