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

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

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

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

Я пытаюсь найти обходной путь, и я видел, что некоторые люди смогли обойти эту проблему, используя локальный VPN-туннель или локальный прокси, чтобы, по сути, позволить маршрутизировать некоторые хосты с подключенного устройства на сервер, работающий на 127.0.01: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. Я уверен, что для них было сложно реализовать это решение.