Как добавить собственное правило iptables на хосте после запуска задания Nomad?

Вопрос или проблема

У меня есть инфраструктура с Nomad. Для некоторых задач мне нужно сначала добавить на узел хоста пользовательское правило iptables (iptables -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu) (не в контейнере – это очень важно!) и автоматизировать это. Я добавил это правило в cron и перезагрузил сервер. Но когда задача Nomad запускается, я вижу, что правило плагина CNI фаервола стоит на первом месте, а мое правило – на втором.
Я написал скрипт, который проверяет, стоит ли мое правило на первом месте, и если нет, добавляет его. Это работает хорошо, но это не решение для IaC. Также задачи могут быть мигрированы на другие серверы, и правило больше не нужно.

Может быть, вы знаете какое-то «красивое» решение с Nomad? Например, когда моя задача nomad запускается, выполнить какую-то проверку для правила iptables. Я также пытался понять, как создать собственное правило с плагином CNI фаервола, но это кажется невозможным.

Что я ожидаю (на сервере 1, сервере 2, например):

  1. Сервер 1 и сервер 2 чисты, нет пользовательских правил, нет правил CNI.
  2. Я запускаю задачу nomad, которая требует моего пользовательского правила. CNI фаервол добавляет свои правила, и после этого мне нужно добавить мое правило на первое место в правилах хоста.
  3. Если задача nomad мигрирует на сервер 2, удалите мое правило на сервере 1 (это не очень важно – я буду использовать пул узлов, чтобы изолировать эту задачу. Таким образом, задача не может мигрировать на сервер 3 и создать правило, которое может повредить другим задачам. Но мне не нужно 100+ одинаковых правил на моих хостах)
  4. Когда задача успешно мигрирует на сервер 2 – проверьте, присутствует ли мое правило, если да, ничего не делайте или добавьте мое пользовательское правило на первое место на хосте.

Извините за неправильные теги – nomad, iptables, cni отсутствуют.

Ответ или решение

Как добавить свои правила iptables на хост после запуска работы Nomad?

Ваша задача — добавить собственное правило iptables на хост после того, как будет запущена работа Nomad, и автоматизировать этот процесс. Ниже приведен подробный пошаговый план, который поможет вам реализовать данное решение.

1. Установка задачи

Для начала необходимо определить ваше требуемое правило iptables:

iptables -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Это правило будет добавлено в цепочку FORWARD, и его позиция имеет значение. При каждом запуске задания Nomad, CNI plugin может добавлять свои собственные правила, что может привести к конфликтам с уже установленными правилами.

2. Решение проблемы с приоритетом правил

Одним из способов решения вашей проблемы может быть использование механизма запуска пользовательских скриптов в Nomad. Вы можете задать пред- или пост-скрипты, которые будут выполняться перед или после выполнения вашей работы.

Например, вы можете использовать check или task конфигурации в вашем Nomad job file, чтобы управлять выполнением скриптов:

job "example" {
  datacenters = ["dc1"]

  group "example" {
    task "my_task" {
      driver = "docker"

      config {
        image = "your-docker-image"
      }

      lifecycle {
        hook = "prestart"

        command = "/path/to/your/script.sh"
      }

      service {
        name = "example-service"
      }
    }
  }
}

3. Создание скрипта для управления правилами iptables

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

#!/bin/bash

# Проверка наличия правила
if ! iptables -C FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 2>/dev/null; then
  iptables -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
fi
  • Добавьте этот скрипт в ваше задание Nomad, чтобы он выполнялся перед стартом контейнера. Это обеспечит, что ваше правило будет добавлено в нужное место при каждом запуске работы.

4. Удаление правила при миграции

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

#!/bin/bash

# Удаление правила при выходе
iptables -D FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Этот скрипт будет извлекаться из задачи при её завершении.

5. Избегание конфликта правил

Если у вас есть возможность, настройте ваш CNI плагин для использования более высокой таблицы маршрутизации или используйте iptables-save и iptables-restore для управления правилами так, чтобы ваши правила добавлялись каждый раз в нужной последовательности.

Заключение

Следуя вышеописанным шагам, вы сможете эффективно управлять правилами iptables на хостах, на которых запущены работы Nomad. Это решение полностью автоматизировано: правила устанавливаются и удаляются автоматически при запуске и миграции задач, что соответствует требованиям инфраструктуры как код (IaC).

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

Оцените материал
Добавить комментарий

Капча загружается...