chronyc sources 显示 no selectable sources 的真实原因是 chronyd 配置中的 allow/deny 规则主动过滤了所有 ntp 源;规则按序匹配,无显式 allow 则默认全部被 deny 拦截,且 ipv4/ipv6 规则不互通,dns 解析的每个 ip 都需单独通过检查。

chronyc sources 显示 no selectable sources 的真实原因
不是服务器没连上,也不是网络不通,而是 chronyd 主动把所有源都过滤掉了——根源在配置文件里的 allow / deny 规则,它会先匹配访问控制,再决定要不要把某个 NTP 源加入可选列表。
allow / deny 规则如何影响 chronyc sources 结果
chronyd 的 allow 和 deny 不只管“谁来查我”,也管“我去连谁”。如果配置里写了 deny 0.0.0.0/0 又没配对应的 allow,哪怕 sources 配置了 server pool.ntp.org,chronyd 启动时也会跳过这个源,chronyc sources 就只能显示 ^? no selectable sources。
-
allow和deny默认作用于所有 NTP 源(包括你用server或pool指定的远程地址) - 规则按顺序匹配,第一条匹配即生效;没有显式
allow,默认全部被deny拦住 - IPv4 和 IPv6 规则不互通,
allow 192.168.1.0/24不影响2001:db8::/32 - 如果你用
pool,DNS 解析出多个 IP,每个 IP 都要单独通过 allow/deny 检查
怎么快速验证是不是 allow/deny 导致的问题
别急着改配置,先用 chronyc -v sources 看详细状态,重点关注每行开头的符号:^? 表示未连接且未被选中,^+ 才是已纳入选择池但暂未同步。再配合 chronyc tracking 看 offset 是否为 0、stratum 是否为 0——如果是,基本锁定是源没进池。
- 临时绕过:注释掉配置中所有
allow/deny行,重启chronyd,再跑chronyc sources—— 如果立刻出现^+,就是它们的问题 - 检查实际加载的规则:运行
chronyc -c sources(CSV 输出),看第三列state是offline还是sel,结合第四列poll时间判断是否被跳过 - 注意日志:grep
"Source .* denied"/var/log/chrony/chronyd.log,会直接打出被拦掉的源 IP 和规则行号
安全又可用的 allow/deny 写法建议
想限制 outbound 源(比如只允许连公司内网 NTP 服务器),不要用粗暴的 deny 0.0.0.0/0,而要用白名单模式。chronyd 5.0+ 支持 allow 直接写域名,但更稳的方式是指定解析后的 IP 段。
- 写法示例:
allow 10.0.0.0/8+allow 172.16.0.0/12+allow 192.168.0.0/16,然后删掉所有deny行 - 如果必须用
deny,务必在它前面加一条allow覆盖你要用的源,例如:allow 203.107.6.88(ntp.aliyun.com 解析结果之一),再写deny 0.0.0.0/0 - 避免用
allow 127.0.0.1试图“只允许本地”,这和上游源无关,反而可能干扰本机 socket 通信 - 改完配置后,用
chronyc reload sources刷新(无需重启服务),再观察sources输出变化
真正麻烦的是 DNS 动态解析 + allow/deny 混用:今天 pool.ntp.org 解出 3 个 IP,你只 allow 了其中 2 个,明天换一批 IP,又全挂了。这种场景下,与其硬控 IP,不如去掉 outbound 侧的 allow/deny,改用防火墙(iptables / nftables)做出口限制,更清晰也更可靠。










