Две лаборатории могут моделировать одну и ту же топологию 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 быть доказательством, а не вашей памяти. Затем сломайте ровно одну вещь — либо удалив маршрут, либо добавив правило отказа на пути пересылки, — и подтвердите предсказанный симптом: завершённое рукопожатие без ответа или сбой разрешения имени вместо тайм-аута. Лаборатория, которая демонстрирует только успех, учит очень малому.

Очистка — это то, что делает следующий запуск повторяемым

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

Используйте локально сгенерированные учётные данные для лаборатории и держите производственные учётные записи подальше от общих примеров. Затем удалите каждое пространство имён и подтвердите, что вид хоста не изменился, — в этом и вся причина выбора этой модели. Лаборатория, которую нельзя чисто удалить, — это изменение хоста с лишними шагами.

Похожие статьи