Я пытаюсь настроить правила iptables для контейнера докеров. я использую нсентер для выполнения команды 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
.
Где я могу найти вывод этих правил журнала? Это известная проблема / ограничение сетевых пространств имен?
Как сказал Дональд, правила LOG iptables внутри контейнеров по умолчанию подавлены.
В ядрах <= 4.10 это поведение нельзя было изменить без исправления ядра. Как упоминалось в agrrd, обходной путь состоит в том, чтобы запустить ulogd в каждом контейнере и использовать правила iptables NFLOG (или ULOG) вместо правил LOG.
Однако, начиная с ядра 4.11, запуск echo 1 > /proc/sys/net/netfilter/nf_log_all_netns
на хосте (вне контейнера) приведет к тому, что правила LOG iptables внутри всех контейнеров будут регистрироваться на хосте. (См. Эту фиксацию ядра.)
Вывод целевых объектов журнала iptables из сетевого пространства имен запрещен по дизайну, чтобы контейнеры не загружали свой хост в DOS за счет переполнения его буферов журнала.
Мне удалось зарегистрировать правила iptables для контейнеров докеров, установив ulogd и заменив «-j LOG» на «-j ULOG». Соответствующие пакеты записываются в каталог / var / log / ulog
Я видел пример (не связанный с ядром) использования -v /dev/log:/dev/log
. Интересно, нужно ли вам сделать что-то подобное ..
Кроме того, я вижу, что вы используете nsenter, а не docker exec
: какая у вас версия докера?