Подключитесь к офисному VPN, запустите небольшой сервис на порту 8443, отправьте адрес туннеля коллеге и наблюдайте, как соединение не удаётся, пока клиент по-прежнему сообщает о подключении. В туннеле ничего не сломано: адрес выдан, сессия установлена, а пакеты, которые должны были бы нести ответ, просто никогда не пропускаются. Выполните три проверки ниже по порядку и остановитесь на той, которая не удалась, потому что у каждой своё исправление и только одна из них касается VPN.

Начните с того, куда на самом деле привязан сокет

Прежде чем что-либо будет маршрутизировано, что-то должно слушать адрес, до которого вызывающий может добраться. Серверы разработки — обычный виновник, потому что многие по умолчанию привязываются к loopback и принимают только соединения с той же машины. Адрес туннеля эту привязку не меняет, и операционная система откажет в соединении задолго до того, как VPN вообще будет задействован.

ss -ltnp | grep 8443
netstat -ano | findstr 8443

Читайте столбец локального адреса, а не состояние. 127.0.0.1:8443 означает только loopback, и исправление — привязка к 0.0.0.0 или к самому адресу туннеля. 0.0.0.0:8443 принимает на всех интерфейсах, что шире, чем большинство имеет в виду, когда у машины есть и публичный адрес; 10.64.7.15:8443 — узкая версия, которая слушает только там, куда может добраться коллега. Обратите внимание и на имя процесса в том же выводе, потому что забытый экземпляр из прошлого теста — частая причина того, что порт выглядит открытым и отвечает неверным содержимым.

Затем спросите, может ли что-нибудь маршрутизировать к этому адресу

Адрес туннеля имеет смысл только для узлов, настроенных отправлять этот префикс в туннель. У машины коллеги есть своя таблица, и если для подсети туннеля нет маршрута, пакет уходит на шлюз по умолчанию и погибает в месте, которое понятия не имеет о существовании адреса. Это вопрос маршрутизации на стороне вызывающего, а не разрешение на вашей стороне.

Symptom from the callerWhat it usually meansWhere to look next
Connection refused immediatelyNothing is listening on the address the packet reachedThe bind address and the process owning the port
Connection times out with no replyA policy dropped the packet, or no route returnsServer forwarding, host firewall, cloud security group
Works from the same machine onlyListener is on loopback, or no route reaches the tunnel addressBind address, then the caller's route to that prefix

Сервер между двумя клиентами значит не меньше. В обычной схеме удалённого доступа каждый клиент открывает исходящее соединение к шлюзу, и шлюз хранит состояние этих потоков, поэтому ответы возвращаются по уже известному ему пути. Соединение от одного клиента к другому — это новый поток, который шлюз должен принять и передать, и многие развёртывания намеренно отключают это, чтобы держать клиентов изолированными друг от друга. Потребительские VPN-сервисы обычно изолируют по умолчанию; корпоративные шлюзы иногда разрешают это по группам.

Проверьте направление, прежде чем что-то менять на хосте. Если адрес туннеля отвечает с самого шлюза, но не от узла-партнёра, разница в настройке клиент-к-клиенту на шлюзе, и никакая правка локального межсетевого экрана её не заменит.

Наконец, найдите политику, разрешающую поток

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

Межсетевой экран хоста — тот уровень, о котором забывают после успешной привязки, потому что правило, разрешающее порт на интерфейсе LAN, не разрешает его автоматически на интерфейсе туннеля. Правила, ограниченные интерфейсом, — правильный дизайн и одновременно обычная причина сервиса, который работает из офиса, но не из дома. Читайте область действия правила, а не номер порта.

Фильтрация с учётом состояния объясняет обратный случай. Исходящее соединение с вашего ноутбука создаёт состояние, и ответы на него пропускаются без входящего правила. Соединение коллеги — совершенно новый поток без состояния за ним, поэтому ему нужно явное разрешение. Эта асимметрия и есть вся причина, по которой работающая сессия браузера на вашей машине ничего не говорит о доступности сервиса снаружи.

Когда одна проверка не удалась, меняйте дизайн, а не туннель

Если требование в том, чтобы коллега открыл ваш локальный сервис, честный ответ обычно — механизм, построенный для входящего доступа. Обратный SSH-туннель — самый маленький: ваша машина исходящим соединением подключается к хосту, до которого коллега уже может добраться, и слушатель существует на этом хосте.

ssh -N -R 8443:127.0.0.1:8443 [email protected]

Ретранслятору нужен GatewayPorts clientspecified в конфигурации SSH-сервера, иначе переданный слушатель привязывается к loopback на ретрансляторе, и коллега получает тот же отказ, что и раньше. Для всего, что живёт дольше одного дня, лучший инструмент — балансировщик нагрузки или ingress с проверкой состояния и сертификатом для опубликованного имени, а туннель между площадками с маршрутами для обеих подсетей — верный ответ, когда две сети действительно должны разговаривать.

Каждый из этих вариантов делает экспозицию явной, и в этом смысл. VPN перемещает пакеты между сетями, для которых вы уже были авторизованы; он не публикует сервис и не превращает ноутбук в хост, обращённый в интернет. Задача — решить, какой из трёх уровней менять, и туннель редко оказывается одним из них.

Похожие статьи