root@testpgmaster:/# puppetd --test
info: Creating a new SSL key for testpgmaster
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for ca
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for testpgmaster
info: Certificate Request fingerprint (md5): C9:83:59:EF:6A:B8:16:31:B6:92:5D:70:F1:67:39:4F
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
root@testpgmaster:/#
这是正常输出,结果正如预期的那样,证书请求正确创建。问题是几乎每次显示警告时,都会有大约两分钟的延迟。
当使用 strace 运行相同的命令时,在混乱的 strace 输出中,我在某处看到:
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 6
fcntl(6, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(6, {sa_family=AF_INET, sin_port=htons(8140), sin_addr=inet_addr("10.0.2.15")}, 16) = -1 EINPROGRESS (Operation now in progress)
...
[lots of intermediate output]
...
select(7, [6], [], [], {119, 999900}) <- The pause occurs here
据我所知,这意味着它在等待傀儡大师对某事做出反应时处于阻塞状态。
puppetmaster 在 apache2 上运行 Passenger,监听端口 8140。它也有防火墙,但端口 8140 允许代理。实际上,代理是一个在充当主服务器的机器内运行的 openvz 容器;容器使用 NAT,主机进行转发;所有这些设置肯定存在问题,但问题仅在出现消息“警告:此 SSL 会话中不会验证对等证书”时发生;在所有其他情况下,一切都运行正常。
答案1
问题发生在 Puppet Master 尝试根据客户端的 IP 地址解析其名称时。由于防火墙配置错误,传入的 UDP 数据包被过滤,这意味着任何 DNS 查询最终都会超时。
我通过在 Puppet Master 上运行 wireshark 来定位问题,因为我怀疑这是网络超时,并希望通过查看暂停前发生的几个数据包来找到罪魁祸首。它确实有效。奇怪的是 DNS 的彻底失败并没有导致任何其他问题;一个原因是我使用了 apt 代理,这意味着 apt-get 没有发出 DNS 请求。