Аварійний вимикач для сайдкара VPN: блокувати трафік, коли він завершується
Спільне використання простору імен контейнера VPN не зупиняє застосунок, коли тунель падає. Додайте явну політику вихідного трафіку й перевіряйте перезапуски, а не лише відключення.
Контейнер застосунку, який використовує мережевий простір імен контейнера VPN, не має власного інтерфейсу, тому легко припустити, що під час відмови тунелю він нічого не зможе надіслати. Це припущення хибне в тому режимі відмови, який має значення. Якщо процес VPN помирає, а простір імен зберігається, застосунок зберігає свої сокети, а простір імен зберігає свої маршрути, і трафік продовжується тим шляхом, який ще встановлений. Справжній аварійний вимикач — це явна політика фільтрації плюс тести життєвого циклу середовища виконання, а не залежність під час запуску.
Чому спільний простір імен не є вимикачем
Спільно використовувати простір імен означає, що застосунок використовує інтерфейси, адреси й таблицю маршрутизації контейнера VPN. Це прибирає незалежний шлях застосунку до мережі, поки спільний простір імен цілий, і нічого не каже про те, що цей простір імен зробить, коли тунель зникне.
Умови залежностей Compose можуть затримати запуск застосунку, доки залежність не стане здоровою. Це покриває лише один момент у часі й жодної наступної відмови, тож це інструмент порядку запуску, а не постійний міжмережевий екран вихідного трафіку.
Що насправді відбувається, коли контейнер завершується
Розрізняйте три події. Процес VPN усередині контейнера може померти, поки контейнер продовжує працювати. Контейнер може зупинитися або бути видаленим, що знищує простір імен. Контейнер може бути створений заново, що будує новий простір імен і нові правила.
У першому випадку простір імен зберігається, маршрут за замовчуванням може досі вказувати на фізичний інтерфейс, і застосунок продовжує надсилати напряму. У другому випадку залежний застосунок зазвичай повністю втрачає зв'язність, бо його простір імен зник. У третьому випадку застосунок може знову підключитися до нового простору імен до того, як тунель буде готовий. Кожен випадок потребує окремої перевірки, а проєкт, що покриває лише впорядковане відключення, покриває найменш цікавий випадок.
Побудуйте явну політику вихідного трафіку
Запишіть політику всередині спільного простору імен, щоб вона застосовувалася до пакетів застосунку. Форма — відкидання за замовчуванням із вузькими винятками: loopback, інтерфейс тунелю, а також конкретна адреса й порт кінцевої точки, потрібні транспорту тунелю.
Виняток для кінцевої точки мусить існувати до того, як підніметься тунель, інакше клієнт VPN не дістанеться свого сервера. Тому набір правил явно дозволяє зовнішній транспорт замість того, щоб дозволяти фізичний інтерфейс загалом. Додайте й правила IPv6, якщо простір імен має зв'язність IPv6, бо політика лише для IPv4 залишає іншу родину відкритою.
DNS теж належить до політики. Якщо застосунок розв'язує імена через резолвер, доступний лише всередині тунелю, правило відкидання зламає розв'язання, коли тунель опущений, і це правильна поведінка для аварійного вимикача. Вирішіть свідомо, чи саме цього ви хочете.
Перевіряйте життєвий цикл, а не лише відключення
Надішліть новий нешкідливий запит, поки тунель здоровий, потім убийте процес VPN і надішліть ще один. Повторіть після зупинки контейнера, після перезапуску й після перестворення. Новий запит важливий, бо наявне з'єднання може пережити зміну правил, що блокує нові.
Не покладайтеся на перевірку здоров'я чи пошук вихідної IP-адреси як на механізм блокування. Перевірка спостерігає стан і повідомляє про нього; політика керує трафіком. Обидва належать до одного розгортання, і вони не замінюють одне одного.
Запишіть правила, щоб перевірка пережила оновлення
Запишіть очікуваний результат для кожного випадку відмови в документацію розгортання разом із правилами, які його реалізують. Цей запис дозволяє запускати ту саму перевірку після оновлення образу чи середовища виконання, коли поведінка простору імен або маршрути за замовчуванням можуть змінитися без того, щоб хтось редагував файл compose.
Тримайте потрібний зовнішній шлях кінцевої точки VPN окремо від необмеженого вихідного трафіку застосунку й тримайте DNS та IPv6 у межах задуманого охоплення. Якщо політика задля зручності дозволяє весь фізичний інтерфейс, вимикач зник. Документація Docker про мережі описує схему спільного простору імен, на якій будується політика, і це той довідник, який треба перевірити, коли поведінка середовища виконання викликає сумніви.