Два домашних роутера, ни одного проброшенного порта и VPN, который иногда всё же подключается. UDP это позволяет, потому что межсетевой экран пропустит пакет, который сможет сопоставить с потоком, уже начатым машиной. Это условный трюк, а не функция, и условия легко перечислить, когда знаешь, что именно сравнивает межсетевой экран. Они же — причина того, что одинаковые профили ведут себя по-разному в разных сетях.

Сравнение, которое делает межсетевой экран

Каждая исходящая датаграмма создаёт краткоживущую запись: адрес источника, порт источника, адрес назначения, порт назначения. Всё, что приходит и совпадает с записью, считается ответом и пропускается. Правила для входящего трафика тут ни при чём.

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

Закрепите локальный порт источника, и тот же номер появится с обеих сторон обмена. В этом весь механизм, и это объясняет, почему трюк хрупок, а не загадочен.

Закрепление одного порта на каждом конце

Порт UDP по умолчанию у OpenVPN — 1194, а lport задаёт порт источника, с которого идёт отправка. Закрепите обоих партнёров, и исходящая четвёрка каждого будет указывать на порт, который слушает другой:

# peer A
lport 1194
remote 198.51.100.20 1194
# peer B
lport 1194
remote 203.0.113.10 1194

Это работает только пока ни один роутер между ними не переписывает порт источника. Когда пакеты появляются в перехвате, но туннель не поднимается, переписывание — первый подозреваемый.

Где четвёрка перестаёт совпадать

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

Операторское преобразование, многоуровневый NAT и рандомизация портов заканчиваются одинаково. Как и любая промежуточная коробка, которая переписывает порты, оставляя адреса в покое.

Потоковым транспортам хуже. Рукопожатие TCP отслеживается шаг за шагом, поэтому VPN на базе TCP так вообще не пробить, и ему нужен слушатель где-то на пути.

Обычно первой сдаётся одна сторона

На практике две сети редко ведут себя одинаково. Один роутер может давать предсказуемое отображение, а другой — порты по назначению, и в результате получается конфигурация, которая работает между двумя домами и не работает из мобильной сети. Противоречащие друг другу отчёты обычно описывают две разные пары роутеров. Ни один автор не ошибается, и ни один результат не обобщается.

Прежде чем трогать профили, выясните, какая сторона отбросила пакет. Перехваты на обоих концах решают это с одной попытки: датаграммы, которые уходят из A и никогда не доходят до B, означают, что поток переписали в пути, а датаграммы, которые доходят до B без ответа обратно, означают, что межсетевой экран не принял их как связанные.

Два партнёра с публичными адресами IPv6 обходят всю проблему. Без преобразования сопоставлять нечего, поэтому достаточно правила межсетевого экрана, называющего партнёров, и проект перестаёт зависеть от поведения роутера.

Когда прекращать попытки

Хост с публичным адресом — надёжный ответ. Он может завершить туннель для обоих партнёров или просто помочь им узнать текущий внешний адрес друг друга, и обе схемы работают независимо от того, что делают NAT. Управляемый оверлей даёт ту же координацию, если политика позволяет.

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

Сначала попробуйте прямую схему, а затем запишите, что увидели. Поведение NAT и перехват, который его показал, ценнее пары портов, которую вы в итоге использовали, потому что следующая сеть будет другой. руководство OpenVPN 2.6 документирует lport и параметры remote, от которых это зависит.

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