Есть ли конфликт между правилами iptables докера и podman?

Я установил Docker и Podman на одной машине. Это моя первая проблема? Может быть. Но моя цель - запустить оба, и я все равно хотел бы продолжить.

Моя проблема заключается в следующем: кажется, что между правилами Docker и правилами Podman существует конфликт iptables, и мое рабочее решение не имеет для меня никакого смысла.

Информация о версии: ОС: RHEL 7.6 Подман: 0.11.1.1 Докер: 18.09.1 ​​Iptables: 1.4.21

Две точки информации:

  1. Демон docker добавляет правила iptables для работы в контейнерах при запуске.
  2. Podman добавляет правила iptables через CNI (контейнерный сетевой интерфейс) для работы в контейнерах при запуске контейнера.

Я запускаю контейнер с podman, который предоставляет порт (скажем, 5000, например). Я создал 3 тестовых примера, которые помогают проиллюстрировать мой вопрос и чрезвычайно странное поведение, с которым я сталкиваюсь в случае 3, который заставляет работать удаленный доступ. Читать дальше.

  1. Первый случай имеет смысл: я устанавливаю Podman нормально, без какой-либо установки Docker, и запускаю контейнер. Пуф! Контейнер работает, и я могу получить удаленный доступ к порту, как я и ожидал.

  2. Во втором случае удаленный доступ не работает. Я обычно устанавливаю Podman, устанавливаю и запускаю сервис Docker, затем запускаю свой контейнер с Podman. Boom. Сбой удаленного доступа, потому что нет маршрута к хосту.

Прежде чем перейти к третьему случаю, важно отметить два очень специфических правила iptables. Вы можете просмотреть эти правила (если у вас запущен демон Docker и запущен контейнер Podman), выполнив:

iptables -t nat -nL PREROUTING

Вывод команды:

Chain PREROUTING (policy ACCEPT)
target    prot opt source            destination
DOCKER    all  --  0.0.0.0/0         0.0.0.0/0      ADDRTYPE match dst-type LOCAL
CNI-HOSTPORT-DNAT    all  --  0.0.0.0/0         0.0.0.0/0      ADDRTYPE match dst-type LOCAL

Теперь идет третий случай:

  1. Так что я слоняюсь по iptables и знаю достаточно, чтобы быть опасным.

Я решил удалить CNI-HOSTPORT-DNAT правило:

iptables -t nat -D PREROUTING 2

И вдруг я снова могу удаленно получить доступ к контейнеру через порт 5000.

Мой вопрос:

Почему удаление вышеупомянутого правила заставляет вещи работать снова? Можно подумать, что удаление правила, созданного CNI, нарушит работу сети Podman. Но это не так. Я сбит с толку!

Заранее спасибо.

ОБНОВЛЕНИЕ: выяснил проблему, и это была моя вина.

Мои пакеты правильно отправлялись в цепочку FORWARD после DNAT, но в этой цепочке по умолчанию установлено DROP, и в этой цепочке нет правил для приема пакетов, привязанных к порту 5000. После добавления правила FORWARD для приема пакетов dport=5000, это начало работать.

Этот вопрос можно закрыть.

0 ответов

Другие вопросы по тегам