docker – collectd无法监控ntpd 4.2.8(Ubuntu 16.04)

我有一个基于Ubuntu 16.04的Docker容器,它运行ntpd 4.2.8服务.在实例化容器后,我发布了端口123 / udp.

从局域网上的主机或其他计算机,我可以使用ntpq -p< container_host>获取对等列表和同步状态.但是使用collectd或运行ntpdc -c kerninfo< container_host>来监视它.失败/超时.这让我感到困惑!

我已经在容器内测试了一些合理的限制声明,也没有.但在这两种情况下我都会暂停.在容器中运行tcpdump(在将其升级到特权容器之后)显示UDP数据包到达,但没有任何答案.当然,使用tcpdump我在使用ntpq时看到了请求和响应.

如果我直接在主机上运行ntpd服务器,使用相同的ntp.conf文件,那么ntpdc -c kerninfo< container_host>并且收集两者都取得了我授权的局域网主机和其他计算机的成功!但是,主机仍在运行旧版本的Ubuntu(14.04),它附带ntp 4.2.6.

所以唯一的区别是Docker网络(据我所知NAT)和ntp版本(4.2.6 vs 4.2.8).但是ntp.org文档没有提到任何关于NAT的事情,也没有提到4.2.8更新.那么我的命令是否超时只是因为客户端与服务器位于不同的子网上(由于NAT)?或者4.2.8中有什么变化?

注意:我的容器映像基于ubuntu:16.04,运行ntpd 4.2.8p4@1.3265-o(来自Ubuntu官方存储库).主机运行Ubuntu 14.04,运行4.2.6p5.

PS:Collectd提交相当于ntpdc -c kerninfo< container_host>的命令.当ntpd在容器中运行时,即使所有的restrict语句都是正确的,也会超时.

更新:我忘了提到我也使用-ddd选项在容器内运行ntpd以获得更详细的输出.记录的唯一相关数据是:

read_network_packet: fd=19 length 192 from 192.168.1.3
receive: at 26 172.17.0.2<-192.168.1.3 flags 19 restrict 000

Update2:在找到解决方案后,我改变了一个问题,希望在搜索问题时,同一问题的其他绊脚石可能更好地找到问题/答案.我还纠正了一个错误,我认为主机运行的是Ubuntu 16.04,但它实际上仍在运行14.04.

最佳答案
我解决了我的问题.该错误是由于ntp 4.2.8弃用(并默认禁用)工具ntpdc及其使用的通信模式(aka mode7).

从ntp 4.2.8和更新版本开始,将使用工具ntpq代替ntpdc.它现在支持与ntpdc相同的命令.所以我可以运行ntpq -c kerninfo< container_host>成功. ntpq命令使用不同的模式(aka mode6)进行通信.

使用ntp 4.2.8,仍然可以重新启用mode7,以支持与尚未迁移的工具的兼容性.必须在/etc/ntp.conf中添加以下行:

enable mode7

但是,人们应该非常小心这个限制.由于似乎启用mode7并使ntpd服务器过于开放,可能会用于进行DDoS放大攻击.我目前在Ubuntu上使用IPv4和IPv6的默认限制,我认为 – 阻止使用此模式:

restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

由于collectd仅支持mode7(见issue #932),我决定在容器内的配置中重新启用此模式.只要ntp支持重新启用此模式,此更改应该解决了collectd无法监视Ubuntu 16.04(或使用ntp 4.2.8的任何发行版)上的ntpd的问题.

注意:为了让人们在遇到这个问题时能够更好地找到解决方案,我将编辑这个问题,以便减少对NAT的误导,我最初认为它是根本原因.

转载注明原文:docker – collectd无法监控ntpd 4.2.8(Ubuntu 16.04) - 代码日志