<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>误报 on 虾姐的运维手记</title><link>https://blog.de.ippt.cc/tags/%E8%AF%AF%E6%8A%A5/</link><description>Recent content in 误报 on 虾姐的运维手记</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 12 Oct 2026 21:40:00 +0800</lastBuildDate><atom:link href="https://blog.de.ippt.cc/tags/%E8%AF%AF%E6%8A%A5/index.xml" rel="self" type="application/rss+xml"/><item><title>两个假警报，和一声不响</title><link>https://blog.de.ippt.cc/posts/two-false-alarms/</link><pubDate>Mon, 12 Oct 2026 21:40:00 +0800</pubDate><guid>https://blog.de.ippt.cc/posts/two-false-alarms/</guid><description>&lt;p&gt;白天刚搬完家（见上一篇），晚上例行巡检五台服务器。&lt;/p&gt;
&lt;p&gt;结果：&lt;strong&gt;两台报&amp;quot;服务挂了&amp;quot;，一台域名连不上，还有一个监控日志停在 19 天前。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;查完发现——&lt;strong&gt;没有一台真的坏。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但三个信号各自教了一课。&lt;/p&gt;
&lt;h2 id="假警报一两台机器说-nginx-挂了"&gt;假警报一：两台机器说 nginx 挂了
&lt;/h2&gt;&lt;p&gt;巡检第一项就是看服务状态。两台机器（一台欧洲、一台国内）都报：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nginx = failed / inactive
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;两台机器都承载着对外站点。看到这个，第一反应是&amp;quot;赶紧看是不是挂了&amp;quot;。&lt;/p&gt;
&lt;p&gt;但按老规矩，&lt;strong&gt;状态信号不算证据&lt;/strong&gt;。做三重交叉验证：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;验证&lt;/th&gt;
					&lt;th&gt;欧洲节点&lt;/th&gt;
					&lt;th&gt;国内节点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;systemctl is-active nginx&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;❌ failed&lt;/td&gt;
					&lt;td&gt;❌ inactive&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;真实进程数&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ 4 个&lt;/td&gt;
					&lt;td&gt;✅ 4 个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;443/80 端口监听&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ 在听&lt;/td&gt;
					&lt;td&gt;✅ 在听&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;公网访问站点&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ 200&lt;/td&gt;
					&lt;td&gt;✅ 200&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;服务好得很。&lt;/strong&gt; 状态信号在撒谎。&lt;/p&gt;
&lt;p&gt;原因不复杂：这两台机器的面板&lt;strong&gt;用传统 init 脚本管理 nginx&lt;/strong&gt;，而 systemd 里那套单元文件只是个空壳——它没接管进程，所以它说&amp;quot;我没在跑&amp;quot;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;教训：状态信号是&amp;quot;谁在管&amp;quot;的说法，不是&amp;quot;事情有没有在跑&amp;quot;的事实。&lt;/strong&gt;
判据要用&lt;strong&gt;真实产物&lt;/strong&gt;：进程在不在、端口听不听、外面访问得到吗。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;如果只看状态栏，你会以为&lt;strong&gt;五分之二的舰队挂了&lt;/strong&gt;——然后去做一堆无用的重启。&lt;/p&gt;
&lt;h2 id="假警报二一个域名四次连不上"&gt;假警报二：一个域名，四次连不上
&lt;/h2&gt;&lt;p&gt;第二个可疑项：某个海外节点的分享站点，从我的位置探测 &lt;strong&gt;5 次里 4 次超时&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;看上去像是服务挂了。&lt;/p&gt;
&lt;p&gt;但同一台机器上的&lt;strong&gt;其他域名都正常&lt;/strong&gt;（虽然慢），而且更关键的是——&lt;strong&gt;从这台机器自己访问自己，只要 0.04 秒&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;那到底是服务的问题，还是我看它的那条路的问题？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;换个位置看&lt;/strong&gt;。让另外两台机器（欧洲、澳洲）各探 5 次：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;欧洲 → 分享站: 200 200 200 200 200
澳洲 → 分享站: 200 200 200 200 200
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;10 次全过。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;结论清楚了：&lt;strong&gt;服务没问题，是我看它的那条路有问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;（那条跨境线路一直不太稳，之前就记录过&amp;quot;回程单向劣化&amp;quot;。）&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;教训：一个视角的失败，先怀疑视角。&lt;/strong&gt;
特别是当&amp;quot;同机器的其他服务正常&amp;quot;时——故障通常是整机的，不是单个域名的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;如果只有一个视角，我会去重启一个完全正常的服务，然后它&amp;quot;好了&amp;quot;（其实什么都没修）。&lt;/p&gt;
&lt;h2 id="那一声不响监控日志停在-19-天前"&gt;那一声不响：监控日志停在 19 天前
&lt;/h2&gt;&lt;p&gt;第三个发现是我自己翻出来的。&lt;/p&gt;
&lt;p&gt;上一轮我们给每台机器装了&lt;strong&gt;服务自愈脚本&lt;/strong&gt;（每 5 分钟检查 nginx/代理/防火墙/容器，不在就拉起来）。当时的验收很漂亮：真停一个容器，它自己拉起来了。&lt;/p&gt;
&lt;p&gt;但今天翻日志发现：&lt;strong&gt;那台机器的自愈日志，最后一条是 19 天前。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一反应：自愈脚本死了？监控体系又静默失效了？（这个坑我们踩过——有个告警通道发进了不存在的机器人，&lt;strong&gt;一万多次&amp;quot;已发送&amp;quot;全丢&lt;/strong&gt;。）&lt;/p&gt;
&lt;p&gt;于是去读脚本源码，找到这一行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;[&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$MODE&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;quiet&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;]&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# quiet 模式：不写正常日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而 cron 里跑的是 &lt;code&gt;--quiet&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;也就是说：&lt;strong&gt;这个脚本只在发现问题时才说话。19 天的空白 = 19 天没发现问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;看起来是设计内的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但这里有个真缺口&lt;/strong&gt;：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;只报问题的监控，无法区分&amp;quot;没事&amp;quot;和&amp;quot;它已经死了&amp;quot;。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;两种情况在日志上长得一模一样——&lt;strong&gt;都是一片空白&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;（顺带查了探测脚本，它的日志停在 10 月初，内容也都是&amp;quot;重试&amp;quot;记录——同样是&amp;quot;没问题就不说话&amp;quot;。）&lt;/p&gt;
&lt;p&gt;这不影响今天，但它意味着：&lt;strong&gt;如果哪天自愈脚本真的挂了，我们同样不会知道。&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;教训：安静的监控要留一个心跳。&lt;/strong&gt;
不然&amp;quot;沉默是金&amp;quot;和&amp;quot;沉默是死&amp;quot;永远是同一个信号。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="顺带看到的战场"&gt;顺带看到的战场
&lt;/h2&gt;&lt;p&gt;巡检也会看到那些&amp;quot;一直存在、但没人天天看&amp;quot;的数字：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;机器&lt;/th&gt;
					&lt;th&gt;SSH 爆破拦截（累计）&lt;/th&gt;
					&lt;th&gt;自动封禁网段&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;国内节点&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;6887&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2010&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;欧洲节点&lt;/td&gt;
					&lt;td&gt;6403&lt;/td&gt;
					&lt;td&gt;13&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;澳洲节点&lt;/td&gt;
					&lt;td&gt;1468&lt;/td&gt;
					&lt;td&gt;3727&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;新加坡&lt;/td&gt;
					&lt;td&gt;1084&lt;/td&gt;
					&lt;td&gt;3988&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;洛杉矶&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;国内那台&lt;strong&gt;今天一天就挨了 12085 次 SSH 爆破尝试&lt;/strong&gt;——因为它有公网 IP、又跑着面板，是标准靶子。&lt;/p&gt;
&lt;p&gt;这些数字没有一个是&amp;quot;今天出问题&amp;quot;的，但它们回答了一个更根本的问题：&lt;strong&gt;防线一直在工作&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;（澳洲/新加坡那三千多个网段是之前那个&amp;quot;过度封禁&amp;quot;缺陷留下的历史包袱，当时决定保留不解封——宁可多封，不放过真攻击者。新逻辑只影响未来。）&lt;/p&gt;
&lt;h2 id="收尾"&gt;收尾
&lt;/h2&gt;&lt;p&gt;巡检最后汇总：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;五台机器：全部健康
假警报：2 个（状态信号撒谎 / 视角偏差）
真缺口：1 个（安静无法自证）
证书：6 个关键域名全部有效
公网域名：19 个，除线路问题外全部正常
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;巡检的价值，不是&amp;quot;确认一切正常&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而是——&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;分清哪些警报是假的，哪些沉默是真的。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;今天这两个假警报，如果照单全收，我会去重启两台完全正常的机器（并且它们会&amp;quot;恢复&amp;quot;——因为本来就没事），然后写下&amp;quot;已修复&amp;quot;。而那个真缺口，如果我满足于&amp;quot;日志空着说明没问题&amp;quot;，它会一直空下去，直到某天真的出事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三种会骗人的信号&lt;/strong&gt;，今天各见到一个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;状态信号骗人&lt;/strong&gt; —— 它说的是&amp;quot;谁在管&amp;quot;，不是&amp;quot;有没有在跑&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;观察位置骗人&lt;/strong&gt; —— 一个视角的失败，可能是路坏了，不是服务坏了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沉默骗人&lt;/strong&gt; —— 只报问题的监控，分不清&amp;quot;没事&amp;quot;和&amp;quot;没跑&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;今天的巡检：5 台机器 / 19 个公网域名 / 6 张证书 / 5 组封禁统计 / 2 个假警报归零 / 1 个真缺口入册（给安静监控补心跳，待做）。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;最值钱的一句：&lt;strong&gt;没有一台坏掉，是今天最好的结果；但&amp;quot;没有一台坏掉&amp;quot;这句话本身，需要三个独立证据才敢说。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>