拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NTP mode-6查询漏洞修复与restrict加固

NTP mode-6查询漏洞修复与restrict加固

1. 从一份巡检报告说起:NTP mode-6 查询漏洞为什么值得单独排期

上个月做季度安全巡检,扫描器在内网一批 Linux 主机上标红了一条中危项:NTP mode-6 查询漏洞。报告原文写得很含糊,只给了"目标主机响应了 NTP 控制消息查询,可用于信息收集与流量放大",风险等级标的是中危,建议里就一句话——"限制 NTP 服务查询权限"。

我当时的第一反应是:UDP 123 端口,内网机器,又不对外,真有那么严重吗?后来把细节摊开看,才意识到这条漏洞不能简单放过。NTP这东西在所有服务器上都有,默认配置几乎一样,一旦有几十上百台机器都能响应mode-6控制查询,攻击者只要拿到内网一个落脚点,就能把这些机器当成探测器和反射源用。更麻烦的是,这类问题通常不会报错、不会告警,服务该对时还对时,你要是不专门测,根本发现不了。

这篇东西就是我把这次修复的完整过程整理下来的记录。它讲的是什么:NTP 的 mode-6 控制查询通道是干什么的、为什么它会被算作漏洞、怎么一步步把配置改干净、改完怎么验证才算真的修好。能解决什么问题:消掉扫描器报的这类风险项,同时把可能存在的流量放大和信息泄露通道一起堵上,还不会把正常的对时和监控采集搞挂。适合谁看:手里管着几台到几百台 Linux 服务器、被巡检报告追着改配置的运维同学;做内网渗透测试、想知道这类问题从攻击侧怎么看的安全同学;以及刚接手 NTP 服务、只知道server xxx iburst这一行的新手。

我这次一共动了 240 多台机器,分了三批灰度,中间踩了几个挺典型的坑,后面都会写出来。文中的配置写法在我这边实测是稳的,但你要照着改之前,先确认自己环境的版本和监控依赖,别直接复制粘贴就重启。

2. 把 mode 字段掰开看:mode-6、mode-7 到底是谁在用

2.1 NTP 报文就 48 字节,第一个字节塞了三样东西

NTP 的报文头固定 48 字节,第一字节是li_vn_mode,用位域的方式压了三个字段:

  • LI(Leap Indicator):2 位,表示闰秒警告,正常是 0。
  • VN(Version Number):3 位,协议版本,常见 3 或 4。
  • Mode:3 位,这才是决定"这个包是干嘛的"的关键字段。

Mode 的取值我自己整理了一张表,看一遍基本就懂了这个协议的骨架:

Mode 值名称谁在发干什么用
1Symmetric Active对等体主动发起对等同步
2Symmetric Passive对等体被动响应对等同步
3Client客户端向服务器请求时间
4Server服务器回时间给客户端
5Broadcast服务器广播时间
6Controlntpq查询/控制状态,读变量
7Privatentpdc私有控制,monlist 就在这儿

平时你看到的对时流量,就是客户端发 mode=3、服务器回 mode=4,一来一回 48 字节的小包。而 mode=6 和 mode=7 是另一条路,是"管理通道"。

2.2 ntpq 走 mode-6,ntpdc 走 mode-7,这两个别搞混

这点我必须单独拎出来说,因为网上很多资料把这两个混为一谈,甚至把经典的monlist放大攻击写成"mode-6 漏洞",严格讲是错的。

准确的关系是这样的:ntpq这个命令行工具用的是mode-6 控制消息,对应的操作码有READSTAT(1)、READVAR(2)、WRITEVAR(3) 等等,你敲的ntpq -c rv、ntpq -c readstat走的就是这条路。而ntpdc用的是mode-7 私有模式,操作码是另一套编号,经典的monlist(对应MON_GETLIST,请求码 0x2a)就在 mode-7 里。

那为什么标题写的是"修复 NTP mode-6 查询漏洞"?因为在实操层面,这两条通道的访问控制是同一套restrict规则管的,noquery这个参数一写下去,mode-6 和 mode-7 的查询请求会被一起拒掉。所以业内习惯把这类问题统称为"mode-6 查询漏洞",修复动作也是同一个。你在写变更单、做加固的时候,按"控制通道未授权访问"来理解是最省事的。

2.3 mode-6 到底能问到什么,信息量比你想的大

我拿一台没加固的测试机跑了下ntpq -c rv,返回的是一长串变量:

associd=0 status=0615 leap_none, sync_ntp, 1 event, clock_sync, version="ntpd 4.2.6p5@1.2349-o Tue Mar 6 08:00:00 UTC 2018 (1)", processor="x86_64", system="Linux/4.4.0-116-generic", leap=00, stratum=3, precision=-23, rootdelay=29.118, rootdisp=23.448, refid=10.10.1.1, reftime=df0a9b2c.8f3a1a2f ...

这里面的东西对防守方来说是"状态展示",对攻击者来说就是一本资产说明书。version直接暴露了 ntpd 的具体版本号和编译时间,我可以拿去比对公开漏洞库;processor和system告诉你对方跑在什么内核上;stratum、refid能推出内网的层级结构和时间源地址;reftime还能反推服务器的大致运行时长。

再进一步,readstat能把所有对等体关联信息列出来,包括每个上游服务器和客户端关联的地址、状态、时间偏移。也就是说,一个未加限制的 mode-6 通道,等于把内网拓扑和主机指纹免费送出去。这不是"理论风险",是实打实的信息收集入口。

2.4 放大倍数怎么算,为什么各家数字差那么多

关于 mode-6/7 通道被拿来做流量放大,最常见的说法是"放大 200 多倍"甚至"500 多倍",很多人看得一头雾水。这里的关键是计算口径不统一。

如果按"NTP 负载字节数"来算,一个控制请求的负载是 48 字节,而响应可以携带几十字节到上千字节的变量数据,倍数是几倍到几十倍。如果按"以太网帧总长度"来算,请求帧大约 234 字节(包含二层三层四层头部和填充),响应帧受 MTU 限制单包最多 1514 字节,但可以通过more标志位持续续传多个包,累计响应量能到几 KB 甚至更多,这样算出来的倍数就会飙到几百倍。

我的建议是别纠结具体数字,记住三个事实就够了:第一,UDP 无连接,源地址可以伪造;第二,响应内容远比请求长,且能分片续传;第三,NTP 服务通常不需要认证就响应控制查询。这三条凑在一起,就是反射放大攻击的经典条件。修复要做的,就是把第三条件掐掉。

3. 修复方案选型:三条路摆在面前,我为什么选组合拳

3.1 方案一:只在配置层收紧 restrict

这是成本最低的做法,改/etc/ntp.conf里的restrict行,重启服务,完事。核心思路是"默认全拒,按需放行"。

它的好处是见效快、可回滚、不需要重启操作系统、不依赖版本。缺点是依赖人写对。restrict这条指令的匹配规则是"按配置文件顺序,第一条命中的规则生效",很多人不知道这一点,写出来的规则互相覆盖,看着改了其实没生效。另外如果你的 ntpd 版本很老,某些参数压根不支持,写了会被静默忽略。

3.2 方案二:关掉 monitor 功能

monitor是 ntpd 里记录最近客户端列表的机制,也就是ntpdc -c monlist能列出东西的根源。在/etc/ntp.conf里加一行disable monitor,或者把 ntpd 换成 4.2.7p26 之后的版本(新版默认就把它关了),就能直接断掉最经典的那条放大路径。

这条路适合对付monlist场景,动手量极小。但它只管住了 mode-7 的 monlist,管不住 mode-6 的 readvar/readstat 信息泄露。如果你只是想让扫描器闭嘴,加这行大概率能过;如果你想真正把控制通道关严,还得配合restrict。

3.3 方案三:升级 ntpd 到较新版本,或者干脆换 chrony

升级版本能一次性修掉好几个控制通道的历史问题,同时拿到更细的restrict参数(比如noserve)。换 chrony 则是釜底抽薪——chrony 默认只允许本机使用控制命令,而且它没有 monlist 那套 MRU 列表机制,从实现上就不具备那种放大能力。

代价也很明显:升级涉及软件包变更,要走变更评审和完整回归;换时间同步组件等于动了基础设施,客户端侧、监控侧、上游配置都得跟着调,风险和工时都不是一个量级。

3.4 三个方案横向对比,我的选择

我把这三条路列成了表,方便你按自己环境选:

维度restrict 加固disable monitor升级/换 chrony
改动范围1 个配置文件1 行配置软件包/组件替换
生效时间重启服务即生效重启服务即生效需完整回归
覆盖 mode-6覆盖不覆盖覆盖
覆盖 monlist覆盖覆盖覆盖
回滚难度低低中到高
主要风险规则写错误伤监控无明显风险兼容性问题
我的结论必做顺手做长期规划

我最后定的是"restrict 为主 + disable monitor 为辅 + 版本升级排进下一季度计划"。原因很实际:这次是巡检整改,有整改时限,240 台机器的软件包升级周期拉不了那么长;而restrict加固当天就能全量推完,风险可控,回滚就是把备份文件拷回来重启。版本升级作为长期项单独立项,不跟这次整改挤在一起,避免变更叠加出问题说不清。

4. 动手改配置:ntpd 和 chrony 的具体写法

4.1 改之前先备份,再摸清现状

这一步千万别省。我的标准动作是先备份,再摸清楚当前到底有哪些 restrict 规则、有没有历史遗留的宽松配置:

cp -a /etc/ntp.conf /etc/ntp.conf.bak.$(date +%F) grep -n -E 'restrict|monitor|disable|interface' /etc/ntp.conf rpm -q ntp || dpkg -l | grep -E 'ntp|chrony' systemctl status ntpd 2>/dev/null || systemctl status ntp 2>/dev/null

这几条命令跑完,你会知道三件事:配置文件在哪、当前有没有人放行过宽网段、以及你面对的到底是 ntpd 还是 chronyd。很多环境里两个都装了,结果改了半天发现跑的是另一个,白忙一场。

注意:如果grep出来有restrict 0.0.0.0 mask 0.0.0.0这种写法,说明历史上做过全局放行,这种规则要重点处理,它的匹配范围比default还宽。

4.2 ntpd 的 restrict 白名单式写法,逐参数说清楚

下面是我最终使用的配置块,直接给出可参考的形态:

driftfile /var/lib/ntp/drift # 默认全拒:IPv4 和 IPv6 必须分开写 restrict -4 default kod notrap nomodify nopeer noquery limited restrict -6 default kod notrap nomodify nopeer noquery limited # 本机放行,供 ntpq 和监控采集使用 restrict 127.0.0.1 restrict ::1 # 内网监控网段只允许查询,不允许改配置 restrict 10.20.30.0 mask 255.255.255.0 nomodify notrap nopeer server ntp1.example.internal iburst server ntp2.example.internal iburst # 显式关闭 monitor,老版本必写 disable monitor

每个参数到底在拦什么,我整理成表放在这里,你自己写规则的时候对着看:

参数拦截对象不写会怎样
ignore所有 NTP 包,直接丢该来源完全不能通信
noquerymode-6 / mode-7 控制查询任何人都能读本机状态
nomodify修改服务器状态的请求允许运行时改对等配置
notrapmode-6 的 trap 消息可被用于日志注入
nopeer试图建立对等关联的请求陌生主机可与本机建 peer
kod超频客户端,回 Kiss-o'-Death客户端疯跑也没提示
limited默认限速,单 IP 每秒一个包高频查询容易耗尽资源
ntpport只匹配源端口为 123 的包匹配任意源端口的包

这里有个很容易被忽略的坑:restrict是按配置文件中出现的顺序,第一条匹配的规则生效,后面的规则不再参与判断。所以要把宽范围的default写在前面、窄范围的具体地址写在后面,这个顺序不能反。反过来写的话,restrict 10.20.30.0 mask 255.255.255.0会先命中,default就形同虚设了——当然你要是就这个网段想放行,那顺序是对的,关键是想清楚。

还有一个细节:ntpport这个参数的含义是"这条规则只对源端口为 123 的包生效",不是"只放行端口 123"。如果你在受限规则里写了它,那么源端口不是 123 的查询包反而不受这条规则约束,等于开了个后门。我在第一批灰度里就写错过一次,被扫描器当场抓出来,后面的批次全改了。

4.3 disable monitor 和限速参数的位置

disable monitor这一行建议放在全局区域,别塞进某个restrict块里。它的作用是关闭 ntpd 的 MRU 客户端记录,也就是断掉 monlist 的数据源。

另外limited和kod这两个参数配合起来效果很好:limited让 ntpd 对同一个源 IP 默认每秒只响应一个包,超过就丢;kod则在客户端超频时回一个特殊的 Kiss-o'-Death 包,让客户端自己收敛。这两个参数对正常客户端几乎无感,但对那些拿你当反射源的流量有明显的抑制效果。

4.4 chrony 的对应配置不一样,别照抄 ntpd

如果你机器上跑的是 chronyd,配置思路类似但语法不同。chrony 用cmdallow/cmddeny控制哪些地址可以使用控制命令(mode-6),默认只允许 localhost。想显式收紧,可以这么写:

# 先全拒,再放行本地 cmddeny all cmdallow 127.0.0.1 # 只允许内网监控网段查询 allow 10.20.30.0/24

要注意cmdallow/cmddeny同样是按顺序第一条匹配生效,所以cmddeny all必须写在前面。另外 chrony 本身不实现 monlist 那套机制,所以放大风险天然低得多,这也是我一直建议新环境直接上 chrony 的原因之一。但它的 mode-6 查询通道还是存在的,cmddeny all这一步不能省。

4.5 Windows 时间服务的兜底处理

Windows Server 上的 W32Time 服务不是完整的 ntpd 实现,它不响应 mode-6/mode-7 的控制查询,所以从漏洞本身来说不适用。但这不代表可以不管——老版本的 Windows Server(比如 2008 那一代)配置 NTP 服务端比较麻烦,需要改注册表HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer下的Enabled值为 1,再执行w32tm /config /reliable:yes /update,最后重启 w32time 服务。

配置完之后,一定要用防火墙把 UDP 123 的入站来源限制到内网网段。我见过有的环境为了图省事,直接把 UDP 123 全放通到公网,虽然不涉及控制查询漏洞,但同样会被人拿去当反射目标。Windows 防火墙的命令行规则可以这么加:

netsh advfirewall firewall add rule name="NTP-Internal-Only" dir=in action=allow protocol=UDP localport=123 remoteip=10.20.0.0/16

4.6 重启生效和灰度节奏

配置改完,重启服务:

systemctl restart ntpd # 或者 systemctl restart chronyd

我这次是分三批推的:第一批 5 台(含 1 台监控采集节点、1 台普通应用节点、1 台数据库节点、1 台容器宿主、1 台测试机),观察 24 小时;第二批 50 台,观察 48 小时;第三批剩余机器全量。灰度批次的选取原则是覆盖所有类型的角色,尤其是监控采集节点,因为它依赖 mode-6 查询,最容易在加固后被误伤。

5. 怎么验证才叫真修好了:三层验证法

5.1 本机自测:ntpq 该通的必须通

改完之后,第一件事是在本机跑一遍,确认本地查询没被自己误伤:

ntpq -p ntpq -c rv ntpq -c readstat

这三条命令都应该正常返回。如果ntpq -p报超时或者返回空,说明restrict 127.0.0.1那行有问题,或者被前面的宽范围规则吃掉了。这是最容易犯的错——加固加固,先把自己的监控通道给关死了。

然后测被拒的路径,从另一台机器上执行:

ntpq -c rv 10.0.0.5 ntpdc -c monlist 10.0.0.5

这两条应该返回超时(timed out, nothing received)或者直接无响应。如果还能返回数据,说明规则没生效,回去查顺序问题。

5.2 外部扫描:用 nmap 脚本批量确认

单机确认完,用 nmap 做一轮网段扫描,效率高很多:

nmap -sU -p 123 --script ntp-monlist,ntp-info 10.20.30.0/24

修复前的输出里会有一段NTP monlist列表,密密麻麻列着客户端 IP 和最后访问时间;修复后应该变成NTP monlist request unsuccessful或者干脆没结果。ntp-info脚本走的是 mode-6,如果它拿不到数据,说明noquery也生效了。

这个扫描建议放在修复前后各做一次,留一份对比报告。巡检整改的场景里,扫描前后截图是很硬的证明材料,比手写"已完成加固"有说服力得多。

5.3 手工构造一个包,做点对点确认

有些环境里 nmap 脚本版本老、不认某些响应,这时候手工构造一个 mode-6 请求最直接。下面这段 Python 只用于验证自己的资产,别拿去扫别人的机器。构造的是一个 mode-6 的READVAR请求,版本号 4:

import socket import sys def probe_mode6(target, timeout=3): # li_vn_mode = 0x26 -> LI=0, VN=4, Mode=6 # r_e_m_op = 0x02 -> response=0, error=0, more=0, opcode=READVAR(2) # 其余字段 sequence/status/associd/offset/count 全 0 packet = bytes([ 0x26, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]) + b'\x00' * 36 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(timeout) try: s.sendto(packet, (target, 123)) data, _ = s.recvfrom(4096) return data except socket.timeout: return None finally: s.close() if __name__ == '__main__': target = sys.argv[1] resp = probe_mode6(target) if resp: print('[!] 目标返回了 %d 字节控制响应,需要继续加固' % len(resp)) print(resp[:120]) else: print('[+] 无响应,mode-6 查询已被拒绝')

修复前你会看到一块响应数据,里面能直接读出version=、system=这类变量;修复后应该稳定输出无响应。这个脚本的好处是不依赖任何第三方库,扔到任意一台 Linux 上都能跑,灰度批次验证时特别顺手。

5.4 回归检查:别把正常对时一起关掉了

加固最大的隐患是误伤。我每次改完都会跑一遍回归清单:

检查项命令/方法期望结果
时间同步是否正常ntpq -p看*标记的源有可达上游,offset 正常
客户端能否对时从业务机ntpdate -q ntp1返回正常偏移量
本地查询是否可用ntpq -c rv正常返回变量
监控采集是否恢复看监控面板 NTP 指标数据不再断线
控制查询是否被拒外部ntpq -c rv超时
monlist 是否被拒外部ntpdc -c monlist超时
日志有无异常journalctl -u ntpd --since "1 hour ago"无大量 denied 刷屏

其中"监控采集"这一项我单独强调一下。很多监控系统(比如各类 NTP exporter、Zabbix 的 NTP 模板)就是靠 mode-6 采集stratum、offset、jitter这些指标的,你把noquery一开,它们立刻全部掉线报警。正确做法不是在 default 上开个口子,而是把监控节点的地址单列一条放行规则,只给它开查询权限,其他来源仍然全拒。

6. 常见问题与排查技巧实录

6.1 问题速查表,我按遇到频率排了序

我把这次和以前遇到过的典型问题整理成一张表,出问题的时候照着查最快:

现象大概率原因处理方式
加固后ntpq -p无输出127.0.0.1放行规则被前面规则覆盖把restrict 127.0.0.1前置到default之前
外部仍能查询只写了 IPv4 规则,IPv6 门户大开补restrict -6 default ... noquery
外部仍能查询规则顺序写反,宽规则没有生效检查配置文件行序,第一条匹配生效
监控指标全掉线noquery限制了监控节点单列一条监控网段的放行规则
改了配置没变化实际跑的是 chronyd,改的是 ntp.conf用ss -lunp | grep 123确认进程
重启后短暂对时异常上游 server 不可达或 drift 文件异常看日志里no server suitable相关行
扫描器仍报同类项扫的是别的端口或别的服务核对报告里的端口和指纹,别急着改 NTP
客户端时间跳变加固顺带改了同步源检查 server 行是否被误删

6.2 我踩过的几个坑,写出来给你省时间

第一个坑是 IPv6 漏网。我第一批只写了restrict -4 default ... noquery,结果扫描器复扫还是标红。当时特别纳闷,明明本地测外部查询已经超时了。后来用-6参数从外部测了一遍才发现,通过 IPv6 依然能拿到readvar响应。原因就是我只限制了 IPv4 的默认规则,restrict语句里带-4和-6前缀是分开生效的。补上restrict -6 default之后复扫通过。这个坑在所有双栈环境里都会遇到,而且很多人第一次根本想不到要去测 IPv6。

第二个坑更隐蔽,是ntpd -q模式。有几台机器上跑着定时任务,用ntpd -q -g做单次校时。这种模式下 ntpd 启动、校时、退出,它读到的是另一份配置,你改的主配置文件对这条路径根本不生效。这几台机器在扫描里反复被标记,查了很久才发现问题所在。处理办法是给这几个定时任务指定统一的配置文件路径,或者干脆把校时方式改成ntpdate加 cron(注意ntpdate是被查询方,不涉及对外暴露控制通道)。

第三个坑是备份文件被当成配置加载。有的系统会把/etc/ntp.conf.d/目录下所有文件都 include 进来,我按习惯把备份文件cp /etc/ntp.conf /etc/ntp.conf.bak.20240101放在同目录下,结果老的宽松规则被一起加载,新规则反而被覆盖。后来养成习惯,备份统一放到/root/backup/目录,绝不放在服务会扫描的路径下。

第四个坑关系到变更管理。第三批推送的时候,有台机器的配置是被人手工改过的,rpmsave 文件跟线上配置文件不一致,我的自动化脚本覆盖之后,上游 server 地址丢了,导致那台机器对时源变成了默认的公共池。虽然加固目标达成了,但引入了一个新的不确定性。从那以后我改配置前都会先diff一遍当前文件和我预期文件的差异,差异大的机器单独人工确认,不硬推。

6.3 加固之外,长期还应该做几件事

单次修复解决的是"当下这台机器不响应控制查询",但它不会自动防住未来。

第一件事是把 restrict 基线写进配置管理。我这次是把最终的配置块提交到了 Ansible 的 NTP 角色里,新机器装出来就带这套规则,不再依赖人工记得改。同时把"是否存在restrict -4 default且包含noquery"做成巡检项,每周跑一次。

第二件事是加一个控制查询的监控指标。做法很简单,从一台固定的探测机上定时向目标发 mode-6 查询,把"是否收到响应"作为一个一元的指标上报。正常情况下应该一直是 0,一旦变成 1 说明有机器的新配置跑偏了。这个指标实现成本极低,但能提前发现漂移,比等扫描器报警主动得多。

第三件事是把 UDP 123 的入站策略收敛。哪怕 NTP 层已经加固得再好,网络层只允许内网网段访问 UDP 123 是一道额外的保险。我在这次整改里顺手把几台本来对外开着的机器做了收敛,用iptables或firewalld限制来源网段即可。

7. 批量落地:240 台机器是怎么推完的

单机改完整不难,难的是规模化和可追溯。我这次的做法是写一个 Ansible playbook,核心逻辑分四步:先stat检查当前配置文件内容,判断是否已经包含noquery(幂等);再备份带时间戳的原文件到/root/backup/ntp/;然后模板渲染新配置;最后validate检查语法后重启服务。

渲染前必须做的语法校验是ntpd -n -q -c <新配置文件>或者ntpq的无副作用检查。我吃过一次亏,手写规则时把一个参数拼错了,ntpd 启动直接失败,虽然那台机器时间同步断了十几分钟没造成业务影响,但事后还是加上了校验环节。现在的流程是:配置渲染 → 语法校验通过 → 才允许写入生效路径 → 再重启,任何一步失败直接跳过该主机并记录,不阻塞整批。

推送节奏上,我按角色分组而不是按 IP 段分组。数据库和容器宿主放同一批,因为它们的时间敏感度最高;监控节点单独一批,因为要验证查询放行是否生效;其余普通应用节点放最后一批。每批之间用前面说的三层验证法各跑一轮,尤其是第二批之后的那次全量扫描,能提前暴露规则写法上的系统性错误。

还有一点值得说:变更记录要写清楚改了什么、为什么这么改。我在变更单里附了三样东西——修复前的配置文件片段、修复后的配置文件片段、修复前后的扫描结果对比。这样审计的人一眼就能看出改动内容,复扫的人也省得重新摸索。比起写"已按安全建议加固 NTP 服务",这几张截图的沟通效率高太多。

8. 一点个人体会

这套方案我在自己管的几个环境里都跑过,稳是稳的,但我要提醒一句:别把"NTP 加固"当成一个孤立的动作。它和你的监控体系、变更流程、配置管理是绑在一起的。我见过太多案例,加固本身写得很规范,结果因为监控掉了没人管,第二天业务同事跑来问为什么几台机器的时间对不上,最后一查是监控节点被误伤、告警没送到人。

如果你环境时间比较紧、只来得及做一件事,我的建议是先把restrict -4 default和restrict -6 default那两行加上noquery和notrap,然后立刻从外部测一遍,再从本机测一遍。这四步做完,风险面就基本收敛了。剩下的disable monitor、限速参数、版本升级,可以排到后面慢慢补。

最后分享一个小技巧:验证的时候别只测一台机器。选三台不同年代、不同发行版、不同部署方式的机器各测一轮,如果三台结果一致,你这套规则的普适性才算过关。我第一批就吃过这个亏,五台机器里四台是同一个镜像,剩下那台是几年前手工装的,规则写法完全不一样,问题恰恰出在那台上。

返回列表