Я хочу иметь возможность видеть 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 в этих случаях "пустой"
Я думаю, что моя проблема связана с этим: https://serverfault.com/questions/1097499/warning-iptables-legacy-tables-present-use-iptables-legacy-save-to-see-them
Я мог бы, но я предпочитаю этого не делать. Мы используем контейнер Docker для запуска служб мониторинга на каждом хосте. Использование контейнеров дает некоторые преимущества, которые мы предпочитаем сохранять. Некоторое время назад у нас было такое на хосте, но мы движемся к этому подходу.


--network=host это все, что вам нужно. Если вы используете --network=host, все сетевые интерфейсы, включая все iptables, являются общими.
Разница, как вы выяснили, в пользовательском пространстве. Ваша хост-система использует nftables, а не iptables.
Одной из ключевых функций Docker является предоставление каждому контейнеру изолированной сетевой среды. Похоже, вы хотите напрямую управлять сетевой средой хоста, и вам может вообще не понадобиться эта изоляция. Можно ли запустить этот процесс непосредственно на хосте, а не в контейнере?