Чому traceroute вмирає в одному напрямку через VPN-тунель
Траса, яка завершується в один бік і друкує зірочки в інший, зазвичай є діагностичною проблемою. Порівняйте методи зондів, зворотні шляхи та справжній запит.
Вивід traceroute, який завершується в одному напрямку і друкує ряди зірочок в іншому, виглядає як асиметричне пересилання, і зазвичай ним не є. Кожному показаному хопу потрібно, щоб зонд дійшов, щоб маршрутизатор вирішив відповісти і щоб відповідь повернулася та зіставилася із зондом. Розірвіть будь-яку з цих ланок, і рядок стане зірочкою, а тунель продовжить нести дані.
Траса — це доказ про діагностику раніше, ніж доказ про транспорт. Варто спитати, яка з трьох ланок відмовила, і відповідь приходить із пакетів, а не з форми виводу.
Зірочка — це відсутня відповідь, а не відсутній хоп
Traceroute рухається назовні, надсилаючи зонди, TTL яких спливає на один маршрутизатор далі в кожному раунді. Маршрутизатор, який відкидає прострочений зонд, має повернути повідомлення ICMP Time Exceeded із власним ім'ям, і інструмент друкує це ім'я. Насправді інструмент чекає, що це повідомлення надійде в межах тайм-ауту. Якщо маршрутизатор відповідає з іншої адреси джерела, обмежує частоту створення помилок або мовчки відкидає зонд, раунд не дає нічого придатного для друку.
Жоден із цих результатів не каже, що прямий шлях зламаний. Зірочка — це звіт про неотриманий лист, а не про порожню дорогу.
Метод зонда вирішує, з яким фільтром ви зустрінетеся
Метод за замовчуванням у Linux — зазвичай UDP-порт призначення з великим номером, tracert у Windows надсилає ICMP-луну, а Linux можна попросити використовувати замість цього ICMP або TCP. Кожен із них виглядає для міжмережевого екрана з відстеженням станів або хмарної групи безпеки як інший вид трафіку. Порівнювати UDP-трасу з одного боку з ICMP-трасою з іншого означає порівнювати два різні експерименти. Зафіксуйте метод, родину адрес, адресу джерела та тайм-аут, перш ніж називати результати різницею.
Для чесного порівняння запускайте трасу з тих хостів, які справді несуть трафік, а не зі шлюзу, що пересилає за них. Траса, створена маршрутизатором, використовує його власну адресу джерела та політику виходу, які можуть бути суворішими за все, що бачить клієнт. Запишіть точну команду, щоб наступна людина могла її повторити.
Значення тайм-ауту — друга половина експерименту, і його легко пропустити в нотатках. Очікування у дві секунди на перевантаженому шляху повідомляє про зірочки там, де очікування у п'ять секунд повідомляє про хопи. Тримайте значення однаковим у всіх запусках, щоб порівняння залишалося про мережу.
Зворотний шлях — це власний маршрут
Помилка ICMP — це звичайний пакет із власним джерелом і призначенням, і йому потрібен маршрут назад до трасувальника. Якщо політика тунелю несе префікси LAN, але не адресу маршрутизатора, що створив помилку, повідомлення виходить шляхом, який не може до вас дістатися. Фільтрація відповідей може відкинути його навіть за наявного маршруту, бо пакет приходить із несподіваної адреси на несподіваному інтерфейсі. Це невідповідність у діагностичній площині, а не збій застосунку.
Розширення кожного селектора, доки траса не завершиться, робить картину красивішою, а політику гіршою. Виправте конкретну діагностичну адресу або прийміть зірочку й перевірте застосунок інакше.
Підтвердьте тунель справжнім запитом
Рукостискання TCP на власному порту служби перевіряє пересилання, зворотну маршрутизацію та фільтрацію в тому напрямку, який важливий. Команди нижче виконуються на обох кінцях і порівнюють, що може відкрити кожна сторона. Замініть порт служби та назву інтерфейсу тунелю на свої.
traceroute -I -n -w 2 203.0.113.40
traceroute -T -p 443 -n -w 2 203.0.113.40
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' --max-time 5 http://203.0.113.40:8080/health
ss -tan state established
Спочатку прочитайте два запуски traceroute: якщо запуск ICMP показує хопи, а запуск TCP ні, різниця в методі, а не в шляху. Потім прийміть результат curl як відповідь на рівні застосунку, бо завершений обмін із розумним кодом стану означає, що прямий і зворотний шляхи працюють для справжнього трафіку. Список сокетів показує, чи встановлено з'єднання взагалі, чого жодна траса вам не скаже.
Тунель, який несе інтерактивну сесію в обидва боки, поки один traceroute друкує зірочки, здоровий і просто нефотогенічний. Зберігайте вивід команд з кожного боку як запис і ставтеся до відсутніх хопів як до відкритого питання про діагностику, а не як до вироку про VPN.