Создание локального VPN-туннеля или прокси?

Привет, я работаю над приложением для iOS, которое запускает HTTP-сервер (Vapor) при загрузке. Этот сервер работает на localhost (порт 8081). Когда приложение работает, другие компьютеры в одной сети могут получить доступ к этому веб-серверу — это также работает при подключении устройств к iPhone через персональную точку доступа.

Таким образом, все устройства подключены к персональной точке доступа iPhone, поэтому сетевой трафик фактически проходит через устройство.

Проблема в том, что некоторые устройства в локальной сети блокируют любые локальные сетевые подключения. Например, `127.0.0.1:8081` для доступа к серверу, работающему на iPhone, будет заблокирован.

Я ищу способ обойти это, и видел, что некоторые люди смогли решить эту проблему, используя локальный VPN-туннель или локальный прокси, чтобы, по сути, разрешить маршрутизацию некоторых хостов с подключенного устройства на сервер, работающий на 127.0.0.1:8081.

Я, по сути, хочу знать, возможно ли направлять запрос, который подключенное устройство отправляет на “fakedomain.com”, на сервер “127.0.0.1:8081” на устройстве iOS.

Больше комментарий/вопрос … 127.0.0.1 обычно является IP-адресом “localhost”. Вы используете этот адрес, чтобы подключиться к себе. Таким образом, каждое устройство, подключаясь к 127.0.0.1, будет подключаться к себе, но, похоже, вы хотите, чтобы каждое устройство подключалось к вашему серверу, работающему на вашем iPhone. У вашего iPhone должен быть “не локальный” IP, который другие устройства могут использовать для подключения к нему. Обычно это что-то вроде 192.168.1.* или 10.1.1.* и т. д. Если вы хотите, чтобы fakedomain.com маршрутизировался на ваш не локальный IP, то вам нужно сделать это на уровне DNS. Я не уверен, может ли точка доступа настраивать DNS для указания на свой собственный DNS-сервер, где вы можете настроить fakedomain, чтобы указать на IP-адрес, который вам нужен.

Вы правы, внешние устройства будут подключаться к IP-адресу телефона. Сервер на телефоне будет слушать localhost.

Вы правы насчет DNS, но через своего рода локальный конфигурационный профиль VPN можно обойти это. Это может быть единственным вариантом.

Если ваша цель — подключить несколько локальных устройств к другому локальному устройству, работающему на сервере, вам стоит обратить внимание на Bonjour. Это протокол, который позволяет локальным устройствам в сети находить/распространять сервисы. Bonjour Concepts

Не обязательно, чтобы это был туннель… сеть, к которой подключаются все ваши устройства, должна иметь IP и DNS, назначенные через DHCP. Таким образом, в вашей сети у вас должен быть собственный DNS-сервер, чтобы разрешить fakecomain.com указать на IP iPhone-сервера. Но это зависит от того, что вы пытаетесь добиться, это просто тестовая среда? Или вы пытаетесь создать продукт, к которому могут подключаться несколько устройств в любом сетевом окружении. В первом случае вам просто нужно настроить вашу сеть. В последнем случае вам нужно будет настроить какую-то многопользовательскую связь (с помощью Bonjour), это будет “правильный” способ сделать это.

https://developer.apple.com/documentation/multipeerconnectivity

Если вы пытаетесь заставить другие устройства подключиться к вашему через Интернет, это совершенно другая вещь.

Настройка следующая:
- Машина Tesla подключается к телефону через точку доступа
- Приложение на телефоне запускает http сервер
- Побочный момент: если я подключаю свой компьютер к точке доступа телефона, я могу получить доступ к http серверу, используя IP-адрес телефона и порт.
- Используя веб-браузер автомобиля Tesla, я не могу получить доступ к веб-серверу, используя IP-адрес телефона, потому что встроенный браузер Tesla не открывает адрес шлюза для сети точки доступа или любого другого локального IP.

Вот обсуждение на эту тему: https://teslamotorsclub.com/tmc/threads/accessing-webpage-on-gatewas-ip.158147/

Я вижу, похоже, есть ограничение безопасности в браузере Tesla, которое не позволяет ему обращаться к локальным IP. Страница, на которую вы ссылаетесь, предлагает использовать третье устройство в качестве точки доступа Wi-Fi (т.е. RPI). Я думаю, что это может сработать. Но это все немного хакерство. Я считаю, что правильный способ заставить это работать — перенести ваш сервер на iPhone и развернуть его где-то внешнем, чтобы браузер Tesla мог к нему обратиться. Вам нужно будет изменить ваше приложение для iPhone, чтобы оно также взаимодействовало с этим сервером, чтобы получать/отправлять необходимые данные. Если сделать это таким образом, то вам даже не нужно беспокоиться о Wi-Fi, это также будет работать на сотовой связи.

Правильно, но кто-то смог обойти ограничение, используя VPN на телефоне.

По этому проекту: https://teslamirror.com/

В их разделе FAQ упоминается:

4 Зачем этому приложению TeslaMirror нужна VPN-служба? Есть ли с этим какие-либо проблемы с конфиденциальностью? Что касается необходимости VPN, это в основном потому, что Tesla блокирует все обычные сегменты частной локальной сети. Поэтому виртуальный IP-адрес используется для обхода ограничения сети Tesla. VPN-туннель не подключен к какому-либо публичному серверу. Для VPN-туннеля одна сторона — это устройство iOS/Android, которое зеркалируется, другая сторона — это автомобиль Tesla. На устройстве iOS работает веб-сервер с виртуальным IP 240.3.3.3 (Android имеет IP-адрес 3.3.3.3). Этот веб-сервер недоступен для доступа из Интернета. Есть только автомобиль Tesla и телефон, никакого промежуточного сервера в Интернете. Проблем с конфиденциальностью в этом нет.

Я хотел бы знать, как этого достичь. Я думаю, что это наиболее удобно с учетом обстоятельств.

Я не согласен, необходимость в VPN менее удобна для пользователя. Какие другие сервисы/приложения, по вашему мнению, требуют наличия VPN? Наличие внешнего сервера, который все хостит, наиболее удобно для пользователя. Но это менее удобно для разработчика, потому что вам нужно создавать дополнительную инфраструктуру/аутентификацию и т. д. для поддержки этого.

Но VPN-туннель также может решить проблему, но вам нужно будет запустить VPN-сервер где-то. Судя по описанию, которое вы привели, они должны запускать VPN-сервер на телефоне (они утверждают, что туннель не использует публичный сервер), но непонятно, как TeslaMirror смогла настроить сеть, чтобы бесшовно подключаться к VPN через точку доступа. Я могу представить, что есть способы заставить это работать на Android, но на iOS я не могу представить, чтобы вы могли настроить функцию уровня системы, такую как точка доступа, изнутри приложения.

Здесь происходит какое-то хакерство, я представляю, что это не будет так просто.

Да, я вижу некоторые API, которые могут сделать это возможным, такие как:

https://developer.apple.com/documentation/networkextension/nehotspotnetwork

https://developer.apple.com/documentation/networkextension/personal_vpn

Но вам все равно нужен VPN-сервер, работающий на вашем телефоне.

Думаю, это на самом деле будет сложнее, чем выносить ваш сервер наружу. Думя о требованиях TeslaMirror (зеркалирование другого экрана), неудивительно, что они хотели сделать это все локально (латентность должна быть хорошей). Если вы не создаете что-то, что требует очень низкой задержки, я бы не стал использовать ту же модель, что и TeslaMirror. Я уверен, что для них было сложно реализовать это решение.