У тій самій розмові з'являються два номери, і жоден з них не є помилковим. Журнал сервера показує слухача, який пропонує службу, ноутбук показує сокет, що надіслав дейтаграму, а маршрутизатор між ними може переписати другий на виході. Порівнювати кінці розмови корисніше, ніж самі цифри. Порівняння нижче тримає окремо слухача, клієнтський сокет і трансляційне джерело, бо вони відповідають на різні питання.

Два номери, що описують протилежні кінці

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

Маршрутизатор між ними може переписати це джерело у власне зіставлення 'NAT'. Тому номер, який спостерігається на сервері, часто не має жодного зв'язку з тим, що вибрав ноутбук.

Де номер джерела змінюється на виході

Візьміть вигаданий приклад з IPv4: клієнт за маршрутизатором, що виконує трансляцію, сервер з одним слухачем 'UDP' і одна дейтаграма, що перетинає обидва. Таблиця називає кожен кінець і те, що з ним відбувається, замість повторного програвання пакета в трьох точках спостереження.

EndpointWhat stays fixedWhat changes on reconnectWho owns it
Server listenerThe service port and the address the profile namesNothing; the listener does not follow the clientThe server operator
Client socketThe destination it dialsThe local source port, chosen per socketThe client, or its operating system
Translated sourceUsually the public address of the routerThe port, and sometimes the address after a network switchThe 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 лише тому, що номер збігається. Документуючи розгортання, позначайте слухача сервера, клієнтський сокет і трансляційне джерело як три різні речі та додавайте транспорт до кожного.

Далі нехай політика йде за ролями. Сервер відкриває передбачений транспорт на своєму слухачі й далі автентифікує партнера; міжмережевий екран клієнта пропускає відповіді на власний вихідний обмін, не публікуючи вхідної служби. Фільтру без стану потрібен явно записаний зворотний напрямок, і це практична причина, чому розрізнення важливе поза охайними схемами.

Схожі статті