Требования к портам VPN: три строки, которые пишут до сравнения
Определите, какой вопрос о портах у вас на самом деле: исходящее назначение, входящая публикация или собственный транспорт туннеля. Затем спрашивайте провайдера только об этом.
Списки портов для VPN-сервисов копируются между страницами сравнения без детали, которая решает, важны ли они: кто начинает соединение. Правило, разрешающее исходящий TCP 443, ничего не говорит о том, может ли другой хост достучаться до слушателя на вашей машине. Напишите три отдельных требования, прежде чем сравнивать хотя бы один тариф, и отметьте, какие из них действительно нужны вашей задаче. Большинство сравнений сводятся к одному короткому вопросу, как только такой лист существует.
Разделите требование, прежде чем читать любой список портов
Три строки покрывают почти все случаи: добраться до цели за пределами туннеля, опубликовать что-то, чтобы другие могли подключиться внутрь, и нести сам туннель. Каждая строка терпит неудачу по своей причине, и политика провайдера, удовлетворяющая одной, может оставить две другие нетронутыми. Отнести задачу к правильной строке — пять минут, и это экономит спор позже.
| Line | Who starts it | What can block it | Question for the provider |
|---|---|---|---|
| Outbound destination | Your application | Egress filter on the exit node | Is this protocol and port allowed to that destination? |
| Inbound publishing | A remote peer | No mapping, no public address, short lifetime | Which protocol, which external port, and how long does the mapping last? |
| Tunnel transport | Your client to the gateway | The access network drops that protocol | Does the client offer a fallback the local network permits? |
Маркетинговые утверждения намеренно размывают три строки. Разрешение P2P описывает политику назначения, выделенный адрес описывает адрес, а утверждение об отсутствии ограничений на порты обычно означает, что тариф их не перечисляет. Ни одна из этих формулировок не отвечает на остальные.
Выберите один конкретный поток и запишите его предложением: инициатор, транспорт, порт, семейство адресов, направление. Ночной клиент резервного копирования, который загружает на удалённый хост, — только исходящий. Игровой сервер на вашем столе, к которому подключаются друзья, — входящий. Пустить оба через один туннель значит, что листу нужны обе строки, а не компромисс между ними.
Исходящий доступ терпит неудачу из-за политики назначения, а не из-за туннеля
Исходящий трафик через транслирующий шлюз создаёт состояние. Первый пакет с внутреннего адреса и порта создаёт запись трансляции, и ответы сопоставляются с ней, что и есть поведение отображения, описанное в RFC 3022. Именно этот механизм объясняет, почему вкладка браузера обычно работает вообще без запроса порта.
Две вещи всё ещё ломают это. Выходной узел может фильтровать назначения или номера портов, которые считает злоупотребительными, а приложение может слушать порт, которого политика выхода вовсе не ожидала. Спрашивайте о паре назначений, а не о входящих правилах, и ждите разных ответов для TCP и UDP.
Измеряйте, прежде чем спорить. Запустите это на машине, которая будет стоять за туннелем, один раз при выключенном туннеле и один раз при включённом:
ss -lntup | sort
nc -vz -w 3 203.0.113.10 443
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 https://example.com
Те же команды, то же назначение, два состояния туннеля дают оператору сравнение до и после, по которому можно действовать. Замените документационный адрес на хост, который вам действительно нужен; важно, чтобы сравнение повторялось, а не чтобы какое-то число выглядело впечатляюще.
Входящая публикация требует отображения, адреса и времени жизни
Ничто снаружи не может начать соединение с вашим слушателем, если что-то на публичной стороне не знает, куда его доставить. Статическое резервирование порта, которое держит оператор, отображение, запрошенное клиентом через UPnP, NAT-PMP или PCP, и маршрутизируемый публичный адрес — три разных продукта с тремя разными границами.
Задайте пять вопросов к любому из них: какой протокол, какой внешний порт, может ли внешний порт отличаться от локального, какое семейство адресов он покрывает и сколько отображение живёт после переподключения. Резервирование, привязанное к активной сессии, исчезает, когда эта сессия заканчивается, что бы ни говорила страница тарифа.
Сначала подтвердите локальную половину, потому что мёртвый слушатель и заблокированный входящий путь снаружи выглядят одинаково:
ss -lntup | grep -E ':(8080|51820)\b'
python3 -m http.server 8080 --bind 0.0.0.0
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080
Когда локальный запрос возвращает 200, а запрос из сети, которую вы не контролируете, всё ещё истекает по таймауту, разрыв на публичной стороне. Это момент назвать оператору протокол и внешний порт вместо того, чтобы описывать приложение по имени.
Собственный транспорт туннеля — отдельный вопрос
Порты носителя — самая маленькая часть проблемы и самая простая для поиска. Значения по умолчанию различаются по протоколам, и то, о чём клиент может договориться, важнее любого описания тарифа.
| Client | Outer transport | Default port | When it helps |
|---|---|---|---|
| OpenVPN | UDP | 1194 | Default mode; needs outbound UDP to pass |
| OpenVPN | TCP | 443 | UDP is dropped and TCP 443 is not |
| WireGuard | UDP | 51820 | Short handshake; there is no TCP mode |
| IKEv2/IPsec | UDP | 500 and 4500 | Mobile clients; 4500 carries NAT traversal |
Сеть, которая отбрасывает исходящий UDP, примет туннель TCP 443 и откажет в UDP, поэтому резервный режим относится к листу требований. Смена носителя не перемещает порт приложения внутри туннеля и не расширяет политику назначения; они остаются в своих строках.
Фрагментация заслуживает одной проверки, пока вы там, потому что туннель, который подключается и затем застревает на больших передачах, обычно имеет неверный MTU, а не закрытый порт:
ping -M do -s 1400 203.0.113.10 ping -M do -s 1372 203.0.113.10
В Windows та же проверка — ping -f -l 1400 203.0.113.10. Задайте MTU туннеля ниже наибольшего размера, который проходит, затем повторите проверку неудачной передачи.
Проверьте три строки, прежде чем платить за тариф
Положите три строки на одну страницу и заполните каждую ячейку измеренным результатом вместо обещания. Эти команды создают локальную половину такой страницы примерно за минуту:
ss -lntup | sort
nc -vz -w 3 203.0.113.10 443
python3 -m http.server 8080 --bind 0.0.0.0
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080
ping -M do -s 1400 203.0.113.10
Читайте вывод как контрольный список. Исходящий работает, когда назначение отвечает при включённом туннеле. Входящий работает только тогда, когда хост вне вашей сети достигает слушателя на внешнем порту. Носитель работает, когда рукопожатие завершается на протоколе, который разрешает ваша сеть доступа.
Две привычки держат лист честным. Записывайте дату и версию клиента рядом с каждым результатом, потому что движутся и политики провайдеров, и значения по умолчанию клиентов. Затем просите самое узкое отображение, которое обслуживает поток, потому что просьба открыть всё обычно приносит отказ или допродажу, а не технический ответ.