网络命名空间内的 Iptables LOG 规则

网络命名空间内的 Iptables LOG 规则

我正在尝试为 docker 容器设置 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

在哪里可以找到这些日志规则的输出?这是网络命名空间的已知问题/限制吗?

答案1

正如唐纳德提到的,容器内的 iptables LOG 规则默认受到抑制。

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

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

答案2

通过设计,可以抑制网络命名空间内部的 iptables LOG 目标的输出,以防止容器通过超出其日志缓冲区的范围来对其主机实施 DOS 攻击。

提交变更

当前内核中的相关源代码行

答案3

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

答案4

我见过一个使用的示例(与内核无关)-v /dev/log:/dev/log。我想知道您是否需要做类似的事情。

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

相关内容