Контейнер приложения, который использует сетевое пространство имён контейнера VPN, не имеет собственного интерфейса, поэтому легко предположить, что при отказе туннеля он ничего не сможет отправить. Это предположение ошибочно в том режиме отказа, который важен. Если процесс VPN умирает, а пространство имён сохраняется, приложение сохраняет свои сокеты, а пространство имён сохраняет свои маршруты, и трафик продолжается по тому пути, который всё ещё установлен. Настоящий аварийный выключатель — это явная политика фильтрации плюс тесты жизненного цикла среды выполнения, а не зависимость при запуске.

Почему совместное пространство имён не является выключателем

Разделять пространство имён означает, что приложение использует интерфейсы, адреса и таблицу маршрутизации контейнера VPN. Это убирает независимый путь приложения в сеть, пока общее пространство имён цело, и ничего не говорит о том, что это пространство имён сделает, когда туннель исчезнет.

Условия зависимостей Compose могут задержать запуск приложения, пока зависимость не станет здоровой. Это покрывает лишь один момент времени и ни одного последующего отказа, поэтому это инструмент порядка запуска, а не постоянный межсетевой экран исходящего трафика.

Что на самом деле происходит, когда контейнер завершается

Различайте три события. Процесс VPN внутри контейнера может умереть, пока контейнер продолжает работать. Контейнер может остановиться или быть удалён, что уничтожает пространство имён. Контейнер может быть создан заново, что строит новое пространство имён и новые правила.

В первом случае пространство имён сохраняется, маршрут по умолчанию может по-прежнему указывать на физический интерфейс, и приложение продолжает отправлять напрямую. Во втором случае зависимое приложение обычно полностью теряет связность, потому что его пространство имён исчезло. В третьем случае приложение может заново подключиться к новому пространству имён до того, как туннель будет готов. Каждый случай требует отдельной проверки, а проект, покрывающий только упорядоченное отключение, покрывает наименее интересный случай.

Постройте явную политику исходящего трафика

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

Исключение для конечной точки должно существовать до того, как поднимется туннель, иначе клиент VPN не сможет достучаться до своего сервера. Поэтому набор правил явно разрешает внешний транспорт вместо того, чтобы разрешать физический интерфейс в целом. Добавьте и правила IPv6, если у пространства имён есть связность IPv6, потому что политика только для IPv4 оставляет другое семейство открытым.

DNS тоже относится к политике. Если приложение разрешает имена через резолвер, доступный только внутри туннеля, правило отбрасывания нарушит разрешение, когда туннель опущен, и это правильное поведение для аварийного выключателя. Решите осознанно, хотите ли вы именно этого.

Проверяйте жизненный цикл, а не только отключение

Отправьте новый безвредный запрос, пока туннель здоров, затем убейте процесс VPN и отправьте ещё один. Повторите после остановки контейнера, после перезапуска и после пересоздания. Новый запрос важен потому, что существующее соединение может пережить изменение правил, блокирующее новые.

Не полагайтесь на проверку здоровья или поиск исходящего IP как на механизм блокировки. Проверка наблюдает состояние и сообщает о нём; политика управляет трафиком. Оба относятся к одному развёртыванию, и они не заменяют друг друга.

Запишите правила, чтобы проверка пережила обновление

Запишите ожидаемый результат для каждого случая отказа в документацию развёртывания вместе с правилами, которые его реализуют. Эта запись позволяет запускать ту же проверку после обновления образа или среды выполнения, когда поведение пространства имён или маршруты по умолчанию могут измениться без того, чтобы кто-то правил файл compose.

Держите требуемый внешний путь конечной точки VPN отдельно от неограниченного исходящего трафика приложения и держите DNS и IPv6 в пределах задуманного охвата. Если политика ради удобства разрешает весь физический интерфейс, выключатель пропал. Документация Docker по сетям описывает схему общего пространства имён, на которой строится политика, и это тот справочник, который нужно проверить, когда поведение среды выполнения вызывает сомнения.

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