Есть ли конфликт между правилами iptables докера и podman?
Я установил Docker и Podman на одной машине. Это моя первая проблема? Может быть. Но моя цель - запустить оба, и я все равно хотел бы продолжить.
Моя проблема заключается в следующем: кажется, что между правилами Docker и правилами Podman существует конфликт iptables, и мое рабочее решение не имеет для меня никакого смысла.
Информация о версии: ОС: RHEL 7.6 Подман: 0.11.1.1 Докер: 18.09.1 Iptables: 1.4.21
Две точки информации:
- Демон docker добавляет правила iptables для работы в контейнерах при запуске.
- Podman добавляет правила iptables через CNI (контейнерный сетевой интерфейс) для работы в контейнерах при запуске контейнера.
Я запускаю контейнер с podman, который предоставляет порт (скажем, 5000, например). Я создал 3 тестовых примера, которые помогают проиллюстрировать мой вопрос и чрезвычайно странное поведение, с которым я сталкиваюсь в случае 3, который заставляет работать удаленный доступ. Читать дальше.
Первый случай имеет смысл: я устанавливаю Podman нормально, без какой-либо установки Docker, и запускаю контейнер. Пуф! Контейнер работает, и я могу получить удаленный доступ к порту, как я и ожидал.
Во втором случае удаленный доступ не работает. Я обычно устанавливаю 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
Теперь идет третий случай:
- Так что я слоняюсь по iptables и знаю достаточно, чтобы быть опасным.
Я решил удалить CNI-HOSTPORT-DNAT
правило:
iptables -t nat -D PREROUTING 2
И вдруг я снова могу удаленно получить доступ к контейнеру через порт 5000.
Мой вопрос:
Почему удаление вышеупомянутого правила заставляет вещи работать снова? Можно подумать, что удаление правила, созданного CNI, нарушит работу сети Podman. Но это не так. Я сбит с толку!
Заранее спасибо.
ОБНОВЛЕНИЕ: выяснил проблему, и это была моя вина.
Мои пакеты правильно отправлялись в цепочку FORWARD после DNAT, но в этой цепочке по умолчанию установлено DROP, и в этой цепочке нет правил для приема пакетов, привязанных к порту 5000. После добавления правила FORWARD для приема пакетов dport=5000, это начало работать.
Этот вопрос можно закрыть.