Фіксовані порти UDP можуть обійти переспрямування портів, але не кожен NAT
Міжмережевий екран із відстеженням станів пропускає пакет партнера як зворотний трафік, коли обидва кінці закріплюють один порт. Ось коли це працює і що тихо це припиняє.
Два домашні маршрутизатори, жодного переспрямованого порту і 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, від яких це залежить.