Управление хостом iptables из контейнера докеров

Я хочу иметь возможность видеть iptables хоста внутри контейнера докеров. Не обязательно управлять им, возможно, iptables только для чтения будет достаточно. Я уже дал --cap-add=NET_ADMIN и сетевой режим установлен на host, но iptables все равно показывает пустой внутри контейнера. Точнее, это похоже на другое пространство имен iptables или что-то в этом роде. Я могу добавлять новые правила изнутри контейнера, но это, конечно, не влияет на iptables хоста.

root@host:~# iptables -xnvL OUTPUT 
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain OUTPUT (policy ACCEPT 1104394 packets, 407916631 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
   16498  3125381            all  --  *      *       8.8.8.8         0.0.0.0/0           
  107211 59743643            all  --  *      *       192.168.0.1          0.0.0.0/0           
root@host:~# docker exec ct_monitor_1 iptables -xnvL OUTPUT
Chain OUTPUT (policy ACCEPT 33081662 packets, 12617923760 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
  206142 41989385            all  --  *      *       1.1.1.1         0.0.0.0/0           
 3686279 1919571839            all  --  *      *       172.0.0.1          0.0.0.0/0

(правила поддельные, просто чтобы показать, что контейнеры имеют разные iptables)

Спасибо!

ОБНОВИТЬ

Я заметил, что проблема возникает на хосте с Ubuntu 22.04 и док-контейнером Ubuntu <= 20.04.

Чтобы уточнить, я даю больше контекста.

Хозяин:

root@host:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy

root@zitz:~# iptables -nvL OUTPUT
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain OUTPUT (policy ACCEPT 437K packets, 229M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 285K  142M            all  --  *      *       8.8.8.8         0.0.0.0/0           
 120K   83M            all  --  *      *       192.168.0.1          0.0.0.0/0

Рабочий пример, обратите внимание, что я использую ubuntu:jammy-20221003

root@zitz:~# docker run --rm -it --network=host --cap-add=NET_ADMIN ubuntu:jammy-20221003 bash
root@zitz:/# apt -qq -y update && apt install -qq -y iptables
root@zitz:/# iptables -nvL OUTPUT
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain OUTPUT (policy ACCEPT 436K packets, 229M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 285K  142M            all  --  *      *       8.8.8.8         0.0.0.0/0           
 120K   82M            all  --  *      *       192.168.0.1          0.0.0.0/0

Нерабочий пример, я использую любую версию Ubuntu ниже или равную 20.04.

root@zitz:~# docker run --rm -it --network=host --cap-add=NET_ADMIN ubuntu:focal bash
root@zitz:/# apt -qq update && apt install -y -qqq iptables
.
.
.
root@zitz:/# iptables -nvL OUTPUT
Chain OUTPUT (policy ACCEPT 148K packets, 53M bytes)
 pkts bytes target     prot opt in     out     source               destination

iptables в этих случаях "пустой"

Обновление 2

Я думаю, что моя проблема связана с этим: https://serverfault.com/questions/1097499/warning-iptables-legacy-tables-present-use-iptables-legacy-save-to-see-them

Одной из ключевых функций Docker является предоставление каждому контейнеру изолированной сетевой среды. Похоже, вы хотите напрямую управлять сетевой средой хоста, и вам может вообще не понадобиться эта изоляция. Можно ли запустить этот процесс непосредственно на хосте, а не в контейнере?

David Maze 14.10.2022 21:51

Я мог бы, но я предпочитаю этого не делать. Мы используем контейнер Docker для запуска служб мониторинга на каждом хосте. Использование контейнеров дает некоторые преимущества, которые мы предпочитаем сохранять. Некоторое время назад у нас было такое на хосте, но мы движемся к этому подходу.

Roberto Iglesias 14.10.2022 22:09
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
2
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

--network=host это все, что вам нужно. Если вы используете --network=host, все сетевые интерфейсы, включая все iptables, являются общими.

Разница, как вы выяснили, в пользовательском пространстве. Ваша хост-система использует nftables, а не iptables.

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