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

Два способи побудувати ту саму лабораторію, і коли перемагає кожен

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

AspectNamespace labHost-route lab
IsolationFull stack per roleShares the host stack
CleanupDelete named namespacesManual route and rule removal
RealismStrong for routingNeeded for GUI clients

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

Один контекст на роль, з'єднані навмисно

Створіть один простір імен на роль і перенесіть кожен кінець кожної пари veth у контекст, якому він належить. Перших чотирьох команд достатньо, щоб побачити форму:

ip netns add client
ip netns add gateway
ip link add veth-c type veth peer name veth-g
ip link set veth-c netns client

Дайте лабораторії діапазони, які ні з чим на хості не перетинаються, і запишіть до старту, який простір імен володіє якою адресою. Робочій лабораторії потрібні два окремі шляхи: зовнішній, щоб кінцева точка VPN дісталася свого партнера, і зворотний шлях для захищеного ресурсу. Моделюйте їх як два рішення, бо лабораторія, яка будує лише вихідну половину, проходить тест рукостискання і провалює тест застосунку.

Роль пересилання — це місце, де лабораторії стають цікавими

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

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

Запишіть базову лінію, потім зламайте один маршрут

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

ip netns list
ip -n client route get 10.0.0.5
ip -n gateway -s link show veth-g

Третя команда — та, яку люди пропускають, і саме там живуть докази: лічильники відкинутих і помилок кажуть, чи дійшов пакет узагалі до ролі пересилання. Запишіть ті самі три види після зміни й дозвольте diff бути доказом, а не вашій пам'яті. Потім зламайте рівно одну річ — або видаливши маршрут, або додавши правило відмови на шляху пересилання, — і підтвердьте передбачений симптом: завершене рукостискання без відповіді або збій розв'язання імені замість тайм-ауту. Лабораторія, яка демонструє лише успіх, навчає дуже мало.

Очищення — це те, що робить наступний запуск повторюваним

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

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

Схожі статті