Я установил 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, оно начало работать.
Этот вопрос можно закрыть.