我正在尝试为 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
答案3
通过安装 ulogd 并将“-j LOG”替换为“-j ULOG”,我能够记录 docker 容器的 iptables 规则。匹配的数据包将记录到 /var/log/ulog 目录中
答案4
我见过一个使用的示例(与内核无关)-v /dev/log:/dev/log
。我想知道您是否需要做类似的事情。
另外,我发现您使用的是 nsenter 而不是docker exec
:您正在运行哪个版本的 docker?