Правило Iptables LOG внутри сетевого пространства имен

9

Я пытаюсь настроить правила 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.

Где я могу найти вывод этих правил журнала? Является ли это известной проблемой / ограничением сетевых пространств имен?

Фабиан Якобс
источник
Обновление: я попытался NFLOGвместо этого, но это все еще не будет работать
Фабиан Джейкобс
Я провел тест с использованием док-контейнера, основанного на centos 7, и он работает, хост - это centos, тот же тест с Ubuntu Ubuntu 15.04 host и контейнер ubuntu 12.04.5 не работает, в любом случае вам нужно быть уверенным, системный журнал работает на вашем хосте.
c4f4t0r
Я использую Debian wheezy в качестве хоста и Ubuntu 14.04 в контейнере. Там это не работает. Мне интересно, что там отличается.
Фабиан Якобс
Вы нашли решение для этого?
Гуки
@gucki Я не нашел решения, чтобы заставить его работать внутри пространства имен. Я переместил правила регистрации за пределы контейнера.
Фабиан Якобс

Ответы:

8

Как упоминал Дональд, правила 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.)

Пол Донохью
источник
3

Выходные данные целей iptables LOG изнутри пространства имен сети подавляются конструкцией, чтобы не допустить, чтобы контейнеры выполняли DOS на своем хосте из-за переполнения буферов журналов.

совершить внесение изменений

соответствующая строка исходного кода в текущем ядре

Дональд
источник
1

Мне удалось зарегистрировать правила iptables для контейнеров Docker, установив ulogd и заменив «-j LOG» на «-j ULOG». Соответствующие пакеты записываются в каталог / var / log / ulog

agrrd
источник
Вы установили ulogd на хост (не выводит правило) oder внутри контейнера (который не запускается)?
Филипп
0

Я видел пример (не связанный с ядром) использования -v /dev/log:/dev/log. Интересно, если вам нужно сделать что-то подобное ..

Кроме того, я вижу, что вы используете nsenter, а не docker exec: какую версию Docker вы используете?

Кэмерон Керр
источник
Это также не работает, когда вообще не используется docker, но netns вручную из командной строки.
Gucki
Вы бы хотели / proc / kmsg или / dev / kmsg, и докер эффективно не позволяет вам монтировать это в контейнер.
Филипп