<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chifan's Blog</title><link>https://eo.chifan.de/</link><description>勿忘吃饭，勿忘开心，勿忘做自己</description><generator>Hugo 0.168.0 &amp; FixIt v1.0.0-beta.4</generator><language>zh-CN</language><lastBuildDate>Mon, 12 Oct 2026 12:31:29 +0800</lastBuildDate><atom:link href="https://eo.chifan.de/index.xml" rel="self" type="application/rss+xml"/><item><title>DeepSeek的推理死循环问题</title><link>https://eo.chifan.de/posts/deepseek%E7%9A%84%E6%8E%A8%E7%90%86%E6%AD%BB%E5%BE%AA%E7%8E%AF%E9%97%AE%E9%A2%98/</link><pubDate>Mon, 12 Oct 2026 12:31:29 +0800</pubDate><guid>https://eo.chifan.de/posts/deepseek%E7%9A%84%E6%8E%A8%E7%90%86%E6%AD%BB%E5%BE%AA%E7%8E%AF%E9%97%AE%E9%A2%98/</guid><category domain="https://eo.chifan.de/categories/ai/">AI</category><description>&lt;!-- 在这里写开头；more 标记之前的内容会作为首页摘要。 --&gt;&#10;&lt;p&gt;let me go,let me write,let me run&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;一开始觉得怪可爱的，有点英文诗的感觉。&lt;/p&gt;&#10;&lt;p&gt;现在才发现，这其实是推理死循环了，既浪费 token，又会生成几十万字符的巨型 thinking block，导致 TUI 打开历史会话时完全卡死。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="一tui-卡顿排查2026-10-07"&gt;&lt;span&gt;一、TUI 卡顿排查（2026-10-07）&lt;/span&gt;&#10; &lt;a href="#%e4%b8%80tui-%e5%8d%a1%e9%a1%bf%e6%8e%92%e6%9f%a52026-10-07" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;2026-10-07 那天我在用 PI 的时候，某一个对话突然卡的不得了。&lt;/p&gt;&#10;&lt;p&gt;一开始觉得可能是 herdr 的问题，也可能是终端的问题（换了 Omarchy 无论遇到什么问题总是觉得是系统的问题）。&#10;但是也就只有那一个对话卡的不得了，其他的对话没事。对那个对话关闭，再打开，依然卡住。&#10;重启系统，再打开，还是卡住。&lt;/p&gt;&#10;&lt;p&gt;排查发现卡顿不是因为文件读取慢，而是卡在 TUI 渲染 thinking block：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;渲染瓶颈&lt;/strong&gt;：同一份会话只改 &lt;code&gt;hideThinkingBlock&lt;/code&gt;，&lt;code&gt;false&lt;/code&gt; 时 60 秒满核（~101 ticks/s）且一行都渲染不出；&lt;code&gt;true&lt;/code&gt; 时 6 秒渲染出 25 行。RPC 模式和 &lt;code&gt;--export&lt;/code&gt; 仅需 0.45 秒，&lt;code&gt;/proc/&amp;lt;pid&amp;gt;/stat&lt;/code&gt; 确认 CPU 消耗全在 pi 进程自身，排除终端和 shell。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最小复现&lt;/strong&gt;：单条 152,804 字符的 thinking 就会卡死；截断到 10,000 字符后 6 秒正常。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;循环数据&lt;/strong&gt;：原始会话里有 7 条超过 10 万字符的 thinking（最大一条 159,193 字符）。最长那条共 12,102 行，但只有 90 个唯一行：&lt;code&gt;Let me go.&lt;/code&gt; 出现 4,034 次、&lt;code&gt;Let me write.&lt;/code&gt; 3,322 次、&lt;code&gt;OK.&lt;/code&gt; 1,991 次。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;非 Pi 独有&lt;/strong&gt;：给 OpenCode 注入 16 万字符文本块，CPU 同样从 1–2 ticks/s 飙到 102–104 ticks/s 满核。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;在 &lt;code&gt;settings.json&lt;/code&gt; 里设 &lt;code&gt;&amp;quot;hideThinkingBlock&amp;quot;: true&lt;/code&gt; 能避免打开卡死，但治标不治本——模型依然会陷入死循环、浪费 token 并写入巨型文本。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="二magpie-的死循环熔断2026-10-12"&gt;&lt;span&gt;二、Magpie 的死循环熔断（2026-10-12）&lt;/span&gt;&#10; &lt;a href="#%e4%ba%8cmagpie-%e7%9a%84%e6%ad%bb%e5%be%aa%e7%8e%af%e7%86%94%e6%96%ad2026-10-12" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;Magpie 在 &lt;code&gt;v0.1.1142&lt;/code&gt;（2026-10-09）引入了推理死循环检测。10 月 12 日遇到了主动熔断报错：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Error: magpie ended this reply:&#10;the model&amp;#39;s reasoning was stuck in a loop,&#10;its last 256 lines and sentences all among&#10;the same 24 (&amp;#34;Let me go.&amp;#34; &amp;#34;Let me write.&amp;#34; &amp;#34;Let me run.&amp;#34; …),&#10;and would have run on to its output limit.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;它检测到最后 256 行只有 24 种不同句子时主动中断生成，正好命中了这个问题，能及时止损 token 并限制 thinking block 体积。不过 Magpie 目前只做到了&lt;strong&gt;检测和熔断&lt;/strong&gt;，还不会自动恢复。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="三中断后的处理用-tree-回退"&gt;&lt;span&gt;三、中断后的处理：用 &lt;code&gt;/tree&lt;/code&gt; 回退&lt;/span&gt;&#10; &lt;a href="#%e4%b8%89%e4%b8%ad%e6%96%ad%e5%90%8e%e7%9a%84%e5%a4%84%e7%90%86%e7%94%a8-tree-%e5%9b%9e%e9%80%80" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;循环被掐断后，不建议直接说「继续」——在相同的上下文下，模型极易再次陷入死循环。&#10;因为推理过程依然存在上下文，之前中断的推理过程，依然会正反馈影响 「继续」后的推理。&lt;/p&gt;&#10;&lt;p&gt;更稳妥的做法是用 Pi 的 &lt;code&gt;/tree&lt;/code&gt; 切回循环发生前的节点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;如果旧分支全是重复打转，选 &lt;code&gt;No summary&lt;/code&gt;，避免将死循环内容带入新分支。&lt;/li&gt;&#10;&lt;li&gt;如果旧分支已完成了有效工作，选 &lt;code&gt;Summarize&lt;/code&gt; 或 &lt;code&gt;Summarize with custom prompt&lt;/code&gt;，只保留结论和进展。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;注意：&lt;code&gt;/tree&lt;/code&gt; 切换的是会话上下文，已修改的工作区文件不会跟着回滚。&lt;/p&gt;&#10;&lt;p&gt;至于其他的 agent 有没有这个功能我就不知道了。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="四目前的应对策略"&gt;&lt;span&gt;四、目前的应对策略&lt;/span&gt;&#10; &lt;a href="#%e5%9b%9b%e7%9b%ae%e5%89%8d%e7%9a%84%e5%ba%94%e5%af%b9%e7%ad%96%e7%95%a5" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;开启 Magpie 的循环检测及时熔断。&lt;/li&gt;&#10;&lt;li&gt;配置 &lt;code&gt;&amp;quot;hideThinkingBlock&amp;quot;: true&lt;/code&gt; 避免历史会话卡死。&lt;/li&gt;&#10;&lt;li&gt;遇到死循环用 &lt;code&gt;/tree&lt;/code&gt; 回退到正常节点重新生成。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;目前这套流程依然需要人工介入。更理想的机制是 Magpie 或 Agent 框架在检测到死循环后，能自动丢弃异常推理并从上一有效状态重试&lt;/p&gt;&#10;&lt;p&gt;后面或许可以向 Magpie 提个 issue，看看有没有继续完善这个功能的想法。&lt;/p&gt;&#10;&lt;p&gt;另 magpie 真的比 cc-switch 好用,强烈推荐使用。&lt;/p&gt;</description></item><item><title>backupctl --用restic的备份脚本</title><link>https://eo.chifan.de/posts/backupctl/</link><pubDate>Wed, 12 Aug 2026 23:55:12 +0800</pubDate><guid>https://eo.chifan.de/posts/backupctl/</guid><category domain="https://eo.chifan.de/categories/ai/">AI</category><category domain="https://eo.chifan.de/categories/%E6%8A%98%E8%85%BE/">折腾</category><description>&lt;p&gt;掐指一算，明天 codex 最后一张重置卡过期，宜蹬些代码。&lt;/p&gt;&#10;&lt;p&gt;Backupctl 是我在 2026-08-12 搞的另一个 VPS 备份方案，目前效果还不是很好。&lt;/p&gt;&#10;&lt;p&gt;V1 是纯 shell 实现；V2 是 shell 实现 install 脚本，Python 实现功能模块。&lt;/p&gt;&#10;&lt;p&gt;V2 搞了一个 CLI 的功能，通过 &lt;code&gt;backupctl&lt;/code&gt; 控制备份和测试。现在 AI 还是擅长使用 CLI，整一个准没错。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="当前方案"&gt;&lt;span&gt;当前方案&lt;/span&gt;&#10; &lt;a href="#%e5%bd%93%e5%89%8d%e6%96%b9%e6%a1%88" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;现在这套方案大致分成几层：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;网络层：Tailscale&#10;传输层：SFTP / HTTPS&#10;备份层：Restic&#10;调度层：systemd&#10;通知层：Telegram&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/docs" target="_blank" rel="external nofollow noopener noreferrer"&gt;Tailscale&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 负责远程组网；&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://aws.amazon.com/cn/what-is/sftp/" target="_blank" rel="external nofollow noopener noreferrer"&gt;SFTP&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 负责 NAS 方向的远程传输；&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/restic/restic" target="_blank" rel="external nofollow noopener noreferrer"&gt;Restic&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 负责备份、加密、快照和去重；&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://wiki.archlinuxcn.org/wiki/Systemd/%E5%AE%9A%E6%97%B6%E5%99%A8" target="_blank" rel="external nofollow noopener noreferrer"&gt;systemd timer&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 负责定时调度；&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://core.telegram.org/bots/api" target="_blank" rel="external nofollow noopener noreferrer"&gt;Telegram Bot API&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 负责通知。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260812235219252_16161334542264256753.webp" title="draw.io 画的备份流程（不太正确，不想修改了）" data-thumbnail="/images/remote/20260812235219252_16161334542264256753.webp" data-sub-html="&lt;h2&gt;draw.io 画的备份流程（不太正确，不想修改了）&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260812235219252_16161334542264256753.webp' alt="draw.io 画的备份流程（不太正确，不想修改了）" height="1072" width="1556"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;用 Restic 实现类似增量备份的效果：就是将文件创建一个逻辑快照，再将文件切成数据块，已经存在的相同数据块不会上传，仅仅上传每次备份不同的数据块。Restic 的设计文档也说明了快照、内容分块和去重机制。&lt;a href="https://github.com/restic/restic/blob/master/doc/design.rst" target="_blank" rel="external nofollow noopener noreferrer"&gt;Restic 设计文档&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; &lt;a href="https://aws.amazon.com/cn/compare/the-difference-between-incremental-differential-and-other-backups/" target="_blank" rel="external nofollow noopener noreferrer"&gt;增量备份与差异备份——数据备份策略之间的区别&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;备份目标包括 &lt;a href="https://www.backblaze.com/docs" target="_blank" rel="external nofollow noopener noreferrer"&gt;Backblaze B2&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 对象存储和 NAS。&lt;/p&gt;&#10;&lt;p&gt;缺点就是暂时不能备份数据库。数据库需要单独使用 &lt;a href="https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;mysqldump&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 或者其他命令导出，再使用 Restic 备份导出文件；否则直接备份正在运行的数据库文件，可能会出现一致性问题。&lt;/p&gt;&#10;&lt;p&gt;上一个备份方案则是使用 tar gzip 打包压缩，使用 rsync 远程传输，用 Tailscale 实现远程组网，NAS 备份。缺点就是没有加密，而且是全量备份。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="遇到的一些问题"&gt;&lt;span&gt;遇到的一些问题&lt;/span&gt;&#10; &lt;a href="#%e9%81%87%e5%88%b0%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;有一些开发问题，主要还是和 AI 协作的问题。&lt;/p&gt;&#10;&lt;p&gt;当我鞭策 AI 写出新的脚本的时候，其实效果不太好，即使我用的是 sol xhig + plan 模式。&lt;/p&gt;&#10;&lt;p&gt;说到这个 plan 模式，我发现现在其实不需要使用者自己去设计 herdness ，我用的 oh-my-pi 和 codex 都有 plan 模式。&#10;但是这个 plan 模式也不是万能的，plan 模式我都是给的强推理的强力模型（看别人都是用强力模型规划，普通模型写代码）。但是做出来的效果也不太符合我的预期，做出来之后也没有变得简单和更能掌握这个项目，&lt;strong&gt;用 plan 模式的时候应该用 grill-me 这个 skill 拷打一下才行&lt;/strong&gt;。&lt;del&gt;superpower 已经过气了&lt;/del&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一来是因为 APT 的 Restic 版本太过落后，一些性能问题、SFTP 的问题还没修好；&lt;/li&gt;&#10;&lt;li&gt;二来是 Tailscale 组网的端对端延迟过高，在做核对关联的时候需要反复确认。每次核对确认都要走 200 ms 的 RTT ，网络开销自然高，用的时间也多。&lt;/li&gt;&#10;&lt;li&gt;三来是为了继承旧的备份脚本使用 shell 的传统，新的方案也全是用 shell，结果整得挺复杂的，给我带来挺大理解负担。我一直觉得，如果某种工具过于强大而全面，还不如去用符合自己需求的简单工具，KISS 嘛。第一版 shell 的备份脚本搞好之后，还是让 AI 用 Python 重构了，希望代码量少一些，结果代码量其实差不多；&lt;/li&gt;&#10;&lt;li&gt;第四点就是写第一个版本的时候，又想试一下 subagent 的能力，又想省一些 terra max 档位，结果就是 terra 的能力不太行，干活时一直被 PowerShell 转义绊倒。像 sol 就能在我不提醒的情况下，用 base 64 编码执行 &lt;code&gt;ssh -o&lt;/code&gt; 命令，避免转义问题。还有就是 subagent 干活真的很慢。真要用，应该开几个 subagent 分工干不同功能模块的活。结果就是开 subagent，terra 在吭哧吭哧干活，sol 在旁边看戏，偶尔指导两句；&lt;/li&gt;&#10;&lt;li&gt;V1 -&amp;gt; V2 重构的效果也不是很好。现在想起来，应该在旧的对话里面写一份交接文档，然后开一个新的对话开始重构。因为过度信任 sol xhigh 的能力，以为它能看出整个项目的功能点，结果最后给我遗漏了 Telegram 通知的功能（如果是一个大项目不敢想会出多少 BUG）；&lt;/li&gt;&#10;&lt;li&gt;还有一个就是让提交到 GitHub 个人仓库里面，直接把我的 VPS 信息、配置目录也上传上去了。虽然没有把 &lt;code&gt;.env&lt;/code&gt; 上传上去，但总感觉有些异味；&lt;/li&gt;&#10;&lt;li&gt;一开始在我问为什么 SFTP + Tailscale 会检查耗时、什么耗时的时候，只给我结论。&lt;del&gt;这个是唯一让我觉得红温的&lt;/del&gt;；&lt;/li&gt;&#10;&lt;li&gt;已经配置了 draw.io MCP ，在收尾的时候，让画一份 draw.io 的草图，居然没有触发 MCP，而是打算用 XML 给我画草图。还是我说明了用 draw.io，才给我用 XML。画 draw.io 的时候还在用 &lt;code&gt;/n&lt;/code&gt; 作为换行符；&lt;/li&gt;&#10;&lt;li&gt;还有一个问题是，codex 像一个过度谨慎的人，不愿意犯错（也可能是我本能不希望 codex 犯错）。之前使用的时候就有感觉，codex 喜欢简单的东西复杂化，过度规划&lt;del&gt;2026-07-25 发现的做 PPT 过度规划校验的问题&lt;/del&gt;。完全可以先起一个 demo ，然后再去扩展。尤其是现在用上 plan 模式之后，感觉更加孤僻了（完全不听劝埋头苦干）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;想睡觉了就先写这么多了，明天再研究一下能不能用 skill 或者全局提示词改一下 codex 的行为。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="文件锁"&gt;&lt;span&gt;文件锁&lt;/span&gt;&#10; &lt;a href="#%e6%96%87%e4%bb%b6%e9%94%81" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;框架锁： &lt;code&gt;/run/lock/backup-framework.lock&lt;/code&gt;，防止同时运行备份行为。&#10;外部锁：&lt;code&gt;/run/lock/vaultwarden-backup.lock&lt;/code&gt; ，防止新旧两个框架同时运行。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# 查找锁的持有进程&#10;lslocks | grep something&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 Linux 中，“一切皆文件”（包括普通文件、目录、网络套接字、设备、管道等）。所以其实也是能用 &lt;code&gt;lsof&lt;/code&gt; List Open Files（列出打开的文件） 查看当前系统中所有进程正在使用的资源。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# 查找哪个进程占用文件&#10;lsof /var/log/syslog&#10;&#10;# 查找占用80端口的进程&#10;lsof -i :80&#10;&#10;# 查看某个进程打开了什么文件&#10;lsof -p 1234&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="systemctl-timer"&gt;&lt;span&gt;Systemctl timer&lt;/span&gt;&#10; &lt;a href="#systemctl-timer" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;一般来说计时器控制服务的定时运行，当出现一些异常状况比如恰好前面停电，而开机在计时器预定时间之后，就会立刻执行一次服务的执行。&lt;del&gt;在学校晚上断电的时候就很有用&lt;/del&gt;&lt;/p&gt;&#10;&lt;p&gt;定时任务归 &lt;code&gt;systemd&lt;/code&gt; 管，也可以用 &lt;code&gt;journalctl&lt;/code&gt; 查看。&lt;/p&gt;&#10;&lt;p&gt;服务文件： &lt;code&gt;/etc/systemd/system/backup-db.service &lt;/code&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[Unit]&#10;Description=Backup MySQL database&#10;After=network.target&#10;&#10;[Service]&#10;Type=oneshot&#10;ExecStart=/usr/local/bin/backup-mysql.sh&#10;Restart=on-failure&#10;RestartSec=30&#10;&#10;[Install]&#10;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;计时器文件：&lt;code&gt;/etc/systemd/system/backup-db.timer&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[Unit]&#10;Description=Run backup-db service daily at 2 AM&#10;&#10;[Timer]&#10;# 每天凌晨 2 点执行&#10;OnCalendar=*-*-* 02:00:00&#10;# 如果系统关机错过了，开机后立即补执行&#10;Persistent=true&#10;# 允许误差 1 分钟，避免多个任务同时触发&#10;RandomizedDelaySec=60&#10;&#10;[Install]&#10;WantedBy=timers.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;启动：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;systemctl start mytask.timer&#10;systemctl enable mytask.timer&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;systemctl list-timers&#10;NEXT LEFT LAST PASSED UNIT ACTIVATES&#10;Thu 2026-08-13 00:00:00 CST 43min left - - dpkg-db-backup.timer dpkg-db-backup.service&#10;Thu 2026-08-13 00:00:00 CST 43min left Wed 2026-08-12 06:00:42 CST 17h ago logrotate.timer logrotate.service&#10;Thu 2026-08-13 03:30:00 CST 4h 13min left Wed 2026-08-12 19:19:51 CST 3h 57min ago backup-all.timer backup-all.service&#10;Thu 2026-08-13 06:08:41 CST 6h left Wed 2026-08-12 12:10:07 CST 11h ago apt-daily-upgrade.timer apt-daily-upgrade.service&#10;Thu 2026-08-13 11:09:58 CST 11h left Wed 2026-08-12 11:09:58 CST 12h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service&#10;Thu 2026-08-13 13:28:56 CST 14h left Wed 2026-08-12 19:03:58 CST 4h 12min ago apt-daily.timer apt-daily.service&#10;Sun 2026-08-16 03:10:46 CST 3 days left Sun 2026-08-09 09:10:04 CST 3 days ago e2scrub_all.timer e2scrub_all.service&#10;Mon 2026-08-17 00:57:40 CST 4 days left Mon 2026-08-10 06:13:54 CST 2 days ago fstrim.timer fstrim.service&#10;&#10;journalctl -u apt-daily-upgrade.timer&#10;Aug 12 10:54:32 [hostname] systemd[1]: [timer]: Deactivated successfully.&#10;Aug 12 10:54:32 [hostname] systemd[1]: Stopped [timer] - Daily apt upgrade and clean activities.&#10;-- Boot [boot-id] --&#10;Aug 12 10:55:02 [hostname] systemd[1]: Started [timer] - Daily apt upgrade and clean activities.&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="本地备份"&gt;&lt;span&gt;本地备份&lt;/span&gt;&#10; &lt;a href="#%e6%9c%ac%e5%9c%b0%e5%a4%87%e4%bb%bd" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;不能把钥匙放在保险柜里面，对于 restic 的密码来说，不能继续存在 vaultwarden 里面。&lt;/p&gt;&#10;&lt;p&gt;我也早就不想把把一些重要的入口密码交给云备份了。&lt;/p&gt;&#10;&lt;p&gt;可以考虑用下面的工具存放，文件都是 &lt;code&gt;.kdbx&lt;/code&gt; 格式。&#10;一份放在手机，一份放在电脑，感觉就差不多了。&#10;&lt;a href="https://github.com/keepassxreboot/keepassxc" target="_blank" rel="external nofollow noopener noreferrer"&gt;keepassxc&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 支持 Windows、Linux、macOS。&#10;&lt;a href="https://github.com/Kunzisoft/KeePassDX" target="_blank" rel="external nofollow noopener noreferrer"&gt;KeePassDX&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 支持 Android。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="todo"&gt;&lt;span&gt;TODO&lt;/span&gt;&#10; &lt;a href="#todo" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;rest-server 似乎能解决 restic 使用 SFTP 的网络开销问题，改天搭建试试看。&lt;/p&gt;&#10;&lt;p&gt;毕竟我用 NAS 一个主要目的是跑备份，能方便备份也不错。&lt;/p&gt;</description></item><item><title>Spicetify使用ivlyrics翻译歌词优化Spotify歌词体验</title><link>https://eo.chifan.de/posts/ivlyrics/</link><pubDate>Fri, 17 Jul 2026 17:19:09 +0800</pubDate><guid>https://eo.chifan.de/posts/ivlyrics/</guid><category domain="https://eo.chifan.de/categories/%E6%8A%98%E8%85%BE/">折腾</category><description>&lt;p&gt;不用 lyricsfy4 给 Spotify 完善歌词功能。&lt;/p&gt;&#10;&lt;p&gt;Spotify 的歌词一直很简陋，大多数歌曲是没有翻译的，而冷门的歌曲更是连歌词都没有。有一个很好的解决办法就是使用 &lt;strong&gt;lyricsfy 4&lt;/strong&gt; 。这个也是维护了很久，很符合国人的使用习惯。&lt;/p&gt;&#10;&lt;p&gt;但使用 lyricsfy 4 是用 Electron 写的，内存占用太多了，没必要为了看翻译歌词单独开一个 Electron 应用。问了下 AI 有没有什么其他好更优雅的方案，发现还是有的。&lt;/p&gt;&#10;&lt;p&gt;一般是使用 spicetify 配合其他的插件使用。下面是配合 ivlyrics 完善歌词体验。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="spicetify"&gt;&lt;span&gt;Spicetify&lt;/span&gt;&#10; &lt;a href="#spicetify" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://spicetify.app/docs/getting-started" target="_blank" rel="external nofollow noopener noreferrer"&gt;Spicetify&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 是 Spotify 的桌面客户端第三方插件加载工具。&#10;功能是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;修改 Spotify 的网页界面文件 &lt;code&gt;xpui&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;加载主题、Extensions 和 CustomApps&lt;/li&gt;&#10;&lt;li&gt;为 ivLyrics 这类项目生成路由文件&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;scoop install spicetify-cli&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;官方文档写了对于非标准路径安装的 Spotify 需要设置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;$ scoop prefix spotify&#10;C:\Users\&amp;lt;username&amp;gt;\scoop\apps\spotify\current&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;# 查看配置&#10;spicetify config&#10;&#10;# 添加 Custom App&#10;spicetify config custom_apps ivLyrics&#10;&#10;# 移除 Custom App 配置&#10;spicetify config custom_apps ivLyrics-&#10;&#10;# 将配置和插件应用到 Spotify&#10;spicetify apply&#10;&#10;# 撤销全部 Spicetify 修改，恢复原版 Spotify&#10;spicetify restore&#10;&#10;# 更新 Spicetify 自身&#10;spicetify update&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一般安装了插件之后，&lt;code&gt;spicetify apply&lt;/code&gt; 重启 Spotify 就可以让插件生效。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="插件-ivlyrics-安装"&gt;&lt;span&gt;插件 ivLyrics 安装&lt;/span&gt;&#10; &lt;a href="#%e6%8f%92%e4%bb%b6-ivlyrics-%e5%ae%89%e8%a3%85" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;下载 &lt;a href="https://github.com/ivLis-Studio/ivLyrics/releases" target="_blank" rel="external nofollow noopener noreferrer"&gt;ivLis-Studio/ivLyrics&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;。&#10;使用脚本安装，安装后 &lt;code&gt;spicetify apply&lt;/code&gt; 重启 Spotify。出现 &lt;strong&gt;ivlyrics&lt;/strong&gt; 的选项但是点进去提示出错了。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D_14798123037562967716.webp" title="打开出错" data-thumbnail="/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D_14798123037562967716.webp" data-sub-html="&lt;h2&gt;打开出错&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D_14798123037562967716.webp' alt="打开出错" height="886" width="1185"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;排查是脚本将 ivLyrics 放进了 &lt;code&gt;LocalAppData&lt;/code&gt;。正确做法是放入 &lt;code&gt;roaming&lt;/code&gt; 里面。&#10;&lt;code&gt;local&lt;/code&gt; 一般是放只属于这台电脑的数据，&lt;code&gt;roaming&lt;/code&gt; 则是放跟着用户走的数据。&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;对比项&lt;/th&gt;&#10; &lt;th&gt;%APPDATA% (Roaming)&lt;/th&gt;&#10; &lt;th&gt;%LOCALAPPDATA% (Local)&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;是否漫游&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;strong&gt;会漫游&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;strong&gt;不漫游&lt;/strong&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;需要跟随用户账号同步的配置&lt;/td&gt;&#10; &lt;td&gt;仅限本机的数据&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;数据特点&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;体积较小、重要配置文件&lt;/td&gt;&#10; &lt;td&gt;体积较大、缓存、临时文件、机器相关数据&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;域环境行为&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;漫游用户配置文件时会同步到服务器&lt;/td&gt;&#10; &lt;td&gt;不会同步，留在本地&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;strong&gt;典型用途&lt;/strong&gt;&lt;/td&gt;&#10; &lt;td&gt;软件设置、快捷方式配置、用户偏好&lt;/td&gt;&#10; &lt;td&gt;浏览器缓存、游戏存档缓存、大型临时文件、日志&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/div&gt;&lt;p&gt;一般来说，spicetify 是安装在 local 目录下面，但是我是用 scoop 安装的有点不太一样。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-1_6579961553705266216.webp" title="local和roaming" data-thumbnail="/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-1_6579961553705266216.webp" data-sub-html="&lt;h2&gt;local和roaming&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-1_6579961553705266216.webp' alt="local和roaming" height="97" width="293"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;可以通过 &lt;code&gt;spicetify config-dir&lt;/code&gt; 命令查看 spicetify 的配置目录。&lt;/p&gt;&#10;&lt;p&gt;将 &lt;code&gt;localappdata&lt;/code&gt; 里面的配置移动到 &lt;code&gt;roaming&lt;/code&gt; 就能使用了。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;$src = &amp;#34;$env:LOCALAPPDATA\spicetify\CustomApps\ivLyrics&amp;#34;&#10;$dst = &amp;#34;$env:APPDATA\spicetify\CustomApps\ivLyrics&amp;#34;&#10;&#10;Get-Process Spotify -ErrorAction SilentlyContinue | Stop-Process -Force&#10;&#10;Remove-Item -LiteralPath $dst -Recurse -Force&#10;New-Item -ItemType Junction -Path $dst -Target $src | Out-Null&#10;&#10;spicetify apply&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;del&gt;提了个 PR 把 Windows 硬编码的问题搞好了。有点奇怪的是作者测试的时候将安装脚本放到仓库里面，&lt;strong&gt;测试完成又删掉&lt;/strong&gt;，给作者提建议之后就把安装脚本放到仓库里面了。这种行为未免太过不安全太过可疑，所以还是建议手动下载放到对应目录。&lt;/del&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;能打开 ivlyrics 后配置一些东西，然后加上 AI API 就能实现翻译歌词了。&lt;/p&gt;&#10;&lt;p&gt;用上之前薅的 grok super。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-2_12448781025983814513.webp" title="ivlyrics设置页" data-thumbnail="/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-2_12448781025983814513.webp" data-sub-html="&lt;h2&gt;ivlyrics设置页&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/Spicetify%20%E4%BD%BF%E7%94%A8%20ivlyrics%E7%BF%BB%E8%AF%91%E6%AD%8C%E8%AF%8D-2_12448781025983814513.webp' alt="ivlyrics设置页" height="866" width="1168"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="网易云插件"&gt;&lt;span&gt;网易云插件&lt;/span&gt;&#10; &lt;a href="#%e7%bd%91%e6%98%93%e4%ba%91%e6%8f%92%e4%bb%b6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;Ivlyrics 自带一个插件市场，发现居然还有网易云歌词插件。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260724224435059_4675017545645273243.webp" title="ivlyrics插件市场" data-thumbnail="/images/remote/20260724224435059_4675017545645273243.webp" data-sub-html="&lt;h2&gt;ivlyrics插件市场&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260724224435059_4675017545645273243.webp' alt="ivlyrics插件市场" height="724" width="832"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260724224450772_2106479176668993259.webp" title="插件设置" data-thumbnail="/images/remote/20260724224450772_2106479176668993259.webp" data-sub-html="&lt;h2&gt;插件设置&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260724224450772_2106479176668993259.webp' alt="插件设置" height="641" width="850"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;需要配置一个 CORS 代理。考虑到地区的原因，尽量用国内的 IP。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;CORS 是浏览器的“跨网站访问许可机制”。CORS 代理的作用是让代理代替浏览器访问网易云接口，再把结果安全地转交给插件。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;浏览器有一个叫“同源策略”的安全限制。比如插件运行在 &lt;code&gt;https://spotify.example&lt;/code&gt; ，直接请求 &lt;code&gt;https://music.163.com/api/song/lyric&lt;/code&gt; 。&#10;两个地址的域名不同，浏览器会检查网易云响应中有没有允许跨域访问的响应头。如果没有，即使网易云已经返回数据，浏览器也不会把数据交给插件。&lt;/p&gt;&#10;&lt;p&gt;所以需要对网易云返回的数据做一些处理，到达浏览器之前，让其看起来是&lt;strong&gt;允许跨域访问&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;要么是用国内的 VPS 的 web 服务器搓一个，不过这么简单的需求，其实可以用 worker 来实现。&#10;由于我的备案域名在阿里云我就用了阿里的边缘函数。&lt;/p&gt;&#10;&lt;p&gt;让 AI 搓一个 CORS PROXY：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;/**&#10; * NetEase Music CORS proxy for Alibaba Cloud ESA Edge Functions.&#10; *&#10; * Add-on configuration:&#10; * https://YOUR_DOMAIN/?url={url}&#10; *&#10; * Security model:&#10; * - HTTPS only&#10; * - music.163.com only&#10; * - /api/* only&#10; * - GET, HEAD and OPTIONS only&#10; * - Never forwards the caller&amp;#39;s cookies or authorization headers&#10; */&#10;&#10;const ALLOWED_HOSTS = new Set([&amp;#34;music.163.com&amp;#34;]);&#10;const ALLOWED_PATH_PREFIXES = [&amp;#34;/api/&amp;#34;];&#10;const MAX_TARGET_URL_LENGTH = 4096;&#10;&#10;function corsHeaders() {&#10; return {&#10; &amp;#34;Access-Control-Allow-Origin&amp;#34;: &amp;#34;*&amp;#34;,&#10; &amp;#34;Access-Control-Allow-Methods&amp;#34;: &amp;#34;GET, HEAD, OPTIONS&amp;#34;,&#10; &amp;#34;Access-Control-Allow-Headers&amp;#34;:&#10; &amp;#34;Accept, Accept-Language, Content-Type, Origin, X-Requested-With&amp;#34;,&#10; &amp;#34;Access-Control-Expose-Headers&amp;#34;:&#10; &amp;#34;Content-Type, Content-Length, Date, ETag, Last-Modified&amp;#34;,&#10; &amp;#34;Access-Control-Max-Age&amp;#34;: &amp;#34;86400&amp;#34;,&#10; &amp;#34;X-Content-Type-Options&amp;#34;: &amp;#34;nosniff&amp;#34;,&#10; };&#10;}&#10;&#10;function jsonResponse(data, status = 200) {&#10; const headers = new Headers(corsHeaders());&#10; headers.set(&amp;#34;Content-Type&amp;#34;, &amp;#34;application/json; charset=utf-8&amp;#34;);&#10; headers.set(&amp;#34;Cache-Control&amp;#34;, &amp;#34;no-store&amp;#34;);&#10;&#10; return new Response(JSON.stringify(data), {&#10; status,&#10; headers,&#10; });&#10;}&#10;&#10;function parseTarget(requestUrl) {&#10; const proxyUrl = new URL(requestUrl);&#10; let rawTarget = proxyUrl.searchParams.get(&amp;#34;url&amp;#34;);&#10;&#10; if (!rawTarget) {&#10; return { error: &amp;#34;Missing query parameter: url&amp;#34;, status: 400 };&#10; }&#10;&#10; rawTarget = rawTarget.trim();&#10;&#10; // URLSearchParams normally decodes the value once. This extra pass also&#10; // accepts clients that encode the target URL twice.&#10; if (!/^https?:\/\//i.test(rawTarget)) {&#10; try {&#10; rawTarget = decodeURIComponent(rawTarget);&#10; } catch (_) {&#10; return { error: &amp;#34;Invalid URL encoding&amp;#34;, status: 400 };&#10; }&#10; }&#10;&#10; if (rawTarget.length &amp;gt; MAX_TARGET_URL_LENGTH) {&#10; return { error: &amp;#34;Target URL is too long&amp;#34;, status: 414 };&#10; }&#10;&#10; let target;&#10; try {&#10; target = new URL(rawTarget);&#10; } catch (_) {&#10; return { error: &amp;#34;Invalid target URL&amp;#34;, status: 400 };&#10; }&#10;&#10; if (target.protocol !== &amp;#34;https:&amp;#34;) {&#10; return { error: &amp;#34;Only HTTPS targets are allowed&amp;#34;, status: 403 };&#10; }&#10;&#10; if (&#10; target.username ||&#10; target.password ||&#10; (target.port &amp;amp;&amp;amp; target.port !== &amp;#34;443&amp;#34;)&#10; ) {&#10; return { error: &amp;#34;Credentials and non-standard ports are not allowed&amp;#34;, status: 403 };&#10; }&#10;&#10; const hostname = target.hostname.toLowerCase();&#10; if (!ALLOWED_HOSTS.has(hostname)) {&#10; return { error: &amp;#34;Target host is not allowed&amp;#34;, status: 403 };&#10; }&#10;&#10; const pathAllowed = ALLOWED_PATH_PREFIXES.some((prefix) =&amp;gt;&#10; target.pathname.startsWith(prefix)&#10; );&#10; if (!pathAllowed) {&#10; return { error: &amp;#34;Target path is not allowed&amp;#34;, status: 403 };&#10; }&#10;&#10; // Fragments are never sent in HTTP requests.&#10; target.hash = &amp;#34;&amp;#34;;&#10; return { target };&#10;}&#10;&#10;function addCorsToUpstreamResponse(upstream) {&#10; const response = new Response(upstream.body, upstream);&#10;&#10; // Do not leak upstream cookies or preserve conflicting CORS policy.&#10; response.headers.delete(&amp;#34;Set-Cookie&amp;#34;);&#10; response.headers.delete(&amp;#34;Set-Cookie2&amp;#34;);&#10; response.headers.delete(&amp;#34;Access-Control-Allow-Origin&amp;#34;);&#10; response.headers.delete(&amp;#34;Access-Control-Allow-Credentials&amp;#34;);&#10;&#10; const cors = corsHeaders();&#10; for (const name of Object.keys(cors)) {&#10; response.headers.set(name, cors[name]);&#10; }&#10;&#10; response.headers.set(&amp;#34;X-Cors-Proxy&amp;#34;, &amp;#34;aliyun-esa&amp;#34;);&#10; return response;&#10;}&#10;&#10;async function handleRequest(request) {&#10; const method = request.method.toUpperCase();&#10;&#10; if (method === &amp;#34;OPTIONS&amp;#34;) {&#10; return new Response(null, {&#10; status: 204,&#10; headers: corsHeaders(),&#10; });&#10; }&#10;&#10; if (method !== &amp;#34;GET&amp;#34; &amp;amp;&amp;amp; method !== &amp;#34;HEAD&amp;#34;) {&#10; return jsonResponse(&#10; { ok: false, error: &amp;#34;Method not allowed&amp;#34; },&#10; 405&#10; );&#10; }&#10;&#10; const requestUrl = new URL(request.url);&#10; if (requestUrl.pathname === &amp;#34;/health&amp;#34;) {&#10; return jsonResponse({&#10; ok: true,&#10; service: &amp;#34;netease-cors-proxy&amp;#34;,&#10; });&#10; }&#10;&#10; const parsed = parseTarget(request.url);&#10; if (parsed.error) {&#10; // Make the root URL convenient to open while setting up the function.&#10; if (&#10; parsed.status === 400 &amp;amp;&amp;amp;&#10; requestUrl.pathname === &amp;#34;/&amp;#34; &amp;amp;&amp;amp;&#10; !requestUrl.searchParams.has(&amp;#34;url&amp;#34;)&#10; ) {&#10; return jsonResponse({&#10; ok: true,&#10; service: &amp;#34;netease-cors-proxy&amp;#34;,&#10; usage: &amp;#34;https://YOUR_DOMAIN/?url={url}&amp;#34;,&#10; });&#10; }&#10;&#10; return jsonResponse(&#10; { ok: false, error: parsed.error },&#10; parsed.status&#10; );&#10; }&#10;&#10; const upstreamHeaders = new Headers();&#10; upstreamHeaders.set(&amp;#34;Accept&amp;#34;, &amp;#34;application/json, text/plain, */*&amp;#34;);&#10; upstreamHeaders.set(&amp;#34;Accept-Language&amp;#34;, &amp;#34;zh-CN,zh;q=0.9,en;q=0.8&amp;#34;);&#10; upstreamHeaders.set(&amp;#34;Origin&amp;#34;, &amp;#34;https://music.163.com&amp;#34;);&#10; upstreamHeaders.set(&amp;#34;Referer&amp;#34;, &amp;#34;https://music.163.com/&amp;#34;);&#10; upstreamHeaders.set(&#10; &amp;#34;User-Agent&amp;#34;,&#10; &amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 &amp;#34; &amp;#43;&#10; &amp;#34;(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36&amp;#34;&#10; );&#10; upstreamHeaders.set(&amp;#34;Cookie&amp;#34;, &amp;#34;os=pc&amp;#34;);&#10;&#10; try {&#10; const upstream = await fetch(parsed.target.toString(), {&#10; method,&#10; headers: upstreamHeaders,&#10; redirect: &amp;#34;manual&amp;#34;,&#10; });&#10;&#10; // Do not let an upstream redirect turn this into a proxy for another host.&#10; if (upstream.status &amp;gt;= 300 &amp;amp;&amp;amp; upstream.status &amp;lt; 400) {&#10; return jsonResponse(&#10; { ok: false, error: &amp;#34;Upstream redirect was blocked&amp;#34; },&#10; 502&#10; );&#10; }&#10;&#10; return addCorsToUpstreamResponse(upstream);&#10; } catch (error) {&#10; return jsonResponse(&#10; {&#10; ok: false,&#10; error: &amp;#34;Upstream request failed&amp;#34;,&#10; detail: String(error &amp;amp;&amp;amp; error.message ? error.message : error),&#10; },&#10; 502&#10; );&#10; }&#10;}&#10;&#10;export default {&#10; async fetch(request) {&#10; return handleRequest(request);&#10; },&#10;};&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="页面展示"&gt;&lt;span&gt;页面展示&lt;/span&gt;&#10; &lt;a href="#%e9%a1%b5%e9%9d%a2%e5%b1%95%e7%a4%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;歌词效果还是不错的：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/uTools_GIF_1784278758708_8426602751767399232.gif" title="歌词页" data-thumbnail="/images/remote/uTools_GIF_1784278758708_8426602751767399232.gif" data-sub-html="&lt;h2&gt;歌词页&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/uTools_GIF_1784278758708_8426602751767399232.gif' alt="歌词页" height="596" width="796"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;歌词悬浮窗：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/uTools_GIF_1784279315862_8252200338371823630.gif" title="歌词悬浮窗" data-thumbnail="/images/remote/uTools_GIF_1784279315862_8252200338371823630.gif" data-sub-html="&lt;h2&gt;歌词悬浮窗&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/uTools_GIF_1784279315862_8252200338371823630.gif' alt="歌词悬浮窗" height="231" width="452"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;黑胶页面：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/uTools_GIF_1784723543376_874847015043057878.gif" title="黑胶页面" data-thumbnail="/images/remote/uTools_GIF_1784723543376_874847015043057878.gif" data-sub-html="&lt;h2&gt;黑胶页面&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/uTools_GIF_1784723543376_874847015043057878.gif' alt="黑胶页面" height="821" width="1450"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>cc-swtich 切换skills agent时提示"创建符号链接失败"问题解决</title><link>https://eo.chifan.de/posts/cc-switch-symlink-bug/</link><pubDate>Wed, 15 Jul 2026 11:23:36 +0800</pubDate><guid>https://eo.chifan.de/posts/cc-switch-symlink-bug/</guid><category domain="https://eo.chifan.de/categories/ai/">AI</category><description>&lt;p&gt;点击迁移 Claude 选项后提示&amp;quot;创建符号链接失败&amp;quot;。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260715161851039_2527873412242911854.webp" title="cc-switch报错信息" data-thumbnail="/images/remote/20260715161851039_2527873412242911854.webp" data-sub-html="&lt;h2&gt;cc-switch报错信息&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260715161851039_2527873412242911854.webp' alt="cc-switch报错信息" height="184" width="1877"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;打开 Windows“设置”。&lt;/li&gt;&#10;&lt;li&gt;进入“系统 → 开发者选项”。&lt;/li&gt;&#10;&lt;li&gt;开启“开发人员模式”。&lt;/li&gt;&#10;&lt;li&gt;从系统托盘彻底退出 cc-switch，再重新打开并安装。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260715161851040_18011170591807748572.webp" title="开启开发人员模式" data-thumbnail="/images/remote/20260715161851040_18011170591807748572.webp" data-sub-html="&lt;h2&gt;开启开发人员模式&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260715161851040_18011170591807748572.webp' alt="开启开发人员模式" height="884" width="876"&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>codex启动"GPT需要一次性权限才能在你的电脑运行"BUG解决</title><link>https://eo.chifan.de/posts/codex-instruction-bug-fix/</link><pubDate>Tue, 14 Jul 2026 20:08:36 +0800</pubDate><guid>https://eo.chifan.de/posts/codex-instruction-bug-fix/</guid><category domain="https://eo.chifan.de/categories/ai/">AI</category><description>&lt;p&gt;打开 ChatGPT 后，提示 “ChatGPT 需要一次性权限才能在你的电脑上运行”。但是点击后依然无法启动的情况。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260714201807872_10720795297717663676.webp" title="GPT BUG 界面" data-thumbnail="/images/remote/20260714201807872_10720795297717663676.webp" data-sub-html="&lt;h2&gt;GPT BUG 界面&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260714201807872_10720795297717663676.webp' alt="GPT BUG 界面" height="756" width="1089"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;基本上是在 &lt;code&gt;.codex\config.toml&lt;/code&gt; 加了一些冲突的配置。我删除里面的 &lt;code&gt;model_instructions_file = &amp;quot;C:/Users/123/.codex/instruction.md&amp;quot;&lt;/code&gt; 即可解决。&lt;/p&gt;&#10;&lt;p&gt;或者删掉 &lt;code&gt;config.toml&lt;/code&gt; 创建让 CHATGPT 创建一个全新的文件。&lt;/p&gt;</description></item><item><title>思科模拟器企业组网</title><link>https://eo.chifan.de/posts/cisco-packet-tracer/</link><pubDate>Fri, 24 Apr 2026 00:11:54 +0800</pubDate><guid>https://eo.chifan.de/posts/cisco-packet-tracer/</guid><category domain="https://eo.chifan.de/categories/%E7%BD%91%E7%BB%9C/">网络</category><description>&lt;p&gt;使用思科模拟器简单搭建一个企业网络&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260424001242595_1802110151208345455.webp" title="网络拓扑图" data-thumbnail="/images/remote/20260424001242595_1802110151208345455.webp" data-sub-html="&lt;h2&gt;网络拓扑图&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260424001242595_1802110151208345455.webp' alt="网络拓扑图" height="1093" width="2493"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="序"&gt;&lt;span&gt;序&lt;/span&gt;&#10; &lt;a href="#%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;包含以下知识点:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;双机热备&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;STP&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;无线 / AP 接入&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;DHCP / DNS / WEB / FTP 服务器&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;OSPF 动态路由&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;串口广域网&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;动态 NAT&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;2960&lt;/code&gt;：接入层二层交换机，只负责 &lt;code&gt;Access / Trunk&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;3560&lt;/code&gt;：汇聚层三层交换机，负责 &lt;code&gt;SVI + ip routing + HSRP + STP&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;4331&lt;/code&gt;：核心 / 出口路由器，负责 &lt;code&gt;OSPF + 串口 + 默认路由 + NAT&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="推荐配置顺序"&gt;&lt;span&gt;推荐配置顺序&lt;/span&gt;&#10; &lt;a href="#%e6%8e%a8%e8%8d%90%e9%85%8d%e7%bd%ae%e9%a1%ba%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;先画拓扑，给每条链路和每个 VLAN 编号&lt;/li&gt;&#10;&lt;li&gt;先配服务器静态 IP，再开 &lt;code&gt;DHCP / DNS / WEB / FTP&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;打通二层：&lt;code&gt;VLAN + Access + Trunk + STP&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;配三层网关：&lt;code&gt;SVI + ip routing + HSRP&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;配路由器互联：园区链路、串口、OSPF&lt;/li&gt;&#10;&lt;li&gt;配出口：默认路由、默认路由发布、NAT&lt;/li&gt;&#10;&lt;li&gt;最后逐段验证：拿地址、跨 VLAN、跨区域、出外网、DNS 解析、主备切换&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 class="heading-element" id="ip-分配"&gt;&lt;span&gt;IP 分配&lt;/span&gt;&#10; &lt;a href="#ip-%e5%88%86%e9%85%8d" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.11.0/24&lt;/code&gt;：服务器区，&lt;code&gt;DHCP / DNS / WEB / FTP&lt;/code&gt; 所在网段&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.12.0/24&lt;/code&gt;：服务器接入路由器到核心路由器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.13.0/24&lt;/code&gt;：核心路由器到总公司接入路由器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.14.0/24&lt;/code&gt;、&lt;code&gt;192.168.15.0/24&lt;/code&gt;：总公司接入路由器与双核心交换机之间的三层互联&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.17.0/24&lt;/code&gt;：核心路由器到出口路由器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;100.1.1.0/24&lt;/code&gt;：出口到外网路由器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;192.168.1.0/24&lt;/code&gt; 到 &lt;code&gt;192.168.8.0/24&lt;/code&gt;：业务 VLAN 网段&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="相关知识点"&gt;&lt;span&gt;相关知识点&lt;/span&gt;&#10; &lt;a href="#%e7%9b%b8%e5%85%b3%e7%9f%a5%e8%af%86%e7%82%b9" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;div class="table-wrapper"&gt;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;技术&lt;/th&gt;&#10; &lt;th&gt;解决的问题&lt;/th&gt;&#10; &lt;th&gt;关键点&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;VLAN + Trunk&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;二层隔离与跨交换机承载多个 VLAN&lt;/td&gt;&#10; &lt;td&gt;Access 口给终端，Trunk 口给交换机 / 汇聚&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;STP&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;二层冗余链路防环&lt;/td&gt;&#10; &lt;td&gt;通过选根桥和阻塞端口避免广播风暴&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;HSRP&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;默认网关冗余&lt;/td&gt;&#10; &lt;td&gt;客户端始终指向虚拟 IP，不关心当前主设备是谁&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;SVI + ip routing&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;VLAN 间路由&lt;/td&gt;&#10; &lt;td&gt;三层交换机必须开启 &lt;code&gt;ip routing&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ip helper-address&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;跨网段 DHCP&lt;/td&gt;&#10; &lt;td&gt;把广播转换为单播转发到 DHCP 服务器&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;OSPF&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;全网动态路由&lt;/td&gt;&#10; &lt;td&gt;只在真正的三层邻居之间建邻接&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;NAT&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;私网访问公网&lt;/td&gt;&#10; &lt;td&gt;出口路由器要分清 &lt;code&gt;inside / outside&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;默认路由&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;去未知网段的出口方向&lt;/td&gt;&#10; &lt;td&gt;常在出口设备上配置，并发布给内部&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/div&gt;&lt;p&gt;一个很重要的配合关系：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;HSRP&lt;/code&gt; 决定“谁当默认网关”&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;STP&lt;/code&gt; 决定“二层流量先走哪条链路”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;实际设计里，最好让同一个 VLAN 的 &lt;code&gt;HSRP Active&lt;/code&gt; 和 &lt;code&gt;STP Root&lt;/code&gt; 尽量落在同一台设备上，避免流量先绕远路再去找网关。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="内部服务器配置"&gt;&lt;span&gt;内部服务器配置&lt;/span&gt;&#10; &lt;a href="#%e5%86%85%e9%83%a8%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;服务器区需要配置 &lt;code&gt;WEB&lt;/code&gt;、&lt;code&gt;DNS&lt;/code&gt;、&lt;code&gt;DHCP&lt;/code&gt;、&lt;code&gt;FTP&lt;/code&gt;，其中最关键的是 &lt;code&gt;DHCP&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;基本要求：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;所有服务器都用静态 IP&lt;/li&gt;&#10;&lt;li&gt;正确填写默认网关&lt;/li&gt;&#10;&lt;li&gt;DNS 服务器为 WEB 服务器添加 &lt;code&gt;A&lt;/code&gt; 记录&lt;/li&gt;&#10;&lt;li&gt;DHCP 地址池为各 VLAN 分配地址、网关、DNS&lt;/li&gt;&#10;&lt;li&gt;FTP 配置本地用户名和密码&lt;/li&gt;&#10;&lt;li&gt;WEB 开启 &lt;code&gt;HTTP&lt;/code&gt; 和 &lt;code&gt;HTTPS&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;DHCP 地址池示意：&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260424001242596_1090224346436976093.webp" title="DHCP 地址池" data-thumbnail="/images/remote/20260424001242596_1090224346436976093.webp" data-sub-html="&lt;h2&gt;DHCP 地址池&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260424001242596_1090224346436976093.webp' alt="DHCP 地址池" height="1129" width="1454"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;FTP 服务器配置用户名和密码。&lt;/p&gt;&#10;&lt;p&gt;同时需要给内部服务器配置静态 IP 和网关。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="路由器与交换机配置"&gt;&lt;span&gt;路由器与交换机配置&lt;/span&gt;&#10; &lt;a href="#%e8%b7%af%e7%94%b1%e5%99%a8%e4%b8%8e%e4%ba%a4%e6%8d%a2%e6%9c%ba%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="1-服务器接入路由器"&gt;&lt;span&gt;1. 服务器接入路由器&lt;/span&gt;&#10; &lt;a href="#1-%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a5%e5%85%a5%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;连接服务器区和园区核心&lt;/li&gt;&#10;&lt;li&gt;为非本地网段的客户端转发 DHCP 请求&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;interface GigabitEthernet0/0/0&#10; ip address 192.168.11.5 255.255.255.0&#10;&#10;interface GigabitEthernet0/0/1&#10; ip address 192.168.12.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;router ospf 10&#10; log-adjacency-changes&#10; network 192.168.11.0 0.0.0.255 area 0&#10; network 192.168.12.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;ip helper-address 192.168.11.3&lt;/code&gt; 表示把 DHCP 广播转发给中心 DHCP 服务器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;router ospf 10&lt;/code&gt; 里的 &lt;code&gt;10&lt;/code&gt; 是本地进程号，只在本设备上有意义，不要求全网一致&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="2-核心路由器"&gt;&lt;span&gt;2. 核心路由器&lt;/span&gt;&#10; &lt;a href="#2-%e6%a0%b8%e5%bf%83%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;连接服务器区、总公司园区、串口广域网和出口路由器&lt;/li&gt;&#10;&lt;li&gt;是整个实验的三层骨干之一&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;interface GigabitEthernet0/0/0&#10; ip address 192.168.12.2 255.255.255.0&#10;&#10;interface GigabitEthernet0/0/1&#10; ip address 192.168.13.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;interface Serial0/2/0&#10; ip address 192.168.16.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;interface Serial0/2/1&#10; ip address 192.168.17.1 255.255.255.0&#10; clock rate 64000&#10;&#10;router ospf 20&#10; log-adjacency-changes&#10; network 192.168.12.0 0.0.0.255 area 0&#10; network 192.168.13.0 0.0.0.255 area 0&#10; network 192.168.16.0 0.0.0.255 area 0&#10; network 192.168.17.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;串口如果是 &lt;code&gt;DCE&lt;/code&gt; 端，需要 &lt;code&gt;clock rate 64000&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;这里依然把 DHCP 请求中继到 &lt;code&gt;192.168.11.3&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;这台设备是很多网段的汇聚点，一旦 OSPF 漏宣告，这里最容易出问题&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="3-出口路由器"&gt;&lt;span&gt;3. 出口路由器&lt;/span&gt;&#10; &lt;a href="#3-%e5%87%ba%e5%8f%a3%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;对内连接企业私网&lt;/li&gt;&#10;&lt;li&gt;对外连接 ISP / 模拟互联网&lt;/li&gt;&#10;&lt;li&gt;做动态 NAT，并向 OSPF 发布默认路由&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;interface Serial0/1/0&#10; ip address 192.168.17.2 255.255.255.0&#10; ip nat inside&#10;&#10;interface Serial0/1/1&#10; ip address 100.1.1.1 255.255.255.0&#10; ip nat outside&#10; clock rate 64000&#10;&#10;router ospf 80&#10; log-adjacency-changes&#10; network 192.168.17.0 0.0.0.255 area 0&#10; default-information originate&#10;&#10;ip nat pool DZC 100.1.1.3 100.1.1.10 netmask 255.255.255.0&#10;ip nat inside source list 1 pool DZC&#10;ip classless&#10;ip route 0.0.0.0 0.0.0.0 100.1.1.2&#10;&#10;access-list 1 permit 192.168.0.0 0.0.255.255&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;ip nat inside source list 1 pool DZC&lt;/code&gt; 是动态 NAT 地址池，不是 PAT&lt;/li&gt;&#10;&lt;li&gt;如果希望很多内网主机共享少量公网地址，通常写成 &lt;code&gt;overload&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;default-information originate&lt;/code&gt; 的前提是本机路由表里已经有默认路由，所以 &lt;code&gt;ip route 0.0.0.0 0.0.0.0 100.1.1.2&lt;/code&gt; 不能漏&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;inside / outside&lt;/code&gt; 配反时，NAT 一定不生效&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="4-外网路由器"&gt;&lt;span&gt;4. 外网路由器&lt;/span&gt;&#10; &lt;a href="#4-%e5%a4%96%e7%bd%91%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;interface Serial0/1/0&#10; ip address 100.1.1.2 255.255.255.0&#10;&#10;interface GigabitEthernet0/0/0&#10; ip address 100.1.2.1 255.255.255.0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这一台主要用于模拟 ISP / 互联网，只要把去出口的下一跳配通即可。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="5-总公司接入路由器"&gt;&lt;span&gt;5. 总公司接入路由器&lt;/span&gt;&#10; &lt;a href="#5-%e6%80%bb%e5%85%ac%e5%8f%b8%e6%8e%a5%e5%85%a5%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;上联核心路由器&lt;/li&gt;&#10;&lt;li&gt;下联双核心交换机&lt;/li&gt;&#10;&lt;li&gt;其中 &lt;code&gt;NIM-ES 2-4&lt;/code&gt; 模块提供的是二层交换口，所以需要用 &lt;code&gt;VLAN + SVI&lt;/code&gt; 的方式承载三层地址&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;interface GigabitEthernet0/0/0&#10; ip address 192.168.13.2 255.255.255.0&#10;&#10;interface GigabitEthernet0/0/1&#10; ip address 192.168.14.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;interface GigabitEthernet0/1/0&#10; switchport mode access&#10; switchport access vlan 101&#10;&#10;interface Vlan101&#10; mac-address 0060.471d.b601&#10; ip address 192.168.15.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;router ospf 50&#10; log-adjacency-changes&#10; network 192.168.13.0 0.0.0.255 area 0&#10; network 192.168.14.0 0.0.0.255 area 0&#10; network 192.168.15.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;NIM-ES&lt;/code&gt; 模块出来的是交换端口，不能一边 &lt;code&gt;no switchport&lt;/code&gt; 一边又 &lt;code&gt;switchport mode access&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;正确思路是把物理口加入 &lt;code&gt;VLAN 101&lt;/code&gt;，然后把 IP 配在 &lt;code&gt;interface Vlan101&lt;/code&gt; 上&lt;/li&gt;&#10;&lt;li&gt;与它相连的交换机接口也要落到同一个 VLAN&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;与之相连的交换机接口示例：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;interface FastEthernet0/8&#10; switchport mode access&#10; switchport access vlan 101&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="6-双机热备与双核心交换机"&gt;&lt;span&gt;6. 双机热备与双核心交换机&lt;/span&gt;&#10; &lt;a href="#6-%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e4%b8%8e%e5%8f%8c%e6%a0%b8%e5%bf%83%e4%ba%a4%e6%8d%a2%e6%9c%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;这部分是整套实验最容易配乱的地方。建议先明确三个事实：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;三层交换机必须先开启 &lt;code&gt;ip routing&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;HSRP&lt;/code&gt; 给终端提供虚拟网关&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;OSPF&lt;/code&gt; 只在真正连接到三层邻居的接口上建邻接，普通用户 VLAN 接口一般保持 &lt;code&gt;passive&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;先看 OSPF 的思路：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;router ospf 60&#10; passive-interface default&#10; no passive-interface FastEthernet0/1&#10; network 192.168.1.0 0.0.0.255 area 0&#10; network 192.168.2.0 0.0.0.255 area 0&#10; network 192.168.3.0 0.0.0.255 area 0&#10; network 192.168.4.0 0.0.0.255 area 0&#10; network 192.168.5.0 0.0.0.255 area 0&#10; network 192.168.10.0 0.0.0.255 area 0&#10; network 192.168.14.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这段配置的意思不是“VLAN 口不能跑 OSPF”，而是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;默认所有接口都不发 Hello&lt;/li&gt;&#10;&lt;li&gt;只有真正要与其他三层设备建邻居的口，才用 &lt;code&gt;no passive-interface&lt;/code&gt; 打开&lt;/li&gt;&#10;&lt;li&gt;普通接用户的 SVI 依然可以被 &lt;code&gt;network&lt;/code&gt; 宣告进 OSPF，只是不参与邻居建立&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 class="heading-element" id="左侧多层交换机"&gt;&lt;span&gt;左侧多层交换机&lt;/span&gt;&#10; &lt;a href="#%e5%b7%a6%e4%be%a7%e5%a4%9a%e5%b1%82%e4%ba%a4%e6%8d%a2%e6%9c%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h4&gt;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作为 &lt;code&gt;VLAN 10 / 20 / 30&lt;/code&gt; 的主网关&lt;/li&gt;&#10;&lt;li&gt;同时承担这些 VLAN 的 &lt;code&gt;STP&lt;/code&gt; 主根桥&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;ip routing&#10;spanning-tree mode pvst&#10;spanning-tree vlan 10,20,30 priority 24576&#10;spanning-tree vlan 40,50 priority 28672&#10;&#10;interface FastEthernet0/1&#10; no switchport&#10; ip address 192.168.14.2 255.255.255.0&#10;&#10;interface FastEthernet0/2&#10; switchport mode access&#10; switchport access vlan 100&#10;&#10;interface FastEthernet0/3&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/4&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/5&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/6&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/7&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/8&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/9&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface Vlan10&#10; mac-address 0001.c950.e401&#10; ip address 192.168.1.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 10 ip 192.168.1.254&#10; standby 10 priority 101&#10; standby 10 preempt&#10; standby 10 track FastEthernet0/1&#10;&#10;interface Vlan20&#10; mac-address 0001.c950.e402&#10; ip address 192.168.2.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 20 ip 192.168.2.254&#10; standby 20 priority 101&#10; standby 20 preempt&#10; standby 20 track FastEthernet0/1&#10;&#10;interface Vlan30&#10; mac-address 0001.c950.e403&#10; ip address 192.168.3.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 30 ip 192.168.3.254&#10; standby 30 priority 101&#10; standby 30 preempt&#10; standby 30 track FastEthernet0/1&#10;&#10;interface Vlan40&#10; mac-address 0001.c950.e404&#10; ip address 192.168.4.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 40 ip 192.168.4.254&#10; standby 40 preempt&#10; standby 40 track FastEthernet0/1&#10;&#10;interface Vlan50&#10; mac-address 0001.c950.e405&#10; ip address 192.168.5.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 50 ip 192.168.5.254&#10; standby 50 preempt&#10; standby 50 track FastEthernet0/1&#10;&#10;interface Vlan100&#10; mac-address 0001.c950.e406&#10; ip address 192.168.10.254 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;router ospf 60&#10; log-adjacency-changes&#10; passive-interface default&#10; no passive-interface FastEthernet0/1&#10; network 192.168.14.0 0.0.0.255 area 0&#10; network 192.168.1.0 0.0.0.255 area 0&#10; network 192.168.2.0 0.0.0.255 area 0&#10; network 192.168.3.0 0.0.0.255 area 0&#10; network 192.168.4.0 0.0.0.255 area 0&#10; network 192.168.5.0 0.0.0.255 area 0&#10; network 192.168.10.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;h4 class="heading-element" id="右侧多层交换机"&gt;&lt;span&gt;右侧多层交换机&lt;/span&gt;&#10; &lt;a href="#%e5%8f%b3%e4%be%a7%e5%a4%9a%e5%b1%82%e4%ba%a4%e6%8d%a2%e6%9c%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h4&gt;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作为 &lt;code&gt;VLAN 40 / 50&lt;/code&gt; 的主网关&lt;/li&gt;&#10;&lt;li&gt;同时承担这些 VLAN 的 &lt;code&gt;STP&lt;/code&gt; 主根桥&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;ip routing&#10;spanning-tree mode pvst&#10;spanning-tree vlan 40,50 priority 24576&#10;spanning-tree vlan 10,20,30 priority 28672&#10;&#10;interface FastEthernet0/1&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/2&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/3&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/4&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/5&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/6&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/7&#10; switchport mode access&#10; switchport access vlan 110&#10;&#10;interface FastEthernet0/8&#10; switchport mode access&#10; switchport access vlan 101&#10;&#10;interface Vlan10&#10; mac-address 0001.c74b.9801&#10; ip address 192.168.1.2 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 10 ip 192.168.1.254&#10; standby 10 preempt&#10; standby 10 track FastEthernet0/8&#10;&#10;interface Vlan20&#10; mac-address 0001.c74b.9802&#10; ip address 192.168.2.2 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 20 ip 192.168.2.254&#10; standby 20 preempt&#10; standby 20 track FastEthernet0/8&#10;&#10;interface Vlan30&#10; mac-address 0001.c74b.9803&#10; ip address 192.168.3.2 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 30 ip 192.168.3.254&#10; standby 30 preempt&#10; standby 30 track FastEthernet0/8&#10;&#10;interface Vlan40&#10; mac-address 0001.c74b.9804&#10; ip address 192.168.4.2 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 40 ip 192.168.4.254&#10; standby 40 priority 101&#10; standby 40 preempt&#10; standby 40 track FastEthernet0/8&#10;&#10;interface Vlan50&#10; mac-address 0001.c74b.9805&#10; ip address 192.168.5.2 255.255.255.0&#10; ip helper-address 192.168.11.3&#10; standby 50 ip 192.168.5.254&#10; standby 50 priority 101&#10; standby 50 preempt&#10; standby 50 track FastEthernet0/8&#10;&#10;interface Vlan101&#10; mac-address 0001.c74b.9807&#10; ip address 192.168.15.2 255.255.255.0&#10;&#10;interface Vlan110&#10; mac-address 0001.c74b.9806&#10; ip address 192.168.11.1 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;router ospf 70&#10; log-adjacency-changes&#10; passive-interface default&#10; no passive-interface Vlan101&#10; network 192.168.1.0 0.0.0.255 area 0&#10; network 192.168.2.0 0.0.0.255 area 0&#10; network 192.168.3.0 0.0.0.255 area 0&#10; network 192.168.4.0 0.0.0.255 area 0&#10; network 192.168.5.0 0.0.0.255 area 0&#10; network 192.168.11.0 0.0.0.255 area 0&#10; network 192.168.15.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;补充说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;左右两台交换机都要 &lt;code&gt;ip routing&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;standby x priority 101&lt;/code&gt; 的一侧会优先成为 &lt;code&gt;Active&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;track&lt;/code&gt; 上联口断开时，会降低优先级，方便主备切换&lt;/li&gt;&#10;&lt;li&gt;右侧设备上 &lt;code&gt;Vlan101&lt;/code&gt; 是三层互联 VLAN，所以取消 &lt;code&gt;passive&lt;/code&gt; 是合理的&lt;/li&gt;&#10;&lt;li&gt;普通用户 VLAN 如果没有直接连接三层邻居，就不需要 &lt;code&gt;no passive-interface&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="7-分公司接入路由器"&gt;&lt;span&gt;7. 分公司接入路由器&lt;/span&gt;&#10; &lt;a href="#7-%e5%88%86%e5%85%ac%e5%8f%b8%e6%8e%a5%e5%85%a5%e8%b7%af%e7%94%b1%e5%99%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;interface FastEthernet0/1&#10; no switchport&#10; ip address 192.168.18.2 255.255.255.0&#10; duplex auto&#10; speed auto&#10;&#10;interface FastEthernet0/2&#10; switchport mode access&#10; switchport access vlan 80&#10;&#10;interface FastEthernet0/3&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/4&#10; switchport trunk encapsulation dot1q&#10; switchport mode trunk&#10;&#10;interface Vlan60&#10; mac-address 0009.7c59.3801&#10; ip address 192.168.6.254 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;interface Vlan70&#10; mac-address 0009.7c59.3802&#10; ip address 192.168.7.254 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;interface Vlan80&#10; mac-address 0009.7c59.3803&#10; ip address 192.168.8.254 255.255.255.0&#10; ip helper-address 192.168.11.3&#10;&#10;router ospf 40&#10; log-adjacency-changes&#10; network 192.168.6.0 0.0.0.255 area 0&#10; network 192.168.7.0 0.0.0.255 area 0&#10; network 192.168.8.0 0.0.0.255 area 0&#10; network 192.168.18.0 0.0.0.255 area 0&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="8-二层交换机"&gt;&lt;span&gt;8. 二层交换机&lt;/span&gt;&#10; &lt;a href="#8-%e4%ba%8c%e5%b1%82%e4%ba%a4%e6%8d%a2%e6%9c%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;二层交换机只做接入和转发，不承担网关职责。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;interface FastEthernet0/1&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/2&#10; switchport mode trunk&#10;&#10;interface FastEthernet0/3&#10; switchport mode access&#10; switchport access vlan 10&#10;&#10;interface FastEthernet0/4&#10; switchport mode access&#10; switchport access vlan 10&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="路由协议"&gt;&lt;span&gt;路由协议&lt;/span&gt;&#10; &lt;a href="#%e8%b7%af%e7%94%b1%e5%8d%8f%e8%ae%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;路由协议里最常见的是 &lt;code&gt;OSPF&lt;/code&gt;，&lt;code&gt;RIP&lt;/code&gt; 也仍然是实验、题目和小型拓扑里经常出现的内容。这个实验主体用的是 &lt;code&gt;OSPF&lt;/code&gt;，但 &lt;code&gt;RIP&lt;/code&gt; 也建议会配、会查、会和 &lt;code&gt;OSPF&lt;/code&gt; 做比较。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="ospf"&gt;&lt;span&gt;OSPF&lt;/span&gt;&#10; &lt;a href="#ospf" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;OSPF 会维护三张关键表：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;邻居表：已经建立邻接关系的设备&lt;/li&gt;&#10;&lt;li&gt;链路状态数据库（LSDB）：全网链路状态信息&lt;/li&gt;&#10;&lt;li&gt;路由表：SPF 计算后的最优路径&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;工作过程可以粗记为：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;用 &lt;code&gt;Hello&lt;/code&gt; 发现邻居&lt;/li&gt;&#10;&lt;li&gt;交换 &lt;code&gt;LSA&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;建立 &lt;code&gt;LSDB&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;运行 &lt;code&gt;SPF&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;安装路由&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;与 &lt;code&gt;RIP&lt;/code&gt; 等距离矢量协议不同，&lt;code&gt;OSPF&lt;/code&gt; 路由器不直接交换整张路由表，而是交换链路状态信息。&lt;/p&gt;&#10;&lt;p&gt;最基本的 OSPF 配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# router ospf 10&#10;Router(config-router)# network 192.168.11.0 0.0.0.255 area 0&#10;Router(config-router)# network 192.168.12.0 0.0.0.255 area 0&#10;Router(config-router)# passive-interface default&#10;Router(config-router)# no passive-interface g0/0/1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;几个关键点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;router ospf 10&lt;/code&gt; 里的 &lt;code&gt;10&lt;/code&gt; 只是本机进程号，只在设备本地有意义&lt;/li&gt;&#10;&lt;li&gt;不同设备写成 &lt;code&gt;1&lt;/code&gt;、&lt;code&gt;10&lt;/code&gt;、&lt;code&gt;20&lt;/code&gt; 都可以，不影响建邻&lt;/li&gt;&#10;&lt;li&gt;真正影响邻接是否建立的，是三层可达、Area 一致、Hello / Dead 定时器一致、认证一致，以及没有被 &lt;code&gt;passive-interface&lt;/code&gt; 禁掉&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;passive-interface default&lt;/code&gt; 很适合企业网，默认把所有接口设为被动，只把真正需要建邻的口开放出来&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;常用 OSPF 检查命令&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show ip ospf neighbor&#10;show ip protocols&#10;show ip ospf&#10;show ip route ospf&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="rip"&gt;&lt;span&gt;RIP&lt;/span&gt;&#10; &lt;a href="#rip" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;RIP 是典型的距离矢量协议，特点是简单，但能力也弱一些。&lt;/p&gt;&#10;&lt;p&gt;RIP 的几个考试 / 实验重点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以“跳数”作为度量值&lt;/li&gt;&#10;&lt;li&gt;最大跳数是 &lt;code&gt;15&lt;/code&gt;，&lt;code&gt;16&lt;/code&gt; 代表不可达&lt;/li&gt;&#10;&lt;li&gt;周期性发送更新，默认大约每 &lt;code&gt;30&lt;/code&gt; 秒一次&lt;/li&gt;&#10;&lt;li&gt;收敛速度比 OSPF 慢，不适合较大的企业网络&lt;/li&gt;&#10;&lt;li&gt;一般在小型拓扑、入门实验、简单分支网络里使用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果要在实验里用 RIP，建议直接上 &lt;code&gt;RIPv2&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# router rip&#10;Router(config-router)# version 2&#10;Router(config-router)# no auto-summary&#10;Router(config-router)# network 192.168.0.0&#10;Router(config-router)# passive-interface default&#10;Router(config-router)# no passive-interface g0/0/0&#10;Router(config-router)# no passive-interface s0/1/0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;version 2&lt;/code&gt;：开启 &lt;code&gt;RIPv2&lt;/code&gt;，支持无类路由&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;no auto-summary&lt;/code&gt;：关闭自动汇总，这句在实验里基本可以当成必敲&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;network 192.168.0.0&lt;/code&gt;：让落在这个主类网络内的接口参与 RIP&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;passive-interface default&lt;/code&gt;：让接用户的接口不发 RIP 更新，只保留真正互联链路发送更新&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果希望出口路由器把默认路由下发给全网，可以这样写：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# ip route 0.0.0.0 0.0.0.0 100.1.1.2&#10;Router(config)# router rip&#10;Router(config-router)# default-information originate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;RIP 常用检查命令：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show ip route&#10;show ip protocols&#10;show ip rip database&#10;debug ip rip&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;OSPF&lt;/code&gt; 和 &lt;code&gt;RIP&lt;/code&gt; 可以这样粗记：&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;协议&lt;/th&gt;&#10; &lt;th&gt;类型&lt;/th&gt;&#10; &lt;th&gt;度量值&lt;/th&gt;&#10; &lt;th&gt;收敛速度&lt;/th&gt;&#10; &lt;th&gt;适用场景&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;OSPF&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;链路状态&lt;/td&gt;&#10; &lt;td&gt;Cost&lt;/td&gt;&#10; &lt;td&gt;快&lt;/td&gt;&#10; &lt;td&gt;企业园区、中大型网络&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;RIP&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;距离矢量&lt;/td&gt;&#10; &lt;td&gt;跳数&lt;/td&gt;&#10; &lt;td&gt;慢&lt;/td&gt;&#10; &lt;td&gt;小型网络、入门实验&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/div&gt;&lt;h2 class="heading-element" id="stp-与-hsrp"&gt;&lt;span&gt;STP 与 HSRP&lt;/span&gt;&#10; &lt;a href="#stp-%e4%b8%8e-hsrp" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;STP&lt;/code&gt; 和 &lt;code&gt;HSRP&lt;/code&gt; 经常一起出现，因为企业网络里既要“二层不成环”，也要“三层网关不单点”。&lt;/p&gt;&#10;&lt;div class="table-wrapper"&gt;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;技术&lt;/th&gt;&#10; &lt;th&gt;控制什么&lt;/th&gt;&#10; &lt;th&gt;核心目的&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;STP&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;二层路径&lt;/td&gt;&#10; &lt;td&gt;防环路、防广播风暴&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;HSRP&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;三层网关&lt;/td&gt;&#10; &lt;td&gt;网关冗余、主备切换&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/div&gt;&lt;h3 class="heading-element" id="stp"&gt;&lt;span&gt;STP&lt;/span&gt;&#10; &lt;a href="#stp" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;STP（Spanning Tree Protocol，生成树协议）的作用是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;在二层冗余链路中阻塞一部分端口，避免交换网络形成环路&lt;/li&gt;&#10;&lt;li&gt;当主链路故障时，再把备用链路放通&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;STP 里最重要的几个概念：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Root Bridge&lt;/code&gt;：根桥，整棵生成树的中心&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Root Port&lt;/code&gt;：每台非根桥设备上，去往根桥的最佳端口&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Designated Port&lt;/code&gt;：每个网段负责转发的端口&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Blocking / Discarding&lt;/code&gt;：被阻塞的端口，不参与正常转发&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这里用的是 &lt;code&gt;PVST&lt;/code&gt;，常见配置有两种写法。&lt;/p&gt;&#10;&lt;p&gt;写法 1：直接指定主根和备根&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Switch(config)# spanning-tree mode pvst&#10;Switch(config)# spanning-tree vlan 40,50 root primary&#10;Switch(config)# spanning-tree vlan 10,20,30 root secondary&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;写法 2：手工改优先级&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Switch(config)# spanning-tree mode pvst&#10;Switch(config)# spanning-tree vlan 10,20,30 priority 24576&#10;Switch(config)# spanning-tree vlan 40,50 priority 28672&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;优先级越小，越容易成为根桥&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;root primary&lt;/code&gt; / &lt;code&gt;root secondary&lt;/code&gt; 本质上也是自动帮你调优先级&lt;/li&gt;&#10;&lt;li&gt;Access 口如果确定只接终端，可以开 &lt;code&gt;portfast&lt;/code&gt;，但不要在 Trunk 或交换机互联口上乱开&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;接入口常见的增强配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Switch(config)# interface range f0/3 - 24&#10;Switch(config-if-range)# spanning-tree portfast&#10;Switch(config-if-range)# spanning-tree bpduguard enable&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;常用 STP 检查命令：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show spanning-tree&#10;show spanning-tree vlan 10&#10;show spanning-tree root&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="hsrp"&gt;&lt;span&gt;HSRP&lt;/span&gt;&#10; &lt;a href="#hsrp" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;HSRP（Hot Standby Router Protocol，热备份路由协议）的作用是给终端提供一个“虚拟网关”，这样真实网关坏了，终端不用改默认网关，业务还能继续走。&lt;/p&gt;&#10;&lt;p&gt;HSRP 里最重要的概念：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Active&lt;/code&gt;：当前真正转发流量的设备&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Standby&lt;/code&gt;：备用设备&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Virtual IP&lt;/code&gt;：客户端填写的默认网关&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Virtual MAC&lt;/code&gt;：跟着虚拟网关一起漂移的虚拟 MAC&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最常见的 HSRP 配置：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Switch(config)# interface vlan 10&#10;Switch(config-if)# ip address 192.168.1.1 255.255.255.0&#10;Switch(config-if)# standby 10 ip 192.168.1.254&#10;Switch(config-if)# standby 10 priority 101&#10;Switch(config-if)# standby 10 preempt&#10;Switch(config-if)# standby 10 track fastEthernet 0/1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每条命令的作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;standby 10 ip 192.168.1.254&lt;/code&gt;：定义虚拟网关 IP&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;standby 10 priority 101&lt;/code&gt;：优先级高的一侧更容易成为 &lt;code&gt;Active&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;standby 10 preempt&lt;/code&gt;：主设备恢复后允许重新抢回主用角色&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;standby 10 track fastEthernet 0/1&lt;/code&gt;：上联口挂了就自动降权，方便切到备机&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;常用 HSRP 检查命令：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show standby brief&#10;show standby&#10;show running-config interface vlan 10&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="为什么-stp-和-hsrp-要一起看"&gt;&lt;span&gt;为什么 STP 和 HSRP 要一起看&lt;/span&gt;&#10; &lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88-stp-%e5%92%8c-hsrp-%e8%a6%81%e4%b8%80%e8%b5%b7%e7%9c%8b" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;只配 &lt;code&gt;HSRP&lt;/code&gt; 不看 &lt;code&gt;STP&lt;/code&gt;，流量可能会绕路。&lt;/p&gt;&#10;&lt;p&gt;理想状态是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;VLAN 10 / 20 / 30&lt;/code&gt; 的 &lt;code&gt;HSRP Active&lt;/code&gt; 和 &lt;code&gt;STP Root&lt;/code&gt; 都落在左侧核心&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;VLAN 40 / 50&lt;/code&gt; 的 &lt;code&gt;HSRP Active&lt;/code&gt; 和 &lt;code&gt;STP Root&lt;/code&gt; 都落在右侧核心&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这样二层路径和三层网关方向一致，终端发往网关的数据不会先绕到另一台核心再转发。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="acl"&gt;&lt;span&gt;ACL&lt;/span&gt;&#10; &lt;a href="#acl" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;ACL（Access Control List，访问控制列表）本质上就是一串“从上到下匹配”的规则，用来决定哪些流量放行，哪些流量拒绝。&lt;/p&gt;&#10;&lt;p&gt;记住 ACL 的四条铁律：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;自上而下逐条匹配&lt;/li&gt;&#10;&lt;li&gt;一旦命中，立即停止继续往下匹配&lt;/li&gt;&#10;&lt;li&gt;规则越具体，越应该写在前面&lt;/li&gt;&#10;&lt;li&gt;最后一条永远隐含 &lt;code&gt;deny ip any any&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 class="heading-element" id="标准-acl-和扩展-acl"&gt;&lt;span&gt;标准 ACL 和扩展 ACL&lt;/span&gt;&#10; &lt;a href="#%e6%a0%87%e5%87%86-acl-%e5%92%8c%e6%89%a9%e5%b1%95-acl" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;div class="table-wrapper"&gt;&#10; &lt;table data-sortable&gt;&lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;类型&lt;/th&gt;&#10; &lt;th&gt;能匹配什么&lt;/th&gt;&#10; &lt;th&gt;常放位置&lt;/th&gt;&#10; &lt;th&gt;编号范围&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;标准 ACL&lt;/td&gt;&#10; &lt;td&gt;只看源 IP&lt;/td&gt;&#10; &lt;td&gt;靠近目的端&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;1-99&lt;/code&gt;、&lt;code&gt;1300-1999&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;扩展 ACL&lt;/td&gt;&#10; &lt;td&gt;看源 / 目的 / 协议 / 端口&lt;/td&gt;&#10; &lt;td&gt;靠近源端&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;100-199&lt;/code&gt;、&lt;code&gt;2000-2699&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/div&gt;&lt;h3 class="heading-element" id="标准-acl"&gt;&lt;span&gt;标准 ACL&lt;/span&gt;&#10; &lt;a href="#%e6%a0%87%e5%87%86-acl" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;标准 ACL 一般用来做“谁能来”，因为它只能看源地址。&lt;/p&gt;&#10;&lt;p&gt;示例 1：只允许网管网段远程登录设备&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# access-list 10 permit 192.168.10.0 0.0.0.255&#10;Router(config)# line vty 0 4&#10;Router(config-line)# access-class 10 in&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;示例 2：只允许 &lt;code&gt;192.168.6.0/24&lt;/code&gt; 访问某个接口后的资源&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# access-list 20 permit 192.168.6.0 0.0.0.255&#10;Router(config)# interface g0/0/1&#10;Router(config-if)# ip access-group 20 out&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="扩展-acl"&gt;&lt;span&gt;扩展 ACL&lt;/span&gt;&#10; &lt;a href="#%e6%89%a9%e5%b1%95-acl" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;扩展 ACL 可以精确到协议和端口，企业网里更常用。&lt;/p&gt;&#10;&lt;p&gt;示例：禁止分公司 VLAN60 访问服务器区 FTP，但允许其访问其他业务&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# access-list 100 deny tcp 192.168.6.0 0.0.0.255 192.168.11.0 0.0.0.255 eq 21&#10;Router(config)# access-list 100 deny tcp 192.168.6.0 0.0.0.255 192.168.11.0 0.0.0.255 eq 20&#10;Router(config)# access-list 100 permit ip any any&#10;Router(config)# interface FastEthernet0/1&#10;Router(config-if)# ip access-group 100 in&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果想用命名 ACL，可读性会更高：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# ip access-list extended BLOCK_FTP&#10;Router(config-ext-nacl)# deny tcp 192.168.6.0 0.0.0.255 192.168.11.0 0.0.0.255 eq 21&#10;Router(config-ext-nacl)# deny tcp 192.168.6.0 0.0.0.255 192.168.11.0 0.0.0.255 eq 20&#10;Router(config-ext-nacl)# permit ip any any&#10;Router(config)# interface FastEthernet0/1&#10;Router(config-if)# ip access-group BLOCK_FTP in&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="acl-的放置原则"&gt;&lt;span&gt;ACL 的放置原则&lt;/span&gt;&#10; &lt;a href="#acl-%e7%9a%84%e6%94%be%e7%bd%ae%e5%8e%9f%e5%88%99" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;标准 ACL：尽量靠近目的端&lt;/li&gt;&#10;&lt;li&gt;扩展 ACL：尽量靠近源端&lt;/li&gt;&#10;&lt;li&gt;控制谁能远程登录设备：优先用 &lt;code&gt;line vty&lt;/code&gt; 下的 &lt;code&gt;access-class&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;NAT 里用到的 ACL 往往只是“匹配谁做转换”，不一定是“拦截流量”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ACL 常用检查命令：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show access-lists&#10;show ip interface&#10;show running-config | section access-list&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="nat"&gt;&lt;span&gt;NAT&lt;/span&gt;&#10; &lt;a href="#nat" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;企业出口里的 NAT，本质上是把私网地址改成公网地址。最常见的是“内网用户访问外网”时做源地址转换。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="pat多个内网地址复用一个公网地址"&gt;&lt;span&gt;PAT：多个内网地址复用一个公网地址&lt;/span&gt;&#10; &lt;a href="#pat%e5%a4%9a%e4%b8%aa%e5%86%85%e7%bd%91%e5%9c%b0%e5%9d%80%e5%a4%8d%e7%94%a8%e4%b8%80%e4%b8%aa%e5%85%ac%e7%bd%91%e5%9c%b0%e5%9d%80" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;Router(config)# interface gigabitEthernet 0/0/0&#10;Router(config-if)# ip nat inside&#10;Router(config)# interface serial 0/2/0&#10;Router(config-if)# ip nat outside&#10;&#10;Router(config)# access-list 1 permit 192.168.0.0 0.0.255.255&#10;Router(config)# ip nat inside source list 1 interface serial 0/2/0 overload&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;overload&lt;/code&gt; 的作用是端口复用，也就是常说的 &lt;code&gt;PAT&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;多台内网主机可以共用一个公网 IP&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="动态-nat从公网地址池里分配地址"&gt;&lt;span&gt;动态 NAT：从公网地址池里分配地址&lt;/span&gt;&#10; &lt;a href="#%e5%8a%a8%e6%80%81-nat%e4%bb%8e%e5%85%ac%e7%bd%91%e5%9c%b0%e5%9d%80%e6%b1%a0%e9%87%8c%e5%88%86%e9%85%8d%e5%9c%b0%e5%9d%80" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;Router(config)# interface gigabitEthernet 0/0/0&#10;Router(config-if)# ip nat inside&#10;Router(config)# interface serial 0/2/0&#10;Router(config-if)# ip nat outside&#10;&#10;Router(config)# access-list 1 permit 192.168.0.0 0.0.255.255&#10;Router(config)# ip nat pool DZC 100.1.1.3 100.1.1.10 netmask 255.255.255.0&#10;Router(config)# ip nat inside source list 1 pool DZC&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果希望“地址池 + 端口复用”一起用，可以写成：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Router(config)# ip nat inside source list 1 pool DZC overload&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;常用查看命令：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;show ip nat translations&#10;show ip nat statistics&#10;clear ip nat translation *&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="故障排查"&gt;&lt;span&gt;故障排查&lt;/span&gt;&#10; &lt;a href="#%e6%95%85%e9%9a%9c%e6%8e%92%e6%9f%a5" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;排错建议按“终端 -&amp;gt; 接入 -&amp;gt; 汇聚 -&amp;gt; 核心 -&amp;gt; 出口”的方向查，不要一上来就全网乱翻。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="基础排错顺序"&gt;&lt;span&gt;基础排错顺序&lt;/span&gt;&#10; &lt;a href="#%e5%9f%ba%e7%a1%80%e6%8e%92%e9%94%99%e9%a1%ba%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;先确认终端 IP、掩码、网关、DNS 是否正确&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ping&lt;/code&gt; 本 VLAN 网关，看本地三层是否正常&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ping&lt;/code&gt; 内网服务器，看园区路由是否正常&lt;/li&gt;&#10;&lt;li&gt;用 &lt;code&gt;tracert&lt;/code&gt; 看流量断在哪一跳&lt;/li&gt;&#10;&lt;li&gt;在对应设备上看 &lt;code&gt;show ip route&lt;/code&gt;、&lt;code&gt;show ip ospf neighbor&lt;/code&gt;、&lt;code&gt;show standby brief&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;出外网异常时，再看 &lt;code&gt;show ip nat translations&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 class="heading-element" id="常见问题"&gt;&lt;span&gt;常见问题&lt;/span&gt;&#10; &lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;三层交换机忘记开启 &lt;code&gt;ip routing&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;DHCP 地址池默认网关填成物理网关，而不是 HSRP 虚拟网关&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;default-information originate&lt;/code&gt; 配了，但本机没有默认路由&lt;/li&gt;&#10;&lt;li&gt;串口 DCE 端忘记 &lt;code&gt;clock rate&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;把所有接口都 &lt;code&gt;no passive-interface&lt;/code&gt;，导致用户 VLAN 也去建 OSPF 邻居&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;NIM-ES&lt;/code&gt; 交换模块口理解错，把二层口和三层口命令混着写&lt;/li&gt;&#10;&lt;li&gt;NAT 的 &lt;code&gt;inside / outside&lt;/code&gt; 打反&lt;/li&gt;&#10;&lt;li&gt;ACL 写完忘了绑到接口，或者绑反了 &lt;code&gt;in / out&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;ACL 只写了 &lt;code&gt;deny&lt;/code&gt;，忘了最后补需要的 &lt;code&gt;permit&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;HSRP 主设备和 STP 根桥不一致，导致流量绕路&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="一组常用命令"&gt;&lt;span&gt;一组常用命令&lt;/span&gt;&#10; &lt;a href="#%e4%b8%80%e7%bb%84%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;show running-config | include helper&#10;show running-config | section access-list&#10;show ip interface brief&#10;show ip route&#10;show ip protocols&#10;show vlan brief&#10;show interfaces trunk&#10;show standby brief&#10;show spanning-tree vlan 10&#10;show ip ospf neighbor&#10;show ip rip database&#10;show access-lists&#10;show ip nat translations&#10;clear ip nat translation *&#10;&#10;Ctrl &amp;#43; Shift &amp;#43; 6&#10;default interface FastEthernet 0/1&#10;erase startup-config&#10;reload&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;&#10; &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;1.&lt;a href="https://www.bilibili.com/video/BV1Nk4y147Ks/?spm_id_from=333.337.search-card.all.click&amp;vd_source=75ba9ed7e36ca38708e502a1d1eac076" target="_blank" rel="external nofollow noopener noreferrer"&gt;思科企业网搭建-企业网含无线-从零开始配置教程_哔哩哔哩_bilibili&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Openclaw的一些知识</title><link>https://eo.chifan.de/posts/openclaw/</link><pubDate>Sun, 05 Apr 2026 23:03:23 +0800</pubDate><guid>https://eo.chifan.de/posts/openclaw/</guid><category domain="https://eo.chifan.de/categories/ai/">AI</category><description>&lt;p&gt;介绍了一些AI的基本概念，openclaw的应用，openclaw的安全相关问题&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="前置概念"&gt;&lt;span&gt;前置概念&lt;/span&gt;&#10; &lt;a href="#%e5%89%8d%e7%bd%ae%e6%a6%82%e5%bf%b5" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;很多人可能还是停留在 4 年前 CHATGPT 刚刚出来的时候，AI 仅仅是网页聊天你问我答的功能。&lt;/p&gt;&#10;&lt;p&gt;但如今 AI 已经能完成很多任务，变化巨大。应用形态大概可以这样理解：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;WEB 问答 AI&lt;/code&gt; -&amp;gt; &lt;code&gt;集成 IDE 的代码助手（coursor）&lt;/code&gt; -&amp;gt; &lt;code&gt;给一个虚拟环境执行（manus）&lt;/code&gt; -&amp;gt; &lt;code&gt;AI CLI（Claude code）&lt;/code&gt; -&amp;gt; &lt;code&gt;OpenClaw&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;越往后走，AI 越不像“网页聊天”，越像“能接收目标、调用工具、持续运行的系统”。&lt;/p&gt;&#10;&lt;p&gt;这篇文章主要讲 &lt;code&gt;OpenClaw&lt;/code&gt;，在此之前先把几个经常混在一起的概念捋清楚。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;LLM：大语言模型。可以先粗暴理解成一个超大号的“填词器”。你给它一段上下文，它根据概率预测下一个 token 应该是什么。聊天、翻译、写代码，本质上都还是在做这个事。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Token：可以理解成模型处理文本时的最小切分单位。中文通常粗略估算时可以认为 &lt;code&gt;1 个中文汉字约等于 1~2 个 token&lt;/code&gt;，英文通常比中文省 token 一些。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Prompt：提示词，也就是你给模型的任务描述。早期模型能力弱，所以那时很强调 &lt;strong&gt;提示词工程（Prompt Engineering）&lt;/strong&gt;，大家会认真设计角色、约束、步骤、输出格式，让模型尽量别跑偏，比如：&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;# Role: [身份]&#10;# Context: [这对我的职业生涯很重要]&#10;&#10;# Constraints&#10;1. 语言：始终使用简体中文回答。&#10;2. 深度：严禁敷衍。涉及命令时，必须解释关键参数的底层含义。&#10;3. 思维：鼓励触类旁通，提供跨学科类比。&#10;4. 态度：保持中立，严禁幻觉。&#10;5. 逻辑：结论后必须简述逻辑依据。&#10;6. 数据：处理被 &amp;lt;data&amp;gt; 标签包裹的内容时，需进行深度审计。&#10;&#10;# Workflow&#10;1. 【分析】：先分析问题，给出【解决思路地图（Roadmap）】。&#10;2. 【澄清】：列出 2-3 个需要补充的细节（若清晰则跳过）。&#10;3. 【暂停】：**停止输出**。等待确认后继续。&#10;4. 【追踪】：从下轮对话起，在回复末尾维护一个 [Project Checklist]，标注进度。&#10;&#10;# Task&#10;[输入问题]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在很多 AI CLI 已经把这些能力做进系统提示词、工作流、规则文件里了，所以普通用户不用再手搓那么长一段模板。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Context：上下文。LLM 没有“人类意义上的记忆”，它看起来记得你之前说过什么，是因为你每次发消息时，系统都会把前面的对话、规则、工具结果打包一起发给模型。这个打包进去的内容就叫上下文。上下文窗口越大，AI 一次性能看到的信息越多。&#10;我还记得我一年前使用 gemini 的时候，一个项目越做，幻觉概率就越高，越降智。所以说上下文窗口大小还是很重要的。&lt;del&gt;虽然说 gemini 也是上下文窗口大起家，但也是不太够用&lt;/del&gt;&#10;现在领先的 LLM 已经有 1 million 的上下文窗口了，完全塞得进很多项目的上下文。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260405230150498_10789991159913790119.webp" title="/images/remote/20260405230150498_10789991159913790119.webp" data-thumbnail="/images/remote/20260405230150498_10789991159913790119.webp" data-sub-html="&lt;h2&gt;/images/remote/20260405230150498_10789991159913790119.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260405230150498_10789991159913790119.webp' alt="/images/remote/20260405230150498_10789991159913790119.webp" height="550" width="1337"&gt;&lt;/a&gt;&#10;因为上下文有限，又提出了 &lt;code&gt;RAG &lt;/code&gt; 、&lt;code&gt;context engineering&lt;/code&gt; 的概念，这里就不说了。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Memory：记忆。记忆不是模型脑子里突然长出了长期记忆，而是把重要信息额外保存下来，下次再塞回上下文里。比如把项目规则写进 &lt;code&gt;AGENTS.md&lt;/code&gt;，把长期偏好写进 &lt;code&gt;MEMORY.md&lt;/code&gt;，本质上都是“外部记忆”。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Tool / Skill：工具和技能。工具是一个具体能力，比如联网搜索、执行 shell、读写文件、打开浏览器、OCR 识别图片文字。技能则更像“把几个工具按固定套路打包好”的可复用流程。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Agent：智能体。这个词最容易被说玄乎，其实可以先理解成：&lt;code&gt;LLM + 工具 + 记忆 + 工作流控制&lt;/code&gt;。&#10;也就是说，Agent 不只是回答一句话，而是会围绕一个目标做多步动作，比如：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;理解你的目标是什么。&lt;/li&gt;&#10;&lt;li&gt;判断要不要调用工具。&lt;/li&gt;&#10;&lt;li&gt;执行工具。&lt;/li&gt;&#10;&lt;li&gt;读取工具结果。&lt;/li&gt;&#10;&lt;li&gt;继续判断下一步要做什么。&#10;所以严格说，最早的 GPT 只是模型，不是 Agent；OCR 只是能力，也不是 Agent。只有“能围绕目标自主调用能力并继续行动”的那一层，才更接近 Agent。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;AI CLI：可以把它理解成“运行在终端里的 agent”。它已经不是简单的网页问答，而是能直接读取当前项目、搜索文件、改代码、跑命令、看测试结果、接 git、接 MCP 的工具。&#10;比如 &lt;code&gt;Codex CLI&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Gemini CLI&lt;/code&gt; 这种东西，本质都是让 AI 真正进入你的本地工作环境里干活。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="openclaw"&gt;&lt;span&gt;OpenClaw&lt;/span&gt;&#10; &lt;a href="#openclaw" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;如果说 AI CLI 是“一个人在终端里调用 AI 干活”，那 OpenClaw 更像“把 AI 做成一个长期在线的控制平面”。&lt;/p&gt;&#10;&lt;p&gt;它不是单纯更强的模型，也不是单纯另一个聊天工具，而是一个 Gateway / Hub：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;可以接入 Telegram、Slack、Discord、WebChat 等多个消息入口。&lt;/li&gt;&#10;&lt;li&gt;可以把浏览器、节点设备、自动化任务、记忆、工作区统一挂到同一个系统里。&lt;/li&gt;&#10;&lt;li&gt;可以让 AI 不只是聊天，而是长期待命、跨设备执行、定时执行、通过 webhook 被外部系统触发。&lt;/li&gt;&#10;&lt;li&gt;还可以把 &lt;code&gt;Codex&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Gemini CLI&lt;/code&gt; 这类 AI CLI 当作自己的后端执行器。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;所以 &lt;code&gt;OpenClaw&lt;/code&gt; 和 &lt;code&gt;AI CLI&lt;/code&gt; 不是简单的替代关系，更像是两层东西：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;AI CLI&lt;/code&gt; 解决的是：“我怎么让 AI 在这台机器、这个仓库里直接干活？”&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;OpenClaw&lt;/code&gt; 解决的是：“我怎么把 AI 变成一个能从聊天、设备、定时任务、工作流里随时调用的长期系统？”&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;也可以这样粗略理解这条演进路线：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;WEB AI&lt;/code&gt;：你问一句，它答一句。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;IDE AI&lt;/code&gt;：AI 开始进入开发环境，但动作还是受限。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AI CLI&lt;/code&gt;：AI 进入终端，开始真正读文件、跑命令、改项目。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;OpenClaw&lt;/code&gt;：AI 不只存在于一个终端会话里，而是变成一个可接消息、可接设备、可跑自动化、可长期在线的网关系统。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;所以这篇文章要讲的核心，其实不是“又一个 AI 工具”，而是：&lt;strong&gt;AI 正在从一次性问答工具，变成一个能接入现实工作流的操作层。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;如果只把 OpenClaw 理解成“聊天机器人”，会低估它；如果把它理解成“一个 AI Gateway + Agent 控制平面”，就比较接近了。&#10;OpenClaw = 入口层 + Gateway 控制层 + 执行层 + 状态层&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;入口层：消息从哪里进来。&lt;/li&gt;&#10;&lt;li&gt;控制层：由 Gateway 决定谁能进、路由给谁处理。&lt;/li&gt;&#10;&lt;li&gt;执行层：真正干活的是 LLM、浏览器、节点、AI CLI、插件。&lt;/li&gt;&#10;&lt;li&gt;状态层：工作区、记忆、历史对话、任务状态会被持续保存。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;flowchart TB&#10; subgraph L1[入口层]&#10; I1[聊天渠道]&#10; I2[Web UI / API]&#10; I3[Webhook / Cron]&#10; end&#10;&#10; subgraph L2[控制层]&#10; G1[Gateway]&#10; G2[Session / Agent 路由]&#10; end&#10;&#10; subgraph L3[执行层]&#10; E1[LLM]&#10; E2[Browser]&#10; E3[Node / system.run]&#10; E4[ACP -&amp;gt; AI CLI]&#10; E5[插件 / MCP]&#10; end&#10;&#10; subgraph L4[记忆层]&#10; S1[Workspace]&#10; S2[Memory]&#10; S3[历史对话]&#10; S4[日志 / Task]&#10; end&#10;&#10; L1 --&amp;gt; L2&#10; L2 --&amp;gt; L3&#10; L2 --&amp;gt; L4&#10; L4 --&amp;gt; L2&#10; L3 --&amp;gt; L2&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="一次请求的运行时序"&gt;&lt;span&gt;一次请求的运行时序&lt;/span&gt;&#10; &lt;a href="#%e4%b8%80%e6%ac%a1%e8%af%b7%e6%b1%82%e7%9a%84%e8%bf%90%e8%a1%8c%e6%97%b6%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sequenceDiagram&#10; actor U as 用户/外部系统&#10; participant G as Gateway&#10; participant W as Workspace/Memory&#10; participant L as LLM/Agent&#10; participant T as Tools&#10;&#10; U-&amp;gt;&amp;gt;G: 发消息 / Webhook / Cron 触发&#10; G-&amp;gt;&amp;gt;G: 身份校验 &amp;#43; 路由到 Session&#10; G-&amp;gt;&amp;gt;W: 读取规则、记忆、历史&#10; G-&amp;gt;&amp;gt;L: 发送上下文 &amp;#43; 当前任务&#10; L--&amp;gt;&amp;gt;G: 判断是否需要工具&#10; alt 需要工具&#10; G-&amp;gt;&amp;gt;T: 调用 Browser / Node / AI CLI / 插件&#10; T--&amp;gt;&amp;gt;G: 返回结果&#10; G-&amp;gt;&amp;gt;L: 把工具结果补进上下文&#10; L--&amp;gt;&amp;gt;G: 继续判断 / 生成最终结果&#10; else 不需要工具&#10; L--&amp;gt;&amp;gt;G: 直接生成结果&#10; end&#10; G-&amp;gt;&amp;gt;W: 写入记忆 / 日志 / 任务状态&#10; G--&amp;gt;&amp;gt;U: 返回回复或触发后续任务&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="具体描述"&gt;&lt;span&gt;具体描述&lt;/span&gt;&#10; &lt;a href="#%e5%85%b7%e4%bd%93%e6%8f%8f%e8%bf%b0" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;用户或者外部系统先把事件送进来，入口可以是聊天消息、Web 界面、API、Webhook，也可以是定时任务自己触发。&lt;/li&gt;&#10;&lt;li&gt;OpenClaw 的 Gateway 先做入口控制，比如身份校验、白名单、pairing，然后决定把这条请求路由到哪个 agent、哪个 session。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;路由完成后，系统会装载对应工作区，把 &lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;TOOLS.md&lt;/code&gt;、&lt;code&gt;MEMORY.md&lt;/code&gt;、历史对话、任务状态这些东西一起组装成上下文。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;LLM 看到这些上下文之后，先理解目标，再判断这次是“直接回答”还是“必须调用工具”。&lt;/li&gt;&#10;&lt;li&gt;如果需要工具，OpenClaw 就去调用浏览器、节点、shell、文件系统、ACP 后端，甚至把任务继续转给 &lt;code&gt;Codex&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Gemini CLI&lt;/code&gt; 这类 AI CLI。&lt;/li&gt;&#10;&lt;li&gt;工具返回结果后，LLM 再读一轮结果，决定是继续执行下一步，还是收尾回复，并把结果写回记忆、日志、任务系统。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;所以 OpenClaw 的运行本质不是“一次问答”，而是一个循环：&#10;&lt;code&gt;输入事件 -&amp;gt; Gateway 路由 -&amp;gt; 组装上下文 -&amp;gt; LLM 判断 -&amp;gt; 调用工具 -&amp;gt; 回看结果 -&amp;gt; 输出 / 记忆 / 继续任务&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;这也是它和普通 AI CLI 最大的不同：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;AI CLI&lt;/code&gt; 更像“当前终端里的执行器”。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;OpenClaw&lt;/code&gt; 更像“长期在线的 AI 中控系统”。&lt;/li&gt;&#10;&lt;li&gt;在 OpenClaw 里，AI CLI 往往只是工具层里的一个后端执行器，而不是整个系统本身。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 class="heading-element" id="应用场景"&gt;&lt;span&gt;应用场景&lt;/span&gt;&#10; &lt;a href="#%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="开发"&gt;&lt;span&gt;开发&lt;/span&gt;&#10; &lt;a href="#%e5%bc%80%e5%8f%91" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;如果只是单纯改代码，&lt;code&gt;Codex CLI&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt; 这种 AI CLI 已经很好用了；但 &lt;code&gt;OpenClaw&lt;/code&gt; 的优势在于，它可以把“聊天入口、任务拆解、多 agent、代码执行、长期上下文”串成一个持续运行的开发系统。&lt;/p&gt;&#10;&lt;p&gt;一个比较典型的用法是：上层先放一个“秘书型 agent”，负责接受人的需求，理解问题，拆分任务，然后把任务继续分给下面更具体的 agent。&#10;比如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一个 agent 只负责代码搜索和上下文整理。&lt;/li&gt;&#10;&lt;li&gt;一个 agent 只负责真正改代码。&lt;/li&gt;&#10;&lt;li&gt;一个 agent 只负责跑测试、读日志、总结结果。&lt;/li&gt;&#10;&lt;li&gt;还有一种做法是先把任务拆成 GitHub issue，再让不同 agent 只围绕 issue 工作。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这样做的好处是让不同职责的 agent 有不同上下文和权限，避免一个 agent 什么都做，最后上下文过大、幻觉变多、边界也更乱。&#10;&lt;del&gt;提示词工程也有类似的思想，解耦&lt;/del&gt;&#10;对于我来说就是处理日志交给 gemini flash ，然后将处理结果交给 gemini pro。&lt;/p&gt;&#10;&lt;p&gt;另外，OpenClaw 还能把 &lt;code&gt;Codex&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Gemini CLI&lt;/code&gt; 这类 AI CLI 当成后端执行器。也就是说，OpenClaw 不一定自己直接改代码，它也可以充当上层调度系统：用户在 Telegram、Slack、Web UI 里下达任务，OpenClaw 再去拉起更擅长 coding 的 agent。&lt;/p&gt;&#10;&lt;p&gt;这种工作流有点像下面这个项目：&#10;&lt;a href="https://github.com/cft0808/edict" target="_blank" rel="external nofollow noopener noreferrer"&gt;GitHub - cft0808/edict: 🏛️ 三省六部制 · OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, and full audit trails · GitHub&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260405230150500_2857423071747266396.webp" title="/images/remote/20260405230150500_2857423071747266396.webp" data-thumbnail="/images/remote/20260405230150500_2857423071747266396.webp" data-sub-html="&lt;h2&gt;/images/remote/20260405230150500_2857423071747266396.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260405230150500_2857423071747266396.webp' alt="/images/remote/20260405230150500_2857423071747266396.webp" height="449" width="905"&gt;&lt;/a&gt;&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260405230150501_15300321987364233531.webp" title="/images/remote/20260405230150501_15300321987364233531.webp" data-thumbnail="/images/remote/20260405230150501_15300321987364233531.webp" data-sub-html="&lt;h2&gt;/images/remote/20260405230150501_15300321987364233531.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260405230150501_15300321987364233531.webp' alt="/images/remote/20260405230150501_15300321987364233531.webp" height="490" width="639"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;所以在开发场景里，OpenClaw 更适合做这些事情：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;接收需求，整理成可执行任务。&lt;/li&gt;&#10;&lt;li&gt;让多个 agent 分工合作，而不是所有事都塞给一个会话。&lt;/li&gt;&#10;&lt;li&gt;挂接 AI CLI、浏览器、shell、文件系统，形成一条完整开发链路。&lt;/li&gt;&#10;&lt;li&gt;把项目规则、历史决策、工作区记忆保留下来，减少每次重新解释背景的成本。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;不过这种自动模式不一定需要贯彻到底，我在 V2EX 上面也看到有人只是用来做一些简单的、表层的任务，真正复杂的任务还是自己的看。“往事开头难”，openclaw 已经把开头的事情给完成了。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="运维"&gt;&lt;span&gt;运维&lt;/span&gt;&#10; &lt;a href="#%e8%bf%90%e7%bb%b4" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;运维其实和 LLM 很搭。因为运维大量面对的就是文本：日志、命令、配置、告警、状态信息、工单。&#10;而 OpenClaw 又天然支持消息入口、Webhook、定时任务、节点设备和 shell 执行，所以它非常适合做轻量级 ChatOps。&lt;/p&gt;&#10;&lt;p&gt;比如可以这样用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;监控系统通过 webhook 把告警推给 OpenClaw。&lt;/li&gt;&#10;&lt;li&gt;OpenClaw 先读告警内容，判断严重程度，做第一轮摘要。&lt;/li&gt;&#10;&lt;li&gt;如果需要，它再调用节点或者 shell 去执行只读检查命令，比如 &lt;code&gt;journalctl&lt;/code&gt;、&lt;code&gt;docker ps&lt;/code&gt;、磁盘检查、日志搜索。&lt;/li&gt;&#10;&lt;li&gt;如果问题和后台页面有关，还可以调用浏览器去看 Grafana、Kibana、云控制台。&lt;/li&gt;&#10;&lt;li&gt;最后把结论回发到 Telegram、Slack、Discord，或者继续创建后续任务。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这和传统 bot 最大的区别是：它不是“收到消息后回一句话”，而是“收到消息后先帮你做一轮排查”。&lt;/p&gt;&#10;&lt;p&gt;除此之外，OpenClaw 还很适合做巡检型运维：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;定时检查服务是否在线。&lt;/li&gt;&#10;&lt;li&gt;检查证书是否快过期。&lt;/li&gt;&#10;&lt;li&gt;检查备份任务有没有成功。&lt;/li&gt;&#10;&lt;li&gt;把每天的系统摘要自动发到固定渠道。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;在 openclaw 还叫 clawcode 的时候，就在 NS 论坛上面看到有人说要取代运维了。但是从安全角度来说不太可能。&#10;运维是 OpenClaw 风险最高的场景之一。因为一旦 agent 同时拥有外部消息入口、shell、浏览器和高权限配置修改能力，风险会非常大。&#10;所以实际使用时更合理的方式往往是：前台 agent 负责分诊，真正高权限的命令只交给受限节点或者经过审批的 agent 去执行。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="个人工作流"&gt;&lt;span&gt;个人工作流&lt;/span&gt;&#10; &lt;a href="#%e4%b8%aa%e4%ba%ba%e5%b7%a5%e4%bd%9c%e6%b5%81" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;个人工作流其实是 OpenClaw 最有想象力的地方。因为它不是一个只会在网页里回答问题的 AI，而是一个可以长期待命、能接消息、能开浏览器、能记事、能定时跑任务的“个人中控”。&lt;/p&gt;&#10;&lt;p&gt;OpenClaw 可以开一个独立的、权限受限的&lt;a href="https://docs.openclaw.ai/tools/browser" target="_blank" rel="external nofollow noopener noreferrer"&gt;浏览器&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;，用来访问 web 页面获取信息。&#10;这意味着它不只是“搜索一下”，而是可以做更完整的工作流：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;定时打开几个固定网站，帮你抓取更新信息。&lt;/li&gt;&#10;&lt;li&gt;看网页、截图、导出 PDF、再做总结。&lt;/li&gt;&#10;&lt;li&gt;代替你去看一些没有 API、但可以网页访问的信息源。&lt;/li&gt;&#10;&lt;li&gt;把网页信息和聊天记录、已有记忆结合起来，整理成日报或摘要。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因此它可以充当一种比较智能的 RSS，也可以进一步变成个人秘书：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;每天早上整理消息、邮件、待办和日程。&lt;/li&gt;&#10;&lt;li&gt;收到外部通知后先做摘要，再决定要不要提醒你。&lt;/li&gt;&#10;&lt;li&gt;把聊天里提到的重要事情写入记忆，形成长期上下文。&lt;/li&gt;&#10;&lt;li&gt;定时做周报、月度复盘、信息归档。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果再配合节点和移动端，OpenClaw 甚至不只处理文字信息，还能连接手机、通知、设备能力。&#10;从这个角度看，它更像一个“个人 AI 工作流中枢”，而不是一个单纯的聊天机器人。&lt;/p&gt;&#10;&lt;p&gt;和 &lt;code&gt;N8N&lt;/code&gt; 的区别是:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;N8N：事件驱动 / 流程驱动&lt;/li&gt;&#10;&lt;li&gt;OpenClaw：人驱动 / 对话驱动 / 助手驱动&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="安全"&gt;&lt;span&gt;安全&lt;/span&gt;&#10; &lt;a href="#%e5%ae%89%e5%85%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;OpenClaw 的安全问题，本质上不是普通 Web 服务那种“接口有没有鉴权”，而是：你在运行一个拥有真实权限、能持续行动、还能调用工具的 agent。&#10;OpenClaw Agent 继承运行用户的系统权限，它能读写文件、执行 Shell、调用 API、打开浏览器、连接节点设备。这意味着：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Agent 可能访问服务器上的敏感文件，例如 SSH 密钥、环境变量、配置文件、浏览器会话。&lt;/li&gt;&#10;&lt;li&gt;Agent 可能执行命令、修改配置、创建 cron、保留长期任务。&lt;/li&gt;&#10;&lt;li&gt;一旦 Agent 被恶意输入带偏，攻击者获得的就不只是一次回答，而是接近宿主机用户权限的行动能力。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因此 OpenClaw 的安全重点是先缩小权限、缩小入口、缩小爆炸半径。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="公网暴露与部署方式"&gt;&lt;span&gt;公网暴露与部署方式&lt;/span&gt;&#10; &lt;a href="#%e5%85%ac%e7%bd%91%e6%9a%b4%e9%9c%b2%e4%b8%8e%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;OpenClaw 官方的安全模型更偏向“可信单操作者”，也就是一个人给自己用的个人助手，而不是面向互不信任用户的公网共享平台。&#10;所以最重要的原则其实很朴素：&lt;strong&gt;不要默认把它当成公网服务去裸奔。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;更稳妥的做法通常是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;默认只绑定本地回环地址，本机使用。&lt;/li&gt;&#10;&lt;li&gt;如果要远程访问，优先走 VPN、Tailscale、内网穿透后的受控访问。&lt;/li&gt;&#10;&lt;li&gt;对外部消息渠道启用 pairing、allowlist、mention gating，不要让陌生人直接给高权限 agent 发指令。&lt;/li&gt;&#10;&lt;li&gt;把不同用途的 agent 拆开，不要让同一个 agent 同时拥有聊天入口、浏览器、shell、cron、配置修改能力。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果一个 OpenClaw 实例直接暴露在公网，而且还带有高权限工具，它就很容易变成潜在的攻击入口。&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260405230150502_3656930984136763622.webp" title="/images/remote/20260405230150502_3656930984136763622.webp" data-thumbnail="/images/remote/20260405230150502_3656930984136763622.webp" data-sub-html="&lt;h2&gt;/images/remote/20260405230150502_3656930984136763622.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260405230150502_3656930984136763622.webp' alt="/images/remote/20260405230150502_3656930984136763622.webp" height="800" width="1212"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="容器使用"&gt;&lt;span&gt;容器使用&lt;/span&gt;&#10; &lt;a href="#%e5%ae%b9%e5%99%a8%e4%bd%bf%e7%94%a8" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;见过不少人使用 CLI 结果把整个 D 盘文件删除，对于这种可能获取高权限的服务最好是运行在沙箱。&lt;/p&gt;&#10;&lt;p&gt;容器能解决的是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;把 agent 的文件访问范围限制在一部分目录里。&lt;/li&gt;&#10;&lt;li&gt;限制部分系统调用和宿主机访问。只挂载代理绝对需要的目录，并尽可能使它们只读。&lt;/li&gt;&#10;&lt;li&gt;在发生错误或被带偏时，缩小破坏范围。&lt;/li&gt;&#10;&lt;li&gt;关闭任何出站互联网访问，除了明确允许的 API 端点（OpenRouter 等）。这样即使一个 SKILLS 试图窃取数据，它也不能联系外部。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;但容器解决不了这些问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;如果敏感文件本来就挂载进容器里，agent 依然能读到。&lt;/li&gt;&#10;&lt;li&gt;如果浏览器 profile、API token、会话文件放在可访问路径里，容器并不会自动帮你保密。&lt;/li&gt;&#10;&lt;li&gt;如果把高权限节点、浏览器、shell 全部开放给 agent，沙箱也只能部分缓解风险。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="提示词注入"&gt;&lt;span&gt;提示词注入&lt;/span&gt;&#10; &lt;a href="#%e6%8f%90%e7%a4%ba%e8%af%8d%e6%b3%a8%e5%85%a5" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;提示词注入是 OpenClaw 这类 agent 系统里最核心的风险之一。&#10;因为 OpenClaw 接收的“不可信输入”远不止用户发来的一句话，还包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Telegram、Slack、Discord、邮件、Webhook 发来的内容。&lt;/li&gt;&#10;&lt;li&gt;浏览器访问到的网页内容。&lt;/li&gt;&#10;&lt;li&gt;文档、截图、OCR 结果、日志、工单、第三方 API 返回值。&lt;/li&gt;&#10;&lt;li&gt;skills、插件、工具返回的文本结果。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些内容都可能夹带“让你忽略前面的规则”“执行某条命令”“读取某个文件”之类的恶意指令。&#10;而 LLM 并不能稳定地区分“这是要处理的数据”还是“这是要服从的指令”。&lt;/p&gt;&#10;&lt;p&gt;所以对抗提示词注入，核心不是指望模型永远识别出来，而是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;把外部消息都视为不可信输入。&lt;/li&gt;&#10;&lt;li&gt;对处理不可信内容的 agent 默认关闭高风险工具。&lt;/li&gt;&#10;&lt;li&gt;必要时启用审批、沙箱和只读模式。&lt;/li&gt;&#10;&lt;li&gt;不让浏览器、shell、配置修改、cron 持久化能力集中到同一个面向外部输入的 agent 上。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最近官方连续修复过多类安全问题，覆盖本地文件读取、远程路径删除、审批绑定绕过、OAuth 边界和插件信任边界。这也说明 OpenClaw 的安全难点，恰恰就在“模型决策 + 工具执行 + 外部输入”交叉的地方。&#10;&lt;a href="https://zhuanlan.zhihu.com/p/2017642973840564269" target="_blank" rel="external nofollow noopener noreferrer"&gt;# CVE-2026-30741&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="不安全的-skills"&gt;&lt;span&gt;不安全的 skills&lt;/span&gt;&#10; &lt;a href="#%e4%b8%8d%e5%ae%89%e5%85%a8%e7%9a%84-skills" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;很多人会把 skill 理解成“提示词模板”，但在 OpenClaw 里，skill 往往不只是文本，它还可能绑定脚本、命令、工具调用逻辑，甚至引导 agent 拉起外部执行器。&lt;/p&gt;&#10;&lt;p&gt;风险主要在几个地方：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;skill 可能诱导 agent 调用本来不该开放的工具。&lt;/li&gt;&#10;&lt;li&gt;skill 可能间接扩大权限边界，比如让 agent 更频繁地接触 shell、浏览器、文件系统。&lt;/li&gt;&#10;&lt;li&gt;skill 自身如果来自不可信来源，里面的脚本和流程也可能有问题。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;所以更安全的做法是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不要看见 skill 就直接装。&lt;/li&gt;&#10;&lt;li&gt;先看它会调用哪些工具、读写哪些路径、依赖哪些脚本。&lt;/li&gt;&#10;&lt;li&gt;对互联网入口 agent，默认不要给 &lt;code&gt;exec&lt;/code&gt;、&lt;code&gt;gateway&lt;/code&gt;、&lt;code&gt;cron&lt;/code&gt;、&lt;code&gt;sessions&lt;/code&gt; 这类高风险能力。&lt;/li&gt;&#10;&lt;li&gt;技能最好分层：公开入口用低权限 skill，真正执行操作的部分交给受限 agent 或经审批流程。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a href="https://www.reddit.com/r/cybersecurity/comments/1rskb80/820_malicious_skills_found_in_openclaws_clawhub/?tl=zh-hans" target="_blank" rel="external nofollow noopener noreferrer"&gt;Reddit - # 在 OpenClaw 的 ClawHub 市场中发现了 820 个恶意技能。安全研究人员表示担忧&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="供应链攻击"&gt;&lt;span&gt;供应链攻击&lt;/span&gt;&#10; &lt;a href="#%e4%be%9b%e5%ba%94%e9%93%be%e6%94%bb%e5%87%bb" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;OpenClaw 的扩展能力很强，但这也意味着它天然带有供应链风险。&#10;插件、skills、npm 包、外部脚本、浏览器扩展、第三方集成，只要有一层被污染，最终都可能进入 agent 的执行链。&lt;/p&gt;&#10;&lt;p&gt;这一类风险常见的表现是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;安装了来路不明的 plugin / skill。&lt;/li&gt;&#10;&lt;li&gt;直接信任第三方脚本或 &lt;code&gt;curl | bash&lt;/code&gt; 安装方式。&lt;/li&gt;&#10;&lt;li&gt;给插件过大的文件系统、网络、会话访问权限。&lt;/li&gt;&#10;&lt;li&gt;升级依赖后把恶意变更带进来，自己却没有察觉。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因此供应链防护的重点是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;只安装可信来源的 plugin 和 skill。&lt;/li&gt;&#10;&lt;li&gt;尽量固定版本，避免无感漂移。&lt;/li&gt;&#10;&lt;li&gt;安装前先读 manifest、脚本、依赖。&lt;/li&gt;&#10;&lt;li&gt;把插件和工作区看成高敏感资产，不要随便混用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;比如说前几天的 axios 的供应链攻击: &lt;a href="https://www.binance.com/fr/square/post/307404730097442" target="_blank" rel="external nofollow noopener noreferrer"&gt;binance.com/fr/square/post/307404730097442&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&#10;这种主要是要看开发者的安全意识，使用者应尽可能关注相关安全信息 &lt;a href="https://github.com/openclaw/openclaw/security" target="_blank" rel="external nofollow noopener noreferrer"&gt;Overview · openclaw/openclaw · GitHub&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="小结"&gt;&lt;span&gt;小结&lt;/span&gt;&#10; &lt;a href="#%e5%b0%8f%e7%bb%93" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;少暴露：不要默认上公网。&lt;/li&gt;&#10;&lt;li&gt;少权限：高风险工具默认关闭。&lt;/li&gt;&#10;&lt;li&gt;少信任：外部消息、网页、文档都按不可信输入处理。&lt;/li&gt;&#10;&lt;li&gt;少耦合：把聊天入口、浏览器、shell、cron、配置修改拆给不同 agent。&lt;/li&gt;&#10;&lt;li&gt;多审计：定期检查配置、依赖、日志和长期任务。记忆层必须可控、可审计、可回滚长期记忆不能向模型开放任意写权限。任何新增、覆盖或删除记忆的动作都应当留痕，并允许人工审查。&lt;/li&gt;&#10;&lt;li&gt;加固: &lt;a href="https://github.com/slowmist/openclaw-security-practice-guide" target="_blank" rel="external nofollow noopener noreferrer"&gt;GitHub - slowmist/openclaw-security-practice-guide: This guide is designed for OpenClaw itself (Agent-facing), not as a traditional human-only hardening checklist. · GitHub&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;&#10; &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://www.youtube.com/@HungyiLeeNTU" target="_blank" rel="external nofollow noopener noreferrer"&gt;Hung-yi Lee - YouTube&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.openclaw.ai/" target="_blank" rel="external nofollow noopener noreferrer"&gt;OpenClaw官方文档&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.youtube.com/@%E9%A9%AC%E5%85%8B%E7%9A%84%E6%8A%80%E6%9C%AF%E5%B7%A5%E4%BD%9C%E5%9D%8A" target="_blank" rel="external nofollow noopener noreferrer"&gt;马克的技术工作坊 - YouTube&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://aws.amazon.com/cn/blogs/china/openclaw-security-and-feature-enhancement-practices/" target="_blank" rel="external nofollow noopener noreferrer"&gt;OpenClaw 安全和功能增强实践 | 亚马逊AWS官方博客&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.bilibili.com/video/BV1ojfDBSEPv/?spm_id_from=333.1387.favlist.content.click&amp;vd_source=75ba9ed7e36ca38708e502a1d1eac076" target="_blank" rel="external nofollow noopener noreferrer"&gt;【闪客】一口气拆穿Skill/MCP/RAG/Agent/OpenClaw底层逻辑_哔哩哔哩_bilibili&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.reddit.com/r/AI_Agents/comments/1r3u98p/openclaw_security_is_worse_than_i_expected_and_im/?tl=zh-hans" target="_blank" rel="external nofollow noopener noreferrer"&gt;Reddit - # OpenClaw的安全性比我预想的要糟糕，我不知道该怎么处理&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Derper 搭建</title><link>https://eo.chifan.de/posts/derper/</link><pubDate>Sat, 04 Apr 2026 19:17:58 +0800</pubDate><guid>https://eo.chifan.de/posts/derper/</guid><category domain="https://eo.chifan.de/categories/%E6%8A%98%E8%85%BE/">折腾</category><description>&lt;p&gt;derper 是Tailscale/headscale 自建的中转节点，用来组网解决公共节点打洞成功率太低和延迟问题。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="自建-derp-节点" data-decreased&gt;&lt;span&gt;自建 DERP 节点&lt;/span&gt;&#10; &lt;a href="#%e8%87%aa%e5%bb%ba-derp-%e8%8a%82%e7%82%b9" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h2 class="heading-element" id="序"&gt;&lt;span&gt;序&lt;/span&gt;&#10; &lt;a href="#%e5%ba%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;之前用一台国外 VPS 配合 sing-box 开过 DERP。和公共 DERP 相比，带宽能跑满，但因为线路和 NAT 环境问题，UDP 打洞一直没成功。&lt;/p&gt;&#10;&lt;p&gt;后来换成国内云主机，改用官方 &lt;code&gt;derper&lt;/code&gt; 二进制重新部署。&lt;/p&gt;&#10;&lt;p&gt;如果机器上没有现成的 Nginx 和证书体系，优先用更简单的官方直跑方案：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-a :443&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-http-port 80&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-certmode letsencrypt&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;我最终采用的方案：&lt;code&gt;Nginx 监听 443&lt;/code&gt;，后端 &lt;code&gt;derper&lt;/code&gt; 监听 &lt;code&gt;12443&lt;/code&gt;，证书由 Nginx 管理，&lt;code&gt;derper&lt;/code&gt; 用 &lt;code&gt;manual&lt;/code&gt; 模式读取证书。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="最终架构"&gt;&lt;span&gt;最终架构&lt;/span&gt;&#10; &lt;a href="#%e6%9c%80%e7%bb%88%e6%9e%b6%e6%9e%84" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;流量路径如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;客户端 -&amp;gt; TCP 443 -&amp;gt; Nginx -&amp;gt; https://127.0.0.1:12443 -&amp;gt; derper&#10;客户端 -&amp;gt; UDP 3478 ---------------------------------------&amp;gt; derper(STUN)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对应关系：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;443/tcp&lt;/code&gt;：DERP 客户端入口，走 Nginx&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;3478/udp&lt;/code&gt;：STUN 打洞，直达 &lt;code&gt;derper&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;12443/tcp&lt;/code&gt;：后端 &lt;code&gt;derper&lt;/code&gt; 监听端口，只给本机 Nginx 用，阿里云防火墙策略里面不对公网放行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;--verify-clients&lt;/code&gt; 用来防止其他人白嫖&#10;如果开启 &lt;code&gt;--verify-clients&lt;/code&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;DERP 机必须安装并接入 &lt;code&gt;tailscaled&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;derper&lt;/code&gt; 会通过本机 &lt;code&gt;tailscaled&lt;/code&gt; 判断客户端是不是自己 tailnet 的成员&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="端口规划"&gt;&lt;span&gt;端口规划&lt;/span&gt;&#10; &lt;a href="#%e7%ab%af%e5%8f%a3%e8%a7%84%e5%88%92" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;至少要确认这些端口：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;443/tcp&lt;/code&gt;：放行&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;3478/udp&lt;/code&gt;：放行&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;80/tcp&lt;/code&gt;：只在你需要 Nginx 做 ACME 或 HTTP 跳转时放行&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;12443/tcp&lt;/code&gt;：不要在云安全组里放行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这样外部只能通过 Nginx 进来，但 STUN 还能正常工作。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="前提条件"&gt;&lt;span&gt;前提条件&lt;/span&gt;&#10; &lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;假设：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;系统是 &lt;code&gt;Debian 12&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;域名是 &lt;code&gt;derp.example.com&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;域名已经解析到 VPS 公网 IP&lt;/li&gt;&#10;&lt;li&gt;证书由 Nginx 或其他现有流程维护&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果准备开启 &lt;code&gt;--verify-clients&lt;/code&gt;，还需要：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;安装 &lt;code&gt;tailscaled&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;让这台 DERP 机加入正确的 tailnet&lt;/li&gt;&#10;&lt;li&gt;最好给它打上 &lt;code&gt;tag:derp&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果机器上启用了 Tailscale，且 &lt;code&gt;apt update&lt;/code&gt; 超时，优先确认不是 DNS 或私网镜像源问题。长期建议：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo tailscale set --accept-dns=false --netfilter-mode=off&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="安装-go-和-derper"&gt;&lt;span&gt;安装 Go 和 &lt;code&gt;derper&lt;/code&gt;&lt;/span&gt;&#10; &lt;a href="#%e5%ae%89%e8%a3%85-go-%e5%92%8c-derper" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;验证 Go：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;go version&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果没装 Go，自行安装到 &lt;code&gt;/usr/local/go&lt;/code&gt; 后，补 PATH：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;echo &amp;#39;export PATH=$PATH:/usr/local/go/bin&amp;#39; | sudo tee /etc/profile.d/go.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建运行目录：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo useradd --system --home /var/lib/derper --create-home --shell /usr/sbin/nologin derp&#10;sudo install -d -o derp -g derp -m 0750 /var/lib/derper /var/lib/derper/certs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装 &lt;code&gt;derper&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo env PATH=$PATH GOBIN=/usr/local/bin /usr/local/go/bin/go install tailscale.com/cmd/derper@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果国内网络太慢：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo env PATH=$PATH GOBIN=/usr/local/bin GOPROXY=https://goproxy.cn,direct /usr/local/go/bin/go install tailscale.com/cmd/derper@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;验证：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;/usr/local/bin/derper -version&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="安装并接入-tailscale"&gt;&lt;span&gt;安装并接入 Tailscale&lt;/span&gt;&#10; &lt;a href="#%e5%ae%89%e8%a3%85%e5%b9%b6%e6%8e%a5%e5%85%a5-tailscale" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;如果要用 &lt;code&gt;--verify-clients&lt;/code&gt;，DERP 机必须先入网：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;curl -fsSL https://tailscale.com/install.sh | sh&#10;sudo systemctl enable --now tailscaled&#10;sudo tailscale up&#10;sudo tailscale set --advertise-tags=tag:derp&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检查状态：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;tailscale version&#10;systemctl status tailscaled&#10;sudo tailscale status&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="证书准备"&gt;&lt;span&gt;证书准备&lt;/span&gt;&#10; &lt;a href="#%e8%af%81%e4%b9%a6%e5%87%86%e5%a4%87" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;如果你已经有 Nginx 管理的证书，例如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;/etc/nginx/ssl/derp/cert.pem&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;/etc/nginx/ssl/derp/key.pem&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;那么 &lt;code&gt;derper&lt;/code&gt; 使用 &lt;code&gt;-certmode manual&lt;/code&gt; 时，不会直接认 &lt;code&gt;cert.pem&lt;/code&gt; 和 &lt;code&gt;key.pem&lt;/code&gt; 这种名字。它要求证书文件名必须和主机名一致：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;derp.example.com.crt&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;derp.example.com.key&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因此可以用软链接映射：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/lib/derper/certs&#10;sudo ln -sf /etc/nginx/ssl/derp/cert.pem /var/lib/derper/certs/derp.example.com.crt&#10;sudo ln -sf /etc/nginx/ssl/derp/key.pem /var/lib/derper/certs/derp.example.com.key&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是这次排障里最关键的坑之一：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;开了 &lt;code&gt;-certmode manual&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;却没配 &lt;code&gt;-certdir&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;或者证书文件名不匹配主机名&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;结果就是 &lt;code&gt;derper&lt;/code&gt; 直接启动失败，Nginx 对后端只能拿到 &lt;code&gt;502 Bad Gateway&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="derperservice"&gt;&lt;span&gt;&lt;code&gt;derper.service&lt;/code&gt;&lt;/span&gt;&#10; &lt;a href="#derperservice" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;最终采用的 &lt;code&gt;systemd&lt;/code&gt; 配置如下：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/etc/systemd/system/derper.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[Unit]&#10;Description=Tailscale DERP Server&#10;Wants=network-online.target tailscaled.service&#10;After=network-online.target tailscaled.service&#10;Requires=tailscaled.service&#10;&#10;[Service]&#10;Type=simple&#10;User=root&#10;Group=root&#10;WorkingDirectory=/var/lib/derper&#10;NoNewPrivileges=true&#10;&#10;ExecStart=/usr/local/bin/derper \&#10; -c /var/lib/derper/derper.key \&#10; -hostname derp.example.com \&#10; -a :12443 \&#10; -http-port -1 \&#10; -stun-port 3478 \&#10; -certmode manual \&#10; -certdir /var/lib/derper/certs \&#10; -stun \&#10; -verify-clients&#10;&#10;Restart=on-failure&#10;RestartSec=3&#10;&#10;[Install]&#10;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里有几个关键点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;User=root&lt;/code&gt;：开启 &lt;code&gt;--verify-clients&lt;/code&gt; 时，这样最省事，避免本地 &lt;code&gt;tailscaled.sock&lt;/code&gt; 权限问题&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-a :12443&lt;/code&gt;：不要写成 &lt;code&gt;127.0.0.1:12443&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-http-port -1&lt;/code&gt;：关闭 &lt;code&gt;derper&lt;/code&gt; 自己的 HTTP 监听&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-stun-port 3478&lt;/code&gt;：STUN 端口是纯数字，不要写成 &lt;code&gt;:3478&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-certmode manual&lt;/code&gt; + &lt;code&gt;-certdir&lt;/code&gt;：让 &lt;code&gt;derper&lt;/code&gt; 使用你已经准备好的证书&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-verify-clients&lt;/code&gt;：限制只允许自己 tailnet 的客户端使用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;启动：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload&#10;sudo systemctl enable --now derper&#10;sudo systemctl status derper&#10;sudo journalctl -u derper -f&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="nginx-反代配置"&gt;&lt;span&gt;Nginx 反代配置&lt;/span&gt;&#10; &lt;a href="#nginx-%e5%8f%8d%e4%bb%a3%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;示例：&#10;&lt;code&gt;/etc/nginx/sites-available/derp&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;server {&#10; listen 443 ssl http2;&#10; server_name derp.example.com;&#10;&#10; ssl_certificate /etc/nginx/ssl/derp/cert.pem;&#10; ssl_certificate_key /etc/nginx/ssl/derp/key.pem;&#10;&#10; location / {&#10; proxy_pass https://127.0.0.1:12443;&#10; proxy_ssl_verify off;&#10; proxy_ssl_server_name on;&#10; proxy_ssl_name derp.example.com;&#10;&#10; proxy_buffering off;&#10; proxy_http_version 1.1;&#10;&#10; proxy_set_header Host $host;&#10; proxy_set_header X-Real-IP $remote_addr;&#10; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&#10; proxy_set_header Upgrade $http_upgrade;&#10; proxy_set_header Connection &amp;#34;upgrade&amp;#34;;&#10;&#10; proxy_connect_timeout 60s;&#10; proxy_read_timeout 300s;&#10; proxy_send_timeout 300s;&#10; }&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;启用并检查：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ln -sf /etc/nginx/sites-available/derp /etc/nginx/sites-enabled/&#10;sudo nginx -t&#10;sudo systemctl reload nginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这次排障确认了几个容易错的点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;proxy_pass&lt;/code&gt; 必须是 &lt;code&gt;https://127.0.0.1:12443&lt;/code&gt;，不能写成 &lt;code&gt;http://&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;proxy_ssl_server_name on&lt;/code&gt; 和 &lt;code&gt;proxy_ssl_name derp.example.com&lt;/code&gt; 最好一起带上&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;proxy_buffering off&lt;/code&gt; 建议开启，DERP 这种长连接/流式转发场景更稳&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="tailnet-policy-和-derpmap"&gt;&lt;span&gt;tailnet policy 和 &lt;code&gt;derpMap&lt;/code&gt;&lt;/span&gt;&#10; &lt;a href="#tailnet-policy-%e5%92%8c-derpmap" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;{&#10; &amp;#34;tagOwners&amp;#34;: {&#10; &amp;#34;tag:derp&amp;#34;: [&amp;#34;autogroup:admin&amp;#34;]&#10; },&#10; &amp;#34;derpMap&amp;#34;: {&#10; &amp;#34;omitDefaultRegions&amp;#34;: false,&#10; &amp;#34;regions&amp;#34;: {&#10; &amp;#34;901&amp;#34;: {&#10; &amp;#34;RegionID&amp;#34;: 901,&#10; &amp;#34;RegionCode&amp;#34;: &amp;#34;sz&amp;#34;,&#10; &amp;#34;RegionName&amp;#34;: &amp;#34;cn-sz DERP&amp;#34;,&#10; &amp;#34;Nodes&amp;#34;: [&#10; {&#10; &amp;#34;Name&amp;#34;: &amp;#34;901a&amp;#34;,&#10; &amp;#34;RegionID&amp;#34;: 901,&#10; &amp;#34;HostName&amp;#34;: &amp;#34;derp.example.com&amp;#34;,&#10; &amp;#34;IPv4&amp;#34;: &amp;#34;1.2.3.4&amp;#34;,&#10; &amp;#34;CanPort80&amp;#34;: true,&#10; &amp;#34;DERPPort&amp;#34;: 443,&#10; &amp;#34;STUNPort&amp;#34;: 3478&#10; }&#10; ]&#10; }&#10; }&#10; },&#10; &amp;#34;grants&amp;#34;: [&#10; {&#10; &amp;#34;src&amp;#34;: [&amp;#34;tag:derp&amp;#34;],&#10; &amp;#34;dst&amp;#34;: [&amp;#34;*&amp;#34;],&#10; &amp;#34;ip&amp;#34;: [&amp;#34;*&amp;#34;]&#10; }&#10; ]&#10;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里的重点是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;DERPPort&lt;/code&gt; 写 &lt;code&gt;443&lt;/code&gt;，因为客户端实际连的是 Nginx，不是后端 &lt;code&gt;12443&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;STUNPort&lt;/code&gt; 还是 &lt;code&gt;3478&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;开启 &lt;code&gt;--verify-clients&lt;/code&gt; 时，不要把 ACL 写得过死，至少先保证 &lt;code&gt;tag:derp&lt;/code&gt; 能“看见”允许使用它的节点&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ACL 写太严时，&lt;code&gt;tailscale ping&lt;/code&gt; 和节点探测都出现异常。先跑通，再慢慢收紧规则更稳妥。&lt;/p&gt;&#10;&lt;p&gt;如果需要 &lt;code&gt;ping&lt;/code&gt;，别忘了 ACL 里要考虑 &lt;code&gt;icmp&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="验证方法"&gt;&lt;span&gt;验证方法&lt;/span&gt;&#10; &lt;a href="#%e9%aa%8c%e8%af%81%e6%96%b9%e6%b3%95" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="服务状态"&gt;&lt;span&gt;服务状态&lt;/span&gt;&#10; &lt;a href="#%e6%9c%8d%e5%8a%a1%e7%8a%b6%e6%80%81" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo systemctl status derper&#10;sudo journalctl -u derper -n 100 --no-pager&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="端口监听"&gt;&lt;span&gt;端口监听&lt;/span&gt;&#10; &lt;a href="#%e7%ab%af%e5%8f%a3%e7%9b%91%e5%90%ac" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo ss -tlnp | grep 12443&#10;sudo ss -ulnp | grep 3478&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;期望结果：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;12443/tcp&lt;/code&gt; 在监听&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;3478/udp&lt;/code&gt; 在公网地址上监听，而不是只绑在 &lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="域名访问"&gt;&lt;span&gt;域名访问&lt;/span&gt;&#10; &lt;a href="#%e5%9f%9f%e5%90%8d%e8%ae%bf%e9%97%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;curl -I https://derp.example.com&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="tailscale-状态"&gt;&lt;span&gt;Tailscale 状态&lt;/span&gt;&#10; &lt;a href="#tailscale-%e7%8a%b6%e6%80%81" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;tailscale netcheck&#10;tailscale ping &amp;lt;peer&amp;gt;&#10;tailscale status&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如何判断：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;看到自定义 DERP 区域，说明 &lt;code&gt;derpMap&lt;/code&gt; 生效&lt;/li&gt;&#10;&lt;li&gt;看到 &lt;code&gt;relay &amp;quot;sz&amp;quot;&lt;/code&gt; 之类信息，说明 DERP 可作为中转保底&lt;/li&gt;&#10;&lt;li&gt;看到 &lt;code&gt;direct&lt;/code&gt;，说明 UDP 打洞成功，已经不是纯 DERP 中转&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="这次排障里最关键的结论"&gt;&lt;span&gt;这次排障里最关键的结论&lt;/span&gt;&#10; &lt;a href="#%e8%bf%99%e6%ac%a1%e6%8e%92%e9%9a%9c%e9%87%8c%e6%9c%80%e5%85%b3%e9%94%ae%e7%9a%84%e7%bb%93%e8%ae%ba" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;502 Bad Gateway&lt;/code&gt; 不等于真的是 443 被拦了&#10;很多时候只是 Nginx 能起来，但后端 &lt;code&gt;derper&lt;/code&gt; 没起来。&#10;先查：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo systemctl status derper&#10;sudo journalctl -u derper -n 50 --no-pager&#10;sudo ss -tlnp | grep derper&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果 &lt;code&gt;12443&lt;/code&gt; 没监听，优先看 &lt;code&gt;derper&lt;/code&gt; 启动参数和证书。&lt;/p&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;code&gt;manual&lt;/code&gt; 模式下，证书目录和文件名必须对&#10;这次最开始的 &lt;code&gt;502&lt;/code&gt;，根因之一就是：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;derper&lt;/code&gt; 开了 &lt;code&gt;-certmode manual&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;但没找到正确的证书&#10;要么缺 &lt;code&gt;-certdir&lt;/code&gt;，要么证书不是按主机名命名。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Nginx 反代 &lt;code&gt;derper&lt;/code&gt; 时，上游必须走 HTTPS&#10;&lt;code&gt;derper&lt;/code&gt; 在这套配置下是 TLS 服务。如果 Nginx 写成：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt;proxy_pass http://127.0.0.1:12443;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;那就属于协议对不上，最后可能得到 &lt;code&gt;400&lt;/code&gt; 或 &lt;code&gt;502&lt;/code&gt;。&lt;/p&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;&lt;code&gt;-a 127.0.0.1:12443&lt;/code&gt; 会把 STUN 一起绑到回环地址&#10;这是这次踩的另一个大坑。&#10;如果把 &lt;code&gt;-a&lt;/code&gt; 绑到 &lt;code&gt;127.0.0.1&lt;/code&gt;，很多版本的 &lt;code&gt;derper&lt;/code&gt; 会让 &lt;code&gt;3478/udp&lt;/code&gt; 也只监听回环地址。结果就是：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;网页可能正常&lt;/li&gt;&#10;&lt;li&gt;DERP 中转可能正常&lt;/li&gt;&#10;&lt;li&gt;但 &lt;code&gt;direct&lt;/code&gt; 很难成功，因为外部客户端根本打不到 STUN&#10;因此最终保留：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;-a :12443&#10;-stun-port 3478&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后通过云安全组不开放 &lt;code&gt;12443/tcp&lt;/code&gt; 来补安全。&lt;/p&gt;&#10;&lt;ol start="5"&gt;&#10;&lt;li&gt;&lt;code&gt;derpMap&lt;/code&gt; 要指向 443，不是 12443&#10;客户端连的是：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt;客户端 -&amp;gt; 443 -&amp;gt; Nginx -&amp;gt; 12443 -&amp;gt; derper&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所以 &lt;code&gt;DERPPort&lt;/code&gt; 必须写 &lt;code&gt;443&lt;/code&gt;。&lt;/p&gt;&#10;&lt;ol start="6"&gt;&#10;&lt;li&gt;&lt;code&gt;--verify-clients&lt;/code&gt; 依赖本机 &lt;code&gt;tailscaled&lt;/code&gt; 的可见范围&#10;如果日志里出现：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt;client nodekey:... rejected: peer nodekey:... not authorized (not found in local tailscaled)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;优先检查：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;DERP 机是否已经加入正确的 tailnet&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tag:derp&lt;/code&gt; 是否配置正确&lt;/li&gt;&#10;&lt;li&gt;ACL / grants 是否让 DERP 机能看到这些客户端&#10;如果只是临时排障，也可以先去掉 &lt;code&gt;-verify-clients&lt;/code&gt;，等网络和反代都跑通再加回来。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="7"&gt;&#10;&lt;li&gt;海外节点访问异常时，要分清是配置问题还是安全组/线路问题&#10;如果外地或海外节点完全打不到你的自建 DERP：&#10;先在远端做两类测试：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt;curl -I https://derp.example.com&#10;nc -zvu 1.2.3.4 3478&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后回头检查：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;云安全组是否放行了 &lt;code&gt;443/tcp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;云安全组是否放行了 &lt;code&gt;3478/udp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;12443/tcp&lt;/code&gt; 是否没有对公网放行&lt;/li&gt;&#10;&lt;li&gt;是否确实存在跨境线路抖动或区域性阻断&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="安全建议"&gt;&lt;span&gt;安全建议&lt;/span&gt;&#10; &lt;a href="#%e5%ae%89%e5%85%a8%e5%bb%ba%e8%ae%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;这一套最终的安全边界是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;公网开放 &lt;code&gt;443/tcp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;公网开放 &lt;code&gt;3478/udp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;公网不开放 &lt;code&gt;12443/tcp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;derper&lt;/code&gt; 开启 &lt;code&gt;--verify-clients&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这样即使 &lt;code&gt;derper&lt;/code&gt; 进程监听了 &lt;code&gt;:12443&lt;/code&gt;，外部也很难直接打到它。&lt;/p&gt;&#10;&lt;p&gt;如果你只是临时测试：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;可以先不启用 &lt;code&gt;--verify-clients&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;先把 &lt;code&gt;Nginx -&amp;gt; derper&lt;/code&gt;、&lt;code&gt;derpMap&lt;/code&gt;、&lt;code&gt;STUN&lt;/code&gt; 跑通&lt;/li&gt;&#10;&lt;li&gt;最后再加访问控制&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="最终判断标准"&gt;&lt;span&gt;最终判断标准&lt;/span&gt;&#10; &lt;a href="#%e6%9c%80%e7%bb%88%e5%88%a4%e6%96%ad%e6%a0%87%e5%87%86" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;满足以下条件就算部署完成：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;derper.service&lt;/code&gt; 是 &lt;code&gt;active (running)&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;curl -I https://derp.example.com&lt;/code&gt; 正常返回&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;3478/udp&lt;/code&gt; 对外可达&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tailscale netcheck&lt;/code&gt; 能看到自定义 DERP 区域&lt;/li&gt;&#10;&lt;li&gt;需要中转时能走到自建 DERP&lt;/li&gt;&#10;&lt;li&gt;网络允许时能出现 &lt;code&gt;direct&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;未授权客户端会被 &lt;code&gt;--verify-clients&lt;/code&gt; 拒绝&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;&#10; &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 class="heading-element" id="官方文档"&gt;&lt;span&gt;官方文档&lt;/span&gt;&#10; &lt;a href="#%e5%ae%98%e6%96%b9%e6%96%87%e6%a1%a3" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/docs/reference/derp-servers" target="_blank" rel="external nofollow noopener noreferrer"&gt;DERP servers&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/kb/1411/device-connectivity" target="_blank" rel="external nofollow noopener noreferrer"&gt;Device connectivity&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/kb/1068/tags" target="_blank" rel="external nofollow noopener noreferrer"&gt;Group devices with tags&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/docs/reference/syntax/grants" target="_blank" rel="external nofollow noopener noreferrer"&gt;Grants syntax&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://tailscale.com/docs/reference/tailscale-cli" target="_blank" rel="external nofollow noopener noreferrer"&gt;Tailscale CLI reference&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 class="heading-element" id="官方仓库"&gt;&lt;span&gt;官方仓库&lt;/span&gt;&#10; &lt;a href="#%e5%ae%98%e6%96%b9%e4%bb%93%e5%ba%93" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/tailscale/tailscale/tree/main/cmd/derper" target="_blank" rel="external nofollow noopener noreferrer"&gt;cmd/derper/README.md&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/tailscale/tailscale/blob/main/cmd/derper/derper.go" target="_blank" rel="external nofollow noopener noreferrer"&gt;cmd/derper/derper.go&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/tailscale/tailscale/blob/main/cmd/derper/cert.go" target="_blank" rel="external nofollow noopener noreferrer"&gt;cmd/derper/cert.go&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>使用Acme.sh申请配置证书</title><link>https://eo.chifan.de/posts/acme.sh/</link><pubDate>Wed, 25 Mar 2026 20:45:39 +0800</pubDate><guid>https://eo.chifan.de/posts/acme.sh/</guid><category domain="https://eo.chifan.de/categories/%E8%BF%90%E7%BB%B4/">运维</category><description>&lt;p&gt;ACME. SH 申请证书并使用 DNS-01 认证&lt;/p&gt;&#10;&lt;p&gt;默认 CA 是 ZeroSSL，如果想用 Let&amp;rsquo;s Encrypt 需要显示指定 &lt;code&gt;--server letsencrypt&lt;/code&gt; 。似乎是 letsencrypt 申请证书比 zerossl 快一些。但是 letsencrypt 多次申请失败会限制 24 小时。&#10;letsencrypt偏向开源免费，而zerossl偏商业。所以我还是选择letsencrypt。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;安装：&amp;ndash;install&lt;/li&gt;&#10;&lt;li&gt;选 CA：&amp;ndash;set-default-ca&lt;/li&gt;&#10;&lt;li&gt;签发：&amp;ndash;issue&lt;/li&gt;&#10;&lt;li&gt;部署到服务：&amp;ndash;install-cert&lt;/li&gt;&#10;&lt;li&gt;续期：&amp;ndash;renew&lt;/li&gt;&#10;&lt;li&gt;查看：&amp;ndash;list&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;官方说明不建议使用 sudo 提权，而是全程使用一个用户。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;下载 ACME. SH&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;curl https://get.acme.sh | sh -s email=you@example.com&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="申请证书"&gt;&lt;span&gt;申请证书&lt;/span&gt;&#10; &lt;a href="#%e7%94%b3%e8%af%b7%e8%af%81%e4%b9%a6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;HTTP-01 和 DNS-01 质询的区别是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;HTTP-01 需要开放 80 端口完成验证，也就是在&lt;code&gt;/. Well-known/acme-challenge/&amp;lt;token&amp;gt;&lt;/code&gt;，然后证书签发机构再去抓取完成验证。&lt;/li&gt;&#10;&lt;li&gt;DNS-01 则是在 &lt;code&gt;_acme-challenge.你的域名&lt;/code&gt; 下面添加一条 TXT 记录完成验证。适合不开放 80 端口的情况。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="heading-element" id="http-01"&gt;&lt;span&gt;HTTP-01&lt;/span&gt;&#10; &lt;a href="#http-01" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;如果已经搭建起网站：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;~/.acme.sh/acme.sh --issue -d example.com -w /var/www/html --server letsencrypt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果没有搭建起网站，就要临时启动一个 HTTP 服务占用 80 端口完成验证&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;~/.acme.sh/acme.sh --issue --standalone -d example.com --server letsencrypt --standalone&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="dns-01"&gt;&lt;span&gt;&lt;strong&gt;DNS-01：&lt;/strong&gt;&lt;/span&gt;&#10; &lt;a href="#dns-01" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;export CF_Token=&amp;#34;你的token&amp;#34;&#10;export CF_Account_ID=&amp;#34;你的account_id&amp;#34;&#10;~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d &amp;#39;*.example.com&amp;#39; --server letsencrypt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cloudflare_token 需要创建令牌拿到&#10;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260325204425725_16896800060764089224.webp" title="/images/remote/20260325204425725_16896800060764089224.webp" data-thumbnail="/images/remote/20260325204425725_16896800060764089224.webp" data-sub-html="&lt;h2&gt;/images/remote/20260325204425725_16896800060764089224.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260325204425725_16896800060764089224.webp' alt="/images/remote/20260325204425725_16896800060764089224.webp" height="804" width="1470"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Cloudflare_account_id 点进域名，右侧下滑可以看到。&lt;/p&gt;&#10;&lt;h3 class="heading-element" id="手动-dns-模式"&gt;&lt;span&gt;手动 DNS 模式&lt;/span&gt;&#10; &lt;a href="#%e6%89%8b%e5%8a%a8-dns-%e6%a8%a1%e5%bc%8f" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;如果域名托管商不提供 API，就需要手动在域名管理后台处添加 TXT 记录，完成后可以删除。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;~/.acme.sh/acme.sh --issue --dns -d example.com --server letsencrypt&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;~/.acme.sh/acme.sh --renew -d example.com&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="安装证书"&gt;&lt;span&gt;安装证书&lt;/span&gt;&#10; &lt;a href="#%e5%ae%89%e8%a3%85%e8%af%81%e4%b9%a6" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;手动 cp 到服务目录的那份不会自动同步，也不会自动 reload 服务。需要用以下命令执行安装。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;~/.acme.sh/acme.sh --install-cert -d dp.example.com --ecc \&#10;--key-file /var/lib/derper/certs/dp.example.com.key \&#10;--fullchain-file /var/lib/derper/certs/dp.example.com.crt \&#10;--reloadcmd &amp;#34;systemctl restart derper&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;&#10; &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;README: &lt;a href="https://github.com/acmesh-official/acme.sh" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/acmesh-official/acme.sh&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;安装: &lt;a href="https://github.com/acmesh-official/acme.sh/wiki/How-to-install" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/acmesh-official/acme.sh/wiki/How-to-install&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;DNS API: &lt;a href="https://github.com/acmesh-official/acme.sh/wiki/dnsapi" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;CA 选择: &lt;a href="https://github.com/acmesh-official/acme.sh/wiki/Server" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/acmesh-official/acme.sh/wiki/Server&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;sudo 说明: &lt;a href="https://github.com/acmesh-official/acme.sh/wiki/sudo" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/acmesh-official/acme.sh/wiki/sudo&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>emc-NAS 的小折腾</title><link>https://eo.chifan.de/posts/emc-nas/</link><pubDate>Sun, 22 Mar 2026 17:13:36 +0800</pubDate><guid>https://eo.chifan.de/posts/emc-nas/</guid><category domain="https://eo.chifan.de/categories/%E6%8A%98%E8%85%BE/">折腾</category><description>&lt;p&gt;捡到一台没人要的NAS，折腾一下。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="ssl-相关"&gt;&lt;span&gt;SSL 相关&lt;/span&gt;&#10; &lt;a href="#ssl-%e7%9b%b8%e5%85%b3" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260322171037846_3076169532330653970.webp" title="/images/remote/20260322171037846_3076169532330653970.webp" data-thumbnail="/images/remote/20260322171037846_3076169532330653970.webp" data-sub-html="&lt;h2&gt;/images/remote/20260322171037846_3076169532330653970.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260322171037846_3076169532330653970.webp' alt="/images/remote/20260322171037846_3076169532330653970.webp" height="678" width="878"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;如果本地网络强制 SSL 的话，下载会出现证书的报错。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="shell"&gt;&lt;span&gt;SHELL&lt;/span&gt;&#10; &lt;a href="#shell" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;这台机器还是能开 SHELL 的。&lt;/p&gt;&#10;&lt;p&gt;访问 &lt;code&gt;IP/manage/diagnostics.html &lt;/code&gt;就可以开启隐藏起来的 SHELL。&lt;/p&gt;&#10;&lt;p&gt;默认账号是 &lt;code&gt;root&lt;/code&gt; ，密码则是 &lt;code&gt;soho+密码&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260322171037847_10011537748658303528.webp" title="/images/remote/20260322171037847_10011537748658303528.webp" data-thumbnail="/images/remote/20260322171037847_10011537748658303528.webp" data-sub-html="&lt;h2&gt;/images/remote/20260322171037847_10011537748658303528.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260322171037847_10011537748658303528.webp' alt="/images/remote/20260322171037847_10011537748658303528.webp" height="954" width="1203"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="进入-shell-后的一些配置"&gt;&lt;span&gt;进入 shell 后的一些配置&lt;/span&gt;&#10; &lt;a href="#%e8%bf%9b%e5%85%a5-shell-%e5%90%8e%e7%9a%84%e4%b8%80%e4%ba%9b%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;第一步是看配置和内核还有内存。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;cat /proc/cpuinfo&#10;uname -a&#10;free -m&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;登录校园网 &lt;a href="https://blog.chifan.de/posts/route-auto-login/" target="_blank" rel="external nofollow noopener noreferrer"&gt;Drcom校园网使用路由器过验证 - Chifan&amp;rsquo;s Blog&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;安装包管理器，这里就安装了 opkg &lt;code&gt;wget -O - http://bin.entware.net/x64-k3.2/installer/generic.sh | sh&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;下载 neofetch，因为内核太老了没有需要的 libc。下载的都是二进制的 musl 版本。&#10;一些不是单纯的二进制文件比如说 openlist 可以将其放在 &lt;code&gt;/opt/apps&lt;/code&gt; 里面，然后使用软链接 &lt;code&gt;ln -s&lt;/code&gt; 将二进制放在 &lt;code&gt;/opt/bin&lt;/code&gt; 里面方便管理。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;vi /etc/profile&#10;&#10;export PATH=/opt/bin:/opt/sbin:$PATH&#10;export LANG=en_US.UTF-8&#10;neofetch&#10;&#10;alias ls=&amp;#39;ls --color=auto&amp;#39;&#10;alias grep=&amp;#39;grep --color=auto&amp;#39;&#10;alias ll=&amp;#39;ls -lah --color=auto&amp;#39;&#10;export PS1=&amp;#39;\[\e[32;1m\]\u@\h\[\e[0m\]:\[\e[34;1m\]\w\[\e[0m\]\$ &amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;换 shell&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;which shell&#10;chsh&#10;/bin/bash&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="monit"&gt;&lt;span&gt;MONIT&lt;/span&gt;&#10; &lt;a href="#monit" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;这台 NAS 的内核版本太低了，不支持 systemd 管理服务。&lt;/p&gt;&#10;&lt;p&gt;但是可以使用 init.d ，写脚本放在 &lt;code&gt;/opt/etc/init.d/&lt;/code&gt; 目录下，开机就会自动运行。但是没办法再服务死亡的死后自动拉起。&lt;/p&gt;&#10;&lt;p&gt;好在 opkg 里面有 monit 可以管理，能够管理服务。&lt;code&gt;opkg install monit&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;monit -t # 配置文件检测&#10;monit # 启动&#10;monit daemon monit -c /var/monit/monitrc # 启动monit daemon时指定配置文件&#10;monit reload # 当更新了配置文件需要重载&#10;monit status # 查看所有服务状态&#10;monit status nginx # 查看nginx服务状态&#10;monit stop all # 停止所有服务&#10;monit stop nginx # 停止nginx服务&#10;monit start all # 启动所有服务&#10;monit start nginx # 启动nginx服务&#10;monit -V # 查看版本&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vi /opt/etc/monitrc&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# 监控名为 openlist 的进程&#10;check process openlist matching &amp;#34;openlist server&amp;#34;&#10; # 启动命令&#10; start program = &amp;#34;/bin/sh -c &amp;#39;cd /opt/apps/openlist &amp;amp;&amp;amp; /opt/bin/openlist server &amp;gt;&amp;gt; /opt/var/log/openlist.log 2&amp;gt;&amp;amp;1&amp;#39;&amp;#34;&#10; # 停止命令&#10; stop program = &amp;#34;/usr/bin/pkill openlist&amp;#34;&#10; if failed port 5244 then restart&#10; if 3 restarts within 5 cycles then unmonitor&#10;&#10;# 监控 FileBrowser 进程&#10;check process filebrowser matching &amp;#34;filebrowser -d&amp;#34;&#10; # 启动命令&#10; start program = &amp;#34;/bin/sh -c &amp;#39;/opt/filebrowser/filebrowser -d /opt/filebrowser/filebrowser.db -a 0.0.0.0 -p 8080 &amp;gt;&amp;gt; /opt/var/log/filebrowser.log 2&amp;gt;&amp;amp;1&amp;#39;&amp;#34;&#10; # 停止命令&#10; stop program = &amp;#34;/usr/bin/pkill filebrowser&amp;#34;&#10; if failed port 8080 then restart&#10; if 3 restarts within 5 cycles then unmonitor&#10;&#10;# 校园网登录脚本&#10;check host campus_network with address baidu.com&#10; start program = &amp;#34;/opt/bin/route.sh&amp;#34;&#10; stop program = &amp;#34;/usr/bin/pkill -f route.sh&amp;#34;&#10; if failed ping then restart&#10; every 2 cycles&#10;&#10;# IP检测脚本&#10; check process ip_report matching &amp;#34;ip.sh&amp;#34;&#10; start program = &amp;#34;/bin/sh -c &amp;#39;/opt/bin/ip.sh &amp;amp;&amp;#39;&amp;#34;&#10; stop program = &amp;#34;/usr/bin/pkill -f ip.sh&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="持久化"&gt;&lt;span&gt;持久化&lt;/span&gt;&#10; &lt;a href="#%e6%8c%81%e4%b9%85%e5%8c%96" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;为了能让机器重启时先启动 monit ，然后再由 monit 拉起其他服务，需要持久化。&#10;&lt;code&gt;vi /etc/rc.local&lt;/code&gt; 在 exit 0 前加入 &lt;code&gt; /opt/bin/monit -c /opt/etc/monitrc&lt;/code&gt; 。&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="远程通知"&gt;&lt;span&gt;远程通知&lt;/span&gt;&#10; &lt;a href="#%e8%bf%9c%e7%a8%8b%e9%80%9a%e7%9f%a5" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;p&gt;为了避免有一天突然断电重启，重新分配 IP，又要去机房看一眼 IP 的问题，就需要一个脚本能够持续发送 IP。&lt;/p&gt;&#10;&lt;p&gt;本来是打算将通知发送到 tgbot 上面的，依旧是用自建的 Cloudflare worker 中转一下就可以了。&lt;/p&gt;&#10;&lt;p&gt;但是机房的网络比较特别，好像是对于国外的 IP 都禁止发起连接。包括 Tailscale 和 Cloudflare 的所有 IP。所以我下载 GitHub 上面的二进制文件都是用的香港的加速才能成功。&lt;/p&gt;&#10;&lt;p&gt;最后是选择用飞书的 bot。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;#!/bin/sh&#10;&#10;# === 配置区 ===&#10;WEBHOOK_URL=&amp;#34;https://www.feishu.cn/flow/api/trigger-webhook/&amp;#34;&#10;# 发送间隔（秒），例如 3600 代表 1 小时&#10;INTERVAL=10&#10;# ==============&#10;&#10;export PATH=/opt/bin:/opt/sbin:/usr/bin:/usr/sbin:/bin:/sbin&#10;&#10;while true; do&#10; # 1. 获取校园网内网 IP&#10; MY_IP=$(ip addr show | grep &amp;#39;state UP&amp;#39; -A2 | grep &amp;#39;inet &amp;#39; | grep -v &amp;#39;127.0.0.1&amp;#39; | awk &amp;#39;{print $2}&amp;#39; | cut -f1 -d&amp;#39;/&amp;#39;)&#10;&#10; # 2. 获取根目录 (/) 的占用情况&#10; ROOT_USAGE=$(df -h / | awk &amp;#39;NR==2 {print $5}&amp;#39;)&#10;&#10; # 3. 获取数据盘 (/mnt/pools/A/A0) 的剩余空间&#10; DATA_FREE=$(df -h /mnt/pools/A/A0 | awk &amp;#39;NR==2 {print $4}&amp;#39;)&#10;&#10; # 4. 获取系统当前时间&#10; NOW=$(date &amp;#34;&amp;#43;%Y-%m-%d %H:%M:%S&amp;#34;)&#10;&#10; # 5. 构造 JSON 数据包&#10; PAYLOAD=$(printf &amp;#39;{&amp;#34;nas_ip&amp;#34;:&amp;#34;%s&amp;#34;, &amp;#34;root_usage&amp;#34;:&amp;#34;%s&amp;#34;, &amp;#34;data_free&amp;#34;:&amp;#34;%s&amp;#34;, &amp;#34;update_time&amp;#34;:&amp;#34;%s&amp;#34;}&amp;#39; \&#10; &amp;#34;$MY_IP&amp;#34; &amp;#34;$ROOT_USAGE&amp;#34; &amp;#34;$DATA_FREE&amp;#34; &amp;#34;$NOW&amp;#34;)&#10;&#10; # 6. 发送请求&#10; curl -s -k -X POST &amp;#34;$WEBHOOK_URL&amp;#34; \&#10; -H &amp;#34;Content-Type: application/json&amp;#34; \&#10; -d &amp;#34;$PAYLOAD&amp;#34; &amp;gt; /dev/null&#10;&#10; sleep $INTERVAL&#10;done&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果想要 IP 发生改变再执行发送一次消息可以添加一个上一次 IP 和此刻 IP 对比的判断。&#10;因为这个不好安装探针，我看着连续的通知比较放心，可以容易判断出什么时候出现问题。掉线的情况。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260322171037848_9208039240259333113.webp" title="/images/remote/20260322171037848_9208039240259333113.webp" data-thumbnail="/images/remote/20260322171037848_9208039240259333113.webp" data-sub-html="&lt;h2&gt;/images/remote/20260322171037848_9208039240259333113.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260322171037848_9208039240259333113.webp' alt="/images/remote/20260322171037848_9208039240259333113.webp" height="636" width="1578"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="lightgallery" target="_blank" href="https://eo.chifan.de/images/remote/20260322171037849_16046350686379798824.webp" title="/images/remote/20260322171037849_16046350686379798824.webp" data-thumbnail="/images/remote/20260322171037849_16046350686379798824.webp" data-sub-html="&lt;h2&gt;/images/remote/20260322171037849_16046350686379798824.webp&lt;/h2&gt;"&gt;&lt;img loading="lazy" src='https://eo.chifan.de/images/remote/20260322171037849_16046350686379798824.webp' alt="/images/remote/20260322171037849_16046350686379798824.webp" height="1029" width="1503"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;&#10; &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;&lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://www.cnblogs.com/52fhy/p/6412547.html" target="_blank" rel="external nofollow noopener noreferrer"&gt;Monit：开源服务器监控工具 - 飞鸿影 - 博客园&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item></channel></rss>