Триггер портов против перенаправления портов для домашнего VPN-сервера
Триггер открывает сопоставление только после исходящего трафика; перенаправление сопоставляет порт навсегда. Домашнему VPN-серверу нужно второе, ограниченное реальным слушателем.
Перенаправление портов и триггер портов находятся в одном меню на большинстве домашних роутеров, поэтому их воспринимают как два способа сделать одну работу. Перенаправление — это статическое правило: входящее подключение к порту WAN транслируется в фиксированный внутренний адрес и порт, происходит ли что-то ещё или нет. Триггер условен: роутер следит за исходящим трафиком и открывает входящее сопоставление только после того, как выйдет подходящее соединение. VPN-сервер ждёт, пока кто-то другой подключится первым, поэтому именно это условие — единственное, которое он никогда не может выполнить.
Два правила с разными жизненными циклами
IPv4 NAT хранит состояние. Когда внутренний хост отправляет пакет наружу, роутер создаёт сопоставление, чтобы ответы нашли обратный путь; входящий пакет, не совпадающий ни с одним сопоставлением, отбрасывается, и именно это поведение держит необновлённый компьютер вне интернета. Перенаправление — постоянная запись трансляции, добавленная вручную. Триггер — временная дыра, охраняемая шаблоном трафика.
Практическая разница — время. Перенаправление существует с момента сохранения, пока кто-нибудь его не удалит. Сработавшее сопоставление существует после срабатывания триггера и закрывается по таймеру простоя, измеряемому в минутах на потребительском оборудовании, или сразу при перезагрузке.
Ни одно из них не безопаснее в абстрактном смысле. Перенаправление постоянно открывает один порт; триггер открывает его только после определённого исходящего трафика. Для сервиса, который должен принять первый пакет от незнакомца, подходит только одно из двух.
Почему триггер не опубликует сервер
VPN-сервер пассивен по своей конструкции. Партнёр, будь то ноутбук в кафе или телефон на мобильных данных, отправляет первый пакет, а у роутера нет для него сопоставления. Ничто внутри не начало трафик к порту триггера, поэтому правило никогда не срабатывает, и соединение умирает до начала рукопожатия.
Там, где триггер выглядит работающим, трафик на порту триггера создаёт что-то другое: клиент в LAN, зонд мониторинга или собственные исходящие проверки сервера. Тогда сопоставление открывается для одного хоста и закрывается, когда трафик прекращается, поэтому следующий внешний партнёр снова терпит неудачу, а первый успех лежит в журнале и выглядит как доказательство.
Триггер обычно рассчитан и на один хост. Многие реализации позволяют держать сопоставление только одному внутреннему устройству одновременно, что совершенно неправильно для сервера, который должен отвечать нескольким партнёрам. Функция создавалась для приложений, которые открывают исходящее управляющее соединение и ждут входящих данных на втором порту, и она до сих пор соответствует этой форме.
Что на самом деле сопоставляет перенаправление
Перенаправление — это одна запись трансляции: порт и протокол WAN во внутренний адрес и порт. Ему нужен слушатель, уже работающий на другом конце, и нужно, чтобы внутренний адрес оставался на месте. Аренда DHCP, которая переезжает на другую машину, молча отправляет каждый туннель не тому хосту, поэтому создайте резервирование до правила.
| Rule | Opens when | Closes when | Fits a VPN listener |
|---|---|---|---|
| Port forward | Saved, at boot | You delete it | Yes |
| Port trigger | Matching outbound traffic | Idle timeout or reboot | No |
Протокол важнее, чем подсказывает форма. OpenVPN поверх UDP требует перенаправления UDP, WireGuard требует UDP, а данные IPsec приходят как ESP, протокол IP 50, у которого вообще нет портов. Форма перенаправления, принимающая только TCP или UDP, не может это выразить, поэтому IPsec нужно passthrough или статическое сопоставление один к одному вместо правила порта.
Уровень над вашим роутером
Перенаправление управляет только той трансляцией, которая принадлежит вам. Если адрес WAN не ваш, а это случай за NAT оператора, где абоненты делят 100.64.0.0/10, как описано в RFC 6598, входящее соединение никогда не достигнет вашего роутера, потому что провайдер транслировал первым. Ни одно правило на вашем устройстве не исправит этот порядок.
Двойной NAT — та же проблема в миниатюре. Ваш роутер перенаправляет на роутер провайдера, у которого нет подходящего правила, и тот отбрасывает пакет. Либо добавьте правило на внешнем устройстве, либо переведите внешнее устройство в режим моста и позвольте своему держать публичный адрес.
Поэтому проверка должна идти снаружи. Проверка из того же LAN через публичный адрес зависит от поддержки hairpin NAT и может пройти или не пройти по причинам, не связанным с правилом; телефон на мобильных данных или друг в другой сети — более чистая проверка.
Ограничьте правило, затем проверьте обе половины
Перенаправьте один порт на один адрес. Диапазон, добавленный потому, что первые попытки не удались, — это путь, которым интерфейсы управления попадают в интернет, а слушателю VPN не нужна опубликованная рядом административная страница роутера.
Сохраните всё, что уже защищало этого слушателя: идентичность по сертификату или ключу, межсетевой экран хоста, актуальные версии пакетов. Перенаправление пропускает пакет; аутентификация решает, станет ли пакет туннелем, и это две отдельные неисправности, когда что-то идёт не так.
У проверки две половины. Рукопожатие должно завершиться из внешней сети, а затем частный ресурс за сервером должен ответить через туннель. Перенаправление пропускает соединение туннеля и не больше; маршрутизация и авторизация для 10.8.0.0/24 — другая настройка на другом экране.
Решите тремя вопросами
Три вопроса решают выбор быстрее любой таблицы сравнения:
- Подключается ли что-то снаружи как первый пакет? Тогда используйте перенаправление или релей. Триггер не может открыться без исходящего трафика, которого никогда не будет.
- Должна ли дыра пережить время простоя? Тогда используйте перенаправление, потому что сработавшее сопоставление закрывается по своему расписанию.
- Адрес WAN ваш, чтобы его публиковать? Если нет, исправьте уровень выше, прежде чем править любое правило.
Если ответ на все три — нет, а это случай ноутбука, который сам звонит коммерческому провайдеру, ни одно из правил не нужно. Клиент за NAT работает потому, что сам хранит состояние, и это охватывает большинство людей, читающих страницу о перенаправлении портов в полночь.