![容器重启后,从外部到 Docker 容器的 UDP 流量被丢弃](https://linux22.com/image/648325/%E5%AE%B9%E5%99%A8%E9%87%8D%E5%90%AF%E5%90%8E%EF%BC%8C%E4%BB%8E%E5%A4%96%E9%83%A8%E5%88%B0%20Docker%20%E5%AE%B9%E5%99%A8%E7%9A%84%20UDP%20%E6%B5%81%E9%87%8F%E8%A2%AB%E4%B8%A2%E5%BC%83.png)
以下情况:我有一个装有 Ubuntu 14.04LTS 的硬件盒,作为 docker 1.4 的主机,我在几个容器中运行 ELK 堆栈。目前,logstash 容器仅公开端口 514 来收集系统日志输入。
在某些情况下,重新启动容器后,syslog 流量不再转发到容器。
'iptables -nvL' 显示,容器启动时,没有流量与应用于转发链的规则匹配。INPUT 链的流量计数器明显高于 FORWARD 链。
我注意到所有向世界公开 UDP 端口的容器都存在这种行为,基于 TCP 的服务的容器都按预期工作。
重新启动容器和docker服务没有成功。
我主要收集防火墙流量日志,因此系统日志流量相当稳定。我每秒收集大约 1.5k 个系统日志陷阱。
我的解决方法是停止所有到主机的流量约 10 秒(目前通过在上游路由器上对流量进行黑洞处理)
在单个防火墙节点上停止 syslog 导出几秒钟后,来自该特定防火墙的流量将按预期转发到容器。但仅限于这一个。
我认为这是 iptables 的问题。看来 iptables 会将转发信息缓存几秒钟,并且只要有流量就会忽略任何新应用的规则。
我在这里没有对 iptables 进行任何额外的配置。一切都由 docker 完成。我没有安装 ufw、conntrackd 或任何东西。
有任何建议如何解决这个问题吗?
致以最良好的祝愿 Andreas
答案1
看起来这与 conntrack 有关。它已被标记为 Docker 错误:https://github.com/docker/docker/issues/8795 那里列出了一个解决方法;我成功地让我的一个主机再次工作conntrack -F
。