网络名称空间中的iptables LOG规则


9

我正在尝试为Docker容器设置iptables规则。我正在使用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但仍然无法正常工作
Fabian Jakobs 2015年

我使用基于centos 7的docker容器进行了测试,并且工作正常,主机是centos,使用ubuntu Ubuntu 15.04主机和ubuntu 12.04.5容器进行的同一测试不起作用,无论如何您都需要确定syslog正在您的主机中运行。
c4f4t0r

我使用Debian wheezy作为主机,并在容器中使用Ubuntu 14.04。那里不起作用。我想知道那里有什么不同。
Fabian Jakobs,2015年

您找到解决方案了吗?
gucki 2015年

@gucki我没有找到使它在命名空间内运行的解决方案。我将日志记录规则移出了容器。
Fabian Jakobs,2015年

Answers:


8

正如唐纳德(Donald)所述,默认情况下,容器内的iptables LOG规则被禁止。

在<= 4.10的内核中,如果不修补内核,则无法调整此行为。正如agrrd所提到的,一种解决方法是在每个容器中运行ulogd并使用iptables NFLOG(或ULOG)规则而不是LOG规则。

但是,从内核4.11开始,echo 1 > /proc/sys/net/netfilter/nf_log_all_netns在主机上(容器外部)运行将导致所有容器内的iptables LOG规则登录到主机。 (请参阅此内核提交。)



1

通过安装ulogd并将“ -j LOG”替换为“ -j ULOG”,我能够记录docker容器的iptables规则。匹配的数据包将记录到/ var / log / ulog目录


您是否在容器内的主机(未启动)上安装了ulogd(不提供任何规则输出)?
Phillipp

0

我已经看到了使用的示例(与内核无关)-v /dev/log:/dev/log。我想知道您是否需要做类似的事情。

另外,我看到您正在使用nsenter而不是docker exec:您正在运行哪个版本的docker ?


当完全不使用docker时,它也不起作用,而是从命令行手动使用netns。
gucki 2015年

您需要/ proc / kmsg或/ dev / kmsg,而docker会有效地阻止您将其安装在容器中。
菲利普·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.