Вихідний порт клієнта проти слухача сервера в потоці VPN
Порівняйте два номери портів в одному тунелі: фіксований слухач сервера й короткочасне джерело клієнта, а також як між ними розташована трансляція маршрутизатора.
У тій самій розмові з'являються два номери, і жоден з них не є помилковим. Журнал сервера показує слухача, який пропонує службу, ноутбук показує сокет, що надіслав дейтаграму, а маршрутизатор між ними може переписати другий на виході. Порівнювати кінці розмови корисніше, ніж самі цифри. Порівняння нижче тримає окремо слухача, клієнтський сокет і трансляційне джерело, бо вони відповідають на різні питання.
Два номери, що описують протилежні кінці
Налаштований порт сервера — це адресат, до якого звертається клієнт. Він зафіксований політикою, присутній у профілі й має бути відкритим на боці сервера. Вихідний порт клієнта вибирається локально, зазвичай з ефемерного діапазону, і існує, щоб відповіді було куди прийти. Він може змінюватися при кожному перепідключенні, і ніщо в архітектурі не залежить від його стабільності.
Маршрутизатор між ними може переписати це джерело у власне зіставлення 'NAT'. Тому номер, який спостерігається на сервері, часто не має жодного зв'язку з тим, що вибрав ноутбук.
Де номер джерела змінюється на виході
Візьміть вигаданий приклад з IPv4: клієнт за маршрутизатором, що виконує трансляцію, сервер з одним слухачем 'UDP' і одна дейтаграма, що перетинає обидва. Таблиця називає кожен кінець і те, що з ним відбувається, замість повторного програвання пакета в трьох точках спостереження.
| Endpoint | What stays fixed | What changes on reconnect | Who owns it |
|---|---|---|---|
| Server listener | The service port and the address the profile names | Nothing; the listener does not follow the client | The server operator |
| Client socket | The destination it dials | The local source port, chosen per socket | The client, or its operating system |
| Translated source | Usually the public address of the router | The port, and sometimes the address after a network switch | The NAT device or the upstream carrier |
Адресат незмінний у кожному рядку, і змінюється лише ідентичність джерела. Вимоги UDP NAT розрізняють внутрішню адресу й порт від зовнішнього зіставлення, і це саме різниця між другим і третім рядком. Маршрутизатор може зберегти вихідний порт клієнта або вибрати інший; збереження — не те, що застосунок має припускати.
Прочитайте три кінці на самих вузлах
Списки нижче отримані з трьох різних машин і разом показують усю розмову. Запустіть перший на сервері, другий на клієнті, а третій там, де існує зіставлення. Один рядок журналу ніколи не показує всі три.
ss -lunp 'sport = :1194'
ss -unp | grep 1194
conntrack -L -p udp | grep 1194
Перший список доводить, що сервер прив'язаний до порту служби, і показує, який процес ним володіє. Другий показує локальний сокет клієнта й адресат, до якого він звертався. Третій показує зіставлення, створене маршрутизатором, і це єдине місце, де з'являється трансляційне джерело. Прочитайте їх у цьому порядку, і два номери перестануть виглядати суперечливими.
Що змінює перепідключення, а що ні
Деякі маршрутизатори зберігають вихідний порт клієнта, коли він вільний, а інші щоразу виділяють інший. Обидві поведінки нормальні, і застосунок, що вимагає першої, зламається на другій. Зміна зіставлення після перепідключення або зміни мережі не є несправністю сервера: клієнт відкриває новий сокет, маршрутизатор виділяє те, що має, а сервер бачить нове джерело на тому самому слухачі. Несправністю було б очікувати, що сервер прийме трафік, адресований довільному порту клієнта.
Клієнти OpenVPN зі спільноти отримують цю поведінку через nobind, що дозволяє операційній системі вибрати локальний порт; віддалений порт і далі береться з профілю. Явне прив'язування — усвідомлений вибір, а не вимога протоколу. Сервер продовжує пропонувати один кінець, поки клієнти обирають власні локальні ідентичності.
Позначайте шари окремо в записі
Усередині тунелю відбувається друга розмова з власними портами. Запит HTTPS, який несе тунель, має адресатом TCP 443, тоді як зовнішнє зашифроване з'єднання використовує UDP 1194, тому зміна зовнішнього вихідного порту нічого не змінює у внутрішній службі.
Навіть на зовнішньому шарі протокол має значення. UDP 1194 і TCP 1194 — різні кінці, і слухач 'TCP' ніколи не отримає дейтаграму UDP лише тому, що номер збігається. Документуючи розгортання, позначайте слухача сервера, клієнтський сокет і трансляційне джерело як три різні речі та додавайте транспорт до кожного.
Далі нехай політика йде за ролями. Сервер відкриває передбачений транспорт на своєму слухачі й далі автентифікує партнера; міжмережевий екран клієнта пропускає відповіді на власний вихідний обмін, не публікуючи вхідної служби. Фільтру без стану потрібен явно записаний зворотний напрямок, і це практична причина, чому розрізнення важливе поза охайними схемами.