Правило Iptables LOG внутри сетевого пространства имен
Я пытаюсь настроить правила iptables для контейнера Docker. Я использую nsenter для выполнения команды iptables внутри сетевого пространства имен контейнера:
# log access to port 8080
PID=$(docker inspect --format "{{.State.Pid}}" $ID)
/home/ubuntu/nsenter -n -t $PID iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 8080 -j LOG
Этот подход работает отлично, за исключением LOG
правила. Те, кажется, нигде не регистрируются. Обратите внимание, что то же правило, примененное к хост-системе, работает и регистрирует /var/log/kern.log
,
Где я могу найти вывод этих правил журнала? Является ли это известной проблемой / ограничением сетевых пространств имен?
4 ответа
Как упоминал Дональд, правила iptables LOG внутри контейнеров по умолчанию подавляются.
В ядрах <=4.10 это поведение не может быть скорректировано без исправления ядра. Как уже упоминалось, обходным путем является запуск ulogd в каждом контейнере и использование правил iptables NFLOG (или ULOG) вместо правил LOG.
Однако, начиная с ядра 4.11, работает echo 1 > /proc/sys/net/netfilter/nf_log_all_netns
на хосте (вне контейнера) приведет к тому, что правила LOG iptables внутри всех контейнеров будут регистрироваться на хосте. (См. Это Kernel Commit.)
Выходные данные целей iptables LOG изнутри пространства имен сети подавляются конструкцией, чтобы не допустить, чтобы контейнеры выполняли DOS на своем хосте из-за переполнения буферов журналов.
Мне удалось зарегистрировать правила iptables для контейнеров Docker, установив ulogd и заменив "-j LOG" на "-j ULOG". Соответствующие пакеты записываются в каталог /var/log/ulog
Я видел пример (не связанный с ядром) использования -v /dev/log:/dev/log
, Интересно, если вам нужно сделать что-то подобное..
Кроме того, я вижу, что вы используете nsenter, а не docker exec
: какую версию докера вы используете?