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

Що зазвичай описує звернення

Уявіть телефон у Wi-Fi із піднятим тунелем. Інтерфейс Wi-Fi тримає адресу локальної мережі, інтерфейс тунелю тримає призначену внутрішню адресу, а запит, що виходить через тунель, приходить до публічного сервісу з того джерела, яке переживе будь-яке перетворення на шляху. Застосунок, що друкує внутрішню адресу, і сервер, що записує перетворене джерело, обидва повідомляють точно, і ці два значення ніколи не збігатимуться.

Три спостереження різняться тим, що вони можуть довести, а не лише тим, що вони описують.

ObservationWhat it describesWhat it cannot prove
An address on a local interfaceOne configured attachment: Wi-Fi, cellular or a tunnelThe source a remote site receives
A socket's local endpointThe binding used by that one connectionThe address after translation further along
The peer address at a serviceWhat arrived at that observation pointAny other interface on the phone

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

На що виклик сокета може і не може відповісти

На рівні API getsockname повідомляє локальну кінцеву точку, яка зараз прив'язана до конкретного сокета. Для з'єднаного сокета це джерело, яке ядро вибрало для цього з'єднання, і це вже конкретніше за будь-який список інтерфейсів. Це не пошук публічної адреси, і виклик його на неприв'язаному сокеті майже нічого не каже. Що б він не повертав, це може бути пізніше переписано на шляху, тому лише власне спостереження сервісу є авторитетним щодо того, що сервіс отримав.

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

Розділений тунель робить різницю видимою. Один запит може вийти через тунель, а наступний, спрямований на інший пункт призначення або іншу родину адрес, ні, тому два результати одного застосунку з різницею в секунди можуть бути чесними й різними.

Виберіть спостереження, що відповідає питанню

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

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

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

Назви інтерфейсів не є детектором

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

Називайте поле за спостереженням, яке воно зберігає. local_interface_address, socket_local_endpoint і service_observed_source незграбні та однозначні, а однозначність це те, що потрібно, коли значення через тиждень потрапляє у звернення до підтримки. Один стовпець з назвою device IP збере всі три, а потім йому довірятимуть так, ніби він один.

Тримайте ідентичність поза стовпцем адреси

Спільний вихід VPN це не ідентичність користувача, а приватна адреса не облікові дані доступу. Обидва описують шлях, а не людину, і ставлення до будь-якого з них як до автентифікації перетворює випадковість маршрутизації на рішення про авторизацію.

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

Потім запишіть, яке з трьох ваш продукт справді має показувати, і вилучіть два інші з інтерфейсу.

Схожі статті