<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Rokutosei&apos;s Blog</title><description>ReRe</description><link>https://blog.rokutosei.com/</link><language>zh_CN</language><item><title>VLESS Proxy 文章指引</title><link>https://blog.rokutosei.com/posts/proxy/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/</guid><description>快速索引博客内关于 VLESS Proxy 协议链、Xray 服务端部署、跨平台裸核运行环境及归档方案。</description><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文档指引博客内与 VLESS Proxy 及 Xray 裸核体系相关的文章：&lt;/p&gt;
&lt;h3&gt;1. 服务端部署&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/proxy/vlessxhttpxray&quot;&gt;服务端：Xray + Caddy 单端口五合一 VLESS XHTTP 部署&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 客户端配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/proxy/xray-client-config&quot;&gt;客户端：Xray-core 自用配置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Xray-core 裸核搭建&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;：&lt;a href=&quot;/posts/proxy/xray-windows-bare-core-guide&quot;&gt;Windows 上的 Xray 裸核部署指南&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;：&lt;a href=&quot;/posts/proxy/debian13-xray-tproxy&quot;&gt;Linux Desktop 上的 Xray 裸核部署指南&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Android&lt;/strong&gt;：安卓端暂时不打算深入折腾，目前魔改了支持导入 Full Config 的 SimpleXray 项目，它采用以子进程运行内核，追新非常方便。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;详情请看仓库：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;::github{repo=&quot;ReRokutosei/SimpleXray&quot;}&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;历史归档&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;以下基于 Mihomo 的方案已停止后续维护，仅保留作为架构参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/proxy/vlessxhttpproxy&quot;&gt;[弃用] 服务端：单端口五合一部署及完整安全加固&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/proxy/vlessxhttpproxysimplify&quot;&gt;[弃用] 服务端：单端口五合一节点配置速查&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>服务端：Xray + Caddy 单端口五合一 VLESS XHTTP 部署</title><link>https://blog.rokutosei.com/posts/proxy/vlessxhttpxray/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/vlessxhttpxray/</guid><description>基于 Xray-core 与 Caddy 构建复用 443 端口的五个 VLESS 节点</description><pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;观前提醒&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文仅给出重要的配置示例，&lt;strong&gt;阅读需具备相关知识&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本教程基于 &lt;code&gt;Xray 服务端 + Caddy 反代 + Xray 客户端&lt;/code&gt; 构建&lt;/p&gt;
&lt;p&gt;本教程几乎全程手敲命令，不借助 3x-ui 此类面板，需要一定耐心&lt;/p&gt;
&lt;p&gt;如果想一键部署，很遗憾，&lt;strong&gt;本文不适合你&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;XHTTP 五合一指的是在同一台 VPS 的 443 端口实现了五个出站节点：&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看 适用场景&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（此处部分引用 @Benjamin1919 大佬的&lt;a href=&quot;https://github.com/XTLS/Xray-core/discussions/4118&quot;&gt;教程原文案&lt;/a&gt;）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;出站 1：XTLS(Vision) + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端 GUI 不支持 XHTTP&lt;/li&gt;
&lt;li&gt;不想开启 TCP 多路复用&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 2：XHTTP + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都比较好&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 3：上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较差，回程（VPS → 客户端）线路较好&lt;/li&gt;
&lt;li&gt;日常使用更偏重下载，很少上传&lt;/li&gt;
&lt;li&gt;隐藏上行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 4：XHTTP + TLS(ECH) 过 CDN&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都很差&lt;/li&gt;
&lt;li&gt;不希望 VPS 的 IP 暴露在公网&lt;/li&gt;
&lt;li&gt;VPS 的 IP 已被墙&lt;/li&gt;
&lt;li&gt;隐藏 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 5：上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较好，回程（VPS → 客户端）线路较差&lt;/li&gt;
&lt;li&gt;日常使用更偏重上传，很少下载&lt;/li&gt;
&lt;li&gt;隐藏下行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C&quot;&gt;1. 准备工作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-cloudflare-%E9%85%8D%E7%BD%AE&quot;&gt;2. Cloudflare 配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E6%B7%BB%E5%8A%A0-dns-%E8%AE%B0%E5%BD%95&quot;&gt;2.1 添加 DNS 记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-ssltls-%E8%AE%BE%E7%BD%AE&quot;&gt;2.2 SSL/TLS 设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-%E7%BC%93%E5%AD%98%E8%A7%84%E5%88%99%E8%AE%BE%E7%BD%AE&quot;&gt;2.3 缓存规则设置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E5%AE%89%E8%A3%85-xray-core-%E4%B8%8E-caddy&quot;&gt;3. 安装 Xray-core 与 Caddy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-%E5%AE%89%E8%A3%85-xray-core&quot;&gt;3.1 安装 Xray-core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-%E7%94%9F%E6%88%90%E5%87%AD%E6%8D%AE&quot;&gt;3.2 生成凭据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-%E5%86%99%E5%85%A5-xray-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&quot;&gt;3.3 写入 Xray 配置文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#34-%E5%AE%89%E8%A3%85-caddy&quot;&gt;3.4 安装 Caddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#35-%E7%BC%96%E5%86%99-caddyfile&quot;&gt;3.5 编写 Caddyfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#36-%E7%94%A8%E6%88%B7%E7%BB%84%E4%B8%8E%E8%BF%90%E8%A1%8C%E7%9B%AE%E5%BD%95%E8%AE%BE%E7%BD%AE&quot;&gt;3.6 用户组与运行目录设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#37-%E7%94%B3%E8%AF%B7%E5%85%AC%E6%9C%89%E5%8F%97%E4%BF%A1%E4%BB%BB%E8%AF%81%E4%B9%A6&quot;&gt;3.7 申请公有受信任证书&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#38-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1&quot;&gt;3.8 启动服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#39-%E5%90%8E%E7%BB%AD%E6%9B%B4%E6%96%B0&quot;&gt;3.9 后续更新&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%85%8D%E7%BD%AE&quot;&gt;4. 客户端配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8F%8B%E6%83%85%E6%8E%A8%E8%8D%90&quot;&gt;友情推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%90%8E%E8%AF%9D&quot;&gt;后话&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. 准备工作&lt;/h1&gt;
&lt;p&gt;在开始之前，请准备好以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一个个人域名&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个通过支付验证的 Cloudflare 账号&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一台拥有 root 完全访问权限的 VPS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
为避免纠纷，本文&lt;strong&gt;不提供任何 VPS 商家推荐或购买指导&lt;/strong&gt;，请自行选择。&lt;/p&gt;
&lt;p&gt;本方案属于 Xray 前置、REALITY 回落到本机 Caddy，不需要配置 &lt;code&gt;limitFallbackUpload&lt;/code&gt;，&lt;/p&gt;
&lt;p&gt;本文中的 &lt;code&gt;&amp;lt;VPS_IP&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_USER&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt; 均为占位符，实际操作时请替换为你的真实 IP、用户名和域名。&lt;/p&gt;
&lt;p&gt;SSH 端口以 &lt;code&gt;&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt; 表示（示例为 &lt;code&gt;54321&lt;/code&gt;），请根据实际部署修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;2. Cloudflare 配置&lt;/h1&gt;
&lt;h2&gt;2.1 添加 DNS 记录&lt;/h2&gt;
&lt;p&gt;将域名托管到 Cloudflare，添加 DNS 解析记录：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;记录类型&lt;/th&gt;
&lt;th&gt;子域名&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;小黄云（Proxy）&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;td&gt;CDN 回源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REALITY.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;关闭&lt;/td&gt;
&lt;td&gt;REALITY 握手直连&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;如果需要双栈，可额外添加 AAAA 记录，可复用同一个子域名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2.2 SSL/TLS 设置&lt;/h2&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 概述 -&amp;gt; 配置 -&amp;gt; 加密模式和源连接设置 -&amp;gt; 加密模式设置为 &lt;code&gt;完全（严格）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 边缘证书 -&amp;gt; 开启 TLS 1.3&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; 开启 gRPC&lt;/p&gt;
&lt;h2&gt;2.3 缓存规则设置&lt;/h2&gt;
&lt;p&gt;为避免 XHTTP 请求被缓存，创建缓存规则：&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;缓存&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt; -&amp;gt; 创建缓存规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名称：随意&lt;/li&gt;
&lt;li&gt;&lt;code&gt;如果传入请求匹配…&lt;/code&gt; -&amp;gt; 选择 &lt;code&gt;自定义筛选表达式&lt;/code&gt; -&amp;gt; 点击 &lt;code&gt;编辑表达式&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入（替换为你的域名和路径）：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&quot;) or (http.request.uri.path contains &quot;/&amp;lt;YOUR_XHTTP_PATH&amp;gt;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;缓存资格&lt;/code&gt; → 设置为 &lt;code&gt;绕过缓存&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 安装 Xray-core 与 Caddy&lt;/h1&gt;
&lt;h2&gt;3.1 安装 Xray-core&lt;/h2&gt;
&lt;p&gt;通过官方脚本裸装（Bare-metal）并使用 systemd 管理：&lt;/p&gt;
&lt;p&gt;推荐安装 Pre-release 版本，目前 Stable 版本还停留在 v26.3.27，新版本包含 XHTTP 修复和功能修复等&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;发版策略说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RPRX(Owner):&lt;/p&gt;
&lt;p&gt;忘公开说明一下了，关于 Xray-core 的发版策略， pre-release 有可能是实际意义上的 stable，而 latest 也不等于“没有 bug”&lt;/p&gt;
&lt;p&gt;没标 latest 通常是因为我觉得下个 stable 该包含什么但它还没有包含，&lt;s&gt;或者单纯懒得写 release notes 那就算了下次吧，感觉比写代码都麻烦&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;via https://t.me/projectXray/5113846&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你依然偏向 &lt;code&gt;Stable&lt;/code&gt;，把命令的 &lt;code&gt;--beta&lt;/code&gt; 去掉即为下载“正式版”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装完成时会默认启动服务，需要先暂停：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop xray
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.2 生成凭据&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;生成 UUID（需要两组，分别用于 Vision 和 XHTTP）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行两次，得到两个不同的 UUID
xray uuid
xray uuid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别记为 &lt;code&gt;UUID_01&lt;/code&gt; 和 &lt;code&gt;UUID_02&lt;/code&gt;，保存待用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 REALITY 密钥对：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xray x25519
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存输出的 &lt;code&gt;Private key&lt;/code&gt; 和 &lt;code&gt;Public key&lt;/code&gt;，私钥填在服务端的 config.json，公钥填在本地客户端里。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 shortID：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl rand -hex 8
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.3 写入 Xray 配置文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
请在&lt;strong&gt;本地的文本编辑器&lt;/strong&gt;，将以下代码块中的占位符替换为你自己的真实信息。替换完成后，粘贴到 VPS 终端中并回车&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
占位符说明：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;占位符&lt;/th&gt;
&lt;th&gt;替换为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第一组 UUID（Vision 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第二组 UUID（XHTTP 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_REALITY_PRIVATE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 Private key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_SHORT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 shortID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reality.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 REALITY 子域名（小黄云关）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cdn.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 CDN 子域名（小黄云开）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/your-xhttp-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义路径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /usr/local/etc/xray/config.json &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
{
  &quot;log&quot;: {
    &quot;loglevel&quot;: &quot;info&quot; // 调试完成后可改为 &quot;warning&quot;
  },
  &quot;inbounds&quot;: [
    {
      &quot;listen&quot;: &quot;0.0.0.0&quot;, // 如果需要 IPv6，改为监听 &quot;::&quot;
      &quot;port&quot;: 443,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_01&quot;, // 对应客户端出站 1
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;vision-user&quot;,
            &quot;flow&quot;: &quot;xtls-rprx-vision&quot;
          },
          {
            &quot;id&quot;: &quot;UUID_02&quot;, // 对应客户端出站 2/3/4/5
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;,
        &quot;fallbacks&quot;: [
          {
            &quot;dest&quot;: &quot;/run/xray/xhttp_in.sock&quot;, 
            // 处理“直连”的 XHTTP 请求 (对应客户端出站 2/3/5 的直连部分)
            // 当 Reality 识别出 VLESS 协议但没有 flow 时，直接丢给内部 XHTTP Socket
            &quot;xver&quot;: 0
          }
        ]
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;raw&quot;,
        &quot;security&quot;: &quot;reality&quot;,
        &quot;realitySettings&quot;: {
          &quot;show&quot;: false,
          &quot;target&quot;: &quot;/run/caddy/tls_gate.sock&quot;,
          // 处理“CDN 转发”或“普通 HTTPS”请求 (对应客户端出站 3/4/5 的 CDN 部分)
          // 任何 Reality 不识别的流量都丢给 Caddy 处理
          &quot;xver&quot;: 0,
          &quot;serverNames&quot;: [
            &quot;reality.example.com&quot;,
            &quot;cdn.example.com&quot;
          ],
          &quot;privateKey&quot;: &quot;YOUR_REALITY_PRIVATE_KEY&quot;,
          &quot;shortIds&quot;: [&quot;YOUR_SHORT_ID&quot;]
        },
        &quot;sockopt&quot;: {
          &quot;tcpFastOpen&quot;: true,
          &quot;tcpCongestion&quot;: &quot;bbr&quot;,
          &quot;tcpMptcp&quot;: true
        }
      },
      &quot;tag&quot;: &quot;VISION+REALITY&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    },
    {
      &quot;listen&quot;: &quot;/run/xray/xhttp_in.sock&quot;,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_02&quot;,
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;xhttp&quot;,
        &quot;xhttpSettings&quot;: {
          &quot;host&quot;: &quot;&quot;,
          &quot;path&quot;: &quot;/your-xhttp-path&quot;, 
          &quot;mode&quot;: &quot;auto&quot;,
          &quot;noSSEHeader&quot;: false,
          &quot;scMaxEachPostBytes&quot;: 1000000,
          &quot;scMaxBufferedPosts&quot;: 30,
          &quot;xPaddingBytes&quot;: &quot;100-1000&quot;,
          &quot;xPaddingObfsMode&quot;: true,
          &quot;xPaddingMethod&quot;: &quot;tokenish&quot;, // 生成一个随机的 Base62 标记
          &quot;xPaddingPlacement&quot;: &quot;queryInHeader&quot;, // 填充嵌入 Referer URL query（CF 兼容）
          &quot;xPaddingKey&quot;: &quot;t&quot;, // URL query 参数名
          &quot;xPaddingHeader&quot;: &quot;Referer&quot;,
          &quot;sessionIDPlacement&quot;: &quot;path&quot;,
          &quot;sessionIDKey&quot;: &quot;SID&quot;,
          &quot;sessionIDTable&quot;: &quot;Base62&quot;,
          &quot;sessionIDLength&quot;: &quot;12-20&quot;
        }
      },
      &quot;tag&quot;: &quot;XHTTP_IN&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;protocol&quot;: &quot;freedom&quot;,
      &quot;tag&quot;: &quot;direct&quot;,
      &quot;settings&quot;: {}
    },
    {
      &quot;protocol&quot;: &quot;blackhole&quot;,
      &quot;tag&quot;: &quot;blocked&quot;,
      &quot;settings&quot;: {}
    }
  ],
  &quot;routing&quot;: {
    &quot;domainStrategy&quot;: &quot;AsIs&quot;,
    &quot;rules&quot;: [
      {
        &quot;ip&quot;: [&quot;geoip:private&quot;],
        &quot;outboundTag&quot;: &quot;blocked&quot;
      }
    ]
  }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.4 安装 Caddy&lt;/h2&gt;
&lt;p&gt;使用 Caddy 官方针对 Debian 的软件源安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 导入 GPG 密钥
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 添加官方软件源
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 更新并安装
sudo apt update
sudo apt install caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.5 编写 Caddyfile&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
同理，请在本地编辑器中替换其中的占位符，替换后粘贴整段代码块至终端回车执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/caddy/Caddyfile &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
# 1. REALITY 域名区块（专供 REALITY 握手与伪装网页）
# 记得换成你自己的 REALITY 子域名！！！
reality.example.com {
        # 监听 Xray REALITY 回落的 Unix Socket
        bind unix//run/caddy/tls_gate.sock

        # 引用 acme.sh 申请的 Let&apos;s Encrypt 证书与私钥
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/reality_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 处理所有其他访问
        # 外部扫描器或浏览器访问，直接给出伪装网页
        handle {
                # 伪装网页路径：/var/www/html/index.html
                root * /var/www/html
                file_server
        }
}

# 2. CDN 域名区块（处理从 Xray 回落的 CDN 代理流量）
# 记得换成你自己的 CDN 子域名！！！
cdn.example.com {
        bind unix//run/caddy/tls_gate.sock

        # 申请的是多域名合并证书，引用相同的证书文件即可
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/cdn_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 捕获套 CDN 的出站（出站 3/4/5）传来的合法的 XHTTP 流量
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        handle /your-xhttp-path/* {
                reverse_proxy unix//run/xray/xhttp_in.sock {
                        transport http {
                                versions 2
                        }
                        flush_interval -1
                }
        }
        
        # 可选：探针探活路径
        handle /status {
                respond &quot;ok&quot; 200
        }

        handle /ping {
                respond &quot;ok&quot; 200
        }

        # 对于扫描器，直接重定向到伪装网页防扫描
        # 记得换成你自己的 REALITY 子域名！！！
        handle {
                redir https://reality.example.com{uri}
        }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;请务必仔细检查你的 &lt;code&gt;handle&lt;/code&gt; 块配置，路径末尾的斜杠和星号 &lt;code&gt;/*&lt;/code&gt; 不能省略&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XHTTP 流量请求的 URL 是动态长随机混淆参数的&lt;/p&gt;
&lt;p&gt;如果前缀不通配，Caddy 就会将其视为未知的外部扫描探测，返回 302 伪装页&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;附：简单伪装导航页&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;如果你没有现成的网站，可以使用下面这段单文件 HTML 代码&lt;/p&gt;
&lt;p&gt;但是后期建议让 GenAI 丰富一下，换成个人博客、OpenList 什么的&lt;/p&gt;
&lt;p&gt;将以下代码块整体复制到终端回车执行，即可一键生成伪装站点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/www/html
sudo tee /var/www/html/index.html &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Tech Hub&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif;
            background: linear-gradient(-45deg, #e0e7ff, #f3e8ff, #dbeafe, #ede9fe);
            background-size: 400% 400%;
            animation: gradientBG 18s ease infinite;
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        .wrapper {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 2rem;
            padding: 2rem;
            width: 100%;
            max-width: 720px;
        }

        .title {
            font-size: clamp(2.4rem, 6vw, 3.6rem);
            font-weight: 600;
            color: #1e293b;
            letter-spacing: -0.02em;
            text-align: center;
        }

        .sub {
            font-size: clamp(0.8rem, 1.5vw, 1rem);
            color: #64748b;
            text-transform: uppercase;
            letter-spacing: 0.2em;
            border-bottom: 1px solid #cbd5e1;
            padding-bottom: 1rem;
            width: 100%;
            text-align: center;
        }

        .nav {
            display: flex;
            gap: 1.5rem;
            padding: 1.5rem 2.5rem;
            border-radius: 80px;
            background: rgba(255, 255, 255, 0.6);
            backdrop-filter: blur(12px);
            -webkit-backdrop-filter: blur(12px);
            border: 1px solid rgba(255, 255, 255, 0.8);
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.06);
            flex-wrap: wrap;
            justify-content: center;
        }

        .nav-item {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 3.4rem;
            height: 3.4rem;
            border-radius: 50%;
            background: rgba(255, 255, 255, 0.4);
            transition: all 0.25s ease;
            text-decoration: none;
            border: 1px solid rgba(255, 255, 255, 0.6);
        }

        .nav-item img {
            width: 1.6rem;
            height: 1.6rem;
            transition: transform 0.2s ease;
        }

        .nav-item:hover {
            transform: translateY(-4px);
            background: rgba(255, 255, 255, 0.9);
            border-color: #94a3b8;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
        }

        .nav-item:hover img {
            transform: scale(1.1);
        }

        @media (max-width: 600px) {
            .wrapper { gap: 1.5rem; padding: 1rem; }
            .nav { padding: 1rem 1.5rem; gap: 1rem; border-radius: 2rem; }
            .nav-item { width: 2.8rem; height: 2.8rem; }
            .nav-item img { width: 1.3rem; height: 1.3rem; }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;wrapper&quot;&amp;gt;
        &amp;lt;h1 class=&quot;title&quot;&amp;gt;Dev Center&amp;lt;/h1&amp;gt;
        &amp;lt;div class=&quot;sub&quot;&amp;gt;Let there be light&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;nav&quot;&amp;gt;
            &amp;lt;a href=&quot;https://www.google.com&quot; class=&quot;nav-item&quot; title=&quot;Google&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/google/1e293b&quot; alt=&quot;Google&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://github.com&quot; class=&quot;nav-item&quot; title=&quot;GitHub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/github/1e293b&quot; alt=&quot;GitHub&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://dash.cloudflare.com&quot; class=&quot;nav-item&quot; title=&quot;Cloudflare&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/cloudflare/1e293b&quot; alt=&quot;Cloudflare&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://hub.docker.com&quot; class=&quot;nav-item&quot; title=&quot;Docker Hub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/docker/1e293b&quot; alt=&quot;Docker&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://stackoverflow.com&quot; class=&quot;nav-item&quot; title=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/stackoverflow/1e293b&quot; alt=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://www.npmjs.com&quot; class=&quot;nav-item&quot; title=&quot;npm&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/npm/1e293b&quot; alt=&quot;npm&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://gitlab.com&quot; class=&quot;nav-item&quot; title=&quot;GitLab&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/gitlab/1e293b&quot; alt=&quot;GitLab&quot;&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;3.6 用户组与运行目录设置&lt;/h2&gt;
&lt;p&gt;启动 Xray 和 Caddy 前需统一运行用户为 &lt;code&gt;caddy&lt;/code&gt;，否则会出现 socket 权限问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Info] transport/internet/tcp: REALITY: failed to dial dest: dial unix /run/caddy/tls_gate.sock: connect: permission denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进一步，为避免两个服务重启时因 &lt;code&gt;RuntimeDirectory&lt;/code&gt; 被 systemd 清理而导致 UDS 套接字文件丢失，我们将双方的套接字放入各自所属服务的运行时目录（Xray 使用 &lt;code&gt;/run/xray/&lt;/code&gt;，Caddy 使用 &lt;code&gt;/run/caddy/&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 统一运行用户为 caddy
sudo mkdir -p /etc/systemd/system/xray.service.d
sudo tee /etc/systemd/system/xray.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
EOF

# 为 Caddy 启用独立的运行目录以放套接字
sudo mkdir -p /etc/systemd/system/caddy.service.d
sudo tee /etc/systemd/system/caddy.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
RuntimeDirectory=caddy
EOF

# 重新加载 Systemd 配置
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.7 申请公有受信任证书&lt;/h2&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看：为什么不能用 Caddy 自带的自动申请证书功能&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Caddy 默认依赖 HTTP-01 或 TLS-ALPN-01 进行 ACME 自动化证书验证，此过程的硬性前置条件是 Web 服务器必须能够直接在操作系统层面接管并监听公网的 80 或 443 端口。&lt;/p&gt;
&lt;p&gt;在当前架构中，公网 443 端口由 Xray 独占监听，Caddy 仅绑定于内网的 Unix Socket 充当回落目标。当 Let&apos;s Encrypt 验证集群发起 TLS-ALPN-01 请求时，流量首先到达 Xray 的 REALITY 服务端。由于该请求不具备有效的 XTLS 身份特征，REALITY 服务端会将其视为未知流量，执行透明的双向 TCP 转发（直接回落至 Caddy 的 Unix Socket）。&lt;/p&gt;
&lt;p&gt;尽管验证流量最终送达了 Caddy，但证书申请依然会失败。因为 Caddy 的 ACME 模块在处理 TLS-ALPN-01 挑战时，强依赖于标准 443 端口监听器来挂载专用的验证证书。面对来自 Unix Socket 的回落流量，Caddy 的验证上下文无法正确匹配并下发该证书。即便 Caddy 异常响应了临时的 ACME 验证证书，由于 REALITY 服务端需持续抓取目标后端返回的 ServerHello 以缓存真实证书，这种非标准的临时证书将引发 REALITY 内部证书缓存逻辑链异常，导致整个 TLS 握手在链路中被异常阻断。&lt;/p&gt;
&lt;p&gt;所以转而使用 acme.sh 脚本动态下发 DNS TXT 记录（即基于 API 交互的 DNS-01 验证），以实现 TLS 证书合规签发。&lt;/p&gt;
&lt;p&gt;另外，REALITY 节点需使用真实 IP 直接承载直连流量（CDN Proxy OFF），若部署未受公共根证书信任的 Cloudflare Origin CA 证书，浏览器直接访问伪装站时会触发 TLS 错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：获取 Cloudflare API Token&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 Cloudflare 网页后台；&lt;/li&gt;
&lt;li&gt;展开左边栏 -&amp;gt; 选择 &lt;strong&gt;管理账户&lt;/strong&gt; -&amp;gt; &lt;strong&gt;账户 API 令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;创建令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;令牌名称自定义；&lt;/li&gt;
&lt;li&gt;权限策略 -&amp;gt; 编辑策略：选择 &lt;code&gt;指定域名&lt;/code&gt;，然后下拉框选你的主域名；&lt;/li&gt;
&lt;li&gt;在下方的权限组列表中，点击展开 &lt;strong&gt;&lt;code&gt;DNS &amp;amp; Zones&lt;/code&gt;&lt;/strong&gt; 类别
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;区域 (Zone)&lt;/code&gt; -  勾选&lt;code&gt;读取 (Read)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;DNS&lt;/code&gt; - 勾选 &lt;code&gt;编辑 (Edit)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;令牌过期时间建议直接选择 &lt;strong&gt;“无过期时间”；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;客户端 IP 地址过滤，可以什么都不填，只要你不把 Token 泄露给别人，就是安全的；或者填上运行 &lt;code&gt;acme.sh&lt;/code&gt; 脚本的服务器的公网 IP 地址；&lt;/li&gt;
&lt;li&gt;审核令牌 -&amp;gt; 创建令牌；&lt;/li&gt;
&lt;li&gt;接着会给出 &lt;code&gt;账户ID&lt;/code&gt; 和 &lt;code&gt;CF_Token&lt;/code&gt;，复制并保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;第二步：在 VPS 切换至 root 并安装 acme.sh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了后续能够全自动在后台无感续签，这一步全程在 &lt;code&gt;root&lt;/code&gt; 用户下执行，以免权限不足导致续签后重载 Caddy 失败。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSH 登录 VPS 并切换到 root
sudo -i

# 设置你的真实邮箱，并安装 acme.sh
EMAIL=&quot;your_email@example.com&quot;
curl https://get.acme.sh | sh -s email=&quot;$EMAIL&quot;

# 切换默认颁发机构为 Let&apos;s Encrypt
ACME=/root/.acme.sh/acme.sh
$ACME --set-default-ca --server letsencrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第三步：隐式导入 Token 并申请证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为防止 Token 泄露到 &lt;code&gt;.bash_history&lt;/code&gt; 中，我们使用静默输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行后，直接粘贴你的 Token 并回车（屏幕上不会显示）
read -rsp &apos;Cloudflare API Token: &apos; CF_Token
echo
export CF_Token
export CF_Account_ID=&quot;你的Account_ID&quot;

# 申请证书 (必须同时包含 Reality 直连域名和 CDN 回源域名，否则 Cloudflare 在“完全(严格)”模式下回源会报 526 证书错误)
$ACME --issue --dns dns_cf -d &quot;reality.example.com&quot; -d &quot;cdn.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第四步：提取证书并配置自动授权重载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们需要把证书提取到 Caddy 的配置目录，每次续签后，私钥文件的属主会被重置为 root，这将导致低权限运行的 Caddy 无法读取私钥而崩溃。因此必须在 &lt;code&gt;--reloadcmd&lt;/code&gt; 中加入 &lt;code&gt;chown&lt;/code&gt; 权限交接命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建目录
mkdir -p /etc/caddy/certs

# 提取证书并设定重载命令
# 安装时只需要指定主域名（第一个 -d 域名），acme.sh 会自动关联
$ACME --install-cert -d &quot;reality.example.com&quot; \
--key-file       /etc/caddy/certs/reality.key \
--fullchain-file /etc/caddy/certs/reality.crt \
--reloadcmd     &quot;chown caddy:caddy /etc/caddy/certs/reality.* &amp;amp;&amp;amp; systemctl reload caddy&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
证书安装后，私钥文件默认权限为 &lt;code&gt;-rw-------&lt;/code&gt;（600），仅属主（root）可读写。&lt;br /&gt;
若 Caddy 以 &lt;code&gt;caddy&lt;/code&gt; 用户运行，需确保其能读取。上述 &lt;code&gt;reloadcmd&lt;/code&gt; 中的 &lt;code&gt;chown&lt;/code&gt; 已解决属主问题。&lt;br /&gt;
若需进一步限制权限，可额外执行 &lt;code&gt;chmod 640 /etc/caddy/certs/reality.key&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
此时报错 &lt;code&gt;Reload error for: reality.example.com / caddy.service is not active&lt;/code&gt; 无伤大雅，因为我们在下一步才正式启动应用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;完成后，输入 &lt;code&gt;exit&lt;/code&gt; 退出 root 环境，返回普通用户。&lt;/p&gt;
&lt;h2&gt;3.8 启动服务&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;启动前检查&lt;/strong&gt;&lt;br /&gt;
为避免 &lt;code&gt;permission denied&lt;/code&gt; 错误，请再次确认以下路径的属主正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Caddy 日志目录
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chmod 755 /var/log/caddy

# 证书文件
ls -la /etc/caddy/certs/
# 应显示 -rw-r--r-- 1 caddy caddy reality.crt
# 应显示 -rw------- 1 caddy caddy reality.key

# 若属主不是 caddy，请执行修正：
sudo chown -R caddy:caddy /var/log/caddy
sudo chown caddy:caddy /etc/caddy/certs/reality.*
sudo chmod 640 /etc/caddy/certs/reality.key
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;正式启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now xray caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;验证状态：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl show xray --property=User,Group
systemctl show caddy --property=User,Group
ls -l /run/xray/ /run/caddy/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理想输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User=caddy
Group=

---

User=caddy
Group=caddy

# /run/xray/
srwxr-xr-x 1 caddy caddy 0 ... xhttp_in.sock
-rw-r--r-- 1 caddy caddy 0 ... xhttp_in.sock.lock

# /run/caddy/
s-w------- 1 caddy caddy 0 ... tls_gate.sock
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.9 后续更新&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;更新 Xray-core&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官方安装脚本支持直接升级，新版本发布后，重新运行安装命令即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查是否有新版本
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ check

# 升级到最新 Pre-release（推荐）
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会自动检测版本号差异、下载新二进制、替换并重启服务。你的 &lt;code&gt;config.json&lt;/code&gt;、&lt;code&gt;override.conf&lt;/code&gt;、日志等配置文件&lt;strong&gt;全部保留&lt;/strong&gt;，不会被覆盖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;升级后 systemd 主 service 文件会被重写为默认的 &lt;code&gt;User=nobody&lt;/code&gt;，但 &lt;code&gt;override.conf&lt;/code&gt;（&lt;code&gt;User=caddy&lt;/code&gt;）优先级更高，运行时用户不受影响。
若要消除 &lt;code&gt;Special user nobody configured&lt;/code&gt; 警告，可手动修复：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sed -i &apos;s/User=nobody/User=caddy/&apos; /etc/systemd/system/xray.service
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新 Caddy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过 apt 更新：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 客户端配置&lt;/h1&gt;
&lt;p&gt;请跳转我另一篇文章 &lt;a href=&quot;/posts/proxy/xray-client-config&quot;&gt;个人 Xray-core 客户端自用配置分享&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【完】&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;友情推荐&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 Nginx 作为反代的教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://smc.im/post/debian-13-xray-vless-reality-hardening/&quot;&gt;Debian 13 VPS 安全加固与 Xray VLESS + REALITY 手动部署&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;本文从中学习到了 &lt;code&gt;read -rsp&lt;/code&gt; 静默输入这一用法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECH 相关教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.litekin.org/archives/vless-xhttp-cloudflare-ech-doh-pei-zhi-zhu-yi-xiang&quot;&gt;XHTTP + CDN + ECH配置教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;后话&lt;/h1&gt;
&lt;p&gt;xray-core v26.9.8 Commit &lt;a href=&quot;https://github.com/XTLS/Xray-core/commit/47cfe999&quot;&gt;47cfe999&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RPRX 移除了版本号校验：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        } else {
            // config.MinClientVer = []byte{26, 3, 27}
            // errors.LogWarning(context.Background(), `REALITY: The default minimal client version is Xray-core v26.3.27...`)
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并且 REALITY 库推行了强制校验 ClientHello 必须带有后量子密钥交换 X25519MLKEM768，否则判定为过时/异常握手，直接触发回落的新的抗探测规则。（&lt;s&gt;嘻嘻&lt;/s&gt;&lt;/p&gt;
</content:encoded></item><item><title>在 Windows 上使用 rclone 与 WinSW 挂载 WebDAV 为系统服务</title><link>https://blog.rokutosei.com/posts/seedbox/rclone-mount-openlist-windows/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/seedbox/rclone-mount-openlist-windows/</guid><description>记录在 Windows 10 环境下使用 rclone 和 WinSW 将远程 WebDAV 挂载为本地驱动器</description><pubDate>Wed, 14 Oct 2026 15:06:00 GMT</pubDate><content:encoded>&lt;p&gt;为了在本地直接使用播放器观看远端 OpenList 上的视频，我近期将 WebDAV 存储挂载到了 Windows 本地。&lt;/p&gt;
&lt;p&gt;起初考虑过编写轻量脚本在开机时静默运行，但这类方式缺乏进程守护、日志追踪能力，遇到网络瞬断退出后不会自动恢复，因此通过 WinSW 将 Rclone 封装为 Windows 系统服务。&lt;/p&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;p&gt;本方案基于以下环境与工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;操作系统：Windows 10&lt;/li&gt;
&lt;li&gt;存储工具：Rclone v1.74&lt;/li&gt;
&lt;li&gt;内核驱动：WinFsp 2.1&lt;/li&gt;
&lt;li&gt;服务封装：WinSW v3（自编译）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1. 安装 WinFsp 驱动&lt;/h3&gt;
&lt;p&gt;在 Windows 上通过 Rclone 挂载本地盘符需要依赖 WinFsp 提供的 FUSE 兼容层。&lt;/p&gt;
&lt;p&gt;可以使用包管理器安装，在终端中执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;winget install WinFsp.WinFsp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用 Scoop：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scoop install winfsp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后不需要重启电脑，驱动会直接加载就绪。&lt;/p&gt;
&lt;h3&gt;2. 规划工作目录&lt;/h3&gt;
&lt;p&gt;建议建立一个专用的服务目录，例如 &lt;code&gt;D:\Program\rclone-service&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;同时，单独规划一个容量充裕的缓存目录，例如 &lt;code&gt;D:\Cache\rclone_cache&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;缓存目录所在的分区必须使用 NTFS 文件系统，后续的 VFS 缓存依赖底层对稀疏文件的支持。&lt;/p&gt;
&lt;p&gt;在终端中先建好所需目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-Item -ItemType Directory -Force -Path &quot;D:\Program\rclone-service\logs&quot;, &quot;D:\Cache\rclone_cache&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将编译/下载好的 &lt;code&gt;WinSW.exe&lt;/code&gt; 复制到 &lt;code&gt;D:\Program\rclone-service&lt;/code&gt; 目录下备用。（winsw官方仓库已经许久未发版，建议浅克隆并自编译）&lt;/p&gt;
&lt;h2&gt;搭建步骤&lt;/h2&gt;
&lt;h3&gt;第一步：配置 WebDAV 连接&lt;/h3&gt;
&lt;p&gt;在正式挂载前，需要先配置好 Rclone 对 WebDAV 的访问凭据。不建议明文密码直接写入文件，可以使用 Rclone 自带的加密命令对密码进行混淆处理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rclone obscure &quot;你的实际密码&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后终端会输出一段经过混淆的字符串。&lt;/p&gt;
&lt;p&gt;接下来在 &lt;code&gt;D:\Program\rclone-service&lt;/code&gt; 目录下创建 &lt;code&gt;rclone.conf&lt;/code&gt; 配置文件，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[openlist]
type = webdav
url = https://openlist.example.com:443/dav/
vendor = other
user = your_username
pass = 刚才输出的混淆字符串
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不懂的参数请前往官方文档查阅：https://doc.oplist.org/guide/advanced/webdav&lt;/p&gt;
&lt;p&gt;配置完成后，可以先在命令行中测试一下与远端服务的网络连通性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rclone lsd openlist: --config &quot;D:\Program\rclone-service\rclone.conf&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果控制台能够正常列出服务端的目录，说明基础网络和凭据均已正确。&lt;/p&gt;
&lt;p&gt;我的远端目录有 &lt;code&gt;Anime&lt;/code&gt; 文件夹，进一步测试查看子目录的命令是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rclone lsd openlist:Anime --config &quot;D:\Program\rclone-service\rclone.conf&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第二步：编写 WinSW 服务文件&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;D:\Program\rclone-service&lt;/code&gt; 目录下创建名为 &lt;code&gt;WinSW.xml&lt;/code&gt; 的服务定义文件。&lt;/p&gt;
&lt;p&gt;将服务定义文件与主程序同名命名为 &lt;code&gt;WinSW.xml&lt;/code&gt;，可以让 WinSW 在执行常用命令时默认加载，省去每次输入配置路径的麻烦。文件完整内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;service&amp;gt;
  &amp;lt;id&amp;gt;rclone-openlist&amp;lt;/id&amp;gt;
  &amp;lt;name&amp;gt;Rclone OpenList Mount&amp;lt;/name&amp;gt;
  &amp;lt;description&amp;gt;Mount OpenList WebDAV as O&amp;lt;/description&amp;gt;

  &amp;lt;executable&amp;gt;rclone&amp;lt;/executable&amp;gt;
  &amp;lt;workingdirectory&amp;gt;%BASE%&amp;lt;/workingdirectory&amp;gt;

  &amp;lt;!-- 挂载参数针对流媒体播放优化，路径均采用自包含变量 --&amp;gt;
  &amp;lt;arguments&amp;gt;mount openlist:Anime O: --config &quot;%BASE%\rclone.conf&quot; --vfs-cache-mode full --cache-dir &quot;D:\Cache\rclone_cache&quot; --vfs-cache-max-size 30G --vfs-cache-max-age 24h --vfs-disk-space-total-size 931G --buffer-size 16M --vfs-read-ahead 0 --vfs-read-chunk-size 8M --vfs-read-chunk-size-limit 2G --vfs-fast-fingerprint --volname &quot;OpenList-Anime&quot; --network-mode --log-file &quot;%BASE%\logs\rclone.log&quot; --log-level INFO&amp;lt;/arguments&amp;gt;

  &amp;lt;!-- 日志轮转单文件上限 2 MB，保留最近 5 份 --&amp;gt;
  &amp;lt;log mode=&quot;roll-by-size&quot;&amp;gt;
    &amp;lt;logpath&amp;gt;%BASE%\logs&amp;lt;/logpath&amp;gt;
    &amp;lt;sizeThreshold&amp;gt;2048&amp;lt;/sizeThreshold&amp;gt;
    &amp;lt;keepFiles&amp;gt;5&amp;lt;/keepFiles&amp;gt;
  &amp;lt;/log&amp;gt;

  &amp;lt;!-- 崩溃重试 --&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;10 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;30 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;1 min&quot;/&amp;gt;
  &amp;lt;resetfailure&amp;gt;1 hour&amp;lt;/resetfailure&amp;gt;

  &amp;lt;priority&amp;gt;Normal&amp;lt;/priority&amp;gt;
  &amp;lt;stoptimeout&amp;gt;15 sec&amp;lt;/stoptimeout&amp;gt;
&amp;lt;/service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;说明&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;%BASE%&lt;/code&gt;：WinSW 的内置环境变量，指向 &lt;code&gt;WinSW.exe&lt;/code&gt; 所在的当前目录。使用该变量可以让服务目录整体迁移时不需要修改内部路径。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vfs-cache-mode full&lt;/code&gt;：开启完整的 VFS 缓存。此模式下 Rclone 会在本地创建稀疏文件，只把播放器真正读到的数据缓存到本地，支持播放器随意拖动进度条。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cache-dir &quot;D:\Cache\rclone_cache&quot;&lt;/code&gt;：将缓存统一放在专用的存储目录，避免占用系统盘。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vfs-cache-max-size 30G&lt;/code&gt; 与 &lt;code&gt;--vfs-cache-max-age 24h&lt;/code&gt;：设置缓存上限为 30GB，且数据在 24 小时未访问后自动清理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vfs-read-ahead 0&lt;/code&gt;：将强制预读关闭。流媒体播放大文件时，如果设置了过大的预读值，Rclone 会持续下载文件开头的数据并占满带宽，导致播放器跳到文件末尾读取索引的请求排队超时。关闭预读后，数据拉取完全由播放器的实际寻道请求按需触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vfs-read-chunk-size 8M&lt;/code&gt;：将初始数据分块从默认的 128M 降低到 8M，加快视频首帧和尾部索引数据的响应速度。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vfs-disk-space-total-size 931G&lt;/code&gt;：手动指定虚拟磁盘的总容量。由于 WebDAV 常常缺少容量配额接口，Rclone 在源码中硬编码了默认填充 1 PiB 作为备用空间。这个参数不加也无所谓，不影响。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--network-mode&lt;/code&gt; 与 &lt;code&gt;--volname &quot;OpenList-Anime&quot;&lt;/code&gt;：通知 WinFsp 以网络共享卷的形式暴露给系统，并为盘符设置直观的卷标名称。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;onfailure&amp;gt;&lt;/code&gt;：配置系统服务异常退出后的自动重启策略，即使遇到网络波动中断，WinSW 也会在后台自动尝试重新拉起。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第三步：配置注册表启用提权互通&lt;/h3&gt;
&lt;p&gt;Windows 服务默认以 SYSTEM 账户在 Session 0 中运行，而普通桌面和文件管理器运行在用户会话中。&lt;/p&gt;
&lt;p&gt;按照本文档配置的是以服务形式挂载的网络驱动器，为了能够在桌面环境中被正常访问，需要修改一次注册表项。&lt;/p&gt;
&lt;p&gt;以管理员身份打开终端，执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ItemProperty -Path &quot;HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System&quot; -Name &quot;EnableLinkedConnections&quot; -Value 1 -Type DWord -Force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该设置确保提权进程与非提权进程之间共享网络驱动器映射，配置一次即可长期生效。&lt;/p&gt;
&lt;h3&gt;第四步：注册并启动系统服务&lt;/h3&gt;
&lt;p&gt;以管理员身份打开终端，进入服务所在目录执行安装与启动命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd D:\Program\rclone-service

# 安装系统服务
.\WinSW.exe install

# 启动服务
.\WinSW.exe start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果使用的是 WinSW v3，可以使用自带的调试命令检查进程拓扑：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.\WinSW.exe dev ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;控制台会以树状形式打印出 WinSW 主服务进程以及由它拉起的 &lt;code&gt;rclone.exe&lt;/code&gt; 子进程，能确认后台服务是否正常托管。&lt;/p&gt;
&lt;h3&gt;第五步：Test&lt;/h3&gt;
&lt;p&gt;服务启动后，打开 Windows 资源管理器，即可看到新增了一个卷标为 &lt;code&gt;OpenList-Anime (O:)&lt;/code&gt; 的网络驱动器。&lt;/p&gt;
&lt;p&gt;进入该盘符，尝试使用视频播放器打开一个 1GB 以上的文件，如果视频能在短时间内正常开始播放，且拖动时间轴进度条时画面能够迅速加载，说明按需寻道与分块缓存参数均已生效。&lt;/p&gt;
&lt;p&gt;如果遇到加载异常，可以打开 &lt;code&gt;D:\Program\rclone-service\logs\rclone.log&lt;/code&gt; 查看 Rclone 日志。&lt;/p&gt;
&lt;h2&gt;后话&lt;/h2&gt;
&lt;p&gt;目前这套配置我已在已连续运行 31 天。&lt;/p&gt;
&lt;p&gt;在经历日常休眠唤醒以及网络环境切换后，服务均能正常维持，O 盘没有出现脱机现象。&lt;/p&gt;
&lt;p&gt;使用播放器播放大码率视频时，进度条拖动与索引加载相对流畅，达到了期望目标。&lt;/p&gt;
</content:encoded></item><item><title>Linux Desktop 上的 Xray 裸核部署指南</title><link>https://blog.rokutosei.com/posts/proxy/debian13-xray-tproxy/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/debian13-xray-tproxy/</guid><description>在 Debian 13 Desktop 环境下，基于 nftables 单表双栈与策略路由构建 Xray-core 本机透明代理。</description><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文档记录在 Debian 13 (Trixie) 桌面环境下部署 Xray-core TProxy IPv4/IPv6 双栈透明代理的流程。&lt;/p&gt;
&lt;p&gt;本文的网络拓扑为单机桌面模式，普通用户产生的 TCP/UDP 流量 Xray 接管并按规则分流，Xray 自身发出的外部流量及系统 root 流量则直接放行。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;资源文件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装工具包：&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install nftables iproute2 curl
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;前往 &lt;a href=&quot;https://github.com/XTLS/Xray-core/releases&quot;&gt;Xray-core Releases&lt;/a&gt; 下载 &lt;code&gt;Xray-linux-64.zip&lt;/code&gt;（推荐 Pre-release）&lt;/li&gt;
&lt;li&gt;前往 &lt;a href=&quot;https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/&quot;&gt;MetaCubeX/meta-rules-dat&lt;/a&gt; 下载 &lt;code&gt;geoip.dat&lt;/code&gt;、&lt;code&gt;geosite.dat&lt;/code&gt; 规则文件&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;目录结构&lt;/h2&gt;
&lt;p&gt;建议规划如下部署目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/opt/proxy/xray/
├── xray                          # Xray-core 可执行文件
├── config/
│   ├── xray.yaml                 # Xray 运行时配置文件 (自行创建)
│   └── xray-tproxy.nft           # nftables 声明式规则集 (自行创建)
├── geo/                          # 规则库资产目录
│   ├── geoip.dat
│   └── geosite.dat
├── logs/                         # 日志
│   ├── access.log
│   └── error.log
└── scripts/                      # 脚本
    ├── tproxy-up.sh              # 规则加载脚本
    ├── tproxy-down.sh            # 规则清理脚本
    └──  rotate-logs.py           # 日志轮转脚本 (可选)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo install -d -o root -g root -m 755 /opt/proxy/xray
sudo install -d -o root -g root -m 755 /opt/proxy/xray/config
sudo install -d -o root -g root -m 755 /opt/proxy/xray/geo
sudo install -d -o root -g root -m 755 /opt/proxy/xray/scripts
sudo install -d -o root -g root -m 755 /opt/proxy/xray/logs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将下载的 &lt;code&gt;xray&lt;/code&gt; 二进制和 &lt;code&gt;geoip.dat&lt;/code&gt;、&lt;code&gt;geosite.dat&lt;/code&gt; 放入对应目录，并赋予权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod 755 /opt/proxy/xray/xray
sudo chmod 644 /opt/proxy/xray/geo/*.dat
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;配置文件&lt;/h2&gt;
&lt;p&gt;接下来书写核心配置文件。&lt;/p&gt;
&lt;h3&gt;1. Xray 配置文件&lt;/h3&gt;
&lt;p&gt;与 Windows 几乎一致，不同的地方是入站和部分路由&lt;/p&gt;
&lt;p&gt;入站需要改为 dokodemo-door / tunnel&lt;/p&gt;
&lt;p&gt;涉及到进程的路由建议删除&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;inbounds:
# 0. TProxy 端口入站 (双栈混合监听，IPv4/IPv6 共用 12345)
- tag: tproxy-in
  port: 12345
  protocol: dokodemo-door
  settings:
    network: tcp,udp
    followRedirect: true
  sniffing:
    enabled: true
    destOverride: [http, tls, quic]
    metadataOnly: false
    routeOnly: false
  streamSettings:
    sockopt:
      tproxy: tproxy
      # 可选显式设置 IPv6 transparent，弥补 Xray 对 IPv6 TPROXY inbound 的默认 sockopt 覆盖
      # customSockopt:
      #   - system: linux
      #     network: tcp
      #     type: int
      #     level: &quot;41&quot;
      #     opt: &quot;75&quot;
      #     value: &quot;1&quot;
      #   - system: linux
      #     network: udp
      #     type: int
      #     level: &quot;41&quot;
      #     opt: &quot;75&quot;
      #     value: &quot;1&quot;

# 1. Socks 入站
- tag: socks-in
  port: 10808
  listen: 127.0.0.1
  protocol: socks
  settings:
    auth: noauth
    udp: true
  sniffing:
    enabled: true
    destOverride: [http, tls, quic]
    metadataOnly: false
    routeOnly: false

# 2. HTTP 入站
- tag: http-in
  port: 10809
  listen: 127.0.0.1
  protocol: http
  sniffing:
    enabled: true
    destOverride: [http, tls, quic]
    metadataOnly: false
    routeOnly: false
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2. nftables 规则文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/sbin/nft -f

table inet xray {
    # 绕行保留地址与局域网网段 (IPv4)
    set reserved_v4 {
        type ipv4_addr
        flags interval
        elements = {
            0.0.0.0/8,
            10.0.0.0/8,
            100.64.0.0/10,
            127.0.0.0/8,
            169.254.0.0/16,
            172.16.0.0/12,
            192.0.0.0/24,
            224.0.0.0/4,
            240.0.0.0/4
        }
    }

    # 绕行保留地址与特殊网段 (IPv6)
    set reserved_v6 {
        type ipv6_addr
        flags interval
        elements = {
            ::1/128,
            fe80::/10,
            fc00::/7,
            ff00::/8
        }
    }

    chain prerouting {
        type filter hook prerouting priority mangle; policy accept;

        # 匹配已建立透明代理连接的 TCP 数据包，打标后直通
        meta l4proto tcp socket transparent 1 socket wildcard 0 meta mark set 1 accept

        # 绕行无需代理的保留/私网地址
        ip daddr @reserved_v4 return
        ip6 daddr @reserved_v6 return

        # 绕行局域网非 DNS 流量（放行 53 端口）
        ip daddr 192.168.0.0/16 tcp dport != 53 return
        ip daddr 192.168.0.0/16 udp dport != 53 return

        # 放行 Xray 自身出站打标流量
        meta mark 0xff return

        # 透明代理转发 TCP 与 UDP 流量至本地 12345 端口
        meta l4proto { tcp, udp } tproxy to :12345 meta mark set 1 accept
    }

    chain output {
        type route hook output priority mangle; policy accept;

        # 绕行无需代理的保留/私网地址
        ip daddr @reserved_v4 return
        ip6 daddr @reserved_v6 return

        # 绕行局域网非 DNS 流量
        ip daddr 192.168.0.0/16 tcp dport != 53 return
        ip daddr 192.168.0.0/16 udp dport != 53 return

        # 放行 Xray 自身出站流量及 root 权限进程流量
        meta mark 0xff return
        meta skuid root return

        # 拦截用户 your_username 发出的 TCP 和 UDP 流量，打上 mark 1 以触发策略路由重定向至 lo
        meta skuid &quot;你地鸣至&quot; meta l4proto { tcp, udp } meta mark set 1
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3. 启停脚本&lt;/h3&gt;
&lt;h4&gt;启动脚本 &lt;code&gt;tproxy-up.sh&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;负责配置策略路由（IPv4 table 100 / IPv6 table 106）并加载 nftables 配置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

set -e
echo &quot;[INFO] 加载 Xray TProxy (nftables) 规则...&quot;

# 配置策略路由（IPv4 table 100 / IPv6 table 106）
ip route add local default dev lo table 100 2&amp;gt;/dev/null || true
ip rule add fwmark 1 table 100 2&amp;gt;/dev/null || true
ip -6 route add local default dev lo table 106 2&amp;gt;/dev/null || true
ip -6 rule add fwmark 1 table 106 2&amp;gt;/dev/null || true

# 加载 nftables 规则
/usr/sbin/nft -f /opt/proxy/xray/config/xray-tproxy.nft

echo &quot;[INFO] Xray TProxy (nftables) 规则加载完成。&quot;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;停止脚本 &lt;code&gt;tproxy-down.sh&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

echo &quot;[INFO] 清理 Xray TProxy 规则...&quot;

# 卸载并销毁 nftables 表
/usr/sbin/nft delete table inet xray 2&amp;gt;/dev/null || true

# 清理策略路由（IPv4 table 100 / IPv6 table 106）
ip rule del fwmark 1 table 100 2&amp;gt;/dev/null || true
ip route flush table 100 2&amp;gt;/dev/null || true
ip -6 rule del fwmark 1 table 106 2&amp;gt;/dev/null || true
ip -6 route flush table 106 2&amp;gt;/dev/null || true

echo &quot;[INFO] Xray TProxy (nftables) 规则清理完成。&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod 755 /opt/proxy/xray/scripts/*.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Systemd 服务&lt;/h2&gt;
&lt;p&gt;将 Xray 注册为系统级守护进程，并在启动与退出时自动调用启停脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Xray Core Service (Standalone nftables TProxy Mode)
After=network.target nss-lookup.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/proxy/xray
Environment=&quot;XRAY_LOCATION_ASSET=/opt/proxy/xray/geo&quot;
RuntimeDirectory=xray
RuntimeDirectoryMode=0755
ExecStart=/opt/proxy/xray/xray run -config /opt/proxy/xray/config/xray.yaml
ExecStartPost=/opt/proxy/xray/scripts/tproxy-up.sh
ExecStopPost=/opt/proxy/xray/scripts/tproxy-down.sh
Restart=on-failure
RestartSec=3s
LimitNOFILE=1000000
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;启动&lt;/h2&gt;
&lt;h3&gt;1. 启动服务&lt;/h3&gt;
&lt;p&gt;修改日志文件属主为 root，随后启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo touch /opt/proxy/xray/logs/access.log /opt/proxy/xray/logs/error.log
sudo chown root:root /opt/proxy/xray/logs/*.log
sudo chmod 644 /opt/proxy/xray/logs/*.log

sudo systemctl daemon-reload
sudo systemctl enable --now xray
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看服务状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status xray --no-pager
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 nftables 规则是否已加载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /usr/sbin/nft list table inet xray
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看策略路由：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip rule show | grep 100
ip -6 rule show | grep 106
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试双栈连通性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 验证 IPv4 国内直连
curl -4 -I --max-time 5 https://www.baidu.com

# 验证 IPv6 国内直连
curl -6 -I --max-time 5 https://www.baidu.com

# 验证海外节点代理出站
curl -I --max-time 5 https://www.google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实时日志：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tail -n 20 /opt/proxy/xray/logs/access.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;期望输出应类似下面的，表明双栈流量均成功经由 TProxy 分流：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;accepted tcp:172.217.119.4:443 [tproxy-in -&amp;gt; proxy]
accepted tcp:[2001:4860:4843:400::]:443 [tproxy-in -&amp;gt; proxy]
accepted tcp:[2409:...]:443 [tproxy-in -&amp;gt; direct]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完结撒花了，下文是可选配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;可选增强&lt;/h2&gt;
&lt;h3&gt;1. 日志自动轮转&lt;/h3&gt;
&lt;p&gt;Xray-core 自身不提供日志文件按大小自动切割能力。可以通过 Python 脚本结合 Xray 提供的 &lt;code&gt;xray api restartlogger&lt;/code&gt; 实现平滑轮转。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;点击展开/收起 &amp;lt;code&amp;gt;rotate-logs.py&amp;lt;/code&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&quot;&quot;&quot;Xray 日志自动轮转脚本 (单文件超过 5 MB 触发，保留 3 份历史备份)&quot;&quot;&quot;

import datetime
import glob
import os
import shutil
import subprocess

XRAY_BIN = &quot;/opt/proxy/xray/xray&quot;
LOG_DIR = &quot;/opt/proxy/xray/logs&quot;
API_SERVER = &quot;127.0.0.1:10085&quot;
MAX_LOG_BYTES = 5 * 1024 * 1024
MAX_BACKUP_COUNT = 3


def prune_backups(log_path):
    pattern = f&quot;{log_path}.*.bak&quot;
    backups = sorted(glob.glob(pattern), key=os.path.getmtime)
    while len(backups) &amp;gt; MAX_BACKUP_COUNT:
        oldest = backups.pop(0)
        try:
            os.remove(oldest)
        except Exception:
            pass


def restart_logger():
    cmd = [XRAY_BIN, &quot;api&quot;, &quot;restartlogger&quot;, f&quot;-server={API_SERVER}&quot;]
    res = subprocess.run(cmd, capture_output=True, text=True, timeout=5)
    if res.returncode != 0:
        raise RuntimeError(f&quot;restartlogger failed: {res.stderr or res.stdout}&quot;)


def main():
    targets = []
    for name in (&quot;access.log&quot;, &quot;error.log&quot;):
        p = os.path.join(LOG_DIR, name)
        if os.path.exists(p) and os.path.getsize(p) &amp;gt;= MAX_LOG_BYTES:
            ts = datetime.datetime.now().strftime(&quot;%Y%m%d_%H%M%S&quot;)
            targets.append((p, f&quot;{p}.{ts}.bak&quot;))

    if not targets:
        return

    # 1. 优先尝试：原子重命名 + gRPC API restartlogger
    try:
        for orig, bak in targets:
            os.rename(orig, bak)
        restart_logger()
        for orig, _ in targets:
            prune_backups(orig)
    except Exception:
        # 2. 失败自动降级到 copytruncate
        for orig, bak in targets:
            if not os.path.exists(orig) and os.path.exists(bak):
                os.rename(bak, orig)
            shutil.copy2(orig, bak)
            with open(orig, &quot;r+&quot;, encoding=&quot;utf-8&quot;, errors=&quot;ignore&quot;) as f:
                f.truncate(0)
            prune_backups(orig)


if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;配合 Systemd Timer 每天执行一次日志检查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Run Xray log rotation daily

[Timer]
OnBootSec=10min
OnCalendar=daily
Persistent=true
Unit=xray-rotate.service

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Rotate Xray logs

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /opt/proxy/xray/scripts/rotate-logs.py
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows 上的 Xray 裸核部署指南</title><link>https://blog.rokutosei.com/posts/proxy/xray-windows-bare-core-guide/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/xray-windows-bare-core-guide/</guid><description>在 Windows 环境下通过 WinSW 服务包装器与 SingTun 虚拟网卡，构建 Xray-core 裸核运行环境。</description><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文档记录在 Windows 上部署 Xray-core 裸核的流程。&lt;/p&gt;
&lt;h2&gt;资源文件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;前往 https://github.com/XTLS/Xray-core/releases 下载 &lt;code&gt;Xray-windows-64.zip&lt;/code&gt;（推荐 Pre-release，本文以 v26.9.9 为例）&lt;/li&gt;
&lt;li&gt;前往 https://github.com/SagerNet/sing-box/releases 下载 &lt;code&gt;sing-box-1.14.0-windows-amd64.zip&lt;/code&gt;（singbox变动频繁，暂时推荐 Release，本文以 v1.14.0 为例）
&lt;blockquote&gt;
&lt;p&gt;注：如果不打算使用 TUN 虚拟网卡或者打算使用 XrayTUN，可以略过 Singbox 的资源下载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;前往 https://github.com/winsw/winsw/releases 下载 &lt;code&gt;WinSW-x64.exe&lt;/code&gt;（推荐 Pre-release）
&lt;blockquote&gt;
&lt;p&gt;注：由于 winsw 最近一次的 release 在三年前，更建议克隆仓库自行构建新版本&lt;/p&gt;
&lt;p&gt;.NET 10 构建命令为：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$HASH = (git rev-parse --short HEAD)
dotnet publish src/WinSW/WinSW.csproj -c Release -f net10.0-windows -r win-x64 --self-contained true -p:Version=&quot;3.0.0&quot; -p:InformationalVersion=&quot;3.0.0-alpha.11+$HASH&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;产物路径：&lt;code&gt;artifacts\bin\WinSW\Release\net10.0-windows\win-x64\publish\WinSW.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;目录结构&lt;/h2&gt;
&lt;p&gt;下载完资源文件后，创建如下目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D:\Programs\Proxy\
├── Xray\                          # Xray-core 目录
│   ├── xray.exe                   # Xray-core 二进制文件
│   ├── wintun.dll                 # TUN 驱动库（官方资源包附带）
│   ├── config\
│   │   └── xray.yaml              # 你的 Xray 配置文件
│   ├── geo\                       # 规则库资产目录（官方资源包附带）
│   │   ├── geoip.dat
│   │   └── geosite.dat
│   ├── logs\                      # 日志目录
│   └── scripts\
│       ├── winsw.exe              # WinSW 服务包装器
│       └── winsw.xml              # WinSW 服务文件（自行创建）
│
└── SingBox\                       # Sing-Box 目录
    ├── sing-box.exe               # Sing-Box 二进制文件
    ├── libcronet.dll              # Cronet 网络库（官方资源包附带）
    ├── config\
    │   └── sing-box.json          # 你的 Sing-Box 配置文件（自行创建）
    ├── dashboard\                 # Web Dashboard 面板资源（可选）
    ├── logs\                      # 日志目录
    └── scripts\
        ├── winsw.exe              # WinSW 服务包装器
        └── winsw.xml              # WinSW 服务文件（自行创建）
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置文件&lt;/h2&gt;
&lt;p&gt;接下来书写配置文件，需要准备：&lt;/p&gt;
&lt;h3&gt;xray config&lt;/h3&gt;
&lt;p&gt;裸核需要 Full Config，请参考我另一篇文章&lt;a href=&quot;/posts/proxy/xray-client-config&quot;&gt;个人 Xray-core 客户端自用配置分享&lt;/a&gt;，此处不赘述&lt;/p&gt;
&lt;h3&gt;singbox config&lt;/h3&gt;
&lt;p&gt;&lt;s&gt;个人认为，个人认为，个人认为！目前 xray tun 还不够成熟，因此使用 singbox 中的 singtun 代替 xray tun&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;log&quot;: {
    &quot;level&quot;: &quot;warn&quot;,
    &quot;output&quot;: &quot;d:\\Programs\\Proxy\\SingBox\\logs\\sing-box.log&quot;,
    &quot;timestamp&quot;: true
  },
  &quot;dns&quot;: {
    &quot;servers&quot;: [
      {
        &quot;type&quot;: &quot;tcp&quot;,
        &quot;tag&quot;: &quot;remote-dns&quot;,
        &quot;detour&quot;: &quot;to-xray&quot;,
        &quot;server&quot;: &quot;8.8.8.8&quot;,
        &quot;server_port&quot;: 53
      },
      {
        &quot;type&quot;: &quot;udp&quot;,
        &quot;tag&quot;: &quot;direct-dns&quot;,
        &quot;detour&quot;: &quot;direct&quot;,
        &quot;server&quot;: &quot;223.5.5.5&quot;,
        &quot;server_port&quot;: 53
      }
    ],
    &quot;final&quot;: &quot;remote-dns&quot;,
    &quot;strategy&quot;: &quot;prefer_ipv4&quot;,
    &quot;cache_capacity&quot;: 4096
  },
  &quot;inbounds&quot;: [
    {
      &quot;type&quot;: &quot;tun&quot;,
      &quot;tag&quot;: &quot;tun-in&quot;,
      &quot;interface_name&quot;: &quot;singbox-tun&quot;,
      &quot;mtu&quot;: 9000,
      &quot;address&quot;: [
        &quot;172.19.0.1/30&quot;,
        &quot;fdfe:dcba:9876::1/126&quot;
      ],
      &quot;auto_route&quot;: true,
      &quot;stack&quot;: &quot;system&quot;,
      &quot;endpoint_independent_nat&quot;: true
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;type&quot;: &quot;socks&quot;,
      &quot;tag&quot;: &quot;to-xray&quot;,
      &quot;server&quot;: &quot;127.0.0.1&quot;,
      &quot;server_port&quot;: 10808
    },
    {
      &quot;type&quot;: &quot;direct&quot;,
      &quot;tag&quot;: &quot;direct&quot;,
      &quot;domain_resolver&quot;: &quot;direct-dns&quot;
    }
  ],
  &quot;route&quot;: {
    &quot;rules&quot;: [
      {
        &quot;action&quot;: &quot;sniff&quot;
      },
      {
        &quot;network&quot;: &quot;udp&quot;,
        &quot;port&quot;: [135, 137, 138, 139, 1900, 3702, 5353],
        &quot;action&quot;: &quot;reject&quot;,
        &quot;method&quot;: &quot;drop&quot;
      },
      {
        &quot;ip_cidr&quot;: [
          &quot;224.0.0.0/3&quot;,
          &quot;ff00::/8&quot;
        ],
        &quot;action&quot;: &quot;reject&quot;,
        &quot;method&quot;: &quot;drop&quot;
      },
      {
        &quot;ip_cidr&quot;: [
          &quot;172.19.0.1/32&quot;,
          &quot;fdfe:dcba:9876::1/128&quot;
        ],
        &quot;action&quot;: &quot;reject&quot;,
        &quot;method&quot;: &quot;drop&quot;
      },
      {
        &quot;protocol&quot;: &quot;dns&quot;,
        &quot;action&quot;: &quot;hijack-dns&quot;
      },
      {
        &quot;process_name&quot;: [
          &quot;xray.exe&quot;,
          &quot;xray&quot;,
          &quot;Weixin.exe&quot;,
          &quot;QQ.exe&quot;,
          &quot;QQMusic.exe&quot;
        ],
        &quot;outbound&quot;: &quot;direct&quot;
      }
    ],
    &quot;final&quot;: &quot;to-xray&quot;,
    &quot;auto_detect_interface&quot;: true
  },
  &quot;experimental&quot;: {
    &quot;cache_file&quot;: {
      &quot;enabled&quot;: true
    },
    &quot;clash_api&quot;: {
      &quot;external_controller&quot;: &quot;127.0.0.1:9090&quot;,
      &quot;external_ui&quot;: &quot;dashboard&quot;,
      &quot;external_ui_download_url&quot;: &quot;https://github.com/Zephyruso/zashboard/releases/download/v3.22.0/dist-no-fonts.zip&quot;,
      &quot;external_ui_download_detour&quot;: &quot;to-xray&quot;,
      &quot;secret&quot;: &quot;SakiSakiSakiSakiSakiSakiSakiSaki&quot;,
      &quot;default_mode&quot;: &quot;rule&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;clash_api&lt;/code&gt; 可以使用 Zashboard WebUI 来查看，推荐先把 WebUI &lt;a href=&quot;https://github.com/Zephyruso/zashboard/releases/download/v3.22.0/dist-no-fonts.zip&quot;&gt;资源包&lt;/a&gt; 下载并解压，解压后的目录大致为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;└── SingBox\                           # Sing-Box 目录
    └── dashboard\                     # Zashboard WebUI 面板资源
        ├── index.html
        ├── assets\                    # Zashboard 编译产物
        │   └── ...
        └── ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不需要 WebUI 的话，将 &lt;code&gt;&quot;experimental&quot;: {……}&lt;/code&gt; 删除即可&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;点击展开/收起 仅推荐 v3.22.0 的原因&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;p&amp;gt;zashboard 在 v3.23.0 后不再支持 Sing-box&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;请见：&amp;lt;a href=&quot;https://github.com/Zephyruso/zashboard/blob/main/docs/sing-box-deprecation.md&quot;&amp;gt;sing-box-deprecation.md&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;blockquote&amp;gt;
&amp;lt;strong&amp;gt;结束对 sing-box 的支持&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;zashboard 将在3.23.0版本移除对 sing-box 的支持，包括 sing-box 原生 gRPC API 以及 sing-box 提供的 Clash API的兼容性支持。&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;strong&amp;gt;为什么停止支持&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;img src=&quot;https://github.com/Zephyruso/zashboard/raw/main/docs/image.png&quot; alt=&quot;&quot; /&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;本来只是工作之余出于兴趣写个面板，没想到还有赛博皇帝在那狗叫，没兴趣兼容这种项目了。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;使用zashboard的sing-box用户：很抱歉，推荐你们使用其他项目。&amp;lt;/p&amp;gt;
&amp;lt;/blockquote&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h3&gt;xray 目录的 winsw.xml&lt;/h3&gt;
&lt;p&gt;接下来将xray和singbox封装为系统服务，需要分别为它们创建 &lt;code&gt;winsw.xml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;service&amp;gt;
  &amp;lt;!-- 服务基本信息 --&amp;gt;
  &amp;lt;id&amp;gt;Xray&amp;lt;/id&amp;gt;
  &amp;lt;name&amp;gt;Xray Core Service&amp;lt;/name&amp;gt;
  &amp;lt;description&amp;gt;Xray Core Service&amp;lt;/description&amp;gt;
  
  &amp;lt;!-- 使用环境变量指定 geo 资产目录 (指向 D:\Programs\Proxy\Xray\geo) --&amp;gt;
  &amp;lt;env name=&quot;xray.location.asset&quot; value=&quot;%BASE%\..\geo&quot; /&amp;gt;

  &amp;lt;!-- 可执行文件指向 D:\Programs\Proxy\Xray\xray.exe --&amp;gt;
  &amp;lt;executable&amp;gt;%BASE%\..\xray.exe&amp;lt;/executable&amp;gt;
  
  &amp;lt;!-- Xray 启动参数 --&amp;gt;
  &amp;lt;arguments&amp;gt;run -c config\xray.yaml&amp;lt;/arguments&amp;gt;
  
  &amp;lt;!-- 工作目录设置为根目录 D:\Programs\Proxy\Xray --&amp;gt;
  &amp;lt;workingdirectory&amp;gt;%BASE%\..&amp;lt;/workingdirectory&amp;gt;
  
  &amp;lt;!-- 启动设置 --&amp;gt;
  &amp;lt;!-- 设置服务进程的 CPU 优先级 --&amp;gt;
  &amp;lt;!-- delayedAutoStart: 延迟启动，系统启动完关键服务后再启动此服务 --&amp;gt;
  &amp;lt;!-- priority: 进程优先级，设置为低于正常优先级，避免影响系统性能 --&amp;gt;
  &amp;lt;!-- idle：空闲优先级（最低） --&amp;gt;
  &amp;lt;!-- belownormal：低于正常优先级 --&amp;gt;
  &amp;lt;!-- normal：正常优先级（默认） --&amp;gt;
  &amp;lt;!-- abovenormal：高于正常优先级 --&amp;gt;
  &amp;lt;!-- high：高优先级 --&amp;gt;
  &amp;lt;!-- realtime：实时优先级（最高，慎用） --&amp;gt;
  &amp;lt;delayedAutoStart&amp;gt;true&amp;lt;/delayedAutoStart&amp;gt;
  &amp;lt;priority&amp;gt;normal&amp;lt;/priority&amp;gt;

  &amp;lt;!-- WinSW 自身日志输出 --&amp;gt;
  &amp;lt;logpath&amp;gt;%BASE%\..\logs&amp;lt;/logpath&amp;gt;
  &amp;lt;log mode=&quot;roll-by-size&quot;&amp;gt;
    &amp;lt;sizeThreshold&amp;gt;2048&amp;lt;/sizeThreshold&amp;gt;
    &amp;lt;keepFiles&amp;gt;14&amp;lt;/keepFiles&amp;gt;
  &amp;lt;/log&amp;gt;

  &amp;lt;!-- 错误重启与超时设置 --&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;10 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;30 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;1 min&quot;/&amp;gt;
  
  &amp;lt;resetfailure&amp;gt;1 hour&amp;lt;/resetfailure&amp;gt;
  &amp;lt;stoptimeout&amp;gt;30sec&amp;lt;/stoptimeout&amp;gt;
&amp;lt;/service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;sing-box 目录的 winsw.xml&lt;/h3&gt;
&lt;p&gt;同理，创建：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;service&amp;gt;
  &amp;lt;id&amp;gt;SingBox-Tun&amp;lt;/id&amp;gt;
  &amp;lt;name&amp;gt;SingBox TUN Service&amp;lt;/name&amp;gt;
  &amp;lt;description&amp;gt;SingBox Wintun Layer for Xray&amp;lt;/description&amp;gt;

  &amp;lt;!-- 使用依赖项让 Xray 先运行，再启动 sing-box TUN --&amp;gt;
  &amp;lt;depend&amp;gt;Xray&amp;lt;/depend&amp;gt;

  &amp;lt;executable&amp;gt;%BASE%\..\sing-box.exe&amp;lt;/executable&amp;gt;
  &amp;lt;arguments&amp;gt;run -c config\sing-box.json&amp;lt;/arguments&amp;gt;
  &amp;lt;workingdirectory&amp;gt;%BASE%\..&amp;lt;/workingdirectory&amp;gt;

  &amp;lt;delayedAutoStart&amp;gt;true&amp;lt;/delayedAutoStart&amp;gt;
  &amp;lt;priority&amp;gt;normal&amp;lt;/priority&amp;gt;

  &amp;lt;logpath&amp;gt;%BASE%\..\logs&amp;lt;/logpath&amp;gt;
  &amp;lt;log mode=&quot;roll-by-size&quot;&amp;gt;
    &amp;lt;sizeThreshold&amp;gt;2048&amp;lt;/sizeThreshold&amp;gt;
    &amp;lt;keepFiles&amp;gt;7&amp;lt;/keepFiles&amp;gt;
  &amp;lt;/log&amp;gt;

  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;5 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;15 sec&quot;/&amp;gt;
  &amp;lt;onfailure action=&quot;restart&quot; delay=&quot;30 sec&quot;/&amp;gt;
  &amp;lt;resetfailure&amp;gt;1 hour&amp;lt;/resetfailure&amp;gt;
  &amp;lt;stoptimeout&amp;gt;15sec&amp;lt;/stoptimeout&amp;gt;
&amp;lt;/service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装并启动服务&lt;/h2&gt;
&lt;p&gt;现在使用 WinSW 安装为服务，以管理员身份启动 pwsh 分别执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装 SingTUN 服务
d:\Programs\Proxy\SingBox\scripts\winsw.exe install

# 安装 Xray-core 服务
d:\Programs\Proxy\Xray\scripts\winsw.exe install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，请再次检查所需文件是否已准备完毕。&lt;/p&gt;
&lt;p&gt;接下来继续在 pwsh 终端执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 由于已经在 winsw.xml 写了 &amp;lt;depend&amp;gt;，只需要启动 singtun 的服务就会自动拉起 xray-core
d:\Programs\Proxy\SingBox\scripts\winsw.exe start

# 查看状态，期望输出应是 Active (running)
d:\Programs\Proxy\SingBox\scripts\winsw.exe status
d:\Programs\Proxy\Xray\scripts\winsw.exe status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;教程到这里结束了，下文是可选的配置&lt;/p&gt;
&lt;h2&gt;可选增强&lt;/h2&gt;
&lt;h3&gt;快捷启停&lt;/h3&gt;
&lt;p&gt;WinSW 提供了几个执行命令，可以封装为快捷方式，配合 Win10 的开始菜单磁贴使用（Win11 我不知道还能不能用，但放到桌面用也是差不多的）&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;点击展开/收起 命令详情&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.\winsw.exe install      # 安装服务
.\winsw.exe start        # 启动服务
.\winsw.exe stop         # 停止服务
.\winsw.exe restart      # 重启服务
.\winsw.exe status       # 查看状态
.\winsw.exe uninstall    # 卸载服务
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;创建以下文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D:\Programs\Proxy\
└── Xray\
    ├── xray.exe
    └── scripts\
        ├── winsw.exe
        ├── winsw.xml
        ├── restart-xray.ps1       # 重启
        ├── start-xray.ps1         # 启动
        └── stop-xray.ps1          # 停止
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;点击展开/收起 三个文件写入内容&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
Set-Location $scriptDir
Write-Host &quot;Restarting Xray &amp;amp; SingBox-Tun services...&quot;
Start-Process winsw.exe -ArgumentList &quot;restart&quot;, &quot;--force&quot; -Wait
Write-Host &quot;Xray service restart command issued.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
Set-Location $scriptDir
Write-Host &quot;Starting SingBox-Tun &amp;amp; Xray...&quot;
$singboxWinsw = Join-Path $scriptDir &quot;..\..\SingBox\scripts\winsw.exe&quot;
Start-Process $singboxWinsw -ArgumentList &quot;start&quot; -Wait
Write-Host &quot;All services started.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
Set-Location $scriptDir
Write-Host &quot;Stopping Xray &amp;amp; SingBox-Tun services...&quot;
Start-Process winsw.exe -ArgumentList &quot;stop&quot;, &quot;--force&quot; -Wait
Write-Host &quot;Xray service stop command issued.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;接下来选中这三个脚本，鼠标右键 -&amp;gt; 创建快捷方式&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image/Xray-Windows-Bare-Core-Guide/1789107404863.webp&quot; alt=&quot;1789107404863&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;C:\Users\你地鸣至\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\&lt;/code&gt; 新建一个文件夹 &lt;code&gt;Proxy&lt;/code&gt;，&lt;/p&gt;
&lt;p&gt;然后把这三个快捷方式放进去，就能在开始菜单放置磁贴并一键操作了（快捷方式可以自定义图标、名称）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image/Xray-Windows-Bare-Core-Guide/1789108099022.webp&quot; alt=&quot;1789108099022&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;日志轮转&lt;/h3&gt;
&lt;p&gt;Xray-core 和 Singbox 自身不提供按大小或时间自动切割日志的能力，建议通过外部脚本轮转，或者不写入 log 物理文件&lt;/p&gt;
&lt;p&gt;另，Xray-core 提供了 &lt;code&gt;xray api restartlogger&lt;/code&gt;，能让 Xray 重新打开日志句柄&lt;/p&gt;
&lt;p&gt;这部分不做示例，&lt;s&gt;因为我的脚本写得太乱&lt;/s&gt;，你可以让 GenAI 帮助你快速创建一个轮转的 python 脚本&lt;/p&gt;
&lt;p&gt;需要轮转的对象：sing-box.log、access.log、error.log&lt;/p&gt;
</content:encoded></item><item><title>客户端：Xray-core 自用配置</title><link>https://blog.rokutosei.com/posts/proxy/xray-client-config/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/xray-client-config/</guid><description>基于 3 台 VPS，示例 Full Xray-core Config。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!TIP]
本文的服务端配置请参考我另一篇文章 &lt;a href=&quot;/posts/proxy/vlessxhttpxray&quot;&gt;Xray + Caddy 单端口五合一 VLESS XHTTP 部署&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于三台机器每台机器都配置 5 个出站节点，使用 Jsonc 书写配置将重复大量内容，所以改为支持锚点的 YAML，配合锚点，旧可以在顶部统一定义模板并快速填写节点信息，在出站字段处直接引用，大幅减少重复代码&lt;/p&gt;
&lt;h2&gt;机器信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;机器&lt;/th&gt;
&lt;th&gt;线路&lt;/th&gt;
&lt;th&gt;月配额&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;机器 A：HKG 移动快乐机&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;香港 CMI / 普通国际直连&lt;/td&gt;
&lt;td&gt;1000G @ 500Mbps&lt;/td&gt;
&lt;td&gt;常规网页 / Tg / GitHub / 国际小包&amp;lt;br/&amp;gt;移动回程快但晚高峰差，大包重传高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;机器 B：LAX 三网优化小流量机&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;美西 CN2 GIA / 9929 / CMIN2&lt;/td&gt;
&lt;td&gt;500G @ 200Mbps&lt;/td&gt;
&lt;td&gt;AIGC / Google / 重要业务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;机器 C：LAX 4837 大流量机&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;美西 AS4837 联通优化&lt;/td&gt;
&lt;td&gt;1000G @ 500Mbps&lt;/td&gt;
&lt;td&gt;AIGC 备用 / OpenList / 大流量下载&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;每台机器都构建 5 个节点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;*-vision&lt;/code&gt;：TCP + VLESS + Vision + REALITY 直连；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*-xhttp-reality&lt;/code&gt;：XHTTP + REALITY 直连；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*-cdn-up-reality-down&lt;/code&gt;：上行走 CDN 隐藏客户端 SNI，下行走 REALITY 直连；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*-cdn-all&lt;/code&gt;：纯 CDN 上下行 + ECH；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*-reality-up-cdn-down&lt;/code&gt;：上行直连 REALITY，下行走 CDN&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;踩坑&lt;/h2&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;h3&gt;ECH 纯 IP UDP 动态查询&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如何配置 ECH 请参考文章 &lt;a href=&quot;https://blog.litekin.org/archives/vless-xhttp-cloudflare-ech-doh-pei-zhi-zhu-yi-xiang&quot;&gt;XHTTP + CDN + ECH配置教程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CDN 节点启用 TLS 1.3 ECH 加密，客户端在握手前需获取公钥&lt;/p&gt;
&lt;p&gt;我尝试配置了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里 &lt;code&gt;https://dns.alidns.com/dns-query&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;报错 &lt;code&gt;Post &quot;https://dns.alidns.com/dns-query&quot;: context deadline exceeded&lt;/code&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cloudflare &lt;code&gt;https://cloudflare-dns.com/dns-query&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;报错&lt;code&gt;Failed to query ECH DNS record for domain, An existing connection was forcibly closed by the remote host.&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经过一番捣鼓，原因是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拉取公钥在代理建立前发起（走直连），如果填写阿里云域名 DNS，则需先解析域名并完成 TLS 握手，非常容易触发 xray 硬编码的 5 秒超时……&lt;pre&gt;&lt;code&gt;// L269
dnsTimeoutCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// L288
conn.SetReadDeadline(time.Now().Add(5 * time.Second))
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;至于 CF，可能是我所在的地区无法直连或它的 DoH IP 已经被功夫网阻断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后我翻阅了 Project X 的文档，这部分有提到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;基础格式为 &lt;code&gt;&quot;udp://1.1.1.1&quot;&lt;/code&gt; 表示从 UDP DNS 1.1.1.1 查询，也可以使用 &lt;code&gt;&quot;https://1.1.1.1/dns-query&quot;&lt;/code&gt;(或者 &lt;code&gt;h2c://&lt;/code&gt;) 这样的格式，代表使用 DOH(h2c) 进行查询(实际使用请替换成当地可用的服务器). 上述三种均支持修改端口号，如 &lt;code&gt;udp://1.1.1.1:53&lt;/code&gt;，没写会按照协议默认 53/443.&lt;/p&gt;
&lt;p&gt;特别地，可以使用指定的域名用于查询 ECHConfig, 格式为 &lt;code&gt;&quot;example.com+https://1.1.1.1/dns-query&quot;&lt;/code&gt; 这样 Xray 会强制使用 example.com 的 DNS 记录中的 ECHConfig 用于连接，如果你想从 DNS 获取 ECHConfig 但又不想暴露自己在查询这个域名的 HTTPS 记录或者在这个域名下发布 HTTPS 记录时有一些用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此，使用纯 IP 的 UDP 53 查询成功解决了问题，单次 UDP 报文交互耗时约 10ms（&lt;code&gt;echConfigList: &apos;yourdomain.com+udp://223.5.5.5:53&apos;&lt;/code&gt;）&lt;/p&gt;
&lt;h3&gt;观测器&lt;/h3&gt;
&lt;p&gt;XHTTP 多路复用需要多重 TLS/H2/H3 握手，使用高频探测会引发 &lt;code&gt;Client.Timeout exceeded while awaiting headers&lt;/code&gt; 假死&lt;/p&gt;
&lt;p&gt;因此，我弄了两个观测器，分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;burstObservatory&lt;/code&gt;（高频探测），仅针对 3 个裸流 TCP 节点（&lt;code&gt;*-vision&lt;/code&gt;）做测速；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;observatory&lt;/code&gt;（标准探测），每 30 秒探测一次，负责全部节点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;客户端配置&lt;/h2&gt;
&lt;p&gt;要求 xray-core &amp;gt;= v26.9.9
与 v26.7.28 的变动请看基础出站部分&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# =========================================================================
# 锚点定义
# =========================================================================
x-anchors:
  # -----------------------------------------------------------------------
  # 0. 用户变量
  # -----------------------------------------------------------------------
  # VPS 1: 香港 HKG 移动快乐
  hkg_ip: &amp;amp;hkg_ip &quot;填入IPx.x.x.x&quot;
  hkg_uuid_01: &amp;amp;hkg_uuid_01 &quot;填入UUID 1&quot;
  hkg_uuid_02: &amp;amp;hkg_uuid_02 &quot;填入UUID 2&quot;
  hkg_reality_sni: &amp;amp;hkg_reality_sni &quot;填入REALITY伪装域名&quot;
  hkg_reality_pubkey: &amp;amp;hkg_reality_pubkey &quot;填入公钥&quot;
  hkg_reality_shortid: &amp;amp;hkg_reality_shortid &quot;填入shortID&quot;
  hkg_cdn_domain: &amp;amp;hkg_cdn_domain &quot;填入套CDN的域名&quot;
  hkg_xhttp_path: &amp;amp;hkg_xhttp_path &quot;填入xhttp path&quot;
  hkg_prefer_cdn_domain: &amp;amp;hkg_prefer_cdn_domain &quot;填入套CDN的域名或优选IP&quot; 

  # VPS 2: 美西 LAX 三网优化
  lax_ip: &amp;amp;lax_ip &quot;填入IPx.x.x.x&quot;
  lax_uuid_01: &amp;amp;lax_uuid_01 &quot;填入UUID 1&quot;
  lax_uuid_02: &amp;amp;lax_uuid_02 &quot;填入UUID 2&quot;
  lax_reality_sni: &amp;amp;lax_reality_sni &quot;填入REALITY伪装域名&quot;
  lax_reality_pubkey: &amp;amp;lax_reality_pubkey &quot;填入公钥&quot;
  lax_reality_shortid: &amp;amp;lax_reality_shortid &quot;填入shortID&quot;
  lax_cdn_domain: &amp;amp;lax_cdn_domain &quot;填入套CDN的域名&quot;
  lax_xhttp_path: &amp;amp;lax_xhttp_path &quot;填入xhttp path&quot;
  lax_prefer_cdn_domain: &amp;amp;lax_prefer_cdn_domain &quot;填入套CDN的域名或优选IP&quot;

  # VPS 3: 美西 LAX 4837
  lax4837_ip: &amp;amp;lax4837_ip &quot;填入IPx.x.x.x&quot;
  lax4837_uuid_01: &amp;amp;lax4837_uuid_01 &quot;填入UUID 1&quot;
  lax4837_uuid_02: &amp;amp;lax4837_uuid_02 &quot;填入UUID 2&quot;
  lax4837_reality_sni: &amp;amp;lax4837_reality_sni &quot;填入REALITY伪装域名&quot;
  lax4837_reality_pubkey: &amp;amp;lax4837_reality_pubkey &quot;填入公钥&quot;
  lax4837_reality_shortid: &amp;amp;lax4837_reality_shortid &quot;填入shortID&quot;
  lax4837_cdn_domain: &amp;amp;lax4837_cdn_domain &quot;填入套CDN的域名&quot;
  lax4837_xhttp_path: &amp;amp;lax4837_xhttp_path &quot;填入xhttp path&quot;
  lax4837_prefer_cdn_domain: &amp;amp;lax4837_prefer_cdn_domain &quot;填入套CDN的域名或优选IP&quot;

  # -----------------------------------------------------------------------
  # 1. 协议、混淆模板
  # -----------------------------------------------------------------------
  sockopt: &amp;amp;default_sockopt
    tcpFastOpen: true
    tcpKeepAliveInterval: 15
    domainStrategy: UseIPv4

  xmux: &amp;amp;default_xmux
    maxConcurrency: 16-32
    cMaxReuseTimes: &quot;0&quot;
    hMaxReusableSecs: 1800-3000
    hKeepAlivePeriod: 0

  xhttp_obfs: &amp;amp;default_xhttp_obfs
    sessionIDTable: Alphabet
    sessionIDLength: 12-20
    xPaddingObfsMode: true
    xPaddingMethod: tokenish
    xPaddingPlacement: queryInHeader
    xPaddingKey: t
    xPaddingHeader: Referer
    scStreamUpServerSecs: 30-60
    xmux: *default_xmux

  # CDN TLS / ALPN / ECH 参数
  cdn_tls_hkg: &amp;amp;cdn_tls_hkg
    fingerprint: chrome
    alpn: [h3, h2]
    echConfigList: &apos;填入套CDN的域名+udp://223.5.5.5:53&apos;

  cdn_tls_lax: &amp;amp;cdn_tls_lax
    fingerprint: chrome
    alpn: [h3, h2]
    echConfigList: &apos;填入套CDN的域名.com+udp://223.5.5.5:53&apos;

  cdn_tls_lax4837: &amp;amp;cdn_tls_lax4837
    fingerprint: chrome
    alpn: [h3, h2]
    echConfigList: &apos;填入套CDN的域名+udp://223.5.5.5:53&apos;

# 日志输出
log:
  loglevel: warning
  access: D:\Programs\Proxy\Xray\logs\access.log
  error: D:\Programs\Proxy\Xray\logs\error.log
  dnsLog: false

# API
api:
  tag: api
  listen: 127.0.0.1:10085
  services: [HandlerService, LoggerService, StatsService, RoutingService, ObservatoryService]

policy:
  levels:
    &quot;0&quot;:
      statsUserUplink: true
      statsUserDownlink: true
  system:
    statsInboundUplink: true
    statsInboundDownlink: true
    statsOutboundUplink: true
    statsOutboundDownlink: true

stats: {}

# 节点观测器配置
observatory:
  # 1. 节点健康状态常规观测 (用于 Balancer 持续挑选延迟最低/健康的节点)
  subjectSelector: [HKG-, LAX-, Lax4837-]
  probeUrl: https://www.gstatic.com/generate_204
  probeInterval: 30s
  enableConcurrency: true

burstObservatory:
  # 2. 仅针对 Vision 极速直连节点做高频测速
  subjectSelector: [HKG-vision, LAX-vision, Lax4837-vision]
  pingConfig:
    destination: https://www.gstatic.com/generate_204
    interval: 30s
    timeout: 6s
    sampling: 3
    httpMethod: HEAD

# =========================================================================
# 入站配置
# =========================================================================
inbounds:
# Xray 原生 TUN。如果使用 SingTUN 转发到 Socks，把这里保持注释或删掉
# - tag: tun-in
#   protocol: tun
#   settings:
#     name: utun10
#     desc: Wintun
#     mtu: 1500
#     gateway: [&quot;198.18.0.1/16&quot;, &quot;fdfe:dcba:9876::1/64&quot;]
#     dns: [&quot;1.1.1.1&quot;, &quot;8.8.8.8&quot;]
#     autoSystemRoutingTable: [&quot;0.0.0.0/0&quot;, &quot;::/0&quot;]
#     autoOutboundsInterface: auto
#   sniffing:
#     enabled: true
#     destOverride: [http, tls, quic]
#     metadataOnly: false
#     routeOnly: false

# Socks 入站
  - tag: socks-in
    port: 10808
    listen: &quot;::&quot;
    protocol: socks
    settings:
      auth: noauth
      udp: true
    sniffing:
      enabled: true
      destOverride: [http, tls, quic]
      metadataOnly: false
      routeOnly: false

# HTTP 入站
  - tag: http-in
    port: 10809
    listen: &quot;::&quot;
    protocol: http
    sniffing:
      enabled: true
      destOverride: [http, tls, quic]
      metadataOnly: false
      routeOnly: false

# =========================================================================
# 出站配置
# =========================================================================
outbounds:
# -----------------------------------------------------------------------
# VPS 1
# -----------------------------------------------------------------------
- tag: HKG-vision
  protocol: vless
  settings:
    vnext:
    - address: *hkg_ip
      port: 443
      users:
      - id: *hkg_uuid_01
        flow: xtls-rprx-vision
        encryption: none
  streamSettings:
    network: tcp
    security: reality
    realitySettings:
      serverName: *hkg_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *hkg_reality_pubkey
      shortId: *hkg_reality_shortid
      spiderX: /
    sockopt: *default_sockopt

- tag: HKG-xhttp-reality
  protocol: vless
  settings:
    vnext:
    - address: *hkg_ip
      port: 443
      users:
      - id: *hkg_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *hkg_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *hkg_reality_pubkey
      shortId: *hkg_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *hkg_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: HKG-cdn-up-reality-down
  protocol: vless
  settings:
    vnext:
    - address: *hkg_prefer_cdn_domain
      port: 443
      users:
      - id: *hkg_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *hkg_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_hkg
    xhttpSettings:
      host: *hkg_cdn_domain
      path: *hkg_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *hkg_ip
        port: 443
        network: xhttp
        security: reality
        realitySettings:
          serverName: *hkg_reality_sni
          fingerprint: chrome
          show: false
          publicKey: *hkg_reality_pubkey
          shortId: *hkg_reality_shortid
          spiderX: /
        xhttpSettings:
          path: *hkg_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: HKG-cdn-all
  protocol: vless
  settings:
    vnext:
    - address: *hkg_prefer_cdn_domain
      port: 443
      users:
      - id: *hkg_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *hkg_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_hkg
    xhttpSettings:
      host: *hkg_cdn_domain
      path: *hkg_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: HKG-reality-up-cdn-down
  protocol: vless
  settings:
    vnext:
    - address: *hkg_ip
      port: 443
      users:
      - id: *hkg_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *hkg_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *hkg_reality_pubkey
      shortId: *hkg_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *hkg_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *hkg_prefer_cdn_domain
        port: 443
        network: xhttp
        security: tls
        tlsSettings:
          serverName: *hkg_cdn_domain
          &amp;lt;&amp;lt;: *cdn_tls_hkg
        xhttpSettings:
          host: *hkg_cdn_domain
          path: *hkg_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

# -----------------------------------------------------------------------
# VPS 2
# -----------------------------------------------------------------------
- tag: LAX-vision
  protocol: vless
  settings:
    vnext:
    - address: *lax_ip
      port: 443
      users:
      - id: *lax_uuid_01
        flow: xtls-rprx-vision
        encryption: none
  streamSettings:
    network: tcp
    security: reality
    realitySettings:
      serverName: *lax_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax_reality_pubkey
      shortId: *lax_reality_shortid
      spiderX: /
    sockopt: *default_sockopt

- tag: LAX-xhttp-reality
  protocol: vless
  settings:
    vnext:
    - address: *lax_ip
      port: 443
      users:
      - id: *lax_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *lax_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax_reality_pubkey
      shortId: *lax_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *lax_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: LAX-cdn-up-reality-down
  protocol: vless
  settings:
    vnext:
    - address: *lax_prefer_cdn_domain
      port: 443
      users:
      - id: *lax_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *lax_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_lax
    xhttpSettings:
      host: *lax_cdn_domain
      path: *lax_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *lax_ip
        port: 443
        network: xhttp
        security: reality
        realitySettings:
          serverName: *lax_reality_sni
          fingerprint: chrome
          show: false
          publicKey: *lax_reality_pubkey
          shortId: *lax_reality_shortid
          spiderX: /
        xhttpSettings:
          path: *lax_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: LAX-cdn-all
  protocol: vless
  settings:
    vnext:
    - address: *lax_prefer_cdn_domain
      port: 443
      users:
      - id: *lax_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *lax_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_lax
    xhttpSettings:
      host: *lax_cdn_domain
      path: *lax_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: LAX-reality-up-cdn-down
  protocol: vless
  settings:
    vnext:
    - address: *lax_ip
      port: 443
      users:
      - id: *lax_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *lax_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax_reality_pubkey
      shortId: *lax_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *lax_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *lax_prefer_cdn_domain
        port: 443
        network: xhttp
        security: tls
        tlsSettings:
          serverName: *lax_cdn_domain
          &amp;lt;&amp;lt;: *cdn_tls_lax
        xhttpSettings:
          host: *lax_cdn_domain
          path: *lax_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

# -----------------------------------------------------------------------
# VPS 3
# -----------------------------------------------------------------------
- tag: Lax4837-vision
  protocol: vless
  settings:
    vnext:
    - address: *lax4837_ip
      port: 443
      users:
      - id: *lax4837_uuid_01
        flow: xtls-rprx-vision
        encryption: none
  streamSettings:
    network: tcp
    security: reality
    realitySettings:
      serverName: *lax4837_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax4837_reality_pubkey
      shortId: *lax4837_reality_shortid
      spiderX: /
    sockopt: *default_sockopt

- tag: Lax4837-xhttp-reality
  protocol: vless
  settings:
    vnext:
    - address: *lax4837_ip
      port: 443
      users:
      - id: *lax4837_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *lax4837_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax4837_reality_pubkey
      shortId: *lax4837_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *lax4837_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: Lax4837-cdn-up-reality-down
  protocol: vless
  settings:
    vnext:
    - address: *lax4837_prefer_cdn_domain
      port: 443
      users:
      - id: *lax4837_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *lax4837_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_lax4837
    xhttpSettings:
      host: *lax4837_cdn_domain
      path: *lax4837_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *lax4837_ip
        port: 443
        network: xhttp
        security: reality
        realitySettings:
          serverName: *lax4837_reality_sni
          fingerprint: chrome
          show: false
          publicKey: *lax4837_reality_pubkey
          shortId: *lax4837_reality_shortid
          spiderX: /
        xhttpSettings:
          path: *lax4837_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: Lax4837-cdn-all
  protocol: vless
  settings:
    vnext:
    - address: *lax4837_prefer_cdn_domain
      port: 443
      users:
      - id: *lax4837_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: tls
    tlsSettings:
      serverName: *lax4837_cdn_domain
      &amp;lt;&amp;lt;: *cdn_tls_lax4837
    xhttpSettings:
      host: *lax4837_cdn_domain
      path: *lax4837_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

- tag: Lax4837-reality-up-cdn-down
  protocol: vless
  settings:
    vnext:
    - address: *lax4837_ip
      port: 443
      users:
      - id: *lax4837_uuid_02
        encryption: none
  streamSettings:
    network: xhttp
    security: reality
    realitySettings:
      serverName: *lax4837_reality_sni
      fingerprint: chrome
      show: false
      publicKey: *lax4837_reality_pubkey
      shortId: *lax4837_reality_shortid
      spiderX: /
    xhttpSettings:
      path: *lax4837_xhttp_path
      mode: auto
      &amp;lt;&amp;lt;: *default_xhttp_obfs
      downloadSettings:
        address: *lax4837_prefer_cdn_domain
        port: 443
        network: xhttp
        security: tls
        tlsSettings:
          serverName: *lax4837_cdn_domain
          &amp;lt;&amp;lt;: *cdn_tls_lax4837
        xhttpSettings:
          host: *lax4837_cdn_domain
          path: *lax4837_xhttp_path
          mode: auto
          &amp;lt;&amp;lt;: *default_xhttp_obfs
    sockopt: *default_sockopt

# 基础出站
- tag: direct
  protocol: freedom
  # v26.9.8 起废弃 freedom.settings.domainStrategy 
  # 推荐统一移入 freedom.streamSettings.sockopt
  # 显式配置 sockopt 可继承 TCP Fast Open 0-RTT 握手加速与 NAT 防老化
  streamSettings:
    sockopt: *default_sockopt

- tag: block
  protocol: blackhole
  # v26.9.8 新增响应模式，显式配置 type: http 可在拦截广告时即时回送 HTTP 403，加速网页渲染
  settings:
    response:
      type: http

- tag: dns-out
  protocol: dns

# =========================================================================
# DNS 配置
# =========================================================================
dns:
  tag: dns-proxy
  hosts:
    # 防止 DoH 域名自身递归解析死锁
    dns.alidns.com: [223.5.5.5, 223.6.6.6]
    doh.pub: [1.12.12.12, 120.53.53.53]
    dns.google: [8.8.8.8, 8.8.4.4]
    cloudflare-dns.com: [1.1.1.1, 1.0.0.1]
    www.gstatic.com: [142.250.73.142, 142.251.46.65, 172.253.117.188]
  servers:
  # 1. 国外域名
  - address: 1.1.1.1
    skipFallback: true
    domains: [&quot;geosite:google&quot;, &quot;geosite:category-scholar-!cn&quot;, &quot;geosite:google-scholar&quot;, &quot;geosite:github&quot;]

  # 2. 国内域名
  - tag: dns-direct
    address: https://dns.alidns.com/dns-query
    skipFallback: false
    domains: [&quot;geosite:cn&quot;]
    expectIPs: [&quot;geoip:cn&quot;]

  # 3. 节点自身域名查询
  - tag: dns-self
    address: https://dns.alidns.com/dns-query
    skipFallback: false
    domains: [&quot;domain:填入VPS1domain.com&quot;, &quot;domain:填入VPS2domain.com&quot;, &quot;domain:填入VPS3domain.com&quot;]
    # domain 只写一级域名即可
    expectIPs: [] # 解析出的可能是 Cloudflare 海外 IP，这里不建议强制 expectIPs: [&quot;geoip:cn&quot;]

  # 4. 国内备用查询
  - tag: dns-direct-fallback
    address: https://doh.pub/dns-query
    skipFallback: true
    domains: [&quot;geosite:cn&quot;]

  # 5. 未知域名兜底查询
  - address: 8.8.8.8
    clientIp: x.x.x.x # 客户端 ECS，填入你常驻宽带的 IP 即可 ；如果切换到手机流量，公共 DoH 会依据出口智能识别
    skipFallback: false

# =========================================================================
# 路由规则
# =========================================================================
routing:
  domainStrategy: IPIfNonMatch
  domainMatcher: mph
  balancers:
  # 负载均衡策略组
  # 1. 常规代理组用前缀自适应，leastPing 自动选择延迟最低节点
  - tag: balancer-default
    selector: [HKG-, LAX-, Lax4837-]
    fallbackTag: HKG-cdn-all
    strategy:
      type: leastPing

  # 2. AIGC 组选择美西优化节点中抖动最小的节点
  - tag: balancer-aigc
    selector: [LAX-, Lax4837-]
    fallbackTag: LAX-cdn-all
    strategy:
      type: leastLoad

  # 3. Download 组选择 Lax4837 线路
  # 不选 HKG 是因为我这台机大包重传太高
  - tag: balancer-download
    selector: [Lax4837-]
    fallbackTag: Lax4837-cdn-all
    strategy:
      type: leastPing

  rules:
  # ---------------------------------------------------------------------
  # [0-DNS 内部路由]
  # ---------------------------------------------------------------------
  - inboundTag: [dns-direct, dns-direct-fallback, dns-self]
    outboundTag: direct

  - inboundTag: [dns-proxy]
    balancerTag: balancer-default

  # ---------------------------------------------------------------------
  # [1-block]
  # ---------------------------------------------------------------------
  - domain:
    - geosite:category-ads-all
    - geosite:category-stun
    outboundTag: block

  - port: 3478,3479,5348,5349,5350,5351,19302
    outboundTag: block

  # 阻止海外 UDP 443 QUIC
  - network: udp
    port: 443
    domain: [&quot;geosite:cn&quot;]
    outboundTag: direct

  - network: udp
    port: 443
    ip: [&quot;geoip:cn&quot;]
    outboundTag: direct

  - network: udp
    port: 443
    outboundTag: block

  # ---------------------------------------------------------------------
  # [2-direct]
  # ---------------------------------------------------------------------
  - process:
  # 如果你用 SingTUN，这里可以不写，在 Singbox 那边写进程直连就行
    - Weixin.exe
    - QQ.exe
    - QQMusic.exe
    - StarRail.exe
    - YuanShen.exe
    - ZenlessZoneZero.exe
    outboundTag: direct
  
  - domain:
    - domain:quark.cn
    - keyword:hoyoverse
    - regexp:\w{10}\.(adobe|adobestats)\.io
    - geosite:category-ai-cn
    - geosite:jetbrains
    - geosite:bing@cn
    - geosite:microsoft@cn
    - geosite:category-bank-cn
    - geosite:category-games-cn
    - geosite:category-cdn-cn
    - geosite:category-httpdns-cn
    - geosite:category-ntp-cn
    outboundTag: direct

  # ---------------------------------------------------------------------
  # [3-proxy]
  # ---------------------------------------------------------------------
  - domain: [&quot;geosite:google&quot;]
    outboundTag: LAX-xhttp-reality

  - process: [ChatGPT.exe, Obsidian.exe, codex.exe, Antigravity.exe]
    balancerTag: balancer-aigc

  - process: [AyuGram.exe]
    balancerTag: balancer-default
  
  - domain:
    - geosite:category-ai-!cn
    - geosite:category-ai-chat-!cn
    - geosite:openai
    - geosite:anthropic
    - geosite:github
    - geosite:gitlab
    - geosite:aws
    - geosite:azure
    - geosite:category-scholar-!cn
    - geosite:google-scholar
    balancerTag: balancer-aigc

  - domain:
    - domain:afdian.com
    - domain:mikanani.me
    - domain:kox.moe
    - domain:annas-archive.org
    - domain:docs.rs
    - full:dict.eudic.net
    balancerTag: balancer-default
  
  - domain: [&quot;geosite:telegram&quot;]
    ip: [&quot;geoip:telegram&quot;]
    balancerTag: balancer-default

  - domain: [&quot;geosite:cloudflare&quot;]
    ip: [&quot;geoip:cloudflare&quot;]
    balancerTag: balancer-default

  - domain:
    - geosite:netflix
    ip: [&quot;geoip:netflix&quot;]
    balancerTag: balancer-download

  - domain:
    - geosite:youtube
    - geosite:bahamut
    balancerTag: balancer-download
  
  - domain:
    - geosite:microsoft
    - geosite:bing
    - geosite:onedrive
    - geosite:nvidia
    - geosite:ubuntu
    - geosite:rust
    - geosite:category-cdn-!cn
    balancerTag: balancer-download

  # ---------------------------------------------------------------------
  # [4-default]
  # ---------------------------------------------------------------------
  - ip: [&quot;geoip:private&quot;, &quot;geoip:cn&quot;]
    outboundTag: direct

  - domain: [&quot;geosite:cn&quot;]
    outboundTag: direct

  # 相当于 mihomo 的 `MATCH, Proxy`
  - network: tcp,udp
    balancerTag: balancer-default

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>OpenList 播放内嵌软字幕与外挂字幕视频的小技巧</title><link>https://blog.rokutosei.com/posts/seedbox/tips-for-openlist/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/seedbox/tips-for-openlist/</guid><description>本文记录 OpenList 跳转外部播放器部分问题的解决方法</description><pubDate>Sat, 25 Jul 2026 23:27:05 GMT</pubDate><content:encoded>&lt;p&gt;OpenList 在浏览器内置播放器中处理字幕时存在一些限制，本文记录目前有效的解决思路。&lt;/p&gt;
&lt;h2&gt;内嵌软字幕&lt;/h2&gt;
&lt;p&gt;遇到已内嵌软字幕的文件，播放时却无字幕显示的情况，可点击视频页面下方的小按钮，跳转到外部播放器播放。&lt;/p&gt;
&lt;h3&gt;PC 端（Windows）&lt;/h3&gt;
&lt;p&gt;推荐使用 &lt;strong&gt;MPV&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;可配合以下小工具实现从 OpenList 页面一键唤起：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;outlook84/mpv-handler-openlist&quot;}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2026-10-16 补充：&lt;/p&gt;
&lt;p&gt;目前推荐使用 WebDav，详情请看我&lt;a href=&quot;/posts/seedbox/rclone-mount-openlist-windows/&quot;&gt;另一篇文章&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Android 端&lt;/h3&gt;
&lt;p&gt;推荐 &lt;strong&gt;VLC&lt;/strong&gt; 或 &lt;strong&gt;MX Player&lt;/strong&gt;（其中 VLC 可正常解析 MKV 内嵌软字幕）&lt;/p&gt;
&lt;p&gt;使用时需要注意不要直接点击视频页面的「VLC 图标」（会提示“无法解析视频”），改点旁边的「安卓图标」按钮，然后在弹出的系统选择框里选 VLC 即可正常播放&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;为什么点击 VLC 会报错？&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;OpenList 前端（&lt;code&gt;video_box.tsx&lt;/code&gt;）定义的唤起模板为 &lt;code&gt;vlc://$durl&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ icon: &quot;vlc&quot;, name: &quot;VLC&quot;, scheme: &quot;vlc://$durl&quot; },
{ icon: &quot;android&quot;, name: &quot;Android&quot;, scheme: &quot;intent:$durl#Intent;type=video/*;S.title=$name;end&quot; },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当直链为 &lt;code&gt;https://...&lt;/code&gt; 时，前端拼接出的 &lt;code&gt;vlc://https://...&lt;/code&gt; 在浏览器导航过程中会被自动剥离冒号，变成 &lt;code&gt;vlc://https//myopenlist.example.com/...&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在 VLC 源码（&lt;code&gt;modules/access/idummy.c&lt;/code&gt;）中，&lt;code&gt;vlc://&lt;/code&gt; 属于控制指令协议（比如 &lt;code&gt;vlc://quit&lt;/code&gt;），并非网络流协议：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vlc_module_begin ()
    set_shortname( N_(&quot;Dummy&quot;) )
    add_shortcut( &quot;dummy&quot;, &quot;vlc&quot; )   // 注册 vlc:// 协议
vlc_module_end ()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于找不到对应的内部指令，VLC 会直接在日志中报错并终止播放：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main debug: creating demux: access=&apos;vlc&apos; demux=&apos;any&apos; location=&apos;https//myopenlist.example.com/d/Anime/test.mkv?sign=xxx:0&apos;
idummy error: unknown command `https//myopenlist.example.com/d/Anime/test.mkv?sign=xxx:0`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相比之下，点击「安卓图标」按钮生成的是标准的 Android Intent 链接（&lt;code&gt;intent:https://...#Intent;type=video/*&lt;/code&gt;），系统会将原样无损的 &lt;code&gt;https://&lt;/code&gt; 直链传给 VLC，从而能正常播放并加载内嵌软字幕&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2026-10-16 补充：&lt;/p&gt;
&lt;p&gt;安卓端使用支持 WebDav 的播放器可能体验更好，目前我发现下面的项目符合我的需求，内嵌软字幕的 MKV 也能正常解析&lt;/p&gt;
&lt;p&gt;可惜没有中文界面，某酷安有人做了汉化，但不开源，感兴趣可自行搜索&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;marlboro-advance/mpvEx&quot;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;外挂字幕&lt;/h2&gt;
&lt;p&gt;即便字幕文件与视频文件同名，且在同一目录，但 OpenList 并不会自动加载字幕&lt;/p&gt;
&lt;p&gt;目前暂未找到 OpenList 自动加载外挂字幕的可靠方法&lt;/p&gt;
&lt;p&gt;替代做法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单独下载字幕文件到本地&lt;/li&gt;
&lt;li&gt;在外部播放器中手动选择该字幕文件&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Debian 12 启用 unattended-upgrades 自动安全更新</title><link>https://blog.rokutosei.com/posts/linux/upgrades/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/linux/upgrades/</guid><description>为 Debian 12 启用自动安全更新</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;对于长期运行的 Debian 12 服务器，建议启用 &lt;code&gt;unattended-upgrades&lt;/code&gt; 自动安装官方安全更新，以便及时修复已公开的安全漏洞&lt;/p&gt;
&lt;p&gt;本文仅启用 &lt;strong&gt;官方安全更新&lt;/strong&gt;，&lt;strong&gt;不启用自动重启&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;更新软件源并安装所需软件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install unattended-upgrades needrestart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unattended-upgrades&lt;/code&gt;：自动安装官方安全更新。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;needrestart&lt;/code&gt;：更新完成后提示哪些服务或系统需要重启。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;启用自动安全更新&lt;/h2&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dpkg-reconfigure --priority=low unattended-upgrades
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现如下提示时选择 &lt;strong&gt;Yes&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Automatically download and install stable updates?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成后，系统将每天自动检查并安装 Debian 官方仓库提供的安全更新&lt;/p&gt;
&lt;h2&gt;验证配置（可选）&lt;/h2&gt;
&lt;p&gt;确认自动更新已启用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /etc/apt/apt.conf.d/20auto-upgrades
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常情况下应包含：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;APT::Periodic::Update-Package-Lists &quot;1&quot;;
APT::Periodic::Unattended-Upgrade &quot;1&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自动重启&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;不建议启用自动重启&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;unattended-upgrades&lt;/code&gt; 默认不会自动重启服务器，即使安装了新的内核，也仅会提示需要重启&lt;/p&gt;
&lt;p&gt;可检查配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep Automatic-Reboot /etc/apt/apt.conf.d/50unattended-upgrades
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认未设置为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Unattended-Upgrade::Automatic-Reboot &quot;true&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;仅自动更新通过 APT 安装的软件包。&lt;/li&gt;
&lt;li&gt;GitHub 下载的二进制程序、手动安装的软件及第三方脚本安装的软件不会自动更新。&lt;/li&gt;
&lt;li&gt;更新完成后，&lt;code&gt;needrestart&lt;/code&gt; 会提示需要重启的服务或系统。&lt;/li&gt;
&lt;li&gt;建议仍定期手动执行完整的软件更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;维护&lt;/h2&gt;
&lt;p&gt;建议每月执行一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt full-upgrade
sudo apt autoremove
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据 &lt;code&gt;needrestart&lt;/code&gt; 的提示，选择重启相关服务或在维护窗口重启服务器&lt;/p&gt;
</content:encoded></item><item><title>个人博客放行谷歌爬虫 IP</title><link>https://blog.rokutosei.com/posts/others/googlebot/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/others/googlebot/</guid><description>N/A</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;防火墙使用 &lt;a href=&quot;https://blog.rokutosei.com/posts/security/block_asn_using_iptables_and_ipset&quot;&gt;&lt;code&gt;deploy_firewall.sh&lt;/code&gt;&lt;/a&gt; 脚本管理，其中 &lt;code&gt;bad_asn_v4&lt;/code&gt; ipset 封禁了大量 ASN 的 IP 段&lt;/p&gt;
&lt;p&gt;Google 搜索爬虫（Googlebot）的 IP 恰好落在被封禁的范围内，导致 Google Search Console 无法抓取 &lt;code&gt;robots.txt&lt;/code&gt; 和 &lt;code&gt;sitemap-index.xml&lt;/code&gt;，提示 &lt;code&gt;Robots.txt 无法访问&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;本文记录解决方案&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;排查过程&lt;/h2&gt;
&lt;p&gt;在 VPS 上执行 &lt;code&gt;iptables -L INPUT -v -n&lt;/code&gt; 发现有两层 DROP 规则：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chain INPUT (policy DROP)
num   pkts target  prot  in  out  source     destination
3     14778 DROP   0     --  *   *    45.0.0.0/8      0.0.0.0/0
4     35911 DROP   0     --  *   *    0.0.0.0/0       0.0.0.0/0  match-set bad_asn_v4 src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Googlebot 的 IP 属于 &lt;code&gt;bad_asn_v4&lt;/code&gt; 匹配的 Google ASN（15169），在规则 4 被直接丢弃&lt;/p&gt;
&lt;p&gt;虽然 VPS 本地 &lt;code&gt;wget&lt;/code&gt; 能正常返回（绕过 iptables），但外部 Googlebot 始终无法连接&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;bad_asn_v4&lt;/code&gt; DROP 规则之前插入一条白名单，仅放行 Google 爬虫（Googlebot）的 80/443 端口流量&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意白名单规则必须插在 &lt;code&gt;bad_asn_v4 DROP&lt;/code&gt; &lt;strong&gt;之前&lt;/strong&gt;，否则不会生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;第一步：安装 jq&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install jq -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第二步：创建 ipset 并拉取 Googlebot IP 列表&lt;/h3&gt;
&lt;p&gt;只放行 Google 搜索爬虫，使用官方发布的专用 IP 列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://developers.google.com/static/crawling/ipranges/common-crawlers.json
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo ipset create google_whitelist hash:net 2&amp;gt;/dev/null

curl -s https://developers.google.com/static/crawling/ipranges/common-crawlers.json | \
  jq -r &apos;.prefixes[] | .ipv4Prefix // .ipv6Prefix // empty&apos; | \
  while read cidr; do
    sudo ipset add google_whitelist &quot;$cidr&quot; 2&amp;gt;/dev/null
  done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第三步：插入 iptables 白名单规则&lt;/h3&gt;
&lt;p&gt;放在 &lt;code&gt;bad_asn_v4&lt;/code&gt; DROP 规则&lt;strong&gt;之前&lt;/strong&gt;（45.0.0.0/8 DROP 之后，即第 4 条位置）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo iptables -I INPUT 4 -p tcp -m multiport --dports 80,443 \
  -m set --match-set google_whitelist src -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Googlebot 请求到 80/443 端口时，先在规则 4 匹配白名单直接 ACCEPT，不会被后续的 &lt;code&gt;bad_asn_v4&lt;/code&gt; DROP&lt;/p&gt;
&lt;h3&gt;第四步：持久化&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第五步：设置定时更新（可选）&lt;/h3&gt;
&lt;p&gt;Google 的 IP 段会动态变化，每周自动同步一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加一行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 3 * * 1 curl -s https://developers.google.com/static/crawling/ipranges/common-crawlers.json | jq -r &apos;.prefixes[] | .ipv4Prefix // .ipv6Prefix // empty&apos; | while read cidr; do ipset add google_whitelist &quot;$cidr&quot; 2&amp;gt;/dev/null; done &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每周一凌晨 3 点自动更新&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;验证&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 检查 iptables 规则顺序
sudo iptables -L INPUT -v -n --line-numbers

# 期望输出：白名单规则（第4条）在 bad_asn 规则（第5条）之前
# 4    ACCEPT  tcp  --  *  *  0.0.0.0/0  0.0.0.0/0  multiport dports 80,443 match-set google_whitelist src
# 5    DROP    0   --  *  *  0.0.0.0/0  0.0.0.0/0  match-set bad_asn_v4 src

# 检查 ipset 条目数
sudo ipset list google_whitelist | wc -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 Google Search Console 重新测试抓取&lt;/p&gt;
</content:encoded></item><item><title>[弃用] 服务端：单端口五合一节点配置速查</title><link>https://blog.rokutosei.com/posts/proxy/vlessxhttpproxysimplify/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/vlessxhttpproxysimplify/</guid><description>省略系统安全配置，仅提供 Xray+Caddy+Mihomo 架构下 REALITY 直连、上下行分离及 CDN 的核心节点配置。</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/posts/proxy/vlessxhttpxray&quot;&gt;已彻底转向 Xray-core&lt;/a&gt;，本文不再维护，请自行判断是否过时&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;观前提醒&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文仅给出三份重要的配置示例，&lt;strong&gt;阅读需具备相关知识&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你是初次搭建，建议查看&lt;a href=&quot;https://blog.rokutosei.com/posts/proxy/vlessxhttpproxy/&quot;&gt;完整版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本教程基于 &lt;code&gt;Xray 服务端 + Caddy 反代 + mihomo 客户端&lt;/code&gt; 构建&lt;/p&gt;
&lt;p&gt;本教程几乎全程手敲命令，不借助 3x-ui 此类面板，需要一定耐心&lt;/p&gt;
&lt;p&gt;如果想一键部署，很遗憾，&lt;strong&gt;本文不适合你&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;XHTTP 五合一指的是在同一台 VPS 的 443 端口实现了五个出站节点：&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看 适用场景&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（此处部分引用 @Benjamin1919 大佬的&lt;a href=&quot;https://github.com/XTLS/Xray-core/discussions/4118&quot;&gt;教程原文案&lt;/a&gt;）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;出站 1：XTLS(Vision) + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端 GUI 不支持 XHTTP&lt;/li&gt;
&lt;li&gt;不想开启 TCP 多路复用&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 2：XHTTP + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都比较好&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 3：上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较差，回程（VPS → 客户端）线路较好&lt;/li&gt;
&lt;li&gt;日常使用更偏重下载，很少上传&lt;/li&gt;
&lt;li&gt;隐藏上行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 4：XHTTP + TLS(ECH) 过 CDN&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都很差&lt;/li&gt;
&lt;li&gt;不希望 VPS 的 IP 暴露在公网&lt;/li&gt;
&lt;li&gt;VPS 的 IP 已被墙&lt;/li&gt;
&lt;li&gt;隐藏 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 5：上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较好，回程（VPS → 客户端）线路较差&lt;/li&gt;
&lt;li&gt;日常使用更偏重上传，很少下载&lt;/li&gt;
&lt;li&gt;隐藏下行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C&quot;&gt;1. 准备工作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-cloudflare-%E9%85%8D%E7%BD%AE&quot;&gt;2. Cloudflare 配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E6%B7%BB%E5%8A%A0-dns-%E8%AE%B0%E5%BD%95&quot;&gt;2.1 添加 DNS 记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-ssltls-%E8%AE%BE%E7%BD%AE&quot;&gt;2.2 SSL/TLS 设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-%E7%BC%93%E5%AD%98%E8%A7%84%E5%88%99%E8%AE%BE%E7%BD%AE&quot;&gt;2.3 缓存规则设置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E5%AE%89%E8%A3%85-xray-core-%E4%B8%8E-caddy&quot;&gt;3. 安装 Xray-core 与 Caddy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-%E5%AE%89%E8%A3%85-xray-core&quot;&gt;3.1 安装 Xray-core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-%E7%94%9F%E6%88%90%E5%87%AD%E6%8D%AE&quot;&gt;3.2 生成凭据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-%E5%86%99%E5%85%A5-xray-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&quot;&gt;3.3 写入 Xray 配置文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#34-%E5%AE%89%E8%A3%85-caddy&quot;&gt;3.4 安装 Caddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#35-%E7%BC%96%E5%86%99-caddyfile&quot;&gt;3.5 编写 Caddyfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#36-%E7%94%A8%E6%88%B7%E7%BB%84%E4%B8%8E%E8%BF%90%E8%A1%8C%E7%9B%AE%E5%BD%95%E8%AE%BE%E7%BD%AE&quot;&gt;3.6 用户组与运行目录设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#37-%E7%94%B3%E8%AF%B7%E5%85%AC%E6%9C%89%E5%8F%97%E4%BF%A1%E4%BB%BB%E8%AF%81%E4%B9%A6&quot;&gt;3.7 申请公有受信任证书&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#38-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1&quot;&gt;3.8 启动服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#39-%E5%90%8E%E7%BB%AD%E6%9B%B4%E6%96%B0&quot;&gt;3.9 后续更新&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%85%8D%E7%BD%AE&quot;&gt;4. 客户端配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#41-mihomo-client-config&quot;&gt;4.1 mihomo Client Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#42-alpnech-%E4%B8%8E-xmux-%E8%AF%B4%E6%98%8E&quot;&gt;4.2 ALPN、ECH 与 XMUX 说明&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#alpn&quot;&gt;ALPN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ech&quot;&gt;ECH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#xmux%E9%93%BE%E6%8E%A5%E5%A4%8D%E7%94%A8&quot;&gt;XMUX（链接复用）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8F%8B%E6%83%85%E6%8E%A8%E8%8D%90&quot;&gt;友情推荐&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. 准备工作&lt;/h1&gt;
&lt;p&gt;在开始之前，请准备好以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一个个人域名&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个通过支付验证的 Cloudflare 账号&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一台拥有 root 完全访问权限的 VPS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
为避免纠纷，本文&lt;strong&gt;不提供任何 VPS 商家推荐或购买指导&lt;/strong&gt;，请自行选择。&lt;/p&gt;
&lt;p&gt;本方案属于 Xray 前置、REALITY 回落到本机 Caddy，不需要配置 &lt;code&gt;limitFallbackUpload&lt;/code&gt;，&lt;/p&gt;
&lt;p&gt;本文中的 &lt;code&gt;&amp;lt;VPS_IP&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_USER&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt; 均为占位符，实际操作时请替换为你的真实 IP、用户名和域名。&lt;/p&gt;
&lt;p&gt;SSH 端口以 &lt;code&gt;&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt; 表示（示例为 &lt;code&gt;54321&lt;/code&gt;），请根据实际部署修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;2. Cloudflare 配置&lt;/h1&gt;
&lt;h2&gt;2.1 添加 DNS 记录&lt;/h2&gt;
&lt;p&gt;将域名托管到 Cloudflare，添加 DNS 解析记录：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;记录类型&lt;/th&gt;
&lt;th&gt;子域名&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;小黄云（Proxy）&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;td&gt;CDN 回源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REALITY.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;关闭&lt;/td&gt;
&lt;td&gt;REALITY 握手直连&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;如果需要双栈，可额外添加 AAAA 记录，可复用同一个子域名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2.2 SSL/TLS 设置&lt;/h2&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 概述 -&amp;gt; 配置 -&amp;gt; 加密模式和源连接设置 -&amp;gt; 加密模式设置为 &lt;code&gt;完全（严格）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 边缘证书 -&amp;gt; 开启 TLS 1.3&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; 开启 gRPC&lt;/p&gt;
&lt;h2&gt;2.3 缓存规则设置&lt;/h2&gt;
&lt;p&gt;为避免 XHTTP 请求被缓存，创建缓存规则：&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;缓存&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt; -&amp;gt; 创建缓存规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名称：随意&lt;/li&gt;
&lt;li&gt;&lt;code&gt;如果传入请求匹配…&lt;/code&gt; -&amp;gt; 选择 &lt;code&gt;自定义筛选表达式&lt;/code&gt; -&amp;gt; 点击 &lt;code&gt;编辑表达式&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入（替换为你的域名和路径）：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&quot;) or (http.request.uri.path contains &quot;/&amp;lt;YOUR_XHTTP_PATH&amp;gt;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;缓存资格&lt;/code&gt; → 设置为 &lt;code&gt;绕过缓存&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 安装 Xray-core 与 Caddy&lt;/h1&gt;
&lt;h2&gt;3.1 安装 Xray-core&lt;/h2&gt;
&lt;p&gt;通过官方脚本裸装（Bare-metal）并使用 systemd 管理：&lt;/p&gt;
&lt;p&gt;推荐安装 Pre-release 版本，目前 Stable 版本还停留在 v26.3.27，新版本包含 XHTTP 修复和功能修复等&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;发版策略说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RPRX(Owner):&lt;/p&gt;
&lt;p&gt;忘公开说明一下了，关于 Xray-core 的发版策略， pre-release 有可能是实际意义上的 stable，而 latest 也不等于“没有 bug”&lt;/p&gt;
&lt;p&gt;没标 latest 通常是因为我觉得下个 stable 该包含什么但它还没有包含，&lt;s&gt;或者单纯懒得写 release notes 那就算了下次吧，感觉比写代码都麻烦&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;via https://t.me/projectXray/5113846&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;mihomo 客户端兼容性说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Xray-core v26.7.11 增加了 REALITY 最低客户端版本校验（&lt;code&gt;minClientVer&lt;/code&gt;），默认要求客户端版本 ≥ &lt;code&gt;26.3.27&lt;/code&gt;
由于 mihomo 底层硬编码了版本号 &lt;code&gt;1.8.2&lt;/code&gt;，两者不兼容时将导致 REALITY 握手失败&lt;/p&gt;
&lt;p&gt;本教程的服务端配置模板已在 &lt;code&gt;realitySettings&lt;/code&gt; 中显式添加 &lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt; 以绕过此限制，安装最新版 Xray-core 即可正常工作&lt;/p&gt;
&lt;p&gt;具体情况请见相关 Issue / PR：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/issues/6477&quot;&gt;Xray-core #6477&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MetaCubeX/mihomo/issues/2967&quot;&gt;mihomo #2967&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/pull/6181&quot;&gt;Xray-core PR #6181&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你依然偏向 &lt;code&gt;Stable&lt;/code&gt;，把命令的 &lt;code&gt;--beta&lt;/code&gt; 去掉即为下载“正式版”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装完成时会默认启动服务，需要先暂停：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop xray
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.2 生成凭据&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;生成 UUID（需要两组，分别用于 Vision 和 XHTTP）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行两次，得到两个不同的 UUID
xray uuid
xray uuid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别记为 &lt;code&gt;UUID_01&lt;/code&gt; 和 &lt;code&gt;UUID_02&lt;/code&gt;，保存待用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 REALITY 密钥对：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xray x25519
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存输出的 &lt;code&gt;Private key&lt;/code&gt; 和 &lt;code&gt;Public key&lt;/code&gt;，私钥填在服务端的 config.json，公钥填在本地客户端里。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 shortID：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl rand -hex 8
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.3 写入 Xray 配置文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
请在&lt;strong&gt;本地的文本编辑器&lt;/strong&gt;，将以下代码块中的占位符替换为你自己的真实信息。替换完成后，粘贴到 VPS 终端中并回车&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
占位符说明：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;占位符&lt;/th&gt;
&lt;th&gt;替换为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第一组 UUID（Vision 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第二组 UUID（XHTTP 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_REALITY_PRIVATE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 Private key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_SHORT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 shortID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reality.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 REALITY 子域名（小黄云关）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cdn.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 CDN 子域名（小黄云开）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/your-xhttp-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保持默认，不要改&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /usr/local/etc/xray/config.json &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
{
  &quot;log&quot;: {
    &quot;loglevel&quot;: &quot;info&quot; // 调试完成后可改为 &quot;warning&quot;
  },
  &quot;inbounds&quot;: [
    {
      &quot;listen&quot;: &quot;0.0.0.0&quot;, // 如果需要 IPv6，改为监听 &quot;::&quot;
      &quot;port&quot;: 443,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_01&quot;, // 对应客户端出站 1
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;vision-user&quot;,
            &quot;flow&quot;: &quot;xtls-rprx-vision&quot;
          },
          {
            &quot;id&quot;: &quot;UUID_02&quot;, // 对应客户端出站 2/3/4/5
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;,
        &quot;fallbacks&quot;: [
          {
            &quot;dest&quot;: &quot;/run/xray/xhttp_in.sock&quot;, 
            // 处理“直连”的 XHTTP 请求 (对应客户端出站 2/3/5 的直连部分)
            // 当 Reality 识别出 VLESS 协议但没有 flow 时，直接丢给内部 XHTTP Socket
            &quot;xver&quot;: 0
          }
        ]
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;raw&quot;,
        &quot;security&quot;: &quot;reality&quot;,
        &quot;realitySettings&quot;: {
          &quot;show&quot;: false,
          &quot;target&quot;: &quot;/run/caddy/tls_gate.sock&quot;,
          // 处理“CDN 转发”或“普通 HTTPS”请求 (对应客户端出站 3/4/5 的 CDN 部分)
          // 任何 Reality 不识别的流量都丢给 Caddy 处理
          &quot;xver&quot;: 0,
          &quot;serverNames&quot;: [
            &quot;reality.example.com&quot;,
            &quot;cdn.example.com&quot;
          ],
          &quot;privateKey&quot;: &quot;YOUR_REALITY_PRIVATE_KEY&quot;,
          &quot;shortIds&quot;: [&quot;YOUR_SHORT_ID&quot;],
          &quot;minClientVer&quot;: &quot;1.8.2&quot;
        },
        &quot;sockopt&quot;: {
          &quot;tcpFastOpen&quot;: true,
          &quot;tcpcongestion&quot;: &quot;bbr&quot;,
          &quot;tcpMptcp&quot;: true,
          &quot;tcpNoDelay&quot;: true
        }
      },
      &quot;tag&quot;: &quot;VISION+REALITY&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    },
    {
      &quot;listen&quot;: &quot;/run/xray/xhttp_in.sock&quot;,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_02&quot;,
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;xhttp&quot;,
        &quot;xhttpSettings&quot;: {
          &quot;host&quot;: &quot;&quot;,
          &quot;path&quot;: &quot;/your-xhttp-path&quot;, 
          &quot;mode&quot;: &quot;auto&quot;,
          &quot;extra&quot;: {
            &quot;noSSEHeader&quot;: false,
            &quot;scMaxEachPostBytes&quot;: 1000000,
            &quot;scMaxBufferedPosts&quot;: 30,
            &quot;xPaddingBytes&quot;: &quot;100-1000&quot;,
            &quot;xPaddingObfsMode&quot;: true,
            &quot;xPaddingMethod&quot;: &quot;tokenish&quot;, // 生成一个随机的 Base62 标记
            &quot;xPaddingPlacement&quot;: &quot;queryInHeader&quot;, // 填充嵌入 Referer URL query（CF 兼容）
            &quot;xPaddingKey&quot;: &quot;t&quot;, // URL query 参数名
            &quot;xPaddingHeader&quot;: &quot;Referer&quot;,
            &quot;sessionIDPlacement&quot;: &quot;path&quot;,
            &quot;sessionIDKey&quot;: &quot;SID&quot;,
            &quot;sessionIDTable&quot;: &quot;Base62&quot;,
            &quot;sessionIDLength&quot;: &quot;12-20&quot;
          }
        },
        &quot;sockopt&quot;: {
          &quot;tcpFastOpen&quot;: true,
          &quot;acceptProxyProtocol&quot;: false,
          &quot;tcpcongestion&quot;: &quot;bbr&quot;,
          &quot;tcpMptcp&quot;: true,
          &quot;tcpNoDelay&quot;: true
        }
      },
      &quot;tag&quot;: &quot;XHTTP_IN&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;protocol&quot;: &quot;freedom&quot;,
      &quot;tag&quot;: &quot;direct&quot;,
      &quot;settings&quot;: {}
    },
    {
      &quot;protocol&quot;: &quot;blackhole&quot;,
      &quot;tag&quot;: &quot;blocked&quot;,
      &quot;settings&quot;: {}
    }
  ],
  &quot;routing&quot;: {
  &quot;domainStrategy&quot;: &quot;AsIs&quot;,
  &quot;rules&quot;: [
    {
      &quot;type&quot;: &quot;field&quot;,
      &quot;ip&quot;: [&quot;geoip:private&quot;],
      &quot;outboundTag&quot;: &quot;blocked&quot;
    }
  ]
}
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;geoip:private blocked&lt;/code&gt; 在路由层阻断&lt;/p&gt;
&lt;p&gt;Xray v26.7.11 新增的 &lt;code&gt;defaultBlockPrivateRule&lt;/code&gt; 在 freedom 出站内部阻断&lt;/p&gt;
&lt;p&gt;两者功能重叠，保留作为纵深防御&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3.4 安装 Caddy&lt;/h2&gt;
&lt;p&gt;使用 Caddy 官方针对 Debian 的软件源安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 导入 GPG 密钥
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 添加官方软件源
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 更新并安装
sudo apt update
sudo apt install caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.5 编写 Caddyfile&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
同理，请在本地编辑器中替换其中的占位符，替换后粘贴整段代码块至终端回车执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/caddy/Caddyfile &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
# 1. REALITY 域名区块（专供 REALITY 握手与伪装网页）
# 记得换成你自己的 REALITY 子域名！！！
reality.example.com {
        # 监听 Xray REALITY 回落的 Unix Socket
        bind unix//run/caddy/tls_gate.sock

        # 引用 acme.sh 申请的 Let&apos;s Encrypt 证书与私钥
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/reality_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 处理所有其他访问
        # 外部扫描器或浏览器访问，直接给出伪装网页
        handle {
                # 伪装网页路径：/var/www/html/index.html
                root * /var/www/html
                file_server
        }
}

# 2. CDN 域名区块（处理从 Xray 回落的 CDN 代理流量）
# 记得换成你自己的 CDN 子域名！！！
cdn.example.com {
        bind unix//run/caddy/tls_gate.sock

        # 申请的是多域名合并证书，引用相同的证书文件即可
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/cdn_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 捕获套 CDN 的出站（出站 3/4/5）传来的合法的 XHTTP 流量
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        handle /your-xhttp-path/* {
                reverse_proxy unix//run/xray/xhttp_in.sock {
                        transport http {
                                versions 2
                        }
                        flush_interval -1
                }
        }
        
        # 可选：探针探活路径
        handle /status {
                respond &quot;ok&quot; 200
        }

        handle /ping {
                respond &quot;ok&quot; 200
        }

        # 对于扫描器，直接重定向到伪装网页防扫描
        # 记得换成你自己的 REALITY 子域名！！！
        handle {
                redir https://reality.example.com{uri}
        }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;请务必仔细检查你的 &lt;code&gt;handle&lt;/code&gt; 块配置，路径末尾的斜杠和星号 &lt;code&gt;/*&lt;/code&gt; 不能省略&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XHTTP 流量请求的 URL 是动态长随机混淆参数的&lt;/p&gt;
&lt;p&gt;如果前缀不通配，Caddy 就会将其视为未知的外部扫描探测，返回 302 伪装页&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;附：简单伪装导航页&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;如果你没有现成的网站，可以使用下面这段单文件 HTML 代码&lt;/p&gt;
&lt;p&gt;但是后期建议让 GenAI 丰富一下，换成个人博客、OpenList 什么的&lt;/p&gt;
&lt;p&gt;将以下代码块整体复制到终端回车执行，即可一键生成伪装站点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/www/html
sudo tee /var/www/html/index.html &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Tech Hub&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif;
            background: linear-gradient(-45deg, #e0e7ff, #f3e8ff, #dbeafe, #ede9fe);
            background-size: 400% 400%;
            animation: gradientBG 18s ease infinite;
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        .wrapper {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 2rem;
            padding: 2rem;
            width: 100%;
            max-width: 720px;
        }

        .title {
            font-size: clamp(2.4rem, 6vw, 3.6rem);
            font-weight: 600;
            color: #1e293b;
            letter-spacing: -0.02em;
            text-align: center;
        }

        .sub {
            font-size: clamp(0.8rem, 1.5vw, 1rem);
            color: #64748b;
            text-transform: uppercase;
            letter-spacing: 0.2em;
            border-bottom: 1px solid #cbd5e1;
            padding-bottom: 1rem;
            width: 100%;
            text-align: center;
        }

        .nav {
            display: flex;
            gap: 1.5rem;
            padding: 1.5rem 2.5rem;
            border-radius: 80px;
            background: rgba(255, 255, 255, 0.6);
            backdrop-filter: blur(12px);
            -webkit-backdrop-filter: blur(12px);
            border: 1px solid rgba(255, 255, 255, 0.8);
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.06);
            flex-wrap: wrap;
            justify-content: center;
        }

        .nav-item {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 3.4rem;
            height: 3.4rem;
            border-radius: 50%;
            background: rgba(255, 255, 255, 0.4);
            transition: all 0.25s ease;
            text-decoration: none;
            border: 1px solid rgba(255, 255, 255, 0.6);
        }

        .nav-item img {
            width: 1.6rem;
            height: 1.6rem;
            transition: transform 0.2s ease;
        }

        .nav-item:hover {
            transform: translateY(-4px);
            background: rgba(255, 255, 255, 0.9);
            border-color: #94a3b8;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
        }

        .nav-item:hover img {
            transform: scale(1.1);
        }

        @media (max-width: 600px) {
            .wrapper { gap: 1.5rem; padding: 1rem; }
            .nav { padding: 1rem 1.5rem; gap: 1rem; border-radius: 2rem; }
            .nav-item { width: 2.8rem; height: 2.8rem; }
            .nav-item img { width: 1.3rem; height: 1.3rem; }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;wrapper&quot;&amp;gt;
        &amp;lt;h1 class=&quot;title&quot;&amp;gt;Dev Center&amp;lt;/h1&amp;gt;
        &amp;lt;div class=&quot;sub&quot;&amp;gt;Let there be light&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;nav&quot;&amp;gt;
            &amp;lt;a href=&quot;https://www.google.com&quot; class=&quot;nav-item&quot; title=&quot;Google&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/google/1e293b&quot; alt=&quot;Google&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://github.com&quot; class=&quot;nav-item&quot; title=&quot;GitHub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/github/1e293b&quot; alt=&quot;GitHub&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://dash.cloudflare.com&quot; class=&quot;nav-item&quot; title=&quot;Cloudflare&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/cloudflare/1e293b&quot; alt=&quot;Cloudflare&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://hub.docker.com&quot; class=&quot;nav-item&quot; title=&quot;Docker Hub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/docker/1e293b&quot; alt=&quot;Docker&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://stackoverflow.com&quot; class=&quot;nav-item&quot; title=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/stackoverflow/1e293b&quot; alt=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://www.npmjs.com&quot; class=&quot;nav-item&quot; title=&quot;npm&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/npm/1e293b&quot; alt=&quot;npm&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://gitlab.com&quot; class=&quot;nav-item&quot; title=&quot;GitLab&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/gitlab/1e293b&quot; alt=&quot;GitLab&quot;&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;3.6 用户组与运行目录设置&lt;/h2&gt;
&lt;p&gt;启动 Xray 和 Caddy 前需统一运行用户为 &lt;code&gt;caddy&lt;/code&gt;，否则会出现 socket 权限问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Info] transport/internet/tcp: REALITY: failed to dial dest: dial unix /run/caddy/tls_gate.sock: connect: permission denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进一步，为避免两个服务重启时因 &lt;code&gt;RuntimeDirectory&lt;/code&gt; 被 systemd 清理而导致 UDS 套接字文件丢失，我们将双方的套接字放入各自所属服务的运行时目录（Xray 使用 &lt;code&gt;/run/xray/&lt;/code&gt;，Caddy 使用 &lt;code&gt;/run/caddy/&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 统一运行用户为 caddy
sudo mkdir -p /etc/systemd/system/xray.service.d
sudo tee /etc/systemd/system/xray.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
EOF

# 为 Caddy 启用独立的运行目录以放套接字
sudo mkdir -p /etc/systemd/system/caddy.service.d
sudo tee /etc/systemd/system/caddy.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
RuntimeDirectory=caddy
EOF

# 重新加载 Systemd 配置
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.7 申请公有受信任证书&lt;/h2&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看：为什么不能用 Caddy 自带的自动申请证书功能&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Caddy 默认依赖 HTTP-01 或 TLS-ALPN-01 进行 ACME 自动化证书验证，此过程的硬性前置条件是 Web 服务器必须能够直接在操作系统层面接管并监听公网的 80 或 443 端口。&lt;/p&gt;
&lt;p&gt;在当前架构中，公网 443 端口由 Xray 独占监听，Caddy 仅绑定于内网的 Unix Socket 充当回落目标。当 Let&apos;s Encrypt 验证集群发起 TLS-ALPN-01 请求时，流量首先到达 Xray 的 REALITY 服务端。由于该请求不具备有效的 XTLS 身份特征，REALITY 服务端会将其视为未知流量，执行透明的双向 TCP 转发（直接回落至 Caddy 的 Unix Socket）。&lt;/p&gt;
&lt;p&gt;尽管验证流量最终送达了 Caddy，但证书申请依然会失败。因为 Caddy 的 ACME 模块在处理 TLS-ALPN-01 挑战时，强依赖于标准 443 端口监听器来挂载专用的验证证书。面对来自 Unix Socket 的回落流量，Caddy 的验证上下文无法正确匹配并下发该证书。即便 Caddy 异常响应了临时的 ACME 验证证书，由于 REALITY 服务端需持续抓取目标后端返回的 ServerHello 以缓存真实证书，这种非标准的临时证书将引发 REALITY 内部证书缓存逻辑链异常，导致整个 TLS 握手在链路中被异常阻断。&lt;/p&gt;
&lt;p&gt;所以转而使用 acme.sh 脚本动态下发 DNS TXT 记录（即基于 API 交互的 DNS-01 验证），以实现 TLS 证书合规签发。&lt;/p&gt;
&lt;p&gt;另外，REALITY 节点需使用真实 IP 直接承载直连流量（CDN Proxy OFF），若部署未受公共根证书信任的 Cloudflare Origin CA 证书，浏览器直接访问伪装站时会触发 TLS 错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：获取 Cloudflare API Token&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 Cloudflare 网页后台；&lt;/li&gt;
&lt;li&gt;展开左边栏 -&amp;gt; 选择 &lt;strong&gt;管理账户&lt;/strong&gt; -&amp;gt; &lt;strong&gt;账户 API 令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;创建令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;令牌名称自定义；&lt;/li&gt;
&lt;li&gt;权限策略 -&amp;gt; 编辑策略：选择 &lt;code&gt;指定域名&lt;/code&gt;，然后下拉框选你的主域名；&lt;/li&gt;
&lt;li&gt;在下方的权限组列表中，点击展开 &lt;strong&gt;&lt;code&gt;DNS &amp;amp; Zones&lt;/code&gt;&lt;/strong&gt; 类别
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;区域 (Zone)&lt;/code&gt; -  勾选&lt;code&gt;读取 (Read)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;DNS&lt;/code&gt; - 勾选 &lt;code&gt;编辑 (Edit)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;令牌过期时间建议直接选择 &lt;strong&gt;“无过期时间”；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;客户端 IP 地址过滤，可以什么都不填，只要你不把 Token 泄露给别人，就是安全的；或者填上运行 &lt;code&gt;acme.sh&lt;/code&gt; 脚本的服务器的公网 IP 地址；&lt;/li&gt;
&lt;li&gt;审核令牌 -&amp;gt; 创建令牌；&lt;/li&gt;
&lt;li&gt;接着会给出 &lt;code&gt;账户ID&lt;/code&gt; 和 &lt;code&gt;CF_Token&lt;/code&gt;，复制并保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;第二步：在 VPS 切换至 root 并安装 acme.sh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了后续能够全自动在后台无感续签，这一步全程在 &lt;code&gt;root&lt;/code&gt; 用户下执行，以免权限不足导致续签后重载 Caddy 失败。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSH 登录 VPS 并切换到 root
sudo -i

# 设置你的真实邮箱，并安装 acme.sh
EMAIL=&quot;your_email@example.com&quot;
curl https://get.acme.sh | sh -s email=&quot;$EMAIL&quot;

# 切换默认颁发机构为 Let&apos;s Encrypt
ACME=/root/.acme.sh/acme.sh
$ACME --set-default-ca --server letsencrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第三步：隐式导入 Token 并申请证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为防止 Token 泄露到 &lt;code&gt;.bash_history&lt;/code&gt; 中，我们使用静默输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行后，直接粘贴你的 Token 并回车（屏幕上不会显示）
read -rsp &apos;Cloudflare API Token: &apos; CF_Token
echo
export CF_Token
export CF_Account_ID=&quot;你的Account_ID&quot;

# 申请证书 (必须同时包含 Reality 直连域名和 CDN 回源域名，否则 Cloudflare 在“完全(严格)”模式下回源会报 526 证书错误)
$ACME --issue --dns dns_cf -d &quot;reality.example.com&quot; -d &quot;cdn.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第四步：提取证书并配置自动授权重载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们需要把证书提取到 Caddy 的配置目录，每次续签后，私钥文件的属主会被重置为 root，这将导致低权限运行的 Caddy 无法读取私钥而崩溃。因此必须在 &lt;code&gt;--reloadcmd&lt;/code&gt; 中加入 &lt;code&gt;chown&lt;/code&gt; 权限交接命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建目录
mkdir -p /etc/caddy/certs

# 提取证书并设定重载命令
# 安装时只需要指定主域名（第一个 -d 域名），acme.sh 会自动关联
$ACME --install-cert -d &quot;reality.example.com&quot; \
--key-file       /etc/caddy/certs/reality.key \
--fullchain-file /etc/caddy/certs/reality.crt \
--reloadcmd     &quot;chown caddy:caddy /etc/caddy/certs/reality.* &amp;amp;&amp;amp; systemctl reload caddy&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
证书安装后，私钥文件默认权限为 &lt;code&gt;-rw-------&lt;/code&gt;（600），仅属主（root）可读写。&lt;br /&gt;
若 Caddy 以 &lt;code&gt;caddy&lt;/code&gt; 用户运行，需确保其能读取。上述 &lt;code&gt;reloadcmd&lt;/code&gt; 中的 &lt;code&gt;chown&lt;/code&gt; 已解决属主问题。&lt;br /&gt;
若需进一步限制权限，可额外执行 &lt;code&gt;chmod 640 /etc/caddy/certs/reality.key&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
此时报错 &lt;code&gt;Reload error for: reality.example.com / caddy.service is not active&lt;/code&gt; 无伤大雅，因为我们在下一步才正式启动应用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;完成后，输入 &lt;code&gt;exit&lt;/code&gt; 退出 root 环境，返回普通用户。&lt;/p&gt;
&lt;h2&gt;3.8 启动服务&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;启动前检查&lt;/strong&gt;&lt;br /&gt;
为避免 &lt;code&gt;permission denied&lt;/code&gt; 错误，请再次确认以下路径的属主正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Caddy 日志目录
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chmod 755 /var/log/caddy

# 证书文件
ls -la /etc/caddy/certs/
# 应显示 -rw-r--r-- 1 caddy caddy reality.crt
# 应显示 -rw------- 1 caddy caddy reality.key

# 若属主不是 caddy，请执行修正：
sudo chown -R caddy:caddy /var/log/caddy
sudo chown caddy:caddy /etc/caddy/certs/reality.*
sudo chmod 640 /etc/caddy/certs/reality.key
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;正式启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now xray caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;验证状态：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl show xray --property=User,Group
systemctl show caddy --property=User,Group
ls -l /run/xray/ /run/caddy/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理想输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User=caddy
Group=

---

User=caddy
Group=caddy

# /run/xray/
srwxr-xr-x 1 caddy caddy 0 ... xhttp_in.sock
-rw-r--r-- 1 caddy caddy 0 ... xhttp_in.sock.lock

# /run/caddy/
s-w------- 1 caddy caddy 0 ... tls_gate.sock
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.9 后续更新&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;更新 Xray-core&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官方安装脚本支持直接升级，新版本发布后，重新运行安装命令即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查是否有新版本
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ check

# 升级到最新 Pre-release（推荐）
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会自动检测版本号差异、下载新二进制、替换并重启服务。你的 &lt;code&gt;config.json&lt;/code&gt;、&lt;code&gt;override.conf&lt;/code&gt;、日志等配置文件&lt;strong&gt;全部保留&lt;/strong&gt;，不会被覆盖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;升级后 systemd 主 service 文件会被重写为默认的 &lt;code&gt;User=nobody&lt;/code&gt;，但 &lt;code&gt;override.conf&lt;/code&gt;（&lt;code&gt;User=caddy&lt;/code&gt;）优先级更高，运行时用户不受影响。
若要消除 &lt;code&gt;Special user nobody configured&lt;/code&gt; 警告，可手动修复：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sed -i &apos;s/User=nobody/User=caddy/&apos; /etc/systemd/system/xray.service
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新 Caddy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过 apt 更新：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 客户端配置&lt;/h1&gt;
&lt;h2&gt;4.1 mihomo Client Config&lt;/h2&gt;
&lt;p&gt;由于 mihomo GUI 繁多，此处仅给出裸核 config：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  # 1. XTLS(Vision) + REALITY 直连
  - name: &quot;出站1-XTLS+REALITY&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_01&quot;
    encryption: &quot;none&quot;
    flow: xtls-rprx-vision
    network: tcp
    # 以下两项取决于你的实际 UDP 使用场景，不需要请注释或删除
    # udp: true               # 需要走代理的境外游戏/QUIC/WebRTC 则开启
    # packet-encoding: xudp   # UDP 编码方式，开启后支持 FullCone NAT（默认即此值）
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;

  # 2. XHTTP + REALITY 直连
  - name: &quot;出站2-XHTTP+REALITY&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;
    xhttp-opts:
      path: /your-xhttp-path      # 必须与服务端配置的 path 一致
      mode: auto                  # Reality 模式下 auto 会自动选择 stream-one
      # host: &quot;reality.example.com&quot; # 直连时可省略，默认继承 servername
      session-table: &quot;Alphabet&quot;   # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;     # session ID 长度范围（起始值不可为 0，总 ID 空间须 &amp;gt; 21 亿）
      session-placement: path     # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true   # 启用填充混淆
      x-padding-method: tokenish  # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;          # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot; # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 3. 上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY（上下行不同 SNI）
  - name: &quot;出站3-CDN上行+XHTTP下行&quot;
    type: vless
    server: &quot;cdn.example.com&quot;      # CDN 域名或优选 IP (上行)
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    ech-opts: {enable: true}       # 隐藏 SNI
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h3]
    servername: &quot;cdn.example.com&quot;  # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
    client-fingerprint: chrome
    skip-cert-verify: false        # 强制校验服务端证书，防止中间人攻击
    xhttp-opts:  # 上行设置
      host: &quot;cdn.example.com&quot;      # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto                   # CDN 模式下 auto 会自动选择 stream-up (H2)
      session-table: &quot;Alphabet&quot;    # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;      # session ID 长度范围
      session-placement: path      # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true    # 启用填充混淆
      x-padding-method: tokenish   # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;           # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot;  # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 上行链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
      download-settings:            # 下行设置（Reality 不支持 h3，须显式覆盖为 h2）
        alpn: [h2]                  # 显式指定 h2，覆盖主代理继承来的 h3
        server: &quot;&amp;lt;YOUR_VPS_IP&amp;gt;&quot;     # 下行地址 (VPS 直连)
        port: 443
        servername: &quot;reality.example.com&quot; # Reality 伪装域名
        reality-opts:
          public-key: &quot;YOUR_PUB_KEY&quot;
          short-id: &quot;YOUR_SHORT_ID&quot;
          # host 继承自外层或省略；mode 强制继承外层
        reuse-settings:  # 下行链接复用设置（即XMUX）
          max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
          # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
          c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
          # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
          h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
          h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 4. XHTTP + TLS(ECH) 过 CDN（上下行不分离）
  - name: &quot;出站4-CDN上下行&quot;
    type: vless
    server: &quot;cdn.example.com&quot;     # CDN 域名或优选 IP
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    ech-opts: {enable: true}      # 隐藏 SNI
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h3]
    servername: &quot;cdn.example.com&quot; # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
    client-fingerprint: chrome
    skip-cert-verify: false       # 强制校验服务端证书，防止中间人攻击
    xhttp-opts:
      host: &quot;cdn.example.com&quot;     # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto
      session-table: &quot;Alphabet&quot;   # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;     # session ID 长度范围
      session-placement: path     # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true   # 启用填充混淆
      x-padding-method: tokenish  # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;          # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot; # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 5. 上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN（上下行不同 SNI）
  - name: &quot;出站5-上XHTTP+REALITY下XHTTP+TLS+CDN&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    skip-cert-verify: false           # 强制校验服务端证书，防止中间人攻击
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;
    xhttp-opts:
      host: &quot;cdn.example.com&quot;         # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto
      session-table: &quot;Alphabet&quot;       # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;         # session ID 长度范围
      session-placement: path         # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true       # 启用填充混淆
      x-padding-method: tokenish      # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;              # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot;     # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 上行链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;      # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;        # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;        # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0        # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
      download-settings:              # 下行设置（CDN 路径，改用 h3）
        path: /your-xhttp-path
        host: &quot;&quot;                      # host 继承自外层或省略；mode 强制继承外层        
        server: &quot;cdn.example.com&quot;     # CDN / 优选 IP (下行连接地址)
        port: 443
        tls: true
        alpn: [h3]
        servername: &quot;cdn.example.com&quot; # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
        client-fingerprint: chrome
        skip-cert-verify: false       # 强制校验服务端证书，防止中间人攻击
        ech-opts: {enable: true}      # 隐藏 SNI
        reality-opts: { public-key: &quot;&quot; } # 强制清空 Reality 公钥，否则下行连接 CDN 将会携带 Reality 握手
        reuse-settings:               # 下行链接复用设置（即XMUX）
          max-concurrency: &quot;16-32&quot;      # 单连接最大并发请求数（0=不限制）
          # max-connections: &quot;3&quot;        # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
          c-max-reuse-times: &quot;0&quot;        # 单连接最大复用次数（0=不限制）
          # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
          h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
          h-keep-alive-period: 0        # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;锚点写法&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 定义锚点
x-anchors:
  # 0. 用户变量 (请在此处统一修改为自己的配置，下方会自动引用)
  variables:
    vps_ip: &amp;amp;vps_ip &quot;YOUR_VPS_IP&quot;
    uuid_01: &amp;amp;uuid_01 &quot;YOUR_UUID_01&quot;
    uuid_02: &amp;amp;uuid_02 &quot;YOUR_UUID_02&quot;
    reality_domain: &amp;amp;reality_domain &quot;reality.example.com&quot;
    cdn_domain: &amp;amp;cdn_domain &quot;cdn.example.com&quot;
    xhttp_path: &amp;amp;xhttp_path &quot;/your-xhttp-path&quot;

  # 1. Reality 密钥配置
  reality-opts: &amp;amp;reality-opts
    public-key: &quot;YOUR_PUB_KEY&quot;
    short-id: &quot;YOUR_SHORT_ID&quot;

  # 2. 链接复用设置参数
  reuse-settings: &amp;amp;reuse-settings
    max-concurrency: &quot;16-32&quot;         # 单连接最大并发请求数（0=不限制）
    # max-connections: &quot;3&quot;           # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
    c-max-reuse-times: &quot;0&quot;           # 单连接最大复用次数（0=不限制）
    # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
    h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
    h-keep-alive-period: 0           # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 3. XHTTP 混淆配置
  xhttp-obfs: &amp;amp;xhttp-obfs
    path: *xhttp_path
    mode: auto
    session-table: &quot;Alphabet&quot;           # 自定义 session ID 字符集，降低 CDN 特征识别
    session-length: &quot;12-20&quot;             # session ID 长度范围
    session-placement: path             # Session ID 放在 URL 路径中
    x-padding-obfs-mode: true           # 启用填充混淆
    x-padding-method: tokenish          # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
    x-padding-placement: queryInHeader  # 填充嵌入 Referer URL query 中
    x-padding-key: &quot;t&quot;                  # URL query 参数名，伪装成 analytics token
    x-padding-header: &quot;Referer&quot;         # 填充存放的 HTTP Header 名，默认 Referer
    sc-stream-up-server-secs: &quot;30-60&quot;   # 单连接流控保活心跳间隔，减少 CDN 超时断开
    reuse-settings: *reuse-settings

  # 4. UDP 配置
  udp-opts: &amp;amp;udp-opts
    # 以下两项取决于你的实际 UDP 使用场景
    udp: false              # 境外游戏/QUIC/WebRTC 有需要走代理的则改为 true
    # packet-encoding: xudp # UDP 编码方式

# 最终节点配置
proxies:
  # 1. XTLS(Vision) + REALITY 直连
  - name: &quot;出站1-XTLS+REALITY&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_01
    encryption: &quot;none&quot;
    flow: xtls-rprx-vision
    network: tcp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    reality-opts: *reality-opts

  # 2. XHTTP + REALITY 直连
  - name: &quot;出站2-XHTTP+REALITY&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    reality-opts: *reality-opts
    xhttp-opts: *xhttp-obfs

  # 3. 上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY
  - name: &quot;出站3-CDN上行+XHTTP下行&quot;
    type: vless
    server: *cdn_domain
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h3]
    servername: *cdn_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    ech-opts: {enable: true}
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain
      download-settings:
        server: *vps_ip
        port: 443
        tls: true
        alpn: [h2]
        servername: *reality_domain
        client-fingerprint: chrome
        reality-opts: *reality-opts
        reuse-settings: *reuse-settings

  # 4. XHTTP + TLS(ECH) 过 CDN（上下行不分离）
  - name: &quot;出站4-CDN上下行&quot;
    type: vless
    server: *cdn_domain
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h3]
    servername: *cdn_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    ech-opts: {enable: true}
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain

  # 5. 上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN
  - name: &quot;出站5-上XHTTP+REALITY下XHTTP+TLS+CDN&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    reality-opts: *reality-opts
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain
      download-settings:
        server: *cdn_domain
        port: 443
        tls: true
        alpn: [h3]
        servername: *cdn_domain
        client-fingerprint: chrome
        skip-cert-verify: false
        ech-opts: {enable: true}
        path: *xhttp_path
        host: &quot;&quot;
        reality-opts: { public-key: &quot;&quot; }
        reuse-settings: *reuse-settings
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;4.2 ALPN、ECH 与 XMUX 说明&lt;/h2&gt;
&lt;h3&gt;ALPN&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mihomo v1.19.23：仅支持 &lt;code&gt;h2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mihomo v1.19.24+：支持 &lt;code&gt;http/1.1&lt;/code&gt; 和 &lt;code&gt;h3&lt;/code&gt;，但不支持多协议动态回退，写法如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: xxx
    alpn: [h2]           # 使用 HTTP/2（默认）
    # alpn: [http/1.1]   # 强制使用 HTTP/1.1
    # alpn: [h3]         # 强制使用 HTTP/3。注意：不支持 REALITY，必须 tls: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ECH&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: xxx
    ech-opts: {enable: true}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ssl/edge-certificates/ech/&quot;&gt;Cloudflare 免费版现已默认启用 ECH（Encrypted ClientHello）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;针对通过 CDN 回源的出站节点，加上此参数后，mihomo 会自动发起 HTTPS DNS 记录查询，拉取 Cloudflare 下发的 ECH 公钥，并在 TLS 握手时加密 SNI，可以有效防止 GFW 通过嗅探 SNI 来封锁连接，一定程度上提升连接的隐蔽性&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;只有套了 CDN 的节点才能用&lt;/li&gt;
&lt;li&gt;mihomo 需要写支持 DoH 解析的 DNS&lt;/li&gt;
&lt;li&gt;域名需要开启 TLS 1.3&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更多详情请查看下面推荐的文章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;XMUX（链接复用）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Xray-core 近期的版本演进中（&lt;a href=&quot;https://github.com/XTLS/Xray-core/issues/6376&quot;&gt;Issue #6376&lt;/a&gt;），对 XMUX 的默认策略经历了多次调整（从最初的 &lt;code&gt;16-32&lt;/code&gt;，到 &lt;code&gt;1&lt;/code&gt;，再到 &lt;code&gt;3&lt;/code&gt;）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本模板中显式写了 &lt;code&gt;max-concurrency: &quot;16-32&quot;&lt;/code&gt;。效果是强制锁定在较稳定的多路复用状态，避免因继承内核默认值而导致并发 TCP 连接数突增爆表（仅为个人理解）&lt;/li&gt;
&lt;li&gt;如果为了对抗严格的审查环境（像 issue 提到的俄罗斯抗 TSPU 封锁）的话，可改为 &lt;code&gt;max-connections: 3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;【完】&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;友情推荐&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 Nginx 作为反代的教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://smc.im/post/debian-13-xray-vless-reality-hardening/&quot;&gt;Debian 13 VPS 安全加固与 Xray VLESS + REALITY 手动部署&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;本文从中学习到了 &lt;code&gt;read -rsp&lt;/code&gt; 静默输入这一用法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECH 相关教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.litekin.org/archives/vless-xhttp-cloudflare-ech-doh-pei-zhi-zhu-yi-xiang&quot;&gt;XHTTP + CDN + ECH配置教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Cloudflare Tunnel 实现零信任 SSH 并封闭公网端口</title><link>https://blog.rokutosei.com/posts/linux/ssh-over-cloudflare-tunnel/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/linux/ssh-over-cloudflare-tunnel/</guid><description>通过 Cloudflare Tunnel（Zero Trust）部署 SSH 反向隧道，配合 iptables 完全屏蔽公网 SSH 端口的步骤。</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录通过 Cloudflare Tunnel（Zero Trust）配置 SSH 反向穿透，并完全封闭公网端口的步骤&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 部署 cloudflared&lt;/h2&gt;
&lt;p&gt;在 VPS 上执行以下命令以安装并注册系统服务连接器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 导入密钥源与仓库地址
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-public-v2.gpg | sudo tee /usr/share/keyrings/cloudflare-public-v2.gpg &amp;gt;/dev/null
echo &apos;deb [signed-by=/usr/share/keyrings/cloudflare-public-v2.gpg] https://pkg.cloudflare.com/cloudflared any main&apos; | sudo tee /etc/apt/sources.list.d/cloudflared.list

# 安装并运行服务（替换 &amp;lt;YOUR_TOKEN&amp;gt;）
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install cloudflared -y
sudo cloudflared service install &amp;lt;YOUR_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认服务状态已拉起：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status cloudflared
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 网页端与本地配置&lt;/h2&gt;
&lt;h3&gt;2.1 路由规则配置&lt;/h3&gt;
&lt;p&gt;在 Cloudflare Zero Trust 隧道的 &lt;strong&gt;Public Hostname&lt;/strong&gt; 中配置路由映射：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subdomain&lt;/strong&gt;：自定义子域名（如 &lt;code&gt;ssh-vps&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain&lt;/strong&gt;：选择已托管的域名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;：&lt;code&gt;SSH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;：&lt;code&gt;localhost:&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt;（若未修改默认端口，则为 &lt;code&gt;localhost:22&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 本地 SSH 客户端配置&lt;/h3&gt;
&lt;p&gt;在本地的 &lt;code&gt;~/.ssh/config&lt;/code&gt; 文件中新增如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host vps-tunnel
    HostName ssh-vps.yourdomain.com
    User your_vps_username
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    ProxyCommand cloudflared access ssh --hostname %h
    ServerAliveInterval 30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;本地通过命令行连接验证：&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh vps-tunnel
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 防火墙配置&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;警告：请务必确保已经通过 &lt;code&gt;ssh vps-tunnel&lt;/code&gt; 验证能够正常进入终端，再执行此步骤，否则会有失联风险。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;iptables&lt;/code&gt; 中屏蔽除本地环回口（&lt;code&gt;lo&lt;/code&gt;）之外所有外部访问 SSH 服务端口的连接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSHD 实际监听的端口
SSH_PORT=54321

# 限制除本地环回外所有针对该端口的 TCP 请求
sudo iptables -I INPUT ! -i lo -p tcp --dport $SSH_PORT -j DROP
sudo ip6tables -I INPUT ! -i lo -p tcp --dport $SSH_PORT -j DROP

# 保存规则
sudo netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证直连状态，确认外部直连超时挂起，而通过隧道连接依旧正常。&lt;/p&gt;
</content:encoded></item><item><title>使用 iptables + ipset 屏蔽主流云厂商 ASN 与恶意扫描流量</title><link>https://blog.rokutosei.com/posts/linux/block_asn_using_iptables_and_ipset/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/linux/block_asn_using_iptables_and_ipset/</guid><description>基于 iptables 与 ipset 动态屏蔽 AWS、GCP、Azure、DigitalOcean 等主流云厂商 ASN 网段的完整方案</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录利用 &lt;code&gt;iptables&lt;/code&gt; 结合 &lt;code&gt;ipset&lt;/code&gt; 屏蔽主流云服务商（AWS, DigitalOcean, Azure, Vultr, Oracle 等）扫描探针与探测流量的方案。&lt;/p&gt;
&lt;p&gt;直接在 &lt;code&gt;iptables&lt;/code&gt; 中处理大量 IP 网段会导致性能劣化。&lt;code&gt;ipset&lt;/code&gt; 使用哈希结构维护 IP 集合，可在 $O(1)$ 时间复杂度内完成检索，并通过 &lt;code&gt;ipset swap&lt;/code&gt; 实现增量无缝更新。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 防火墙初始化部署脚本&lt;/h2&gt;
&lt;p&gt;在部署前，禁用 &lt;code&gt;ufw&lt;/code&gt; 以防规则冲突：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw disable
sudo systemctl stop ufw
sudo systemctl disable ufw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建脚本 &lt;code&gt;/usr/local/bin/deploy_firewall.sh&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# ============================================================================
# 防火墙初始化部署脚本
# ============================================================================

SSH_PORT=54321
WEB_PORTS=(80 443)
ENABLE_IPV6=1
NEIGHBOR_V4=&quot;-&quot;
NEIGHBOR_V6=&quot;-&quot;

export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;

check_v6() {
    if [ &quot;$ENABLE_IPV6&quot; != &quot;1&quot; ]; then echo 0; return; fi
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

check_deps() {
    local missing=()
    for cmd in ipset iptables; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        echo &quot;Missing dependencies: ${missing[*]}&quot;
        echo &quot;Run: sudo apt install -y ipset iptables&quot;
        exit 1
    fi
}

install_persistent() {
    if dpkg -l iptables-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos; &amp;amp;&amp;amp; dpkg -l ipset-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos;; then
        return 0
    fi
    echo iptables-persistent iptables-persistent/autosave_v4 boolean true | debconf-set-selections 2&amp;gt;/dev/null
    echo iptables-persistent iptables-persistent/autosave_v6 boolean true | debconf-set-selections 2&amp;gt;/dev/null
    DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent ipset-persistent &amp;amp;&amp;gt;/dev/null
}

create_ipsets() {
    ipset create bad_asn_v4 hash:net family inet hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        ipset create bad_asn_v6 hash:net family inet6 hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    fi
}

deploy_v4() {
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    iptables -F
    iptables -X

    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT

    if [ &quot;$NEIGHBOR_V4&quot; != &quot;-&quot; ]; then
        iptables -A INPUT -s &quot;$NEIGHBOR_V4&quot; -j DROP
    fi

    # 丢弃匹配 ipset 集合源的连接请求
    iptables -A INPUT -m set --match-set bad_asn_v4 src -j DROP

    iptables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        iptables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
    done
}

deploy_v6() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT
    ip6tables -F
    ip6tables -X

    ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

    if [ &quot;$NEIGHBOR_V6&quot; != &quot;-&quot; ]; then
        ip6tables -A INPUT -s &quot;$NEIGHBOR_V6&quot; -j DROP
    fi

    ip6tables -A INPUT -m set --match-set bad_asn_v6 src -j DROP
    ip6tables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        ip6tables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
    done
}

persist() {
    if command -v netfilter-persistent &amp;amp;&amp;gt;/dev/null; then
        netfilter-persistent save 2&amp;gt;/dev/null
    else
        mkdir -p /etc/iptables
        ipset save &amp;gt; /etc/iptables/ipsets 2&amp;gt;/dev/null
        iptables-save &amp;gt; /etc/iptables/rules.v4
        [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ip6tables-save &amp;gt; /etc/iptables/rules.v6
    fi
}

main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then exit 1; fi
    HAS_V6=$(check_v6)
    check_deps
    create_ipsets
    deploy_v4
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; deploy_v6
    install_persistent
    persist
}

main &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予权限并运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/deploy_firewall.sh
sudo /usr/local/bin/deploy_firewall.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 动态黑名单拉取更新脚本&lt;/h2&gt;
&lt;p&gt;创建脚本 &lt;code&gt;/usr/local/bin/update_blacklists.sh&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# ============================================================================
# 自治系统 IP 段同步脚本
# ============================================================================

ASNS=(
    &quot;14061|DigitalOcean&quot;
    &quot;16509|AWS&quot;
    &quot;15169|Google_Cloud&quot;
    &quot;8075|Azure&quot;
    &quot;20473|Vultr&quot;
    &quot;31898|Oracle&quot;
)

CACHE_DIR=&quot;/var/lib/seedbox-firewall&quot;
export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;
set -o pipefail

check_v6() {
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

check_deps() {
    local missing=()
    for cmd in curl awk python3 ipset whois sha256sum; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        echo &quot;Missing: ${missing[*]}. Run: sudo apt install -y curl gawk python3 ipset iproute2 whois&quot;
        exit 1
    fi
}

init_cache() {
    mkdir -p &quot;$CACHE_DIR&quot; 2&amp;gt;/dev/null
}

get_cached_hash() {
    [ -f &quot;${CACHE_DIR}/${1}.sha256&quot; ] &amp;amp;&amp;amp; cat &quot;${CACHE_DIR}/${1}.sha256&quot; || echo &quot;&quot;
}

set_cached_hash() {
    echo &quot;$2&quot; &amp;gt; &quot;${CACHE_DIR}/${1}.sha256&quot;
}

is_changed() {
    if [ ! -s &quot;$2&quot; ]; then return 0; fi
    local new_hash=$(sha256sum &quot;$2&quot; | awk &apos;{print $1}&apos;)
    local old_hash=$(get_cached_hash &quot;$1&quot;)
    [ &quot;$new_hash&quot; != &quot;$old_hash&quot; ]
}

update_cache() {
    local new_hash=$(sha256sum &quot;$2&quot; | awk &apos;{print $1}&apos;)
    set_cached_hash &quot;$1&quot; &quot;$new_hash&quot;
}

update_asn() {
    local work=&quot;/tmp/asn-update-$$&quot;
    mkdir -p &quot;$work&quot;
    local v4_cidr=&quot;${CACHE_DIR}/asn_v4.cidr&quot;
    local v6_cidr=&quot;${CACHE_DIR}/asn_v6.cidr&quot;
    local v4_tmp=&quot;${work}/asn_v4.cidr&quot;
    local v6_tmp=&quot;${work}/asn_v6.cidr&quot;

    true &amp;gt; &quot;$v4_tmp&quot;
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; true &amp;gt; &quot;$v6_tmp&quot;

    local v4_total=0 v6_total=0

    for ITEM in &quot;${ASNS[@]}&quot;; do
        ASN=&quot;${ITEM%%|*}&quot;
        local whois_out=&quot;${work}/whois_${ASN}.txt&quot;
        if ! timeout 20 whois -h whois.radb.net -- &quot;-i origin AS${ASN}&quot; &amp;gt; &quot;$whois_out&quot; 2&amp;gt;/dev/null; then
            rm -f &quot;$whois_out&quot;
            continue
        fi

        local v4_count=$(awk &apos;/^route:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v4_tmp&quot; | wc -l)
        v4_total=$((v4_total + v4_count))

        if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
            local v6_count=$(awk &apos;/^route6:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v6_tmp&quot; | wc -l)
            v6_total=$((v6_total + v6_count))
        fi
        rm -f &quot;$whois_out&quot;
    done

    # 增量比对，利用 ipset swap 无缝替换
    if [ &quot;$v4_total&quot; -ge 50 ] &amp;amp;&amp;amp; is_changed &quot;asn_v4&quot; &quot;$v4_tmp&quot;; then
        local new_set=&quot;bad_asn_v4_new&quot;
        ipset create &quot;$new_set&quot; hash:net family inet hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
        {
            echo &quot;create $new_set hash:net family inet hashsize 4096 maxelem 500000 -exist&quot;
            awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v4_tmp&quot;
        } | ipset restore -exist 2&amp;gt;/dev/null
        ipset swap &quot;$new_set&quot; bad_asn_v4
        ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
        cp &quot;$v4_tmp&quot; &quot;$v4_cidr&quot;
        update_cache &quot;asn_v4&quot; &quot;$v4_tmp&quot;
    fi

    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; [ &quot;$v6_total&quot; -ge 50 ] &amp;amp;&amp;amp; is_changed &quot;asn_v6&quot; &quot;$v6_tmp&quot;; then
        local new_set=&quot;bad_asn_v6_new&quot;
        ipset create &quot;$new_set&quot; hash:net family inet6 hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
        {
            echo &quot;create $new_set hash:net family inet6 hashsize 4096 maxelem 500000 -exist&quot;
            awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v6_tmp&quot;
        } | ipset restore -exist 2&amp;gt;/dev/null
        ipset swap &quot;$new_set&quot; bad_asn_v6
        ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
        cp &quot;$v6_tmp&quot; &quot;$v6_cidr&quot;
        update_cache &quot;asn_v6&quot; &quot;$v6_tmp&quot;
    fi

    rm -rf &quot;$work&quot;
}

main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then exit 1; fi
    HAS_V6=$(check_v6)
    check_deps
    init_cache
    update_asn
}

main &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 首次加载与定时同步配置&lt;/h2&gt;
&lt;p&gt;手动运行脚本拉取数据并初始化 ipset 集合：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加 crontab 任务，设置每周日凌晨 4 点进行规则库同步：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
# 写入以下配置
0 4 * * 0 /usr/local/bin/update_blacklists.sh &amp;gt; /var/log/blacklist-update.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行以下命令查看拦截链状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo iptables -L INPUT -v -n --line-numbers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 INPUT 规则链中应存在 &lt;code&gt;match-set bad_asn_v4 src DROP&lt;/code&gt; 相关的全局阻断项（位列 SSH 与 Web 端口放行规则之前）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
iptables 按自上而下的顺序处理规则，由于黑名单 DROP 规则位于开放端口 ACCEPT 规则之前，来自黑名单 ASN 的流量会在前半部分被直接丢弃，非黑名单流量才能匹配到后面的端口放行规则。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>VPS 新机基础安全加固与系统优化（精简版）</title><link>https://blog.rokutosei.com/posts/linux/vps-basic-optimization-and-security/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/linux/vps-basic-optimization-and-security/</guid><description>新购 VPS 后的基础操作，清除模板、开启 BBR、调整 Swap、SSH 密钥登录、创建非 root 用户与 Fail2ban 部署的精简流程。</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录 Debian/Ubuntu 新购 VPS 的常规性能优化与安全加固配置步骤&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 系统基础优化&lt;/h2&gt;
&lt;h3&gt;1.1 清除开机预置任务&lt;/h3&gt;
&lt;p&gt;部分服务商在系统镜像中预置了首次开机脚本或监控探针。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除其中如 &lt;code&gt;@reboot /admin/firstbootkvm yes&lt;/code&gt; 等第三方残留自启动项。&lt;/p&gt;
&lt;h3&gt;1.2 开启 BBR 加速&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;net.core.default_qdisc=fq&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
echo &quot;net.ipv4.tcp_congestion_control=bbr&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证启用状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sysctl net.ipv4.tcp_congestion_control
# 返回: net.ipv4.tcp_congestion_control = bbr
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 虚拟内存 (Swap) 配置&lt;/h3&gt;
&lt;p&gt;对小内存配置 2GB Swap 空间及 swappiness 阈值（设置为 10，避免频繁读写磁盘）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建并挂载 Swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 配置开机自动挂载
echo &apos;/swapfile none swap sw 0 0&apos; | sudo tee -a /etc/fstab

# 优化交换阈值
echo &apos;vm.swappiness=10&apos; | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4 切换默认 Shell 为 Bash&lt;/h3&gt;
&lt;p&gt;将 &lt;code&gt;/bin/sh&lt;/code&gt; 的链接从默认的 &lt;code&gt;dash&lt;/code&gt; 指向 &lt;code&gt;bash&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;dash dash/sh boolean false&quot; | sudo debconf-set-selections
sudo ln -sf bash /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. SSH 服务安全加固&lt;/h2&gt;
&lt;h3&gt;2.1 部署 Ed25519 密钥认证&lt;/h3&gt;
&lt;p&gt;在本地客户端生成密钥对并上传至服务器，禁用密码登录以防暴力破解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本地生成密钥：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &quot;vps-key&quot; -f ~/.ssh/id_ed25519_vps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;上传公钥至 VPS：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-copy-id -i ~/.ssh/id_ed25519_vps.pub -p &amp;lt;PORT&amp;gt; root@&amp;lt;VPS_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 修改 SSHD 配置文件&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port 54321                  # 修改为自定义高位端口
PasswordAuthentication no   # 禁用密码认证
PubkeyAuthentication yes    # 启用密钥认证
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：检查 &lt;code&gt;/etc/ssh/sshd_config.d/&lt;/code&gt; 目录下是否有其他配置文件覆盖此项，如存在 &lt;code&gt;50-cloud-init.conf&lt;/code&gt;，须将其中的 &lt;code&gt;PasswordAuthentication&lt;/code&gt; 修改为 &lt;code&gt;no&lt;/code&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;重启 SSHD 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在未测试成功前不要关闭当前会话。新开终端执行 &lt;code&gt;ssh -i ~/.ssh/id_ed25519_vps -p 54321 root@&amp;lt;VPS_IP&amp;gt;&lt;/code&gt; 验证正常后再关闭旧终端。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 权限管理：创建非 Root 用户&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 新建用户与密码
sudo useradd -m -u 1000 user_name
sudo passwd user_name

# 赋予管理员权限
sudo usermod -aG sudo user_name
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 部署 Fail2ban 防御端口扫描&lt;/h2&gt;
&lt;p&gt;安装并配置 Fail2ban，对频繁连接失败的 IP 进行临时封锁。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装服务
sudo apt update &amp;amp;&amp;amp; sudo apt install fail2ban -y

# 编辑配置文件 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 54321
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;10 分钟内发生 3 次登录失败的 IP 将被封禁 24 小时。&lt;/p&gt;
&lt;p&gt;启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可通过 &lt;code&gt;sudo fail2ban-client status sshd&lt;/code&gt; 检查当前封锁状态。&lt;/p&gt;
</content:encoded></item><item><title>Linux 下部署 PeerBanHelper（Java 25 + systemd）</title><link>https://blog.rokutosei.com/posts/seedbox/peerbanhelper-setup/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/seedbox/peerbanhelper-setup/</guid><description>在 Linux 系统配置 Java 25 环境，并使用 systemd 守护进程运行 PeerBanHelper，用于封禁 BT 吸血客户端的完整步骤。</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录在 Linux 下部署独立的 Java 25 运行时与 PeerBanHelper 服务，对接 qBittorrent 自动阻断吸血 Peer。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 部署独立的 JDK 25 运行环境&lt;/h2&gt;
&lt;p&gt;采用绿色免安装版将 JDK 部署在 &lt;code&gt;/opt/java25&lt;/code&gt;，避免对系统的全局环境造成冲突。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 新增隔离目录
sudo mkdir -p /opt/java25

# 获取最新的 JDK 25 Linux x64 二进制包并解压
wget -O jdk25.tar.gz &quot;https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jdk/hotspot/normal/eclipse&quot;
sudo tar -xzf jdk25.tar.gz -C /opt/java25 --strip-components=1 &amp;amp;&amp;amp; rm jdk25.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认安装状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/opt/java25/bin/java -version
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 部署 PeerBanHelper&lt;/h2&gt;
&lt;p&gt;下载并安装包到普通用户的家目录内，实现权限隔离：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/seedbox/config/pbh &amp;amp;&amp;amp; cd ~/seedbox/config/pbh

# 下载指定发布包（以 v9.3.14 为例）
wget https://github.com/PBH-BTN/PeerBanHelper/releases/download/v9.3.14/PeerBanHelper_9.3.14.zip

# 安装解压工具并处理包
sudo apt update &amp;amp;&amp;amp; sudo apt install unzip -y
unzip PeerBanHelper_9.3.14.zip &amp;amp;&amp;amp; rm PeerBanHelper_9.3.14.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 配置 Systemd 守护服务&lt;/h2&gt;
&lt;p&gt;新建配置 &lt;code&gt;/etc/systemd/system/peerbanhelper.service&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=PeerBanHelper Daemon
After=network.target

[Service]
Type=simple
User=your_username
Group=your_username
WorkingDirectory=/home/your_username/seedbox/config/pbh/PeerBanHelper
ExecStart=/opt/java25/bin/java -jar /home/your_username/seedbox/config/pbh/PeerBanHelper/PeerBanHelper.jar
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：请将配置中的 &lt;code&gt;User&lt;/code&gt;、&lt;code&gt;Group&lt;/code&gt; 及目录修改为实际的运行普通用户与对应绝对路径。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;载入系统服务并启动运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now peerbanhelper
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 仪表盘配置与客户端联动&lt;/h2&gt;
&lt;p&gt;服务启动后默认监听本地 &lt;code&gt;9898&lt;/code&gt; 端口。&lt;/p&gt;
&lt;h3&gt;4.1 提取初始化 Token&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo journalctl -u peerbanhelper | grep -i token
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制输出的临时 Token 登录后台面板。&lt;/p&gt;
&lt;h3&gt;4.2 关联 qBittorrent&lt;/h3&gt;
&lt;p&gt;在控制台的“连接下载器”配置中填入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：选择 &lt;code&gt;qBittorrent&lt;/code&gt; 或 &lt;code&gt;qBittorrentEE&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：如果为同机部署，输入 &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;账号/密码&lt;/strong&gt;：输入对应的 WebUI 登录凭据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 配置代理前缀&lt;/h3&gt;
&lt;p&gt;如果使用反向代理域名（如 &lt;code&gt;https://pbh.yourdomain.com&lt;/code&gt;）连接服务：
前往 &lt;strong&gt;设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;基础设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;WebUI&lt;/strong&gt;。将 &lt;strong&gt;反向代理前缀 (Prefix)&lt;/strong&gt; 修正为实际域名，否则回传给下载器的封禁数据会使用本地环回地址导致同步失败。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 日志与屏蔽地区规则设置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;日志期限&lt;/strong&gt;：建议在设置中调整封禁日志保留时长至 &lt;code&gt;15天&lt;/code&gt; 或 &lt;code&gt;30天&lt;/code&gt; 以节省磁盘空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CN 地区屏蔽&lt;/strong&gt;：如遇极端流量占用，可在 &lt;strong&gt;设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;规则订阅&lt;/strong&gt; -&amp;gt; &lt;strong&gt;地区&lt;/strong&gt; 中配置 &lt;code&gt;CN&lt;/code&gt; 地区屏蔽规则。该规则可能会阻断部分正常的中文 Peer 连接，建议酌情选用。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>使用 Telegram Bot 实现 qBittorrent 下载完成即时通知</title><link>https://blog.rokutosei.com/posts/toolbox/qbittorrent-telegram-notification/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/toolbox/qbittorrent-telegram-notification/</guid><description>基于 Bash 脚本与 Telegram Bot API，在 qBittorrent 下载完成后推送通知的配置方法，适合 Seedbox 用户</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录通过 Telegram Bot 接收 qBittorrent 任务下载完成推送的配置方法。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 准备工作&lt;/h2&gt;
&lt;h3&gt;1.1 获取 Bot Token&lt;/h3&gt;
&lt;p&gt;在 Telegram 中向 &lt;code&gt;@BotFather&lt;/code&gt; 发送 &lt;code&gt;/newbot&lt;/code&gt; 指令，按照指引命名并获取 API Token（格式形如 &lt;code&gt;1234567890:BBA2XXjn...&lt;/code&gt;）。并在聊天中点击 &lt;strong&gt;Start&lt;/strong&gt; 激活对话。&lt;/p&gt;
&lt;h3&gt;1.2 获取 Chat ID&lt;/h3&gt;
&lt;p&gt;向机器人发送测试文本。在浏览器中访问以下接口（替换 &lt;code&gt;&amp;lt;TOKEN&amp;gt;&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记录返回的 JSON 数据中 &lt;code&gt;&quot;chat&quot;:{&quot;id&quot;:123456789}&lt;/code&gt; 中的数字。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 编写消息通知脚本&lt;/h2&gt;
&lt;p&gt;在服务器合适位置写入以下脚本（如 &lt;code&gt;~/script/tg_notify.sh&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 配置你的 token 和 ID
BOT_TOKEN=&quot;YOUR_BOT_TOKEN&quot;
CHAT_ID=&quot;YOUR_CHAT_ID&quot;
# ==========================================

# 接收 qB 传过来的参数
TORRENT_NAME=&quot;${1:-&quot;Unknown Torrent&quot;}&quot;
SIZE_BYTES=&quot;${2:-0}&quot;
SAVE_PATH=&quot;${3:-&quot;Unknown Path&quot;}&quot;

SAFE_NAME=$(echo &quot;$TORRENT_NAME&quot; | sed &apos;s/&amp;amp;/\&amp;amp;amp;/g; s/&amp;lt;/\&amp;amp;lt;/g; s/&amp;gt;/\&amp;amp;gt;/g&apos;)
SAFE_PATH_RAW=$(echo &quot;$SAVE_PATH&quot; | sed &apos;s/&amp;amp;/\&amp;amp;amp;/g; s/&amp;lt;/\&amp;amp;lt;/g; s/&amp;gt;/\&amp;amp;gt;/g&apos;)

SIZE_MB=$((SIZE_BYTES / 1024 / 1024))
if [ &quot;$SIZE_MB&quot; -ge 1024 ]; then
    SIZE_GB=$(echo &quot;scale=1; $SIZE_MB / 1024&quot; | bc)
    SIZE_DISPLAY=&quot;${SIZE_GB} GB&quot;
else
    SIZE_DISPLAY=&quot;${SIZE_MB} MB&quot;
fi

USERNAME=$(whoami)
SAVE_PATH_OBFUSCATED=$(echo &quot;$SAFE_PATH_RAW&quot; | sed &quot;s|${USERNAME}|&amp;lt;span class=\&quot;tg-spoiler\&quot;&amp;gt;${USERNAME}&amp;lt;/span&amp;gt;|g&quot;)

MESSAGE=&quot;🎉 &amp;lt;b&amp;gt;Seedbox 种子下载完成！&amp;lt;/b&amp;gt;

🎬 &amp;lt;b&amp;gt;名称&amp;lt;/b&amp;gt;: ${SAFE_NAME}
💾 &amp;lt;b&amp;gt;大小&amp;lt;/b&amp;gt;: ${SIZE_DISPLAY}
📁 &amp;lt;b&amp;gt;路径&amp;lt;/b&amp;gt;: ${SAVE_PATH_OBFUSCATED}&quot;

curl -s --max-time 10 -X POST &quot;https://api.telegram.org/bot${BOT_TOKEN}/sendMessage&quot; \
    -d chat_id=&quot;${CHAT_ID}&quot; \
    --data-urlencode text=&quot;${MESSAGE}&quot; \
    -d parse_mode=&quot;HTML&quot; &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予脚本可执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ~/script/tg_notify.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 在 qBittorrent 中启用绑定&lt;/h2&gt;
&lt;p&gt;在 qBittorrent WebUI 中打开 &lt;strong&gt;设置 (Settings)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;下载 (Downloads)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;启用 &lt;strong&gt;种子下载完成时运行外部程序 (Run external program on torrent completion)&lt;/strong&gt;，输入对应的调用命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/home/yourname/script/tg_notify.sh &quot;%N&quot; &quot;%Z&quot; &quot;%D&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：请根据实际运行路径替换 &lt;code&gt;/home/yourname/&lt;/code&gt; 部分。&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;变量映射说明：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%N&lt;/code&gt;：种子名称。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%Z&lt;/code&gt;：文件字节大小。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%D&lt;/code&gt;：保存目标目录。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>基于 qBittorrent EE、PeerBanHelper 与 OpenList 的个人追番 Seedbox 部署指南</title><link>https://blog.rokutosei.com/posts/seedbox/deployment/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/seedbox/deployment/</guid><description>个人追番向 Seedbox 完整部署指南。基于 qBittorrent Enhanced Edition、PeerBanHelper 与 OpenList，配合 Caddy 反代与系统安全加固（SSH、iptables+ipset 黑名单）。实现 RSS 自动下载、反吸血与多端在线观看，适合非 PT 刷流的个人用户。</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文先发布于 &lt;a href=&quot;https://www.nodeseek.com/post-779438-1&quot;&gt;NodeSeek&lt;/a&gt; 与 &lt;a href=&quot;https://github.com/ReRokutosei/SeedboxDeployment&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NodeSeek、GitHub 文章不保证再更新，可能过时&lt;/p&gt;
&lt;p&gt;请以本文或者为主&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;在此之前的很长一段时间里，我一直使用 Windows 本机运行 qBEE 追番。日常使用倒也没什么大问题，只是偶尔会系统卡顿一下（尤其在我播放音频的时候尤为明显），而且网络也似乎时不时被运营商 Q，多少有些不便。再考虑到长期全天做种对 SSD 有读写负担，索性迁移到 VPS 上&lt;/p&gt;
&lt;p&gt;前阵子我买了某芬兰厂家的普通 Seedbox（无 root 权限的普通盒子），但没想到短时间内就经历了两次服务宕机，发工单也没真人，都是 AI 敷衍回复。&lt;/p&gt;
&lt;p&gt;虽然社区也已经有了一键搭建脚本，但它们大多面向 PT 刷流场景，又或者里面预装很多东西等等之类的，于是我便想着，为什么我不自己搞一台大盘机做 Seedbox 呢？&lt;/p&gt;
&lt;p&gt;但最近硬盘内存涨价，连带服务器也水涨船高，便宜的大盘机基本都处于售罄状态，更何况是版权宽松的芬兰、荷兰和卢森堡等地的机器，特别某些热门商家，即便补货也是被脚本秒了。要么去继续蹲，要么溢价收……&lt;/p&gt;
&lt;p&gt;在我各种搜索之后，（虽然得到的案例不多）知道了我的需求貌似处于一个中间地带，被 DMCA 投诉的对象一般是热门美剧、英剧、好莱坞大片或主流流媒体平台（&lt;s&gt;Ne*flix、Di*ney+、H*O&lt;/s&gt;等）的独家剧集，而某 Mi*an、某 N*a 上面这类动漫种子则通常都是经由字幕组重烧录编码，文件哈希已经改变（除了 Raw 生肉搬运、部分由 &lt;s&gt;Ne*flix&lt;/s&gt; 发行的动漫），版权方很难追溯。那么我就想，是不是不一定需要找版权宽松地区的机器？这样选择范围变广了，再考虑到我需要通过 OpenList 在线观看，那在预算有限的情况下，优先选择美西地区的大盘机……&lt;/p&gt;
&lt;p&gt;&lt;s&gt;因此，我决定铤而走险，试试在 DMCA 最严格的 US 尝试 BT 下载&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;以本文记录我个人的操作流程，供日后参考&lt;/p&gt;
&lt;h2&gt;适用人群&lt;/h2&gt;
&lt;p&gt;本文面向&lt;strong&gt;以 RSS 订阅追番为主&lt;/strong&gt;、希望将 BT 下载与日常电脑分离的个人用户，适合以下读者：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;了解 Linux 基础操作&lt;/li&gt;
&lt;li&gt;拥有一台 VPS（2C2G 或 1C2G 起步）和一个个人域名&lt;/li&gt;
&lt;li&gt;希望设备简单解耦&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
本文&lt;strong&gt;不适合&lt;/strong&gt; PT 刷流或冲上传量的玩家&lt;/p&gt;
&lt;p&gt;文中配置追求保守、不被投诉，需要自动刷流请参考其他专门教程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;完成后将获得&lt;/h2&gt;
&lt;p&gt;跟随本文完成全部部署后，日常工作流如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;种子自动下载&lt;/strong&gt;：在 qBEE 中配置 RSS 订阅，番剧更新后自动下载到 VPS （限于篇幅，本文不教如何使用 RSS 订阅种子）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多端在线观看&lt;/strong&gt;：在任意设备的浏览器打开 &lt;code&gt;https://openlist.yourdomain.com&lt;/code&gt;，直接在线播放已下载的番剧&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地备份（可选）&lt;/strong&gt;：通过 Air2、SFTP、Rclone 等工具将文件拖回 Windows 本地保存&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%83%8C%E6%99%AF&quot;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%80%82%E7%94%A8%E4%BA%BA%E7%BE%A4&quot;&gt;适用人群&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AE%8C%E6%88%90%E5%90%8E%E5%B0%86%E8%8E%B7%E5%BE%97&quot;&gt;完成后将获得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%9B%B6-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C&quot;&gt;零、 准备工作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%80-%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E9%98%B2%E6%8A%A4&quot;&gt;一、 系统基础防护&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11-%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E4%BC%98%E5%8C%96&quot;&gt;1.1 系统基础优化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#111-%E6%B8%85%E9%99%A4%E5%8E%82%E5%AE%B6%E6%A8%A1%E6%9D%BF&quot;&gt;1.1.1 清除厂家模板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#112-%E5%BC%80%E5%90%AF-bbr-%E7%BD%91%E7%BB%9C%E5%8A%A0%E9%80%9F&quot;&gt;1.1.2 开启 BBR 网络加速&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#113-%E5%A2%9E%E5%A4%A7-swap%E5%8F%AF%E9%80%89&quot;&gt;1.1.3 增大 Swap（可选）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#114-%E5%88%87%E6%8D%A2%E9%BB%98%E8%AE%A4-shell-%E4%B8%BA-bash&quot;&gt;1.1.4 切换默认 Shell 为 Bash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-ssh-%E5%AF%86%E9%92%A5%E7%99%BB%E5%BD%95&quot;&gt;1.2 SSH 密钥登录&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#121-%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E5%AF%B9&quot;&gt;1.2.1 生成密钥对&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#122-%E4%B8%8A%E4%BC%A0%E5%85%AC%E9%92%A5%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8&quot;&gt;1.2.2 上传公钥至服务器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#123-%E5%8A%A0%E5%9B%BA-ssh-%E9%85%8D%E7%BD%AE&quot;&gt;1.2.3 加固 SSH 配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#124-%E6%B5%8B%E8%AF%95%E8%BF%9E%E6%8E%A5&quot;&gt;1.2.4 测试连接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#125-%E9%85%8D%E7%BD%AE%E6%9C%AC%E5%9C%B0%E5%BF%AB%E6%8D%B7%E7%99%BB%E5%BD%95&quot;&gt;1.2.5 配置本地快捷登录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-%E5%88%9B%E5%BB%BA%E6%96%B0%E7%94%A8%E6%88%B7&quot;&gt;1.3 创建新用户&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#131-%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E5%B9%B6%E8%AE%BE%E7%BD%AE%E7%99%BB%E5%BD%95%E5%AF%86%E7%A0%81&quot;&gt;1.3.1 创建用户并设置登录密码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#132-%E5%B0%86%E7%94%A8%E6%88%B7%E5%8A%A0%E5%85%A5-sudo-%E7%BB%84&quot;&gt;1.3.2 将用户加入 sudo 组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#133-%E9%85%8D%E7%BD%AE%E5%85%8D%E5%AF%86-sudo-%E5%8F%AF%E9%80%89%E8%B0%A8%E6%85%8E&quot;&gt;1.3.3 配置免密 sudo （可选、谨慎！）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#134-%E5%B0%86%E5%85%AC%E9%92%A5%E5%A4%8D%E5%88%B6%E7%BB%99%E6%96%B0%E7%94%A8%E6%88%B7&quot;&gt;1.3.4 将公钥复制给新用户&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#135-%E6%9B%B4%E6%96%B0%E6%9C%AC%E5%9C%B0-ssh-config&quot;&gt;1.3.5 更新本地 SSH config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-%E9%83%A8%E7%BD%B2-fail2ban&quot;&gt;1.4 部署 Fail2ban&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#15-%E9%83%A8%E7%BD%B2%E9%98%B2%E7%81%AB%E5%A2%99&quot;&gt;1.5 部署防火墙&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#151-%E7%A6%81%E7%94%A8-ufw&quot;&gt;1.5.1 禁用 UFW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#152-%E5%88%9B%E5%BB%BA%E9%98%B2%E7%81%AB%E5%A2%99%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC&quot;&gt;1.5.2 创建防火墙部署脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#153-%E5%88%9B%E5%BB%BA%E9%BB%91%E5%90%8D%E5%8D%95%E6%9B%B4%E6%96%B0%E8%84%9A%E6%9C%AC&quot;&gt;1.5.3 创建黑名单更新脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#154-%E9%A6%96%E6%AC%A1%E5%8A%A0%E8%BD%BD%E9%BB%91%E5%90%8D%E5%8D%95&quot;&gt;1.5.4 首次加载黑名单&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#155-%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0&quot;&gt;1.5.5 设置自动更新&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#156-%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99&quot;&gt;1.5.6 验证规则&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%8C-%E5%AE%89%E8%A3%85%E5%BA%94%E7%94%A8%E4%B8%8E%E5%8F%8D%E4%BB%A3%E7%BD%91%E5%85%B3&quot;&gt;二、 安装应用与反代网关&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E7%9B%AE%E5%BD%95%E5%88%9D%E5%A7%8B%E5%8C%96&quot;&gt;2.1 目录初始化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-%E5%AE%89%E8%A3%85%E5%B9%B6%E9%85%8D%E7%BD%AE-qbittorrent-ee&quot;&gt;2.2 安装并配置 qBittorrent EE&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#221-%E5%AE%89%E8%A3%85-qbee&quot;&gt;2.2.1 安装 qBEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#222-%E7%BC%96%E5%86%99%E6%9C%8D%E5%8A%A1&quot;&gt;2.2.2 编写服务&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-%E5%AE%89%E8%A3%85%E5%B9%B6%E9%85%8D%E7%BD%AE-peerbanhelper-pbh&quot;&gt;2.3 安装并配置 PeerBanHelper (PBH)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#231-%E9%85%8D%E7%BD%AE-java-25-%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83&quot;&gt;2.3.1 配置 Java 25 运行环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#232-%E4%B8%8B%E8%BD%BD%E5%B9%B6%E8%A7%A3%E5%8E%8B-pbh&quot;&gt;2.3.2 下载并解压 PBH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#233-%E7%BC%96%E5%86%99-systemd-%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B&quot;&gt;2.3.3 编写 Systemd 守护进程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#24-%E5%AE%89%E8%A3%85%E5%B9%B6%E9%85%8D%E7%BD%AE-openlist-%E6%B5%81%E5%AA%92%E4%BD%93%E9%9D%A2%E6%9D%BF&quot;&gt;2.4 安装并配置 OpenList (流媒体面板)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#25-%E9%83%A8%E7%BD%B2-caddy-%E7%BD%91%E5%85%B3%E7%BB%9F%E4%B8%80%E5%8F%8D%E4%BB%A3&quot;&gt;2.5 部署 Caddy 网关统一反代&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#251-cloudflare-dns-%E8%AE%BE%E7%BD%AE&quot;&gt;2.5.1 Cloudflare DNS 设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#252-%E5%AE%89%E8%A3%85-caddy&quot;&gt;2.5.2 安装 Caddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#253-%E9%85%8D%E7%BD%AE-caddyfile-%E8%B7%AF%E7%94%B1&quot;&gt;2.5.3 配置 Caddyfile 路由&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#26-%E9%99%90%E5%88%B6-systemd-journal-%E6%97%A5%E5%BF%97%E5%A4%A7%E5%B0%8F&quot;&gt;2.6 限制 Systemd Journal 日志大小&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%89%E5%90%AF%E5%8A%A8%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%BA%94%E7%94%A8&quot;&gt;三、启动并配置应用&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-%E5%90%AF%E5%8A%A8-qbee&quot;&gt;3.1 启动 qBEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-%E5%90%AF%E5%8A%A8-pbh&quot;&gt;3.2 启动 PBH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-%E5%90%AF%E5%8A%A8-openlist&quot;&gt;3.3 启动 OpenList&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%9B%9B-%E8%BF%9B%E9%98%B6%E5%8F%AF%E9%80%89%E9%85%8D%E7%BD%AE&quot;&gt;四、 进阶可选配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#41-%E6%9B%B4%E6%8D%A2-webui-%E4%B8%BA-vuetorrent&quot;&gt;4.1 更换 WebUI 为 VueTorrent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#42-%E8%87%AA%E5%8A%A8%E6%B8%85%E7%90%86%E8%BF%87%E6%9C%9F%E7%95%AA%E5%89%A7&quot;&gt;4.2 自动清理过期番剧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#43-%E4%BC%98%E5%8C%96%E7%BA%BF%E8%B7%AF%E8%B7%B3%E8%BD%ACmihomo-%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91&quot;&gt;4.3 优化线路跳转（Mihomo 代理转发）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#44-%E9%85%8D%E7%BD%AE%E4%B8%8B%E8%BD%BD%E9%80%9A%E7%9F%A5telegram-bot&quot;&gt;4.4 配置下载通知（Telegram Bot）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#441-%E5%88%9B%E5%BB%BA-telegram-bot&quot;&gt;4.4.1 创建 Telegram Bot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#442-%E8%8E%B7%E5%8F%96-chat-id&quot;&gt;4.4.2 获取 Chat ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#443-%E5%88%9B%E5%BB%BA%E9%80%9A%E7%9F%A5%E8%84%9A%E6%9C%AC&quot;&gt;4.4.3 创建通知脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#444-%E7%BB%91%E5%AE%9A%E5%88%B0-qbee&quot;&gt;4.4.4 绑定到 qBEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#445-%E9%A2%84%E6%9C%9F%E6%95%88%E6%9E%9C&quot;&gt;4.4.5 预期效果&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#45-%E9%83%A8%E7%BD%B2%E9%9B%B6%E4%BF%A1%E4%BB%BB%E9%9A%A7%E9%81%93&quot;&gt;4.5 部署零信任隧道&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#451-%E5%9C%A8%E4%BA%91%E7%AB%AF%E5%88%9B%E5%BB%BA%E9%9A%A7%E9%81%93&quot;&gt;4.5.1 在云端创建隧道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#452-%E5%9C%A8-seedbox-%E4%B8%8A%E5%AE%89%E8%A3%85%E8%BF%9E%E6%8E%A5%E5%99%A8&quot;&gt;4.5.2 在 Seedbox 上安装连接器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#453-%E5%9C%A8%E7%BD%91%E9%A1%B5%E7%AB%AF%E9%85%8D%E7%BD%AE-ssh-%E8%B7%AF%E7%94%B1&quot;&gt;4.5.3 在网页端配置 SSH 路由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#454-%E5%A2%9E%E5%8A%A0-ssh-%E9%85%8D%E7%BD%AE%E5%9D%97&quot;&gt;4.5.4 增加 SSH 配置块&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%99%84qbee-%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE&quot;&gt;附：qBEE 参考配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%99%90%E9%80%9F&quot;&gt;限速&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BF%9E%E6%8E%A5%E6%95%B0&quot;&gt;连接数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%98%9F%E5%88%97&quot;&gt;队列&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%81%9A%E7%A7%8D%E9%99%90%E5%88%B6&quot;&gt;做种限制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bittorrent&quot;&gt;BitTorrent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%AB%98%E7%BA%A7--%E5%86%85%E5%AD%98&quot;&gt;高级 — 内存&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%AB%98%E7%BA%A7--%E7%BA%BF%E7%A8%8B&quot;&gt;高级 — 线程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%AB%98%E7%BA%A7--%E7%A3%81%E7%9B%98&quot;&gt;高级 — 磁盘&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%AB%98%E7%BA%A7--%E7%BD%91%E7%BB%9C%E4%B8%8E-peer&quot;&gt;高级 — 网络与 Peer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%99%84%E6%9C%AC%E6%96%87%E6%8F%90%E5%8F%8A%E7%AB%AF%E5%8F%A3%E9%80%9F%E6%9F%A5&quot;&gt;附：本文提及端口速查&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;零、 准备工作&lt;/h2&gt;
&lt;p&gt;在开始之前，请做好以下准备：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一个个人域名&lt;/strong&gt;：用于反代访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个通过支付验证的 Cloudflare 账号&lt;/strong&gt;：将域名托管至 Cloudflare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一台 VPS&lt;/strong&gt;：拥有 root 且建议 2GB RAM 起步&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
为避免纠纷，本文&lt;strong&gt;不提供任何 VPS 商家推荐或购买指导&lt;/strong&gt;，请自行选择&lt;/p&gt;
&lt;p&gt;本文中的 &lt;code&gt;your_vps_ip&lt;/code&gt;、&lt;code&gt;yourname&lt;/code&gt;、&lt;code&gt;yourdomain.com&lt;/code&gt; 均为占位符，实际操作时请替换为你的真实 IP、用户名和域名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、 系统基础防护&lt;/h2&gt;
&lt;h3&gt;1.1 系统基础优化&lt;/h3&gt;
&lt;h4&gt;1.1.1 清除厂家模板&lt;/h4&gt;
&lt;p&gt;使用 root 账密进行 ssh 登录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh root@192.0.2.100  # 改为你的 IP，回车后输入密码
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部分服务商的系统模板可能包含首次开机脚本，建议清除，没有则跳过&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入编辑界面后，寻找类似 &lt;code&gt;@reboot /admin/firstbootkvm yes&lt;/code&gt; 的行，将其删除并保存&lt;/p&gt;
&lt;h4&gt;1.1.2 开启 BBR 网络加速&lt;/h4&gt;
&lt;p&gt;把系统自带的 BBR 拥塞控制开启，能直接拉升机器的公网吞吐量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;net.core.default_qdisc=fq&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
echo &quot;net.ipv4.tcp_congestion_control=bbr&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.1.3 增大 Swap（可选）&lt;/h4&gt;
&lt;p&gt;对于 2GB RAM 的 VPS，qBEE 和 PBH 同时运行时内存吃紧，适当增大 Swap 可提供缓冲：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前 Swap
sudo swapon --show

# 创建 2G Swap 文件（可根据磁盘余量调整大小）
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 写入 fstab 使其重启后自动挂载
echo &apos;/swapfile none swap sw 0 0&apos; | sudo tee -a /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;降低 swappiness 让系统优先使用物理内存：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;vm.swappiness=10&apos; | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;swappiness&lt;/th&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;不用 swap（如果 RAM 充足，可以完全不用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;物理内存接近耗尽时才动用 swap（&lt;strong&gt;推荐&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;较保守的折中值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;系统默认，较早换出到 swap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;数值越低，系统越倾向保留物理内存，避免磁盘 I/O；但同时 OOM 风险略增。常规场景设为 10 即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.1.4 切换默认 Shell 为 Bash&lt;/h4&gt;
&lt;p&gt;Debian 12 Template 默认将 &lt;code&gt;/bin/sh&lt;/code&gt; 指向 &lt;code&gt;dash&lt;/code&gt;，不是 &lt;code&gt;bash&lt;/code&gt;。本文所有脚本均以 &lt;code&gt;#!/bin/bash&lt;/code&gt; 声明，&lt;strong&gt;不受影响&lt;/strong&gt;，但个别系统脚本和交互环境可能行为异常（比如在 PowerShell 7 中主机名无彩色、部分 sh 脚本语法报错）。&lt;/p&gt;
&lt;p&gt;将默认 Shell 切换为 bash：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一（标准交互方式）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前指向
ls -l /bin/sh

# 重新配置 dash，在弹出的对话框中选择 &amp;lt;No&amp;gt;（即“不使用 dash 作为默认 sh”）
sudo dpkg-reconfigure dash

# 确认已切换
ls -l /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后应看到 &lt;code&gt;/bin/sh -&amp;gt; bash&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果执行后没有弹出任何交互窗口（直接返回），可能是系统处于非交互模式，&lt;strong&gt;请改用方法二：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 设置 debconf 选项为“不使用 dash”
echo &quot;dash dash/sh boolean false&quot; | sudo debconf-set-selections

# 手动链接到 bash
sudo ln -sf bash /bin/sh

# 确认切换
ls -l /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;方法二同时更新了 debconf 数据库，因此后续 dash 包升级时不会自动覆盖该链接。如果交互失败，直接采用方法二即可，无需纠结弹窗。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.2 SSH 密钥登录&lt;/h3&gt;
&lt;h4&gt;1.2.1 生成密钥对&lt;/h4&gt;
&lt;p&gt;在本地电脑（本文以 Windows 为例）打开 PowerShell 7，生成一把新密钥对：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
ssh-keygen -t ed25519 -C &quot;随便取名比如seedbox&quot; -f ~/.ssh/id_ed25519_seedbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回车后，会提示你设置密码（passphrase），如果嫌麻烦可以直接连按两次回车跳过即可&lt;/p&gt;
&lt;h4&gt;1.2.2 上传公钥至服务器&lt;/h4&gt;
&lt;p&gt;密钥生成后，在本地 PowerShell 中运行以下命令，将公钥上传到服务器（注意将 &lt;code&gt;your_vps_ip&lt;/code&gt; 替换为真实 IP）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$pubKey = Get-Content &quot;$HOME\.ssh\id_ed25519_seedbox.pub&quot;
$pubKey | ssh root@your_vps_ip &quot;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.2.3 加固 SSH 配置&lt;/h4&gt;
&lt;p&gt;然后，回到 VPS SSH 窗口，编辑 SSH 配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改或取消注释以下行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port 43210                  # 修改为任意高位端口
PasswordAuthentication no   # 禁用密码登录
PubkeyAuthentication yes    # 允许密钥登录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顺便查看是否存在这一行 &lt;code&gt;Include /etc/ssh/sshd_config.d/*.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如有，在保存退出对 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; 的编辑后，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls -R /etc/ssh/sshd_config.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果看到输出结果是 &lt;code&gt;50-cloud-init.conf&lt;/code&gt;，则继续输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将里面的 &lt;code&gt;PasswordAuthentication yes&lt;/code&gt; 改为 &lt;code&gt;PasswordAuthentication no&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;重启 SSH 服务使变更生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，重启服务后，先别关闭当前的 SSH 终端窗口，先开一个新的终端窗口，测试一下能不能用新端口和密钥成功连上，如果连不上，在原来的窗口里把配置改回来&lt;/p&gt;
&lt;h4&gt;1.2.4 测试连接&lt;/h4&gt;
&lt;p&gt;从本地 Windows 测试连接的命令是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/.ssh
ssh -i ./id_ed25519_seedbox -p 43210 root@your_vps_ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果私钥设置了 passphrase，在连接时会提示输入；如果没有设置，则直接登录&lt;/p&gt;
&lt;h4&gt;1.2.5 配置本地快捷登录&lt;/h4&gt;
&lt;p&gt;如果希望后续不用每次都输路径和端口，可以在本地添加一个配置块&lt;/p&gt;
&lt;p&gt;在 Windows Powershell 7 输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notepad $HOME/.ssh/config 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回车后会打开一个记事本编辑器，输入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host seedbox
    HostName your_vps_ip
    User root
    Port 43210
    IdentityFile ~/.ssh/id_ed25519_seedbox
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ctrl+S 保存后，即可用以下命令登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh seedbox
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 创建新用户&lt;/h3&gt;
&lt;p&gt;为贯彻最小权限原则，我们不使用 &lt;code&gt;root&lt;/code&gt; 登录，创建一个专用用户来运行服务和管理文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
以下步骤仍在当前的 root SSH 会话中执行，完成后将切换到新用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.3.1 创建用户并设置登录密码&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 创建用户 yourname（UID 1000，带 home 目录）
useradd -m -u 1000 yourname

# 设置密码（必须设置，否则无法使用 sudo）
passwd yourname
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
系统会提示你输入两次密码，虽然我们主要用密钥登录，但 &lt;strong&gt;&lt;code&gt;sudo&lt;/code&gt; 默认需要用户有密码&lt;/strong&gt;，否则会报错 &lt;code&gt;user is not in the sudoers file&lt;/code&gt; 或 &lt;code&gt;no password set&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.3.2 将用户加入 sudo 组&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;usermod -aG sudo yourname
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3.3 配置免密 sudo （可选、谨慎！）&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
跳过密码验证会降低安全性，仅建议在&lt;strong&gt;个人独占、无敏感数据&lt;/strong&gt;的 VPS 上使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你希望执行 &lt;code&gt;sudo&lt;/code&gt; 时&lt;strong&gt;不用输密码&lt;/strong&gt;，编辑 sudoers 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件末尾添加一行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yourname ALL=(ALL) NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ctrl+O 、回车、 Ctrl+X 保存退出&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
比较推荐的方法是保留密码验证，只对特定命令免密&lt;/p&gt;
&lt;p&gt;比如 &lt;code&gt;sudo systemctl restart qbittorrent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;本教程为简化流程采用全局免密&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.3.4 将公钥复制给新用户&lt;/h4&gt;
&lt;p&gt;在&lt;strong&gt;本地 PowerShell&lt;/strong&gt; 中运行（注意将 &lt;code&gt;your_vps_ip&lt;/code&gt; 替换为真实 IP）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$pubKey = Get-Content &quot;$HOME\.ssh\id_ed25519_seedbox.pub&quot;
$pubKey | ssh seedbox &quot;mkdir -p /home/yourname/.ssh &amp;amp;&amp;amp; chmod 700 /home/yourname/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; /home/yourname/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 /home/yourname/.ssh/authorized_keys &amp;amp;&amp;amp; chown -R yourname:yourname /home/yourname/.ssh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3.5 更新本地 SSH config&lt;/h4&gt;
&lt;p&gt;打开你本地的 &lt;code&gt;$HOME/.ssh/config&lt;/code&gt;，追加新用户的配置块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host seedbox-yourname
    HostName your_vps_ip
    User yourname
    Port 43210
    IdentityFile ~/.ssh/id_ed25519_seedbox
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后，即可用 &lt;code&gt;ssh seedbox-yourname&lt;/code&gt; 登录，再通过 &lt;code&gt;sudo&lt;/code&gt; 执行管理命令&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4 部署 Fail2ban&lt;/h3&gt;
&lt;p&gt;虽然已经禁用了密码登录，但公网上的端口探测依然会消耗系统资源&lt;/p&gt;
&lt;p&gt;Fail2ban 可以动态封禁那些反复试探的 IP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建自定义配置，注意将 &lt;code&gt;port&lt;/code&gt; 改为你之前设置的 SSH 端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/fail2ban/jail.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[sshd]
enabled = true
port = 43210
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;10 分钟内输错 3 次密码，封禁该 IP 24 小时&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动并设置开机自启：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.5 部署防火墙&lt;/h3&gt;
&lt;p&gt;本文采用以下设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;防火墙规则&lt;/strong&gt;（iptables）：长期稳定，部署一次即可，后续无需变动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黑名单数据&lt;/strong&gt;（ipset）：定期更新，独立脚本执行，不影响现有防火墙规则&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;防火墙规则 (deploy_firewall.sh)     → 执行一次即可
        ↓
     ipset 集合
        ↓
ASN 黑名单 (update_blacklists.sh)  → 每周自动更新
P2P 黑名单 (update_blacklists.sh)  → 每周自动更新
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.5.1 禁用 UFW&lt;/h4&gt;
&lt;p&gt;如果你之前启用过 UFW，先关掉：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw disable
sudo systemctl stop ufw
sudo systemctl disable ufw
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.5.2 创建防火墙部署脚本&lt;/h4&gt;
&lt;p&gt;防火墙部署脚本只需&lt;strong&gt;执行一次&lt;/strong&gt;（或修改端口配置后重新执行）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/local/bin/deploy_firewall.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;粘贴以下脚本：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
注意修改开头的&lt;strong&gt;用户配置区&lt;/strong&gt;：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# ============================================================================
# 部署防火墙规则，本脚本只需执行一次
#
# 修改配置后重新执行即可，脚本会自动覆盖旧规则
# ============================================================================

# ===================== 用户配置区 =====================

SSH_PORT=43210

# BT 监听端口（TCP 与 UDP 通常相同）
BT_TCP_PORT=54321
BT_UDP_PORT=54321

# Web 端口（80 用于 HTTP，443 用于 HTTPS）
# 如需放行其他端口请在此添加
WEB_PORTS=(80 443)

# 是否启用 IPv6（1=启用，0=禁用）
ENABLE_IPV6=1

# 邻居网段全局阻断（设为 &quot;-&quot; 表示不启用）
# 示例: NEIGHBOR_V4=&quot;10.0.0.0/8&quot;
NEIGHBOR_V4=&quot;-&quot;
NEIGHBOR_V6=&quot;-&quot;


export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;

# ===================== 日志与颜色 =====================

RED=&apos;\033[1;31m&apos;
GREEN=&apos;\033[1;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
BLUE=&apos;\033[1;34m&apos;
CYAN=&apos;\033[1;36m&apos;
NC=&apos;\033[0m&apos;

log()  { echo -e &quot;${BLUE}[INFO]${NC}  $1&quot;; }
ok()   { echo -e &quot;${GREEN}[OK]${NC}    $1&quot;; }
warn() { echo -e &quot;${YELLOW}[WARN]${NC}  $1&quot;; }
err()  { echo -e &quot;${RED}[ERR]${NC}   $1&quot;; }
die()  { err &quot;$1&quot;; exit 1; }

# 检查 IPv6
check_v6() {
    if [ &quot;$ENABLE_IPV6&quot; != &quot;1&quot; ]; then echo 0; return; fi
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

# 依赖检查
check_deps() {
    local missing=()
    for cmd in ipset iptables; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        err &quot;Missing dependencies: ${missing[*]}&quot;
        err &quot;Run: apt install -y ipset iptables&quot;
        exit 1
    fi
    ok &quot;Dependencies satisfied&quot;

    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ! command -v ip6tables &amp;amp;&amp;gt;/dev/null; then
        warn &quot;ip6tables not found, disabling IPv6&quot;
        HAS_V6=0
    fi
}

# 安装 iptables-persistent 与 ipset-persistent
install_persistent() {
    if dpkg -l iptables-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos; &amp;amp;&amp;amp; dpkg -l ipset-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos;; then
        return 0
    fi
    log &quot;Installing iptables-persistent &amp;amp; ipset-persistent...&quot;
    echo iptables-persistent iptables-persistent/autosave_v4 boolean true \
        | debconf-set-selections 2&amp;gt;/dev/null
    echo iptables-persistent iptables-persistent/autosave_v6 boolean true \
        | debconf-set-selections 2&amp;gt;/dev/null
    DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent ipset-persistent &amp;amp;&amp;gt;/dev/null \
        || warn &quot;Could not install persistent packages, will fallback to manual save&quot;
}

# 创建 ipset 集合
create_ipsets() {
    ipset create bad_asn_v4 hash:net family inet \
        hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    ipset create bad_p2p_v4 hash:net family inet \
        hashsize 65536 maxelem 1000000 -exist 2&amp;gt;/dev/null
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        ipset create bad_asn_v6 hash:net family inet6 \
            hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    fi
    ok &quot;ipset collections created&quot;
}

# 部署 iptables 规则
deploy_v4() {
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    iptables -F
    iptables -X

    # 基础放行
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT

    # 全局阻断：邻居网段
    if [ &quot;$NEIGHBOR_V4&quot; != &quot;-&quot; ]; then
        iptables -A INPUT -s &quot;$NEIGHBOR_V4&quot; -j DROP
        ok &quot;Neighbor v4 blocked globally: $NEIGHBOR_V4&quot;
    fi

    # 全局阻断：ASN &amp;amp; P2P 黑名单
    iptables -A INPUT -m set --match-set bad_asn_v4 src -j DROP
    iptables -A INPUT -m set --match-set bad_p2p_v4 src -j DROP
    ok &quot;Global blacklist: DROP(ASN) -&amp;gt; DROP(P2P)&quot;

    # SSH
    iptables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT
    ok &quot;Allow TCP port $SSH_PORT (SSH)&quot;

    # Web (80, 443)
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        iptables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
        ok &quot;Allow TCP port $port (Web)&quot;
    done

    # BT
    iptables -A INPUT -p tcp --dport &quot;$BT_TCP_PORT&quot; -j ACCEPT
    ok &quot;Allow TCP port $BT_TCP_PORT (BT)&quot;
    iptables -A INPUT -p udp --dport &quot;$BT_UDP_PORT&quot; -j ACCEPT
    ok &quot;Allow UDP port $BT_UDP_PORT (BT DHT)&quot;
}

# 部署 ip6tables 规则
deploy_v6() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT

    ip6tables -F
    ip6tables -X

    ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

    # 全局阻断：邻居网段
    if [ &quot;$NEIGHBOR_V6&quot; != &quot;-&quot; ]; then
        ip6tables -A INPUT -s &quot;$NEIGHBOR_V6&quot; -j DROP
        ok &quot;Neighbor v6 blocked globally: $NEIGHBOR_V6&quot;
    fi

    # 全局阻断：ASN 黑名单
    ip6tables -A INPUT -m set --match-set bad_asn_v6 src -j DROP
    ok &quot;Global blacklist: DROP(ASN)&quot;

    # SSH
    ip6tables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT

    # Web (80, 443)
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        ip6tables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
    done

    # BT
    ip6tables -A INPUT -p tcp --dport &quot;$BT_TCP_PORT&quot; -j ACCEPT
    ip6tables -A INPUT -p udp --dport &quot;$BT_UDP_PORT&quot; -j ACCEPT
}

# 持久化
persist() {
    if command -v netfilter-persistent &amp;amp;&amp;gt;/dev/null; then
        netfilter-persistent save 2&amp;gt;/dev/null
        ok &quot;Rules saved via netfilter-persistent&quot;
    else
        mkdir -p /etc/iptables
        ipset save &amp;gt; /etc/iptables/ipsets 2&amp;gt;/dev/null
        iptables-save &amp;gt; /etc/iptables/rules.v4
        [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ip6tables-save &amp;gt; /etc/iptables/rules.v6
        ok &quot;Rules saved to /etc/iptables/&quot;
        warn &quot;Consider installing iptables-persistent for automatic restore on boot&quot;
    fi
}

# 打印当前规则
print_rules() {
    echo &quot;&quot;
    echo -e &quot;${CYAN}=== IPv4 INPUT Rules ===${NC}&quot;
    iptables -L INPUT -v -n --line-numbers 2&amp;gt;/dev/null | head -20
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        echo &quot;&quot;
        echo -e &quot;${CYAN}=== IPv6 INPUT Rules ===${NC}&quot;
        ip6tables -L INPUT -v -n --line-numbers 2&amp;gt;/dev/null | head -15
    fi
}

# 主流程
main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then
        die &quot;This script must be run as root&quot;
    fi

    echo &quot;&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo -e &quot;${GREEN}  Firewall Deployment (One-Time Setup)${NC}&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo &quot;&quot;

    HAS_V6=$(check_v6)
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ok &quot;IPv6 enabled&quot; || warn &quot;IPv6 disabled&quot;

    check_deps
    create_ipsets

    echo &quot;&quot;
    log &quot;Deploying IPv4 rules...&quot;
    deploy_v4

    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        echo &quot;&quot;
        log &quot;Deploying IPv6 rules...&quot;
        deploy_v6
    fi

    echo &quot;&quot;
    log &quot;Persisting rules...&quot;
    install_persistent
    persist

    print_rules

    echo &quot;&quot;
    echo -e &quot;${GREEN}Firewall deployed.${NC}&quot;
    echo -e &quot;${YELLOW}Next: run update_blacklists.sh to load ASN/P2P blacklists.${NC}&quot;
    echo &quot;&quot;
}

main &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限并运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/deploy_firewall.sh
sudo /usr/local/bin/deploy_firewall.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建 ipset 集合（&lt;code&gt;bad_asn_v4&lt;/code&gt;、&lt;code&gt;bad_p2p_v4&lt;/code&gt;、&lt;code&gt;bad_asn_v6&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;清空原有 iptables 规则并部署新规则&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;iptables-persistent&lt;/code&gt; 和 &lt;code&gt;ipset-persistent&lt;/code&gt; 并保存规则（重启后自动恢复）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
iptables 的匹配逻辑是 &lt;strong&gt;“自上而下，首次匹配即停止”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本脚本将黑名单 DROP 规则写在开放端口 ACCEPT 规则的前面：命中黑名单的请求在前半部分就会被直接丢弃；只有未命中黑名单的正常请求，才会顺次走到后半部分被 443 / BT 端口 ACCEPT 放行。&lt;/p&gt;
&lt;p&gt;此脚本只部署防火墙规则，&lt;strong&gt;不会下载黑名单数据&lt;/strong&gt;。此时 ipset 集合为空，所有合法的 443 和 BT 请求均可正常访问。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.5.3 创建黑名单更新脚本&lt;/h4&gt;
&lt;p&gt;黑名单更新脚本负责下载 ASN/P2P 数据并更新 ipset 集合，&lt;strong&gt;不修改防火墙规则&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;粘贴以下脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# ============================================================================
# 更新 ASN &amp;amp; P2P 黑名单
# ============================================================================

# 需要屏蔽的 ASN
ASNS=(
    &quot;14061|DigitalOcean&quot;
    &quot;16509|AWS&quot;
    &quot;15169|Google_Cloud&quot;
    &quot;8075|Azure&quot;
    &quot;20473|Vultr&quot;
    &quot;31898|Oracle&quot;
)

# P2P 黑名单数据源
declare -A P2P_SOURCES=(
    [&quot;Naunter_Mega&quot;]=&quot;https://raw.githubusercontent.com/Naunter/BT_BlockLists/master/bt_blocklists.gz&quot;
    [&quot;mxdpeep_Comprehensive&quot;]=&quot;https://raw.githubusercontent.com/mxdpeep/p2p-blocklist-creator/master/blocklist.p2p&quot;
    [&quot;eMule_Security&quot;]=&quot;http://upd.emule-security.org/ipfilter.zip&quot;
)

# 缓存目录
CACHE_DIR=&quot;/var/lib/seedbox-firewall&quot;


export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;
set -o pipefail

# ===================== 日志与颜色 =====================

RED=&apos;\033[1;31m&apos;
GREEN=&apos;\033[1;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
BLUE=&apos;\033[1;34m&apos;
CYAN=&apos;\033[1;36m&apos;
NC=&apos;\033[0m&apos;

log()  { echo -e &quot;${BLUE}[INFO]${NC}  $1&quot;; }
ok()   { echo -e &quot;${GREEN}[OK]${NC}    $1&quot;; }
warn() { echo -e &quot;${YELLOW}[WARN]${NC}  $1&quot;; }
err()  { echo -e &quot;${RED}[ERR]${NC}   $1&quot;; }
die()  { err &quot;$1&quot;; exit 1; }
ln()   { echo &quot;------------------------------&quot;; }
fmt()  { printf &quot;%&apos;d&quot; &quot;$1&quot;; }

# 检查 IPv6
check_v6() {
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

# 依赖检查
check_deps() {
    local missing=()
    for cmd in curl gunzip unzip awk python3 ipset whois md5sum sha256sum; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        die &quot;Missing: ${missing[*]}. Run: apt install -y curl gzip unzip gawk python3 ipset iproute2 whois&quot;
    fi

    # 检查 ipsets 是否存在
    if ! ipset list bad_asn_v4 &amp;amp;&amp;gt;/dev/null || ! ipset list bad_p2p_v4 &amp;amp;&amp;gt;/dev/null; then
        die &quot;ipsets not found. Run deploy_firewall.sh first.&quot;
    fi
}

# ===================== 缓存函数 =====================

init_cache() {
    mkdir -p &quot;$CACHE_DIR&quot; 2&amp;gt;/dev/null || { die &quot;Cannot create $CACHE_DIR&quot;; }
}

get_cached_hash() {
    local name=&quot;$1&quot;
    local hashfile=&quot;${CACHE_DIR}/${name}.sha256&quot;
    [ -f &quot;$hashfile&quot; ] &amp;amp;&amp;amp; cat &quot;$hashfile&quot; || echo &quot;&quot;
}

set_cached_hash() {
    local name=&quot;$1&quot; hash=&quot;$2&quot;
    echo &quot;$hash&quot; &amp;gt; &quot;${CACHE_DIR}/${name}.sha256&quot;
}

is_changed() {
    local name=&quot;$1&quot; cidr_file=&quot;$2&quot;
    if [ ! -s &quot;$cidr_file&quot; ]; then
        return 0  # 空文件视为有变化（或错误）
    fi
    local new_hash=$(sha256sum &quot;$cidr_file&quot; | awk &apos;{print $1}&apos;)
    local old_hash=$(get_cached_hash &quot;$name&quot;)
    if [ &quot;$new_hash&quot; = &quot;$old_hash&quot; ] &amp;amp;&amp;amp; [ -n &quot;$old_hash&quot; ]; then
        return 1  # 未变化
    fi
    return 0  # 有变化
}

update_cache() {
    local name=&quot;$1&quot; cidr_file=&quot;$2&quot;
    local new_hash=$(sha256sum &quot;$cidr_file&quot; | awk &apos;{print $1}&apos;)
    set_cached_hash &quot;$name&quot; &quot;$new_hash&quot;
}

# ===================== ASN 更新 =====================

update_asn() {
    log &quot;Fetching ASN routes from RADb...&quot;

    local work=&quot;/tmp/asn-update-$$&quot;
    mkdir -p &quot;$work&quot;
    local v4_cidr=&quot;${CACHE_DIR}/asn_v4.cidr&quot;
    local v6_cidr=&quot;${CACHE_DIR}/asn_v6.cidr&quot;
    local v4_tmp=&quot;${work}/asn_v4.cidr&quot;
    local v6_tmp=&quot;${work}/asn_v6.cidr&quot;

    true &amp;gt; &quot;$v4_tmp&quot;
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; true &amp;gt; &quot;$v6_tmp&quot;

    local v4_total=0 v6_total=0

    for ITEM in &quot;${ASNS[@]}&quot;; do
        ASN=&quot;${ITEM%%|*}&quot;
        NAME=&quot;${ITEM##*|}&quot;

        local whois_out=&quot;${work}/whois_${ASN}.txt&quot;
        if ! timeout 20 whois -h whois.radb.net -- &quot;-i origin AS${ASN}&quot; &amp;gt; &quot;$whois_out&quot; 2&amp;gt;/dev/null; then
            warn &quot;AS${ASN} ${NAME}: whois timeout or failed&quot;
            rm -f &quot;$whois_out&quot;
            continue
        fi

        # 提取 v4 路由
        local v4_count=$(awk &apos;/^route:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v4_tmp&quot; | wc -l)
        v4_total=$((v4_total + v4_count))

        if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
            local v6_count=$(awk &apos;/^route6:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v6_tmp&quot; | wc -l)
            v6_total=$((v6_total + v6_count))
        fi

        log &quot;  AS${ASN} ${NAME}: v4=${v4_count} v6=${HAS_V6:+&quot;$v6_count&quot;}&quot;
        rm -f &quot;$whois_out&quot;
    done

    # 更新 v4
    local v4_updated=0
    if [ &quot;$v4_total&quot; -lt 50 ]; then
        warn &quot;ASN v4 too few entries ($v4_total), keeping existing set&quot;
    elif is_changed &quot;asn_v4&quot; &quot;$v4_tmp&quot;; then
        log &quot;ASN v4 changed, swapping ipset...&quot;
        local new_set=&quot;bad_asn_v4_new&quot;
        ipset create &quot;$new_set&quot; hash:net family inet hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
        {
            echo &quot;create $new_set hash:net family inet hashsize 4096 maxelem 500000 -exist&quot;
            awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v4_tmp&quot;
        } | ipset restore -exist 2&amp;gt;/dev/null
        ipset swap &quot;$new_set&quot; bad_asn_v4
        ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
        cp &quot;$v4_tmp&quot; &quot;$v4_cidr&quot;
        update_cache &quot;asn_v4&quot; &quot;$v4_tmp&quot;
        v4_updated=1
        ok &quot;ASN v4 updated: $(fmt $(wc -l &amp;lt; &quot;$v4_cidr&quot;)) entries&quot;
    else
        ok &quot;ASN v4 unchanged ($(fmt $v4_total) entries), skipped&quot;
    fi

    # 更新 v6
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        if [ &quot;$v6_total&quot; -lt 50 ]; then
            warn &quot;ASN v6 too few entries ($v6_total), keeping existing set&quot;
        elif is_changed &quot;asn_v6&quot; &quot;$v6_tmp&quot;; then
            log &quot;ASN v6 changed, swapping ipset...&quot;
            local new_set=&quot;bad_asn_v6_new&quot;
            ipset create &quot;$new_set&quot; hash:net family inet6 hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
            {
                echo &quot;create $new_set hash:net family inet6 hashsize 4096 maxelem 500000 -exist&quot;
                awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v6_tmp&quot;
            } | ipset restore -exist 2&amp;gt;/dev/null
            ipset swap &quot;$new_set&quot; bad_asn_v6
            ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
            cp &quot;$v6_tmp&quot; &quot;$v6_cidr&quot;
            update_cache &quot;asn_v6&quot; &quot;$v6_tmp&quot;
            ok &quot;ASN v6 updated: $(fmt $(wc -l &amp;lt; &quot;$v6_cidr&quot;)) entries&quot;
        else
            ok &quot;ASN v6 unchanged ($(fmt $v6_total) entries), skipped&quot;
        fi
    fi

    rm -rf &quot;$work&quot;
}

# ===================== P2P 更新 =====================

download_p2p_source() {
    local name=&quot;$1&quot; url=&quot;$2&quot; out=&quot;$3&quot;
    printf &quot;  %-25s &quot; &quot;${name}...&quot;

    if ! curl -sL --connect-timeout 15 --max-time 120 --retry 3 --retry-delay 2 \
        &quot;$url&quot; -o &quot;$out&quot;; then
        echo -e &quot;${RED}FAIL${NC}&quot;
        return 1
    fi

    # Auto-detect compression and decompress
    if command -v file &amp;amp;&amp;gt;/dev/null; then
        if file &quot;$out&quot; | grep -q &quot;gzip compressed&quot;; then
            mv &quot;$out&quot; &quot;${out}.gz&quot;
            gunzip -c &quot;${out}.gz&quot; &amp;gt; &quot;$out&quot; 2&amp;gt;/dev/null
            rm -f &quot;${out}.gz&quot;
        elif file &quot;$out&quot; | grep -q &quot;Zip archive&quot;; then
            mv &quot;$out&quot; &quot;${out}.zip&quot;
            unzip -p &quot;${out}.zip&quot; &amp;gt; &quot;$out&quot; 2&amp;gt;/dev/null
            rm -f &quot;${out}.zip&quot;
        fi
    fi

    if [ -s &quot;$out&quot; ]; then
        echo -e &quot;${GREEN}OK${NC} ($(fmt $(wc -l &amp;lt; &quot;$out&quot;)) lines)&quot;
        return 0
    fi

    echo -e &quot;${RED}FAIL${NC}&quot;
    return 1
}

update_p2p() {
    log &quot;Fetching P2P blocklists...&quot;

    local work=&quot;/tmp/p2p-update-$$&quot;
    mkdir -p &quot;$work/cache&quot;
    local raw=&quot;${work}/raw.tmp&quot;
    local cidr_out=&quot;${CACHE_DIR}/p2p_v4.cidr&quot;
    local cidr_tmp=&quot;${work}/p2p_v4.cidr&quot;

    &amp;gt; &quot;$raw&quot;

    local ok_count=0 fail_count=0
    for name in &quot;${!P2P_SOURCES[@]}&quot;; do
        local url=&quot;${P2P_SOURCES[$name]}&quot;
        local cache_file=&quot;${work}/cache/$(echo &quot;$url&quot; | md5sum | cut -d&apos; &apos; -f1).dat&quot;
        if download_p2p_source &quot;$name&quot; &quot;$url&quot; &quot;$cache_file&quot;; then
            cat &quot;$cache_file&quot; &amp;gt;&amp;gt; &quot;$raw&quot;
            ((ok_count++))
        else
            ((fail_count++))
        fi
    done

    if [ &quot;$ok_count&quot; -eq 0 ]; then
        err &quot;All P2P sources failed, keeping existing ipset&quot;
        rm -rf &quot;$work&quot;
        return 1
    fi

    log &quot;P2P raw lines: $(fmt $(wc -l &amp;lt; &quot;$raw&quot;)) | ${ok_count} OK, ${fail_count} failed&quot;

    # 解析 IP 范围（支持 range 和 CIDR 格式）
    local processed=&quot;${work}/processed.tmp&quot;
    awk &apos;
    function ip2dec(ip) {
        split(ip, a, &quot;.&quot;)
        return (a[1]*16777216) + (a[2]*65536) + (a[3]*256) + a[4]
    }
    {
        content = $0
        if ($0 ~ /^[A-Za-z0-9_]+:/) {
            split($0, p, &quot;:&quot;)
            content = p[2]
        }
        # IP-range: 1.2.3.4-5.6.7.8
        if (match(content, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)) {
            split(substr(content, RSTART, RLENGTH), ips, &quot;-&quot;)
            s = ip2dec(ips[1]); e = ip2dec(ips[2])
            if (s &amp;lt;= e) print s &quot;,&quot; e
        }
        # CIDR: 1.2.3.0/24
        else if (match(content, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/)) {
            split(substr(content, RSTART, RLENGTH), parts, &quot;/&quot;)
            s = ip2dec(parts[1])
            e = s + (2 ^ (32 - parts[2])) - 1
            print s &quot;,&quot; e
        }
    }&apos; &quot;$raw&quot; | sort -t&apos;,&apos; -k1,1n &amp;gt; &quot;$processed&quot;

    local range_count=$(wc -l &amp;lt; &quot;$processed&quot;)

    # 合并连续范围，转换为 CIDR
    awk -F&apos;,&apos; &apos;
    function dec2ip(d) {
        return sprintf(&quot;%d.%d.%d.%d&quot;,
            int(d/16777216)%256, int(d/65536)%256, int(d/256)%256, d%256)
    }
    NR==1 { s=$1; e=$2; next }
    $1&amp;lt;=e+1 { if($2&amp;gt;e) e=$2; next }
    { printf &quot;%s %s\n&quot;, dec2ip(s), dec2ip(e); s=$1; e=$2 }
    END { if(NR&amp;gt;0) printf &quot;%s %s\n&quot;, dec2ip(s), dec2ip(e) }
    &apos; &quot;$processed&quot; | sort -u | python3 -c &quot;
import sys, ipaddress
for line in sys.stdin:
    start, end = line.strip().split()
    for net in ipaddress.summarize_address_range(
        ipaddress.IPv4Address(start), ipaddress.IPv4Address(end)
    ):
        print(net)
&quot; &amp;gt; &quot;$cidr_tmp&quot;

    local final_count=$(wc -l &amp;lt; &quot;$cidr_tmp&quot;)
    local savings=$((range_count - final_count))
    local pct=$((range_count &amp;gt; 0 ? (savings * 100 / range_count) : 0))
    log &quot;P2P merged: $(fmt $final_count) CIDR entries (${pct}% reduction)&quot;

    # 缓存检查 + 原子更新
    if is_changed &quot;p2p_v4&quot; &quot;$cidr_tmp&quot;; then
        log &quot;P2P data changed, swapping ipset...&quot;
        local new_set=&quot;bad_p2p_v4_new&quot;
        ipset create &quot;$new_set&quot; hash:net family inet hashsize 65536 maxelem 1000000 -exist 2&amp;gt;/dev/null
        {
            echo &quot;create $new_set hash:net family inet hashsize 65536 maxelem 1000000 -exist&quot;
            awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$cidr_tmp&quot;
        } | ipset restore -exist 2&amp;gt;/dev/null
        ipset swap &quot;$new_set&quot; bad_p2p_v4
        ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
        cp &quot;$cidr_tmp&quot; &quot;$cidr_out&quot;
        update_cache &quot;p2p_v4&quot; &quot;$cidr_tmp&quot;
        ok &quot;P2P v4 updated: $(fmt $final_count) entries&quot;
    else
        ok &quot;P2P v4 unchanged ($(fmt $final_count) entries), skipped&quot;
    fi

    rm -rf &quot;$work&quot;
}

# ===================== 打印统计 =====================

print_summary() {
    echo &quot;&quot;
    ln
    local asn_v4=$(ipset list bad_asn_v4 2&amp;gt;/dev/null | grep &quot;Number of entries&quot; | awk &apos;{print $NF}&apos;)
    local p2p_v4=$(ipset list bad_p2p_v4 2&amp;gt;/dev/null | grep &quot;Number of entries&quot; | awk &apos;{print $NF}&apos;)
    echo &quot;  ASN v4:  ${asn_v4:-0} entries&quot;
    echo &quot;  P2P v4:  ${p2p_v4:-0} entries&quot;
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        local asn_v6=$(ipset list bad_asn_v6 2&amp;gt;/dev/null | grep &quot;Number of entries&quot; | awk &apos;{print $NF}&apos;)
        echo &quot;  ASN v6:  ${asn_v6:-0} entries&quot;
    fi
    ln
}

# ===================== 主流程 =====================

main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then
        die &quot;This script must be run as root&quot;
    fi

    echo &quot;&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo -e &quot;${GREEN}  Blacklist Update${NC}&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo &quot;&quot;

    HAS_V6=$(check_v6)
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ok &quot;IPv6 enabled&quot; || warn &quot;IPv6 disabled&quot;

    check_deps
    init_cache

    echo &quot;&quot;
    log &quot;Updating ASN blacklists...&quot;
    update_asn

    echo &quot;&quot;
    log &quot;Updating P2P blacklists...&quot;
    update_p2p

    print_summary

    echo -e &quot;${GREEN}Blacklist update complete.${NC}&quot;
    echo &quot;&quot;
}

main &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原子更新&lt;/strong&gt;：创建新集合 → 导入数据 → &lt;code&gt;ipset swap&lt;/code&gt; 切换 → 销毁旧集合，切换耗时毫秒级，更新期间不会出现空集合窗口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;：将解析后的 CIDR 列表存入 &lt;code&gt;/var/lib/seedbox-firewall/&lt;/code&gt;，下次运行时对比 SHA256，数据未变化则跳过更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错&lt;/strong&gt;：下载失败不销毁现有集合，部分源失败不影响已成功的更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.5.4 首次加载黑名单&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次运行会下载并导入所有 ASN 和 P2P 黑名单（目前约 47+ 万条），耗时取决于网络和 VPS 性能&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
由于脚本采用原子 swap 更新，首次运行时 &lt;code&gt;deploy_firewall.sh&lt;/code&gt; 创建的集合可能为空，需要等待导入完成后才会有数据&lt;/p&gt;
&lt;p&gt;后续每周运行时，当前集合始终保持有效，不受更新过程影响&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.5.5 设置自动更新&lt;/h4&gt;
&lt;p&gt;P2P 黑名单更新频率较低，建议&lt;strong&gt;每周&lt;/strong&gt;执行一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;末尾添加一行（每周日凌晨 4 点）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 4 * * 0 /usr/local/bin/update_blacklists.sh &amp;gt; /var/log/blacklist-update.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你希望更高频率，改为每日：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 4 * * * /usr/local/bin/update_blacklists.sh &amp;gt; /var/log/blacklist-update.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
该 cron 任务只更新 ipset 数据，&lt;strong&gt;不修改防火墙规则、不会中断网络连接&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;1.5.6 验证规则&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo iptables -L INPUT -v -n --line-numbers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期输出类似（&lt;code&gt;bad_asn_v4&lt;/code&gt; 与 &lt;code&gt;bad_p2p_v4&lt;/code&gt; 为全局 DROP，排在端口放行规则之前）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chain INPUT (policy DROP)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0
3        0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            match-set bad_asn_v4 src
4        0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            match-set bad_p2p_v4 src
5        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:43210
6        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
7        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
8        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:54321
9        0     0 ACCEPT    17    --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:54321
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
iptables 规则链的匹配逻辑是 &lt;strong&gt;“自上而下，首次匹配即停止”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bad_asn_v4&lt;/code&gt; 和 &lt;code&gt;bad_p2p_v4&lt;/code&gt; 规则为全局 DROP，位列所有开放端口（SSH / 80 / 443 / BT）规则的前面。&lt;/p&gt;
&lt;p&gt;命中黑名单的请求会在规则 3/4 直接被拦截丢弃，不会触及后续的端口放行规则；只有未命中黑名单的正常请求才能顺次匹配到后面的端口 ACCEPT 规则。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;验证 ipset 集合数据量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ipset list bad_asn_v4 | grep &quot;Number of entries&quot;
sudo ipset list bad_p2p_v4 | grep &quot;Number of entries&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期输出示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Number of entries: 3421
Number of entries: 468200
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;二、 安装应用与反代网关&lt;/h2&gt;
&lt;p&gt;所有业务应用均在普通用户下运行，应用启动后，统一由 Caddy 接管公网流量&lt;/p&gt;
&lt;h3&gt;2.1 目录初始化&lt;/h3&gt;
&lt;p&gt;以普通用户（如 &lt;code&gt;yourname&lt;/code&gt;）登录，执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 数据落盘区
mkdir -p ~/downloads/anime
mkdir -p ~/downloads/animetemp
mkdir -p ~/downloads/bd_archive
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 安装并配置 qBittorrent EE&lt;/h3&gt;
&lt;h4&gt;2.2.1 安装 qBEE&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 安装依赖
sudo apt install -y unzip

# 下载静态编译包（一般选择 x86_64 架构即可）
wget https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases/latest/download/qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip

# 解压
unzip qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip

# 将二进制文件移动到本机软件目录并赋予执行权限
sudo mv qbittorrent-nox /usr/local/bin/qbittorrent-nox
sudo chmod +x /usr/local/bin/qbittorrent-nox

# 清理安装包
rm qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.2.2 编写服务&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/qbittorrent.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将以下内容粘贴进去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=qBittorrent Command Line Client
After=network.target

[Service]
Type=exec
User=yourname  # 改为你的用户名
Group=yourname # 改为你的用户名
UMask=002
ExecStart=/usr/local/bin/qbittorrent-nox
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;UMask=002&lt;/code&gt; 能确保 qBEE 下载的文件，默认权限是 775 （目录）和 664 （文件）&lt;/p&gt;
&lt;p&gt;对于后续 OpenList 读取或者 rclone 拖回本地都极其友好，不会卡权限&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;保存并退出（Ctrl+O 回车，Ctrl+X）后，拉起服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now qbittorrent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后停止以生成配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop qbittorrent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nano 打开 &lt;code&gt;~/.config/qBittorrent/qBittorrent.conf&lt;/code&gt;，在 &lt;code&gt;[Preferences]&lt;/code&gt; 区域添加/修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WebUI\Address=127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此操作将面板死锁在本地环回地址&lt;/p&gt;
&lt;p&gt;顺便将其中的&lt;code&gt;Session\Port=54321&lt;/code&gt; 记下来，该端口就是上面提到的 BT 监听端口&lt;/p&gt;
&lt;h3&gt;2.3 安装并配置 PeerBanHelper (PBH)&lt;/h3&gt;
&lt;p&gt;接下来保持 qBEE 不启动，继续配置 PBH&lt;/p&gt;
&lt;h4&gt;2.3.1 配置 Java 25 运行环境&lt;/h4&gt;
&lt;p&gt;目前PBH 最新版需要 Java 25，先下载一个纯净绿色的 Java 25 放到 &lt;code&gt;/opt&lt;/code&gt; 下专门给 PBH 用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建 Java 25 目录
sudo mkdir -p /opt/java25

# 下载 Java 25
wget -O jdk25.tar.gz &quot;https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jdk/hotspot/normal/eclipse&quot;

# 解压到专属目录
sudo tar -xzf jdk25.tar.gz -C /opt/java25 --strip-components=1

# 删除压缩包
rm jdk25.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.3.2 下载并解压 PBH&lt;/h4&gt;
&lt;p&gt;让程序和数据都待在之前创建的 &lt;code&gt;yourname&lt;/code&gt; 专属目录里：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建并进入专属配置目录
mkdir -p /home/yourname/seedbox/config/pbh
cd /home/yourname/seedbox/config/pbh

# 下载安装包
wget https://github.com/PBH-BTN/PeerBanHelper/releases/download/v9.3.14/PeerBanHelper_9.3.14.zip

# 解压
unzip PeerBanHelper_9.3.14.zip

# 删掉安装包
rm PeerBanHelper_9.3.14.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.3.3 编写 Systemd 守护进程&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/peerbanhelper.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将下面的内容粘贴进去（强制以 &lt;code&gt;yourname&lt;/code&gt; 用户运行，并指定使用我们刚准备好的 Java 25）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=PeerBanHelper Daemon
After=network.target

[Service]
Type=simple
User=yourname  # 改为你的用户名
Group=yourname # 改为你的用户名
WorkingDirectory=/home/yourname/seedbox/config/pbh/PeerBanHelper
ExecStart=/opt/java25/bin/java -jar /home/yourname/seedbox/config/pbh/PeerBanHelper/PeerBanHelper.jar
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存并退出&lt;/p&gt;
&lt;h3&gt;2.4 安装并配置 OpenList (流媒体面板)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;二进制部署：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# 1. 创建 OpenList 专属工作目录
mkdir -p /home/yourname/seedbox/config/openlist
cd /home/yourname/seedbox/config/openlist

# 2. 下载 OpenList 最新的 linux-amd64 包
wget https://github.com/OpenListTeam/OpenList/releases/latest/download/openlist-linux-amd64.tar.gz

# 3. 解压并赋予权限
tar -zxf openlist-linux-amd64.tar.gz
sudo mv openlist /usr/local/bin/openlist
sudo chmod +x /usr/local/bin/openlist

# 4. 清理安装包
rm openlist-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Systemd 守护：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;编写守护进程&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/openlist.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将以下内容粘贴进去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=OpenList Web File Manager
After=network.target

[Service]
Type=simple
User=yourname  # 改为你的用户名
Group=yourname # 改为你的用户名
WorkingDirectory=/home/yourname/seedbox/config/openlist
ExecStart=/usr/local/bin/openlist server
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存并退出&lt;/p&gt;
&lt;h3&gt;2.5 部署 Caddy 网关统一反代&lt;/h3&gt;
&lt;p&gt;各面板现已隐藏在 &lt;code&gt;127.0.0.1&lt;/code&gt;，使用 Caddy 将其安全发布并自动维护 HTTPS 证书&lt;/p&gt;
&lt;p&gt;总共需要在 Cloudflare 上配置三个子域名&lt;/p&gt;
&lt;h4&gt;2.5.1 Cloudflare DNS 设置&lt;/h4&gt;
&lt;p&gt;登录 Cloudflare 控制台，为你的主域名 &lt;code&gt;&amp;lt;yourdomain.com&amp;gt;&lt;/code&gt; 增添三个 &lt;strong&gt;A 记录&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;qbee&lt;/code&gt; -&amp;gt; 指向 &lt;strong&gt;Seedbox 的公网 IP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openlist&lt;/code&gt; -&amp;gt; 指向 &lt;strong&gt;Seedbox 的公网 IP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pbh&lt;/code&gt; -&amp;gt; 指向 &lt;strong&gt;Seedbox 的公网 IP&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
这三个域名的“代理状态”全部请保持为 &lt;strong&gt;小灰云（仅限 DNS）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;后续 OpenList 传输大流量视频时直连跑满带宽，不走 Cloudflare CDN，以免违反 TOS 导致封号&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;2.5.2 安装 Caddy&lt;/h4&gt;
&lt;p&gt;使用 Caddy 官方针对 Debian 的软件源进行原生安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 导入 GPG 密钥
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 添加官方软件源
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 更新并安装
sudo apt update
sudo apt install caddy -y

# 创建 Caddy 专属日志目录并赋予 caddy 用户权限
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chmod 755 /var/log/caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.5.3 配置 Caddyfile 路由&lt;/h4&gt;
&lt;p&gt;清空再打开 Caddyfile：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo &amp;gt; /etc/caddy/Caddyfile
sudo nano /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将下面这段配置粘贴进去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. qBittorrent Enhanced Edition 面板
qbee.yourdomain.com {
    reverse_proxy localhost:8080

    log {
        output file /var/log/caddy/qbee_access.log {
            roll_size     10mib
            roll_keep     7
            roll_keep_for 168h
        }
    }
}

# 2. OpenList 媒体看番面板
openlist.yourdomain.com {
    reverse_proxy localhost:5244

    log {
        output file /var/log/caddy/openlist_access.log {
            roll_size     10mib
            roll_keep     7
            roll_keep_for 168h
        }
    }
}

# 3. PeerBanHelper 管理面板
pbh.yourdomain.com {
    reverse_proxy localhost:9898

    log {
        output file /var/log/caddy/pbh_access.log {
            roll_size     10mib
            roll_keep     7
            roll_keep_for 168h
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存并退出，然后启动 Caddy 服务：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Caddy 会在首次启动时&lt;strong&gt;自动向 Let&apos;s Encrypt 申请免费 SSL 证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为三个子域名启用 HTTPS，无需任何额外配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.6 限制 Systemd Journal 日志大小&lt;/h3&gt;
&lt;p&gt;Caddy 的访问日志已经在 Caddyfile 中配置了原生内置的日志滚动机制（&lt;code&gt;roll_size&lt;/code&gt;、&lt;code&gt;roll_keep&lt;/code&gt; 等参数），无需额外配置系统的 &lt;code&gt;logrotate&lt;/code&gt; 脚本。&lt;/p&gt;
&lt;p&gt;但是 Systemd 的日志（&lt;code&gt;journald&lt;/code&gt;）默认仅按系统空闲空间比例限制大小，需要手动限制最大占用空间。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果不需要保留访问日志，或者磁盘空间十分有限，可以直接将 Caddyfile 中的整个 &lt;code&gt;log { ... }&lt;/code&gt; 代码块移除。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Systemd 的日志（&lt;code&gt;journald&lt;/code&gt;）默认只按体积轮转但&lt;strong&gt;不设硬性上限&lt;/strong&gt;，需要手动限制最大占用空间。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/journald.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到并&lt;strong&gt;取消注释、修改&lt;/strong&gt;以下两行（若不存在则手动添加）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SystemMaxUse=100M
MaxFileSec=1week
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后重启服务，使新配置生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart systemd-journald
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、启动并配置应用&lt;/h2&gt;
&lt;p&gt;基础设施已就绪，现在可以正式启动 qBEE 和 PBH ：&lt;/p&gt;
&lt;h3&gt;3.1 启动 qBEE&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 启动 qBEE
sudo systemctl start qbittorrent

# 查看并记录首次启动的随机密码
sudo journalctl -u qbittorrent | grep -i password
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时，在本地 Windows 的浏览器中进入 &lt;code&gt;https://qbee.yourdomain.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;初始账号为 admin，使用刚才抓取的随机密码登录进去后&lt;/p&gt;
&lt;p&gt;首先去 &lt;code&gt;Tools -&amp;gt; Options -&amp;gt; Web UI&lt;/code&gt; 修改随机初始密码与账户名（不推荐继续使用 admin）&lt;/p&gt;
&lt;p&gt;假设修改为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user: yourname
password: 12345678 # 仅作教程示例，请使用强密码！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后，按 F5 刷新网址重新登陆一遍即可&lt;/p&gt;
&lt;p&gt;接着，根据个人喜好进行设置，VPS 配置较低的用户可参考文末的【附：qBEE 参考配置】&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;默认保存路径（完成时）：/home/yourname/downloads/anime
默认下载路径（未完成的种子）：/home/yourname/downloads/animetemp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 启动 PBH&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now peerbanhelper
sudo systemctl status peerbanhelper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在本地 Windows 的浏览器中直接输入 &lt;code&gt;https://pbh.yourdomain.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;登录 token 为随机生成，建议使用浏览器密码管理器保存&lt;/p&gt;
&lt;p&gt;接下来跟随界面指引，创建 BTN 账号或登录已有账号（输入已有的 App ID 和 Secret）&lt;/p&gt;
&lt;p&gt;接着&lt;code&gt;连接下载器&lt;/code&gt;，填下以下信息（未提及的保持默认）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;类型：qBittorrentEE
名称：随便
地址：http://127.0.0.1:8080
用户名：yourname
密码：12345678 # 仅作教程示例，请使用强密码！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着前往 PBH 的设置页-&amp;gt;基础设置-&amp;gt;WebUI，将前缀(Prefix)改为&lt;code&gt;https://pbh.yourdomain.com&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为我们使用了 Caddy 反代，这里需要修改为外部可以访问的域名，否则 PBH 无法把封禁列表传给 qBEE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;（可选）继续往下滑，调整封禁日志保留时间默认存半年的日志，建议改成 15 天或 30 天即可&lt;/p&gt;
&lt;p&gt;（可选）屏蔽 CN IP&lt;/p&gt;
&lt;p&gt;去年发现热门种子容易被国内用户刷下行以平衡上行，可按需在 PBH 中屏蔽所有来自 CN 的 IP：设置 → 规则订阅 → 地区 → 新增 → 输入 &lt;code&gt;CN&lt;/code&gt;（必须大写）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
PBH 已通过行为检测（BTN 规则、进度判定、吸血识别）自动封禁恶意 Peer，一般无需额外按地理范围封禁。开启后会切断中文社区做种者的连接，可能影响做种效率，酌情使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.3 启动 OpenList&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 拉起并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable --now openlist

# 进入 OpenList 工作目录并设定管理员密码（复杂强密码需要用单引号包裹）
cd /home/yourname/seedbox/config/openlist
/usr/local/bin/openlist admin set &apos;1111111111111&apos; # 此处仅示例，实际请改为强密码！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Windows 浏览器打开 &lt;code&gt;https://openlist.yourdomain.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;登录后，在 管理 -&amp;gt; 用户，找到 &lt;code&gt;guest&lt;/code&gt; 账号，点击编辑并勾选 &lt;code&gt;停用&lt;/code&gt;，禁止游客登陆；&lt;/p&gt;
&lt;p&gt;接着在个人资料将初始用户名 &lt;code&gt;admin&lt;/code&gt; 修改为 &lt;code&gt;yourname&lt;/code&gt;；&lt;/p&gt;
&lt;p&gt;再接着挂载由 qBEE 下好的视频： &lt;code&gt;存储&lt;/code&gt; -&amp;gt; &lt;code&gt;添加&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;驱动：本机存储
挂载路径：/动漫
根文件夹路径： /home/yourname/downloads/anime
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;点击最底部的 &lt;code&gt;添加&lt;/code&gt; 即可保存&lt;/p&gt;
&lt;p&gt;最后加固一下，设置 -&amp;gt; 站点，将底部的 &lt;code&gt;Robots.txt&lt;/code&gt; 改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;s&gt;浏览器中 OpenList 暂不支持解析 MKV 容器的内嵌软字幕&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;遇到已经内嵌软字幕的文件播放却无字幕的情况，请尝试点击视频页面下方小按钮跳转到外部播放器即可&lt;/p&gt;
&lt;p&gt;PC 端推荐 MPV，友情推荐一个关联小工具：
::github{repo=&quot;outlook84/mpv-handler-openlist&quot;}&lt;/p&gt;
&lt;p&gt;Android 端则推荐 VLC 或 MX Player&lt;/p&gt;
&lt;p&gt;对于内嵌软字幕的 MKV，安卓端目前仅测试了 VLC 支持解析；&lt;/p&gt;
&lt;p&gt;同时，在视频页面直接点击 VLC 图标，VLC 无法解析视频链接，可以尝试点击视频页面的安卓图标按钮，然后再选择 VLC&lt;/p&gt;
&lt;p&gt;对于外挂字幕，目前没找到自动加载的办法，只能单独下载字幕文件到本地，再通过播放器手动选择字幕&lt;/p&gt;
&lt;p&gt;详情可查看：&lt;a href=&quot;/posts/seedbox/tips-for-openlist/&quot;&gt;OpenList 播放内嵌软字幕与外挂字幕视频的小技巧&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;四、 进阶可选配置&lt;/h2&gt;
&lt;h3&gt;4.1 更换 WebUI 为 VueTorrent&lt;/h3&gt;
&lt;p&gt;如果看腻了 qBEE 的默认样式，可尝试更换为 &lt;a href=&quot;https://github.com/VueTorrent/VueTorrent&quot;&gt;VueTorrent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;VueTorrent/VueTorrent&quot;}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~

# 下载构建产物
wget https://github.com/VueTorrent/VueTorrent/releases/latest/download/vuetorrent.zip

# 解压
unzip vuetorrent.zip

# 清理
rm vuetorrent.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着登录 qBEE WebUI，进入 设置 -&amp;gt; WebUI -&amp;gt;&lt;/p&gt;
&lt;p&gt;启用备用 WebUI，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/home/yourname/vuetorrent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成后刷新网页即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
若路径填写错误，WebUI 会返回「&lt;strong&gt;不支持的文件类型&lt;/strong&gt;」且无法再进入页面&lt;/p&gt;
&lt;p&gt;此时通过 SSH 编辑 &lt;code&gt;nano ~/.config/qBittorrent/qBittorrent.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;WebUI\AlternativeUIEnabled=true&lt;/code&gt; 改为 &lt;code&gt;false&lt;/code&gt; 即可恢复默认界面&lt;/p&gt;
&lt;p&gt;或者将 &lt;code&gt;WebUI\RootFolder=&lt;/code&gt; 改为正确的 VueTorrent 路径即可恢复正常&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.2 自动清理过期番剧&lt;/h3&gt;
&lt;p&gt;qBEE 下载的番剧会长期占用磁盘空间，用一个脚本定期扫描 &lt;code&gt;anime&lt;/code&gt; 目录，将&lt;strong&gt;超过 120 天且未在 qBEE 中做种&lt;/strong&gt;的旧番自动删除，防止磁盘被撑爆&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
触发条件：文件最后修改时间距今超过 &lt;code&gt;EXPIRE_DAYS&lt;/code&gt;（默认 120 天），且该文件名不在 qBEE 当前种子列表中&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装依赖并编写脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y jq
cd ~ &amp;amp;&amp;amp; mkdir -p script &amp;amp;&amp;amp; cd script &amp;amp;&amp;amp; nano qb_cleaner.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;填入以下内容（注意将 &lt;code&gt;QB_PASS&lt;/code&gt; 和 &lt;code&gt;PORT&lt;/code&gt; 改为你的实际值）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
QB_USER=&quot;yourname&quot;
QB_PASS=&apos;你的qB WebUI密码&apos;

# qBittorrent WebUI 端口（默认 8080），非 BT 监听端口
PORT=&quot;8080&quot;
API_URL=&quot;http://127.0.0.1:${PORT}/api/v2&quot;
COOKIE_FILE=&quot;/tmp/qb_cookies_cleaner.txt&quot;

ANIME_DIR=&quot;/home/yourname/downloads/anime&quot;
BD_ARCHIVE_DIR=&quot;/home/yourname/downloads/bd_archive&quot;
EXPIRE_DAYS=120

# 检查 jq 是否安装
if ! command -v jq &amp;amp;&amp;gt;/dev/null; then
    echo &quot;[ERROR] jq is not installed. Run: sudo apt install -y jq&quot;
    exit 1
fi

# 登录 qB API 并获取所有种子名称
curl -s -c &quot;$COOKIE_FILE&quot; \
    --data-urlencode &quot;username=$QB_USER&quot; \
    --data-urlencode &quot;password=$QB_PASS&quot; \
    &quot;${API_URL}/auth/login&quot; &amp;gt; /dev/null

ACTIVE_NAMES=$(curl -s -b &quot;$COOKIE_FILE&quot; \
    &quot;${API_URL}/torrents/info&quot; | jq -r &apos;.[] | .name&apos; 2&amp;gt;/dev/null)

# 若获取做种列表失败或为空则直接退出，防止误删做种文件
if [ -z &quot;$ACTIVE_NAMES&quot; ]; then
    echo &quot;[ERROR] Failed to fetch active torrent list or list is empty. Aborting cleanup for safety.&quot;
    rm -f &quot;$COOKIE_FILE&quot;
    exit 1
fi

# 扫描过期的目录/文件，跳过仍在做种的
find &quot;$ANIME_DIR&quot; -mindepth 1 -maxdepth 1 -mtime +$EXPIRE_DAYS | while read -r ITEM; do
    if [[ &quot;$ITEM&quot; == *&quot;$BD_ARCHIVE_DIR&quot;* ]]; then continue; fi
    
    BASE_NAME=$(basename &quot;$ITEM&quot;)
    if echo &quot;$ACTIVE_NAMES&quot; | grep -F -x -q &quot;$BASE_NAME&quot;; then
        continue
    else
        rm -rf &quot;$ITEM&quot;
    fi
done

rm -f &quot;$COOKIE_FILE&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ~/script/qb_cleaner.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着每日清晨 8 点自动执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 8 * * * /home/yourname/script/qb_cleaner.sh &amp;gt;&amp;gt; ~/script/qb_cleaner.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 优化线路跳转（Mihomo 代理转发）&lt;/h3&gt;
&lt;p&gt;假设，你的 Seedbox 在 LA，但是线路很差，但是恰好你又有另一台 LA 优化线路的机，并且更巧还搭建好了魔法，那么可利用本地 Mihomo 客户端将优化节点作为 SSH 跳板&lt;/p&gt;
&lt;p&gt;如果你的 mihomo rules 最后是 &lt;code&gt;Match, Proxy&lt;/code&gt;，那当你访问 Seedbox 时，大概率会被自动捕获并走 proxy，但我们可以简单加一个 tunnel 字段，使得 mihomo 不必每次都去匹配 rules：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 Mihomo 配置文件中添加顶级字段 &lt;code&gt;tunnels&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;tunnels:
  # 类型，监听本地端口，目标地址与端口，出站节点/节点组
  # 将目标地址与端口改为你seedbox的ip与ssh端口
  - tcp,127.0.0.1:33333,your_vps_ip:43210,魔法节点/魔法节点策略组
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;接着在本地添加 ssh config 配置块：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;notepad $HOME/.ssh/config 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Host seedbox-mihomo
    HostName 127.0.0.1
    Port 33333
    User yourname
    IdentityFile ~/.ssh/id_ed25519_seedbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;倘若顺利，当你执行 &lt;code&gt;ssh seedbox-mihomo&lt;/code&gt; 时，mihomo 日志显示的连接类型应为 &lt;code&gt;Tunnel&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此方法需要 mihomo 保持启动状态，&lt;s&gt;更多玩法自行研究吧&lt;/s&gt;&lt;/p&gt;
&lt;h3&gt;4.4 配置下载通知（Telegram Bot）&lt;/h3&gt;
&lt;p&gt;在本地 Windows 上我习惯使用&lt;code&gt;下载完成后发送电子邮件通知&lt;/code&gt;，但 VPS 环境下配置 SMTP 既繁琐又不安全，因此我使用 Telegram Bot 进行通知&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：拥有一个 Telegram 账号&lt;/p&gt;
&lt;h4&gt;4.4.1 创建 Telegram Bot&lt;/h4&gt;
&lt;p&gt;在 Telegram 中搜索 &lt;code&gt;@BotFather&lt;/code&gt;，依次发送以下指令：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/newbot&lt;/code&gt; 创建新 Bot&lt;/li&gt;
&lt;li&gt;输入 Bot 显示名称（任意）&lt;/li&gt;
&lt;li&gt;输入 Bot 用户名（必须以 &lt;code&gt;bot&lt;/code&gt; 结尾）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完成后 BotFather 会返回一段消息，其中包含：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Use this token to access the HTTP API:
1234567890:BBA2XXjn4YjgHmPqdvd-nK7AbuvCkuSVPzs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;妥善保存此 token&lt;/strong&gt;，持有它即可控制你的 Bot&lt;/p&gt;
&lt;p&gt;然后在 TG 搜索你刚创建的 Bot 用户名，将其添加到聊天列表&lt;/p&gt;
&lt;h4&gt;4.4.2 获取 Chat ID&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;第三方 TG 客户端可以直接看到自己的 ID&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;往你的 Bot 发送一条任意消息（如 &lt;code&gt;hello&lt;/code&gt;），然后在浏览器访问以下网址（替换 &lt;code&gt;TOKEN&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回的 JSON 中 &lt;code&gt;&quot;chat&quot;:{&quot;id&quot;:123123123}&lt;/code&gt; 即为你的 Chat ID，记录下来&lt;/p&gt;
&lt;h4&gt;4.4.3 创建通知脚本&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y bc
cd ~/script &amp;amp;&amp;amp; nano tg_notify.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 配置你的 token 和 ID
BOT_TOKEN=&quot;YOUR_BOT_TOKEN&quot;
CHAT_ID=&quot;YOUR_CHAT_ID&quot;
# ==========================================

# 接收 qB 传过来的参数
TORRENT_NAME=&quot;${1:-&quot;Unknown Torrent&quot;}&quot;
SIZE_BYTES=&quot;${2:-0}&quot;
SAVE_PATH=&quot;${3:-&quot;Unknown Path&quot;}&quot;

SAFE_NAME=$(echo &quot;$TORRENT_NAME&quot; | sed &apos;s/&amp;amp;/\&amp;amp;amp;/g; s/&amp;lt;/\&amp;amp;lt;/g; s/&amp;gt;/\&amp;amp;gt;/g&apos;)
SAFE_PATH_RAW=$(echo &quot;$SAVE_PATH&quot; | sed &apos;s/&amp;amp;/\&amp;amp;amp;/g; s/&amp;lt;/\&amp;amp;lt;/g; s/&amp;gt;/\&amp;amp;gt;/g&apos;)

SIZE_MB=$((SIZE_BYTES / 1024 / 1024))
if [ &quot;$SIZE_MB&quot; -ge 1024 ]; then
    SIZE_GB=$(echo &quot;scale=1; $SIZE_MB / 1024&quot; | bc)
    SIZE_DISPLAY=&quot;${SIZE_GB} GB&quot;
else
    SIZE_DISPLAY=&quot;${SIZE_MB} MB&quot;
fi

USERNAME=$(whoami)
SAVE_PATH_OBFUSCATED=$(echo &quot;$SAFE_PATH_RAW&quot; | sed &quot;s|${USERNAME}|&amp;lt;span class=\&quot;tg-spoiler\&quot;&amp;gt;${USERNAME}&amp;lt;/span&amp;gt;|g&quot;)

MESSAGE=&quot;🎉 &amp;lt;b&amp;gt;Seedbox 种子下载完成！&amp;lt;/b&amp;gt;

🎬 &amp;lt;b&amp;gt;名称&amp;lt;/b&amp;gt;: ${SAFE_NAME}
💾 &amp;lt;b&amp;gt;大小&amp;lt;/b&amp;gt;: ${SIZE_DISPLAY}
📁 &amp;lt;b&amp;gt;路径&amp;lt;/b&amp;gt;: ${SAVE_PATH_OBFUSCATED}&quot;

curl -s --max-time 10 -X POST &quot;https://api.telegram.org/bot${BOT_TOKEN}/sendMessage&quot; \
    -d chat_id=&quot;${CHAT_ID}&quot; \
    --data-urlencode text=&quot;${MESSAGE}&quot; \
    -d parse_mode=&quot;HTML&quot; &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ~/script/tg_notify.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.4.4 绑定到 qBEE&lt;/h4&gt;
&lt;p&gt;打开 qBEE WebUI → 设置 → 下载，勾选 &lt;code&gt;种子下载完成时运行外部程序&lt;/code&gt;，填入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/home/yourname/script/tg_notify.sh &quot;%N&quot; &quot;%Z&quot; &quot;%D&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;%N&lt;/code&gt; = 种子名称，&lt;code&gt;%Z&lt;/code&gt; = 文件大小（字节），&lt;code&gt;%D&lt;/code&gt; = 保存路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.4.5 预期效果&lt;/h4&gt;
&lt;p&gt;当种子下载完成时，你将在 Telegram 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;🎉 Seedbox 下载完成

🎬 名称：[FLsnow][Star-Detective_Precure][20][1080p]
💾 大小：977 MB
📁 路径：/home/yourname/downloads/anime/07-名侦探光之美少女
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.5 部署零信任隧道&lt;/h3&gt;
&lt;p&gt;利用 Cloudflare Tunnel 实现无端口的隐蔽内网穿透&lt;/p&gt;
&lt;h4&gt;4.5.1 在云端创建隧道&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 Cloudflare 账号，进入 &lt;strong&gt;Zero Trust&lt;/strong&gt; 面板&lt;/li&gt;
&lt;li&gt;. Zero Trust → Networks（网络） → Connectors（连接器） → Create a tunnel（创建隧道）&lt;/li&gt;
&lt;li&gt;隧道类型 → 选择 &lt;code&gt;Cloudflared&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;命名 &lt;code&gt;Seedbox-Main&lt;/code&gt;（这里的命名是隧道的显示名称，随便取） → Save tunnel（保存隧道）&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;4.5.2 在 Seedbox 上安装连接器&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;在面板的下一步里，选择环境为 &lt;strong&gt;Debian&lt;/strong&gt; -&amp;gt; &lt;strong&gt;64-bit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;在这里会给出三个安装命令，复制粘贴执行前面两个即可&lt;/li&gt;
&lt;li&gt;把这整些命令复制到 Seedbox 的 SSH 终端里运行逐个执行即可&lt;/li&gt;
&lt;li&gt;运行完毕后，CF 网页端底部会弹出一个绿色的 &lt;code&gt;Connected&lt;/code&gt;（已连接）状态，点击 Next&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;4.5.3 在网页端配置 SSH 路由&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain（子域名）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;YOUR_SSH_SUBDOMAIN&amp;gt;&lt;/code&gt;（子域名前缀，可自己取，比如&lt;code&gt;seedbox-ssh&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain（域）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt; （下拉选择你已托管的域名）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path（路径）&lt;/td&gt;
&lt;td&gt;留空&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type（类型）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SSH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;填入 &lt;code&gt;localhost:你的非标 SSH 端口&lt;/code&gt; (比如 &lt;code&gt;localhost:43210&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;点击 &lt;strong&gt;Save tunnel&lt;/strong&gt;即可&lt;/p&gt;
&lt;h4&gt;4.5.4 增加 SSH 配置块&lt;/h4&gt;
&lt;p&gt;依然是打开 Windows 的 &lt;code&gt;~/.ssh/config&lt;/code&gt;，加入这段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notepad $HOME/.ssh/config 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Host seedbox-cf
    HostName seedbox-ssh.yourdomain.com
    User yourname
    IdentityFile ~/.ssh/id_ed25519_seedbox
    IdentitiesOnly yes
    ProxyCommand cloudflared access ssh --hostname %h
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下次可以使用 &lt;code&gt;ssh seedbox-cf&lt;/code&gt; 通过隧道访问 SSH&lt;/p&gt;
&lt;p&gt;至此，Seedbox 部署完毕&lt;/p&gt;
&lt;h2&gt;附：qBEE 参考配置&lt;/h2&gt;
&lt;p&gt;适用于 2GB RAM VPS 的保守配置，以下为本人实际使用参数，请根据自身情况调整，&lt;strong&gt;切勿照抄&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本人 VPS 带宽 10 Gbps，位于美西洛杉矶&lt;/p&gt;
&lt;p&gt;长时间占用上传通道可能给邻居或宿主机带来负担，违反 TOS 导致封号&lt;/p&gt;
&lt;p&gt;再加上 US 并非版权宽松地区，低调限速以规避部分投诉风险&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;限速&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全局上传限速：500 Mbps&lt;/li&gt;
&lt;li&gt;启用备用限速
&lt;ul&gt;
&lt;li&gt;备用限速时段：16:00 – 02:00 (UTC+8)&lt;/li&gt;
&lt;li&gt;备用上传速度：80 Mbps&lt;/li&gt;
&lt;li&gt;备用下载速度：300 Mbps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;连接数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全局最大连接数：300&lt;/li&gt;
&lt;li&gt;单种最大连接数：50&lt;/li&gt;
&lt;li&gt;全局上传槽：30&lt;/li&gt;
&lt;li&gt;单种上传槽：5&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;队列&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;活动下载：5&lt;/li&gt;
&lt;li&gt;活动上传：15&lt;/li&gt;
&lt;li&gt;活动总数：20&lt;/li&gt;
&lt;li&gt;启用种子队列：开&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;做种限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分享率达到：1.5&lt;/li&gt;
&lt;li&gt;做种时间达到：7200 分钟&lt;/li&gt;
&lt;li&gt;非活跃做种时间达到：7200 分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当&lt;code&gt;分享率 ≥1.5&lt;/code&gt; 或 &lt;code&gt;做种满 5 天&lt;/code&gt; 或 &lt;code&gt;非活跃 5 天后&lt;/code&gt; 自动移除&lt;/p&gt;
&lt;h3&gt;BitTorrent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DHT：开&lt;/li&gt;
&lt;li&gt;PeX：开&lt;/li&gt;
&lt;li&gt;LSD：关&lt;/li&gt;
&lt;li&gt;加密模式：优先加密&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里额外说一下加密模式&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;选项&lt;/th&gt;
&lt;th&gt;中文&lt;/th&gt;
&lt;th&gt;libtorrent 策略&lt;/th&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allow encryption&lt;/td&gt;
&lt;td&gt;允许加密 / 优先加密&lt;/td&gt;
&lt;td&gt;pe_enabled&lt;/td&gt;
&lt;td&gt;尝试加密，对方不支持则降级明文&lt;/td&gt;
&lt;td&gt;兼容性好，日常用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Require encryption&lt;/td&gt;
&lt;td&gt;强制加密&lt;/td&gt;
&lt;td&gt;pe_forced&lt;/td&gt;
&lt;td&gt;强制加密，拒绝明文连接&lt;/td&gt;
&lt;td&gt;应对 ISP 限速&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disable encryption&lt;/td&gt;
&lt;td&gt;禁用加密&lt;/td&gt;
&lt;td&gt;pe_disabled&lt;/td&gt;
&lt;td&gt;禁用加密，仅明文&lt;/td&gt;
&lt;td&gt;连接某些极其古老的 tracker/peer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;高级 — 内存&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RAM 使用限制：384 MiB&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;高级 — 线程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;异步 I/O 线程：2&lt;/li&gt;
&lt;li&gt;哈希校验线程：1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;高级 — 磁盘&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;文件池大小：50&lt;/li&gt;
&lt;li&gt;校验时内存增量：32 MiB&lt;/li&gt;
&lt;li&gt;预分配文件：关&lt;/li&gt;
&lt;li&gt;磁盘缓存：64 MiB&lt;/li&gt;
&lt;li&gt;磁盘缓存过期时间：60 秒&lt;/li&gt;
&lt;li&gt;磁盘队列大小：1024 KiB&lt;/li&gt;
&lt;li&gt;读缓存模式：启用系统缓存&lt;/li&gt;
&lt;li&gt;写缓存模式：启用系统缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;高级 — 网络与 Peer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每秒传出连接数：10&lt;/li&gt;
&lt;li&gt;Socket Backlog：30&lt;/li&gt;
&lt;li&gt;μTP-TCP 混合模式：优先使用 TCP&lt;/li&gt;
&lt;li&gt;单个 Peer 最大未完成请求：250&lt;/li&gt;
&lt;li&gt;允许来自同一 IP 的多个连接：关&lt;/li&gt;
&lt;li&gt;上传连接策略：最快上传&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;附：本文提及端口速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端口&lt;/th&gt;
&lt;th&gt;协议&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;在何处配置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;43210&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sshd_config&lt;/code&gt; / 防火墙脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;HTTP（Caddy 反代）&lt;/td&gt;
&lt;td&gt;防火墙脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;HTTPS（Caddy）&lt;/td&gt;
&lt;td&gt;Caddy 自动 / 防火墙脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8080&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;qBEE WebUI&lt;/td&gt;
&lt;td&gt;qBittorrent 默认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54321&lt;/td&gt;
&lt;td&gt;TCP/UDP&lt;/td&gt;
&lt;td&gt;BT 监听&lt;/td&gt;
&lt;td&gt;qBittorrent / 防火墙脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9898&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;PBH WebUI&lt;/td&gt;
&lt;td&gt;PBH 默认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5244&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;OpenList WebUI&lt;/td&gt;
&lt;td&gt;OpenList 默认&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>Komari 探针部署与运维指南</title><link>https://blog.rokutosei.com/posts/linux/probe/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/linux/probe/</guid><description>本文记录探针 Komari 的部署、配置与常见问题排错</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录探针 Komari 的部署、配置与常见问题排错。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 资源占用实测数据&lt;/h2&gt;
&lt;p&gt;监控环境共三台节点。Agent 部署于 Server A/B/C，Server 端部署于 Server A。持续运行约 8 天 6 小时后的资源消耗如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;节点&lt;/th&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;运行时长 (etime)&lt;/th&gt;
&lt;th&gt;物理内存 (RES)&lt;/th&gt;
&lt;th&gt;虚拟内存 (VIRT)&lt;/th&gt;
&lt;th&gt;瞬时 CPU&lt;/th&gt;
&lt;th&gt;累计 CPU 时间 (TIME+)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server C&lt;/td&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;8天6小时&lt;/td&gt;
&lt;td&gt;17.9 MB&lt;/td&gt;
&lt;td&gt;1.23 GB&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;27m37s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server B&lt;/td&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;8天6小时&lt;/td&gt;
&lt;td&gt;12.4 MB&lt;/td&gt;
&lt;td&gt;1.23 GB&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;23m24s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server A&lt;/td&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;8天6小时&lt;/td&gt;
&lt;td&gt;12.6 MB&lt;/td&gt;
&lt;td&gt;1.23 GB&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;33m38s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server A&lt;/td&gt;
&lt;td&gt;服务端&lt;/td&gt;
&lt;td&gt;8天6小时&lt;/td&gt;
&lt;td&gt;34.6 MB&lt;/td&gt;
&lt;td&gt;1.34 GB&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;6m34s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;原始监测命令与输出片段&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 服务端（Server A）
username@ServerA:~$ top -p $(pgrep -d&apos;,&apos; komari)
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  49316 komari    20   0 1343280  34636  11980 S   0.0   1.7   6:34.61 komari

username@ServerA:~$ ps -p 49316 -o etime=
 8-06:11:49

# Agent（Server A）
username@ServerA:~$ top -p $(pgrep -d&apos;,&apos; agent)
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  49459 root      20   0 1234116  12664   5140 S   0.0   0.6  33:38.01 agent

username@ServerA:~$ ps -p 49459 -o etime=
 8-06:04:41

# Agent（Server B）
username@ServerB:~$ top -p $(pgrep -d&apos;,&apos; agent)
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
2379623 root      20   0 1234116  12400   4992 S   0.0   2.6  23:24.26 agent

username@ServerB:~$ ps -p 2379623 -o etime=
 8-06:05:52

# Agent（Server C）
username@ServerC:~$ top -p $(pgrep -d&apos;,&apos; agent)
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  13527 root      20   0 1233860  17940   6520 S   0.0   1.8  27:37.69 agent

username@ServerC:~$ ps -p 13527 -o etime=
 8-06:03:06
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：VIRT 较大为 Go 运行时地址空间预留，不代表物理内存消耗。&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 拓扑架构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│                  Server A                       │
│  Komari Server (使用 SQLite 数据库)               │
│  Caddy 反代 -&amp;gt; https://monitor.example.com       │
└─────────────────────────────────────────────────────┘
         ▲                        ▲
         │ 上报数据                │ 上报数据
         │                        │
┌────────┴──────────┐   ┌─────────┴───────────┐
│ Server B         │   │ Server C          │
│ Komari Agent     │   │ Komari Agent      │
└───────────────────┘   └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 服务端部署 (Server A)&lt;/h2&gt;
&lt;h3&gt;3.1 创建隔离用户与数据目录&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 创建无登录权限的系统用户
sudo useradd -r -s /usr/sbin/nologin komari

# 初始化工作目录
sudo mkdir -p /opt/komari/data
sudo chown -R komari:komari /opt/komari
sudo chmod 755 /opt/komari
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 部署二进制文件&lt;/h3&gt;
&lt;p&gt;自 &lt;a href=&quot;https://github.com/komari-monitor/komari/releases&quot;&gt;Komari Releases&lt;/a&gt; 下载&lt;s&gt;最新发行版&lt;/s&gt; v1.25 版本（无后缀名，是裸二进制）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
近期 1.25 之后的版本存在争议，表现为硬盘占用过大，因此暂不做推荐&lt;/p&gt;
&lt;p&gt;see &lt;a href=&quot;https://github.com/komari-monitor/komari/issues/620&quot;&gt;komari #620&lt;/a&gt;、&lt;a href=&quot;https://github.com/komari-monitor/komari/issues/612&quot;&gt;komari #612&lt;/a&gt;、&lt;a href=&quot;https://github.com/komari-monitor/komari/issues/619&quot;&gt;komari #620&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;cd /opt/komari
sudo wget https://github.com/komari-monitor/komari/releases/download/1.2.5/komari-linux-amd64
sudo mv komari-linux-amd64 komari
sudo chmod +x komari
sudo chown komari:komari komari
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 配置 Systemd 服务与沙箱权限&lt;/h3&gt;
&lt;p&gt;创建服务配置，限制其系统访问权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/komari.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Komari Monitor Service
After=network.target

[Service]
Type=simple
User=komari
Group=komari
ExecStart=/opt/komari/komari server -l 127.0.0.1:25774
WorkingDirectory=/opt/komari
Restart=always
RestartSec=5

# 权限沙箱化配置
CapabilityBoundingSet=
NoNewPrivileges=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/opt/komari/data
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;User=komari&lt;/code&gt;：非 root 运行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CapabilityBoundingSet=&lt;/code&gt;：丢弃所有特权能力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoNewPrivileges=yes&lt;/code&gt;：禁止提权&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ProtectSystem=strict&lt;/code&gt; + &lt;code&gt;ReadWritePaths=/opt/komari/data&lt;/code&gt;：系统只读，数据目录可写&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ProtectHome=yes&lt;/code&gt;：无法访问 /home&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PrivateDevices=yes&lt;/code&gt;：无法访问物理设备&lt;/li&gt;
&lt;li&gt;监听 &lt;code&gt;127.0.0.1&lt;/code&gt;：不暴露到公网&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.4 启动与初始化&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now komari.service

# 获取日志中打印的首次启动随机管理密码
sudo journalctl -u komari.service --no-pager -l | tail -30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如未获取到密码，可通过命令行手动重置 &lt;code&gt;admin&lt;/code&gt; 密码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo -u komari /opt/komari/komari chpasswd -p &amp;lt;YOUR_PASSWORD&amp;gt; -d /opt/komari/data/komari.db
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;chpasswd&lt;/code&gt; 不支持 &lt;code&gt;-u&lt;/code&gt; 参数（默认修改 admin 用户）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关于修改面板用户名密码：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.2.5 (e446bee)面板的更新用户功能同时修改用户名和密码时，会清空所有 session 导致当前用户被登出，
且前端 401 处理不完善，页面显示裸错误。建议分两步操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先只改用户名 → 保存（session 保持有效）&lt;/li&gt;
&lt;li&gt;再只改密码 → 保存（会被登出，重新登录即可）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果已经 401 了，恢复方法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop komari
sudo -u komari sqlite3 /opt/komari/data/komari.db &quot;DELETE FROM sessions;&quot;
sudo systemctl start komari
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.5 Caddy 反代与 DNS 配置&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;，配置反代域名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;monitor.example.com {
    reverse_proxy 127.0.0.1:25774
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Caddy：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着在域名解析商处将 &lt;code&gt;monitor&lt;/code&gt; 子域名指向 Server A 的公网 IP。&lt;/p&gt;
&lt;p&gt;添加 A 记录：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;代理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Server A 的公网 IP&lt;/td&gt;
&lt;td&gt;开启（CDN 代理）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;3.6 生成自动发现密钥&lt;/h3&gt;
&lt;p&gt;登录 &lt;code&gt;https://monitor.example.com&lt;/code&gt;，进入 &lt;strong&gt;设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;自动发现&lt;/strong&gt;，生成并记录自动发现密钥（AD Key）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 客户端部署 (Agent)&lt;/h2&gt;
&lt;p&gt;在各被监控节点（含服务端节点本机）上执行一键安装&lt;/p&gt;
&lt;p&gt;进入 Admin 面板后台，服务器 -&amp;gt; 添加节点&lt;/p&gt;
&lt;p&gt;勾选 &lt;code&gt;安装选项&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;展开列表后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;勾选 &lt;code&gt;禁用远程控制&lt;/code&gt;，禁用网页端 SSH 及远程执行命令权限&lt;/li&gt;
&lt;li&gt;勾选 &lt;code&gt;禁用自动更新&lt;/code&gt;，停用客户端自动更新&lt;/li&gt;
&lt;li&gt;勾选 &lt;code&gt;从网卡获取IP地址&lt;/code&gt;，通过本地网卡读取 IP&lt;/li&gt;
&lt;li&gt;勾选 &lt;code&gt;排除特定网卡&lt;/code&gt;，输入 &lt;code&gt;lo&lt;/code&gt; 过滤环回网卡数据&lt;/li&gt;
&lt;li&gt;勾选 &lt;code&gt;采集间隔(秒)&lt;/code&gt;，输入 5 或 10 秒&lt;/li&gt;
&lt;li&gt;勾选 &lt;code&gt;网络统计月重置日&lt;/code&gt;，输入你的机器账单日&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后点击最底部的 &lt;code&gt;复制&lt;/code&gt;，即得到 Agent 的安装命令&lt;/p&gt;
&lt;p&gt;【完】&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Theme&lt;/h2&gt;
&lt;p&gt;进入 Admin 面板后台，设置 -&amp;gt; 主题管理，即可更换主题&lt;/p&gt;
&lt;p&gt;推荐安装主题：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;sanrokamlan-prog/komari-theme-Glassmorphism&quot;}&lt;/p&gt;
&lt;h2&gt;6. 常用维护命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 服务端生命周期管理
sudo systemctl [start|stop|restart|status] komari
sudo journalctl -u komari -f

# 客户端生命周期管理
sudo systemctl [start|stop|restart|status] komari-agent
sudo journalctl -u komari-agent -f

# 服务端手动升级
cd /opt/komari &amp;amp;&amp;amp; sudo systemctl stop komari
sudo wget -O komari https://github.com/komari-monitor/komari/releases/latest/download/komari-linux-amd64
sudo chmod +x komari &amp;amp;&amp;amp; sudo chown komari:komari komari
sudo systemctl start komari
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;客户端卸载与残留清理&lt;/h3&gt;
&lt;p&gt;官方卸载命令存在缓存残留，若更换服务端重建数据库，Agent 缓存的旧 token 失效，如果不手动删除，Agent 会一直 401。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop komari-agent
sudo systemctl disable komari-agent
sudo rm -f /etc/systemd/system/komari-agent.service
sudo systemctl daemon-reload

# 彻底清理二进制和 token 缓存文件
sudo rm -rf /opt/komari/agent
sudo rm -f /opt/komari/auto-discovery.json    # 必须清理的旧 Token 缓存
sudo rm -f /opt/komari/agent.yml
sudo rm -f /opt/komari/net_static.json
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;7. 排错与问题对照&lt;/h2&gt;
&lt;h3&gt;7.1 服务端常见问题&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表现&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;对策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;启动报 &lt;code&gt;read-only file system&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Systemd 沙箱只读限制&lt;/td&gt;
&lt;td&gt;确认服务文件包含 &lt;code&gt;ReadWritePaths=/opt/komari/data&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;启动报 &lt;code&gt;permission denied&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/opt/komari/data&lt;/code&gt; 目录属主为 root&lt;/td&gt;
&lt;td&gt;执行 &lt;code&gt;chown -R komari:komari /opt/komari/data&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;面板修改密码后提示 401&lt;/td&gt;
&lt;td&gt;全局 Session 销毁导致登出&lt;/td&gt;
&lt;td&gt;建议改用户名与改密码分步保存，或通过 CLI 命令修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开启“私有站点”新设备无法打开&lt;/td&gt;
&lt;td&gt;未登录用户的 &lt;code&gt;/api/me&lt;/code&gt; 接口被拦截&lt;/td&gt;
&lt;td&gt;新设备首次连接前先关闭私有站点，完成登录后再行开启&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关于私有站点（Private Site）：&lt;/strong&gt;
面板设置中的「私有站点」选项开启后，新设备首次访问时不会显示登录框（&lt;code&gt;/api/me&lt;/code&gt; 等公开接口被拦截），
导致 &lt;code&gt;Error: Failed to fetch node data&lt;/code&gt;。已登录的设备不受影响。&lt;/p&gt;
&lt;p&gt;不开私有站点也没有实质风险，未登录用户最多只能看到版本号和站点名，
节点数据、资源监控等敏感信息均需登录后才能查看&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.2 客户端常见问题&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表现&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;对策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bash: /dev/fd/63: No such file...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo&lt;/code&gt; 状态下不支持 &lt;code&gt;*&amp;lt;()&lt;/code&gt; 进程替换&lt;/td&gt;
&lt;td&gt;采用 &lt;code&gt;wget -qO- | sudo bash&lt;/code&gt; 管道连接模式安装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重装或迁移服务端后持续报 401&lt;/td&gt;
&lt;td&gt;缓存了已失效的旧 Token 校验文件&lt;/td&gt;
&lt;td&gt;停止服务并清理 &lt;code&gt;rm -f /opt/komari/auto-discovery.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>[弃用] 服务端：单端口五合一部署及完整安全加固</title><link>https://blog.rokutosei.com/posts/proxy/vlessxhttpproxy/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/vlessxhttpproxy/</guid><description>基于 Xray+Caddy+Mihomo 架构，从裸机环境构建集成 SSH 硬化、iptables 黑名单与零信任的代理节点。</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/posts/proxy/vlessxhttpxray&quot;&gt;已彻底转向 Xray-core&lt;/a&gt;，本文不再维护，请自行判断是否过时&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;观前提醒&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文包括基础系统安防指导，因此略显冗长&lt;/p&gt;
&lt;p&gt;可直接点击目录查看需要的部分，或者查看&lt;a href=&quot;https://blog.rokutosei.com/posts/proxy/vlessxhttpproxysimplify/&quot;&gt;精简版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本教程基于 &lt;code&gt;Xray 服务端 + Caddy 反代 + mihomo 客户端&lt;/code&gt; 构建&lt;/p&gt;
&lt;p&gt;本教程几乎全程手敲命令，不借助 3x-ui 此类面板，需要一定耐心&lt;/p&gt;
&lt;p&gt;如果想一键部署，很遗憾，&lt;strong&gt;本文不适合你&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;XHTTP 五合一指的是在同一台 VPS 的 443 端口实现了五个出站节点：&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看 适用场景&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（此处部分引用 @Benjamin1919 大佬的&lt;a href=&quot;https://github.com/XTLS/Xray-core/discussions/4118&quot;&gt;教程原文案&lt;/a&gt;）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;出站 1：XTLS(Vision) + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端 GUI 不支持 XHTTP&lt;/li&gt;
&lt;li&gt;不想开启 TCP 多路复用&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 2：XHTTP + REALITY 直连&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都比较好&lt;/li&gt;
&lt;li&gt;想要尽可能低的延迟与尽可能高的上下行速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 3：上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较差，回程（VPS → 客户端）线路较好&lt;/li&gt;
&lt;li&gt;日常使用更偏重下载，很少上传&lt;/li&gt;
&lt;li&gt;隐藏上行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 4：XHTTP + TLS(ECH) 过 CDN&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 去程和回程的线路都很差&lt;/li&gt;
&lt;li&gt;不希望 VPS 的 IP 暴露在公网&lt;/li&gt;
&lt;li&gt;VPS 的 IP 已被墙&lt;/li&gt;
&lt;li&gt;隐藏 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;出站 5：上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN（上下行不同 SNI）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去程（客户端 → VPS）线路较好，回程（VPS → 客户端）线路较差&lt;/li&gt;
&lt;li&gt;日常使用更偏重上传，很少下载&lt;/li&gt;
&lt;li&gt;隐藏下行 SNI 防探测封锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C&quot;&gt;1. 准备工作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E9%98%B2%E6%8A%A4&quot;&gt;2. 系统基础防护&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E4%BC%98%E5%8C%96&quot;&gt;2.1 系统基础优化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#211-%E6%B8%85%E9%99%A4%E5%8E%82%E5%AE%B6%E6%A8%A1%E6%9D%BF&quot;&gt;2.1.1 清除厂家模板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#212-%E5%BC%80%E5%90%AF-bbr-%E7%BD%91%E7%BB%9C%E5%8A%A0%E9%80%9F&quot;&gt;2.1.2 开启 BBR 网络加速&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#213-%E5%A2%9E%E5%A4%A7-swap%E5%8F%AF%E9%80%89&quot;&gt;2.1.3 增大 Swap（可选）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#214-%E5%88%87%E6%8D%A2%E9%BB%98%E8%AE%A4-shell-%E4%B8%BA-bash&quot;&gt;2.1.4 切换默认 Shell 为 Bash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-ssh-%E5%AF%86%E9%92%A5%E7%99%BB%E5%BD%95&quot;&gt;2.2 SSH 密钥登录&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#221-%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E5%AF%B9&quot;&gt;2.2.1 生成密钥对&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#222-%E4%B8%8A%E4%BC%A0%E5%85%AC%E9%92%A5%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8&quot;&gt;2.2.2 上传公钥至服务器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#223-%E5%8A%A0%E5%9B%BA-ssh-%E9%85%8D%E7%BD%AE&quot;&gt;2.2.3 加固 SSH 配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#224-%E6%B5%8B%E8%AF%95%E8%BF%9E%E6%8E%A5&quot;&gt;2.2.4 测试连接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#225-%E9%85%8D%E7%BD%AE%E6%9C%AC%E5%9C%B0%E5%BF%AB%E6%8D%B7%E7%99%BB%E5%BD%95&quot;&gt;2.2.5 配置本地快捷登录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-%E5%88%9B%E5%BB%BA%E6%96%B0%E7%94%A8%E6%88%B7&quot;&gt;2.3 创建新用户&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#231-%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E5%B9%B6%E8%AE%BE%E7%BD%AE%E5%AF%86%E7%A0%81&quot;&gt;2.3.1 创建用户并设置密码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#232-%E5%8A%A0%E5%85%A5-sudo-%E7%BB%84&quot;&gt;2.3.2 加入 sudo 组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#233-%E9%85%8D%E7%BD%AE%E5%85%8D%E5%AF%86-sudo%E5%8F%AF%E9%80%89&quot;&gt;2.3.3 配置免密 sudo（可选）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#234-%E5%B0%86%E5%85%AC%E9%92%A5%E5%A4%8D%E5%88%B6%E7%BB%99%E6%96%B0%E7%94%A8%E6%88%B7&quot;&gt;2.3.4 将公钥复制给新用户&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#235-%E6%9B%B4%E6%96%B0%E6%9C%AC%E5%9C%B0-ssh-config&quot;&gt;2.3.5 更新本地 SSH config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#24-%E9%83%A8%E7%BD%B2%E9%98%B2%E7%81%AB%E5%A2%99&quot;&gt;2.4 部署防火墙&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#241-%E7%A6%81%E7%94%A8-ufw&quot;&gt;2.4.1 禁用 UFW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#242-%E9%98%B2%E7%81%AB%E5%A2%99%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC&quot;&gt;2.4.2 防火墙部署脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#243-%E9%BB%91%E5%90%8D%E5%8D%95%E6%9B%B4%E6%96%B0%E8%84%9A%E6%9C%AC&quot;&gt;2.4.3 黑名单更新脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#244-%E9%A6%96%E6%AC%A1%E5%8A%A0%E8%BD%BD%E9%BB%91%E5%90%8D%E5%8D%95%E5%B9%B6%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1&quot;&gt;2.4.4 首次加载黑名单并设置定时任务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#245-%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99&quot;&gt;2.4.5 验证规则&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#25-%E9%83%A8%E7%BD%B2-fail2ban%E5%8F%AF%E9%80%89&quot;&gt;2.5 部署 Fail2ban（可选）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-cloudflare-%E9%85%8D%E7%BD%AE&quot;&gt;3. Cloudflare 配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-%E6%B7%BB%E5%8A%A0-dns-%E8%AE%B0%E5%BD%95&quot;&gt;3.1 添加 DNS 记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-ssltls-%E8%AE%BE%E7%BD%AE&quot;&gt;3.2 SSL/TLS 设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-%E7%BC%93%E5%AD%98%E8%A7%84%E5%88%99%E8%AE%BE%E7%BD%AE&quot;&gt;3.3 缓存规则设置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%E5%AE%89%E8%A3%85-xray-core-%E4%B8%8E-caddy&quot;&gt;4. 安装 Xray-core 与 Caddy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#41-%E5%AE%89%E8%A3%85-xray-core&quot;&gt;4.1 安装 Xray-core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#42-%E7%94%9F%E6%88%90%E5%87%AD%E6%8D%AE&quot;&gt;4.2 生成凭据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#43-%E5%86%99%E5%85%A5-xray-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&quot;&gt;4.3 写入 Xray 配置文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#44-%E5%AE%89%E8%A3%85-caddy&quot;&gt;4.4 安装 Caddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#45-%E7%BC%96%E5%86%99-caddyfile&quot;&gt;4.5 编写 Caddyfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#46-%E7%94%A8%E6%88%B7%E7%BB%84%E4%B8%8E%E8%BF%90%E8%A1%8C%E7%9B%AE%E5%BD%95%E8%AE%BE%E7%BD%AE&quot;&gt;4.6 用户组与运行目录设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#47-%E7%94%B3%E8%AF%B7%E5%85%AC%E6%9C%89%E5%8F%97%E4%BF%A1%E4%BB%BB%E8%AF%81%E4%B9%A6&quot;&gt;4.7 申请公有受信任证书&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#48-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1&quot;&gt;4.8 启动服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#49-%E9%99%90%E5%88%B6-systemd-journal-%E6%97%A5%E5%BF%97%E5%A4%A7%E5%B0%8F&quot;&gt;4.9 限制 Systemd Journal 日志大小&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#410-%E5%90%8E%E7%BB%AD%E6%9B%B4%E6%96%B0&quot;&gt;4.10 后续更新&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%85%8D%E7%BD%AE&quot;&gt;5. 客户端配置&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#51-mihomo-%E5%AE%A2%E6%88%B7%E7%AB%AF&quot;&gt;5.1 mihomo 客户端&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#52-alpnech-%E4%B8%8E-xmux-%E8%AF%B4%E6%98%8E&quot;&gt;5.2 ALPN、ECH 与 XMUX 说明&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#alpn&quot;&gt;ALPN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ech&quot;&gt;ECH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#xmux%E9%93%BE%E6%8E%A5%E5%A4%8D%E7%94%A8&quot;&gt;XMUX（链接复用）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%E5%8F%AF%E9%80%89%E8%BF%9B%E9%98%B6%E9%83%A8%E7%BD%B2%E9%9B%B6%E4%BF%A1%E4%BB%BB-ssh&quot;&gt;6. 可选进阶：部署零信任 SSH&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#61-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6&quot;&gt;6.1 前提条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#62-%E9%85%8D%E7%BD%AE-xray-%E8%B7%AF%E7%94%B1%E7%99%BD%E5%90%8D%E5%8D%95%E4%B8%8E-freedom-%E6%94%BE%E8%A1%8C%E8%A7%84%E5%88%99&quot;&gt;6.2 配置 Xray 路由白名单与 Freedom 放行规则&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#63-%E4%B8%BB%E9%80%9A%E9%81%93mihomo-%E9%9A%A7%E9%81%93&quot;&gt;6.3 主通道：mihomo 隧道&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#631-vps-%E7%AB%AF%E7%A1%AE%E8%AE%A4-lo-%E7%8E%AF%E5%9B%9E%E6%94%BE%E8%A1%8C&quot;&gt;6.3.1 VPS 端：确认 lo 环回放行&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#632-%E6%9C%AC%E5%9C%B0mihomo-%E9%85%8D%E7%BD%AE%E6%B7%BB%E5%8A%A0%E9%9A%A7%E9%81%93&quot;&gt;6.3.2 本地：mihomo 配置添加隧道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#633-%E6%9C%AC%E5%9C%B0ssh-config&quot;&gt;6.3.3 本地：SSH config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#634-%E6%B5%8B%E8%AF%95%E4%B8%BB%E9%80%9A%E9%81%93&quot;&gt;6.3.4 测试主通道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#64-%E5%A4%87%E7%94%A8%E9%80%9A%E9%81%93cloudflare-tunnel&quot;&gt;6.4 备用通道：Cloudflare Tunnel&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#641-cf-%E9%9D%A2%E6%9D%BF%E5%88%9B%E5%BB%BA%E9%9A%A7%E9%81%93&quot;&gt;6.4.1 CF 面板创建隧道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#642-vps-%E7%AB%AF%E5%AE%89%E8%A3%85-cloudflared&quot;&gt;6.4.2 VPS 端安装 cloudflared&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#643-%E9%9D%A2%E6%9D%BF%E9%85%8D%E7%BD%AE%E8%B7%AF%E7%94%B1&quot;&gt;6.4.3 面板配置路由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#644-%E6%9C%AC%E5%9C%B0-ssh-config--%E6%B5%8B%E8%AF%95%E5%A4%87%E7%94%A8%E9%80%9A%E9%81%93&quot;&gt;6.4.4 本地 SSH config + 测试备用通道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#65-%E5%85%AC%E7%BD%91-ssh-%E9%9A%90%E8%BA%AB&quot;&gt;6.5 公网 SSH 隐身&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#66-%E5%8D%B8%E8%BD%BD-fail2ban&quot;&gt;6.6 卸载 Fail2ban&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#67-%E9%AA%8C%E8%AF%81&quot;&gt;6.7 验证&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8F%8B%E6%83%85%E6%8E%A8%E8%8D%90&quot;&gt;友情推荐&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. 准备工作&lt;/h1&gt;
&lt;p&gt;在开始之前，请准备好以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一个个人域名&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个通过支付验证的 Cloudflare 账号&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一台拥有 root 完全访问权限的 VPS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
为避免纠纷，本文&lt;strong&gt;不提供任何 VPS 商家推荐或购买指导&lt;/strong&gt;，请自行选择。&lt;/p&gt;
&lt;p&gt;本方案属于 Xray 前置、REALITY 回落到本机 Caddy，不需要配置 &lt;code&gt;limitFallbackUpload&lt;/code&gt;，&lt;/p&gt;
&lt;p&gt;本文中的 &lt;code&gt;&amp;lt;VPS_IP&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_USER&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt; 均为占位符，实际操作时请替换为你的真实 IP、用户名和域名。&lt;/p&gt;
&lt;p&gt;SSH 端口以 &lt;code&gt;&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt; 表示（示例为 &lt;code&gt;54321&lt;/code&gt;），请根据实际部署修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 系统基础防护&lt;/h1&gt;
&lt;h2&gt;2.1 系统基础优化&lt;/h2&gt;
&lt;h3&gt;2.1.1 清除厂家模板&lt;/h3&gt;
&lt;p&gt;使用 root 账密进行 SSH 登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh root@&amp;lt;VPS_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部分服务商的系统模板可能包含首次开机脚本，建议清除，没有则跳过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入编辑界面后，寻找类似 &lt;code&gt;@reboot /admin/firstbootkvm yes&lt;/code&gt; 的行，将其删除并保存。&lt;/p&gt;
&lt;h3&gt;2.1.2 开启 BBR 网络加速&lt;/h3&gt;
&lt;p&gt;把系统自带的 BBR 拥塞控制开启，拉升机器的公网吞吐量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;net.core.default_qdisc=fq&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
echo &quot;net.ipv4.tcp_congestion_control=bbr&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.1.3 增大 Swap（可选）&lt;/h3&gt;
&lt;p&gt;对于内存较少的 VPS，适当增大 Swap 可提供缓冲：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前 Swap
sudo swapon --show

# 创建 Swap 文件（根据磁盘余量调整大小，如 2G）
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 写入 fstab 使其重启后自动挂载
echo &apos;/swapfile none swap sw 0 0&apos; | sudo tee -a /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;降低 swappiness 让系统优先使用物理内存：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;vm.swappiness=10&apos; | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;swappiness&lt;/th&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;不用 swap（如果 RAM 充足，可以完全不用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;物理内存接近耗尽时才动用 swap（&lt;strong&gt;推荐&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;较保守的折中值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;系统默认，较早换出到 swap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;数值越低，系统越倾向保留物理内存，避免磁盘 I/O；但同时 OOM 风险略增。常规场景设为 10 即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.1.4 切换默认 Shell 为 Bash&lt;/h3&gt;
&lt;p&gt;Debian 12 Template 默认将 &lt;code&gt;/bin/sh&lt;/code&gt; 指向 &lt;code&gt;dash&lt;/code&gt;，不是 &lt;code&gt;bash&lt;/code&gt;。本文所有脚本均以 &lt;code&gt;#!/bin/bash&lt;/code&gt; 声明，&lt;strong&gt;不受影响&lt;/strong&gt;，但个别系统脚本和交互环境可能行为异常。&lt;/p&gt;
&lt;p&gt;将默认 Shell 切换为 bash：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一（标准交互方式）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前指向
ls -l /bin/sh

# 重新配置 dash，在弹出的对话框中选择 &amp;lt;No&amp;gt;
sudo dpkg-reconfigure dash

# 确认已切换
ls -l /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果执行后没有弹出任何交互窗口，&lt;strong&gt;请改用方法二：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 设置 debconf 选项为&quot;不使用 dash&quot;
echo &quot;dash dash/sh boolean false&quot; | sudo debconf-set-selections

# 手动链接到 bash
sudo ln -sf bash /bin/sh

# 确认切换
ls -l /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;方法二同时更新了 debconf 数据库，因此后续 dash 包升级时不会自动覆盖该链接。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2.2 SSH 密钥登录&lt;/h2&gt;
&lt;h3&gt;2.2.1 生成密钥对&lt;/h3&gt;
&lt;p&gt;在本地电脑（本文以 Windows 为例）打开 PowerShell 7，生成一把新密钥对：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
ssh-keygen -t ed25519 -C &quot;my-vps&quot; -f ~/.ssh/id_ed25519_vps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回车后，会提示你设置密码（passphrase），如果嫌麻烦可以直接连按两次回车跳过。&lt;/p&gt;
&lt;h3&gt;2.2.2 上传公钥至服务器&lt;/h3&gt;
&lt;p&gt;在本地 PowerShell 中运行（将 &lt;code&gt;&amp;lt;VPS_IP&amp;gt;&lt;/code&gt; 替换为真实 IP）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$pubKey = Get-Content &quot;$HOME\.ssh\id_ed25519_vps.pub&quot;
$pubKey | ssh root@&amp;lt;VPS_IP&amp;gt; &quot;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2.3 加固 SSH 配置&lt;/h3&gt;
&lt;p&gt;回到 VPS SSH 窗口，编辑 SSH 配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改或取消注释以下行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port &amp;lt;SSH_PORT&amp;gt;             # 改为任意高位端口，如 54321
PasswordAuthentication no   # 禁用密码登录
PubkeyAuthentication yes    # 允许密钥登录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顺便查看是否存在 &lt;code&gt;Include /etc/ssh/sshd_config.d/*.conf&lt;/code&gt;。如有，检查该目录下是否存在配置文件，同样需要禁用密码登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls -R /etc/ssh/sshd_config.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如有 50-cloud-init.conf，编辑并修改 PasswordAuthentication yes → no&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 SSH 服务使变更生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
重启服务后，&lt;strong&gt;先别关闭当前 SSH 终端&lt;/strong&gt;。开一个新终端测试新端口和密钥能否连上，确认无误后再关闭旧窗口。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2.4 测试连接&lt;/h3&gt;
&lt;p&gt;从本地 Windows 测试连接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -i ~/.ssh/id_ed25519_vps -p &amp;lt;SSH_PORT&amp;gt; root@&amp;lt;VPS_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果私钥设置了 passphrase，在连接时会提示输入；如果没有设置，则直接登录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2.5 配置本地快捷登录&lt;/h3&gt;
&lt;p&gt;如果希望后续不用每次都输路径和端口，可以在本地 &lt;code&gt;~/.ssh/config&lt;/code&gt; 添加一个配置块&lt;/p&gt;
&lt;p&gt;在 Windows Powershell 7 输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notepad $HOME/.ssh/config 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回车后会打开一个记事本编辑器，输入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host my-vps
    HostName &amp;lt;VPS_IP&amp;gt;
    User root
    Port &amp;lt;SSH_PORT&amp;gt;
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后即可在 pwsh7 使用 &lt;code&gt;ssh my-vps&lt;/code&gt; 登录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.3 创建新用户&lt;/h2&gt;
&lt;p&gt;为贯彻最小权限原则，创建一个专用用户来运行服务和管理文件。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
以下步骤仍在当前的 root SSH 会话中执行，完成后将切换到新用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3.1 创建用户并设置密码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 创建用户 &amp;lt;YOUR_USER&amp;gt;（UID 1000，带 home 目录）
sudo useradd -m -u 1000 &amp;lt;YOUR_USER&amp;gt;

# 设置密码（必须设置，否则无法使用 sudo）
sudo passwd &amp;lt;YOUR_USER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
系统会提示你输入两次密码，虽然我们主要用密钥登录，但 &lt;strong&gt;&lt;code&gt;sudo&lt;/code&gt; 默认需要用户有密码&lt;/strong&gt;，否则会报错 &lt;code&gt;user is not in the sudoers file&lt;/code&gt; 或 &lt;code&gt;no password set&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3.2 加入 sudo 组&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -aG sudo &amp;lt;YOUR_USER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3.3 配置免密 sudo（可选）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
跳过密码验证会降低安全性，仅建议在个人独占的 VPS 上使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件末尾添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;YOUR_USER&amp;gt; ALL=(ALL) NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
比较推荐的方法是保留密码验证，只对特定命令免密&lt;/p&gt;
&lt;p&gt;比如 &lt;code&gt;sudo systemctl start xray&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;本教程为简化流程采用全局免密&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3.4 将公钥复制给新用户&lt;/h3&gt;
&lt;p&gt;在&lt;strong&gt;本地 PowerShell&lt;/strong&gt; 中运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$pubKey = Get-Content &quot;$HOME\.ssh\id_ed25519_vps.pub&quot;
$pubKey | ssh my-vps &quot;mkdir -p /home/&amp;lt;YOUR_USER&amp;gt;/.ssh &amp;amp;&amp;amp; chmod 700 /home/&amp;lt;YOUR_USER&amp;gt;/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; /home/&amp;lt;YOUR_USER&amp;gt;/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 /home/&amp;lt;YOUR_USER&amp;gt;/.ssh/authorized_keys &amp;amp;&amp;amp; chown -R &amp;lt;YOUR_USER&amp;gt;:&amp;lt;YOUR_USER&amp;gt; /home/&amp;lt;YOUR_USER&amp;gt;/.ssh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3.5 更新本地 SSH config&lt;/h3&gt;
&lt;p&gt;追加到本地 &lt;code&gt;~/.ssh/config&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host my-vps-user
    HostName &amp;lt;VPS_IP&amp;gt;
    User &amp;lt;YOUR_USER&amp;gt;
    Port &amp;lt;SSH_PORT&amp;gt;
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后，即可用 &lt;code&gt;ssh my-vps-user&lt;/code&gt; 登录，再通过 &lt;code&gt;sudo&lt;/code&gt; 执行管理命令。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.4 部署防火墙&lt;/h2&gt;
&lt;p&gt;本文采用以下设计：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;防火墙规则 (deploy_firewall.sh)     → 执行一次即可
        ↓
     ipset 集合
        ↓
ASN 黑名单 (update_blacklists.sh)  → 每周自动更新
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4.1 禁用 UFW&lt;/h3&gt;
&lt;p&gt;如果你之前启用过 UFW，先关掉：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw disable
sudo systemctl stop ufw
sudo systemctl disable ufw
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4.2 防火墙部署脚本&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
请在本地编辑器复制并替换下方代码块开头的&lt;strong&gt;用户配置区&lt;/strong&gt;，然后粘贴整段代码块到 VPS 终端执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /usr/local/bin/deploy_firewall.sh &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
#!/bin/bash
# ============================================================================
# 部署防火墙规则，本脚本只需执行一次
# 无 P2P 版
# 修改配置后重新执行即可，脚本会自动覆盖旧规则
# ============================================================================

# ===================== 用户配置区 =====================

SSH_PORT=54321

# Web 端口（80 用于 HTTP，443 用于 HTTPS）
# 如需放行其他端口请在此添加
WEB_PORTS=(80 443)

# 是否启用 IPv6（1=启用，0=禁用）
ENABLE_IPV6=1

# 邻居网段全局阻断（设为 &quot;-&quot; 表示不启用）
# 示例: NEIGHBOR_V4=&quot;10.0.0.0/8&quot;
NEIGHBOR_V4=&quot;&amp;lt;YOUR_NEIGHBOR_V4_CIDR&amp;gt;&quot;
NEIGHBOR_V6=&quot;&amp;lt;YOUR_NEIGHBOR_V6_CIDR&amp;gt;&quot;


export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;

# ===================== 日志与颜色 =====================

RED=&apos;\033[1;31m&apos;
GREEN=&apos;\033[1;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
BLUE=&apos;\033[1;34m&apos;
CYAN=&apos;\033[1;36m&apos;
NC=&apos;\033[0m&apos;

log()  { echo -e &quot;${BLUE}[INFO]${NC}  $1&quot;; }
ok()   { echo -e &quot;${GREEN}[OK]${NC}    $1&quot;; }
warn() { echo -e &quot;${YELLOW}[WARN]${NC}  $1&quot;; }
err()  { echo -e &quot;${RED}[ERR]${NC}   $1&quot;; }
die()  { err &quot;$1&quot;; exit 1; }

# 检查 IPv6
check_v6() {
    if [ &quot;$ENABLE_IPV6&quot; != &quot;1&quot; ]; then echo 0; return; fi
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

# 依赖检查
check_deps() {
    local missing=()
    for cmd in ipset iptables; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        err &quot;Missing dependencies: ${missing[*]}&quot;
        err &quot;Run: sudo apt install -y ipset iptables&quot;
        exit 1
    fi
    ok &quot;Dependencies satisfied&quot;

    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ! command -v ip6tables &amp;amp;&amp;gt;/dev/null; then
        warn &quot;ip6tables not found, disabling IPv6&quot;
        HAS_V6=0
    fi
}

# 安装 iptables-persistent 与 ipset-persistent
install_persistent() {
    if dpkg -l iptables-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos; &amp;amp;&amp;amp; dpkg -l ipset-persistent 2&amp;gt;/dev/null | grep -q &apos;^ii&apos;; then
        return 0
    fi
    log &quot;Installing iptables-persistent &amp;amp; ipset-persistent...&quot;
    echo iptables-persistent iptables-persistent/autosave_v4 boolean true \
        | debconf-set-selections 2&amp;gt;/dev/null
    echo iptables-persistent iptables-persistent/autosave_v6 boolean true \
        | debconf-set-selections 2&amp;gt;/dev/null
    DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent ipset-persistent &amp;amp;&amp;gt;/dev/null \
        || warn &quot;Could not install persistent packages, will fallback to manual save&quot;
}

# 创建 ipset 集合
create_ipsets() {
    ipset create bad_asn_v4 hash:net family inet \
        hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        ipset create bad_asn_v6 hash:net family inet6 \
            hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
    fi
    ok &quot;ipset collections created&quot;
}

# 部署 iptables 规则
deploy_v4() {
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    iptables -F
    iptables -X

    # 基础放行
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT

    # 全局阻断邻居网段
    if [ &quot;$NEIGHBOR_V4&quot; != &quot;-&quot; ]; then
        iptables -A INPUT -s &quot;$NEIGHBOR_V4&quot; -j DROP
        ok &quot;Neighbor v4 blocked globally: $NEIGHBOR_V4&quot;
    fi

    # 全局阻断 ASN 黑名单
    iptables -A INPUT -m set --match-set bad_asn_v4 src -j DROP
    ok &quot;Global blacklist: DROP(ASN)&quot;

    # SSH
    iptables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT
    ok &quot;Allow TCP port $SSH_PORT (SSH)&quot;

    # Web (80, 443)
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        iptables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
        ok &quot;Allow TCP port $port (Web)&quot;
    done
}

# 部署 ip6tables 规则
deploy_v6() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT

    ip6tables -F
    ip6tables -X

    ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

    # 全局阻断 邻居网段
    if [ &quot;$NEIGHBOR_V6&quot; != &quot;-&quot; ]; then
        ip6tables -A INPUT -s &quot;$NEIGHBOR_V6&quot; -j DROP
        ok &quot;Neighbor v6 blocked globally: $NEIGHBOR_V6&quot;
    fi

    # 全局阻断 ASN 黑名单
    ip6tables -A INPUT -m set --match-set bad_asn_v6 src -j DROP
    ok &quot;Global blacklist: DROP(ASN)&quot;

    # SSH
    ip6tables -A INPUT -p tcp --dport &quot;$SSH_PORT&quot; -j ACCEPT

    # Web (80, 443)
    for port in &quot;${WEB_PORTS[@]}&quot;; do
        ip6tables -A INPUT -p tcp --dport &quot;$port&quot; -j ACCEPT
    done
}

# 持久化
persist() {
    if command -v netfilter-persistent &amp;amp;&amp;gt;/dev/null; then
        netfilter-persistent save 2&amp;gt;/dev/null
        ok &quot;Rules saved via netfilter-persistent&quot;
    else
        mkdir -p /etc/iptables
        ipset save &amp;gt; /etc/iptables/ipsets 2&amp;gt;/dev/null
        iptables-save &amp;gt; /etc/iptables/rules.v4
        [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ip6tables-save &amp;gt; /etc/iptables/rules.v6
        ok &quot;Rules saved to /etc/iptables/&quot;
        warn &quot;Consider installing iptables-persistent for automatic restore on boot&quot;
    fi
}

print_rules() {
    echo &quot;&quot;
    echo -e &quot;${CYAN}=== IPv4 INPUT Rules ===${NC}&quot;
    iptables -L INPUT -v -n --line-numbers 2&amp;gt;/dev/null | head -20
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        echo &quot;&quot;
        echo -e &quot;${CYAN}=== IPv6 INPUT Rules ===${NC}&quot;
        ip6tables -L INPUT -v -n --line-numbers 2&amp;gt;/dev/null | head -15
    fi
}

# 主流程
main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then
        die &quot;This script must be run as root&quot;
    fi

    echo &quot;&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo -e &quot;${GREEN}  Firewall Deployment (One-Time Setup)${NC}&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo &quot;&quot;

    HAS_V6=$(check_v6)
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ok &quot;IPv6 enabled&quot; || warn &quot;IPv6 disabled&quot;

    check_deps
    create_ipsets

    echo &quot;&quot;
    log &quot;Deploying IPv4 rules...&quot;
    deploy_v4

    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        echo &quot;&quot;
        log &quot;Deploying IPv6 rules...&quot;
        deploy_v6
    fi

    echo &quot;&quot;
    log &quot;Persisting rules...&quot;
    install_persistent
    persist

    print_rules

    echo &quot;&quot;
    echo -e &quot;${GREEN}Firewall deployed.${NC}&quot;
    echo -e &quot;${YELLOW}Next: run update_blacklists.sh to load ASN blacklists.${NC}&quot;
    echo &quot;&quot;
}

main &quot;$@&quot;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限并运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/deploy_firewall.sh
sudo /usr/local/bin/deploy_firewall.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建 ipset 集合（&lt;code&gt;bad_asn_v4&lt;/code&gt;、&lt;code&gt;bad_asn_v6&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;清空原有 iptables 规则并部署新规则&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;iptables-persistent&lt;/code&gt; 并保存规则（重启后自动恢复）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
此脚本只部署防火墙规则，&lt;strong&gt;不会下载黑名单数据&lt;/strong&gt;，此时 ipset 集合为空，所有 443 请求都可以正常访问。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.4.3 黑名单更新脚本&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
直接复制下方代码块至终端回车，即可一键生成更新黑名单脚本：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /usr/local/bin/update_blacklists.sh &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
#!/bin/bash
# ============================================================================
# 更新 ASN 黑名单
# ============================================================================

# 需要屏蔽的 ASN（格式：ASN|名称）
ASNS=(
    &quot;14061|DigitalOcean&quot;
    &quot;16509|AWS&quot;
    &quot;15169|Google_Cloud&quot;
    &quot;8075|Azure&quot;
    &quot;20473|Vultr&quot;
    &quot;31898|Oracle&quot;
)

# 缓存目录
CACHE_DIR=&quot;/var/lib/seedbox-firewall&quot;

export PATH=&quot;/usr/sbin:/sbin:$PATH&quot;
set -o pipefail

# ===================== 日志与颜色 =====================

RED=&apos;\033[1;31m&apos;
GREEN=&apos;\033[1;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
BLUE=&apos;\033[1;34m&apos;
CYAN=&apos;\033[1;36m&apos;
NC=&apos;\033[0m&apos;

log()  { echo -e &quot;${BLUE}[INFO]${NC}  $1&quot;; }
ok()   { echo -e &quot;${GREEN}[OK]${NC}    $1&quot;; }
warn() { echo -e &quot;${YELLOW}[WARN]${NC}  $1&quot;; }
err()  { echo -e &quot;${RED}[ERR]${NC}   $1&quot;; }
die()  { err &quot;$1&quot;; exit 1; }
ln()   { echo &quot;------------------------------&quot;; }
fmt()  { printf &quot;%&apos;d&quot; &quot;$1&quot;; }

# 检查 IPv6
check_v6() {
    if [ -f /proc/net/if_inet6 ] &amp;amp;&amp;amp; [ &quot;$(wc -l &amp;lt; /proc/net/if_inet6)&quot; -gt 0 ]; then
        command -v ip6tables &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo 1 || echo 0
    else
        echo 0
    fi
}

# 依赖检查
check_deps() {
    local missing=()
    for cmd in curl awk python3 ipset whois sha256sum; do
        command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null || missing+=(&quot;$cmd&quot;)
    done
    if [ &quot;${#missing[@]}&quot; -gt 0 ]; then
        die &quot;Missing: ${missing[*]}. Run: sudo apt install -y curl gawk python3 ipset iproute2 whois&quot;
    fi

    # 检查 ASN ipset 是否存在（由 deploy_firewall.sh 创建）
    if ! ipset list bad_asn_v4 &amp;amp;&amp;gt;/dev/null; then
        die &quot;ipset &apos;bad_asn_v4&apos; not found. Run deploy_firewall.sh first.&quot;
    fi
}

# ===================== 缓存函数 =====================

init_cache() {
    mkdir -p &quot;$CACHE_DIR&quot; 2&amp;gt;/dev/null || { die &quot;Cannot create $CACHE_DIR&quot;; }
}

get_cached_hash() {
    local name=&quot;$1&quot;
    local hashfile=&quot;${CACHE_DIR}/${name}.sha256&quot;
    [ -f &quot;$hashfile&quot; ] &amp;amp;&amp;amp; cat &quot;$hashfile&quot; || echo &quot;&quot;
}

set_cached_hash() {
    local name=&quot;$1&quot; hash=&quot;$2&quot;
    echo &quot;$hash&quot; &amp;gt; &quot;${CACHE_DIR}/${name}.sha256&quot;
}

is_changed() {
    local name=&quot;$1&quot; cidr_file=&quot;$2&quot;
    if [ ! -s &quot;$cidr_file&quot; ]; then
        return 0  # 空文件视为有变化（或错误）
    fi
    local new_hash=$(sha256sum &quot;$cidr_file&quot; | awk &apos;{print $1}&apos;)
    local old_hash=$(get_cached_hash &quot;$name&quot;)
    if [ &quot;$new_hash&quot; = &quot;$old_hash&quot; ] &amp;amp;&amp;amp; [ -n &quot;$old_hash&quot; ]; then
        return 1  # 未变化
    fi
    return 0  # 有变化
}

update_cache() {
    local name=&quot;$1&quot; cidr_file=&quot;$2&quot;
    local new_hash=$(sha256sum &quot;$cidr_file&quot; | awk &apos;{print $1}&apos;)
    set_cached_hash &quot;$name&quot; &quot;$new_hash&quot;
}

# ===================== ASN 更新 =====================

update_asn() {
    log &quot;Fetching ASN routes from RADb...&quot;

    local work=&quot;/tmp/asn-update-$$&quot;
    mkdir -p &quot;$work&quot;
    local v4_cidr=&quot;${CACHE_DIR}/asn_v4.cidr&quot;
    local v6_cidr=&quot;${CACHE_DIR}/asn_v6.cidr&quot;
    local v4_tmp=&quot;${work}/asn_v4.cidr&quot;
    local v6_tmp=&quot;${work}/asn_v6.cidr&quot;

    true &amp;gt; &quot;$v4_tmp&quot;
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; true &amp;gt; &quot;$v6_tmp&quot;

    local v4_total=0 v6_total=0

    for ITEM in &quot;${ASNS[@]}&quot;; do
        ASN=&quot;${ITEM%%|*}&quot;
        NAME=&quot;${ITEM##*|}&quot;

        local whois_out=&quot;${work}/whois_${ASN}.txt&quot;
        if ! timeout 20 whois -h whois.radb.net -- &quot;-i origin AS${ASN}&quot; &amp;gt; &quot;$whois_out&quot; 2&amp;gt;/dev/null; then
            warn &quot;AS${ASN} ${NAME}: whois timeout or failed&quot;
            rm -f &quot;$whois_out&quot;
            continue
        fi

        # 提取 v4 路由
        local v4_count=$(awk &apos;/^route:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v4_tmp&quot; | wc -l)
        v4_total=$((v4_total + v4_count))

        if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
            local v6_count=$(awk &apos;/^route6:/ {print $2}&apos; &quot;$whois_out&quot; | grep -v &apos;^$&apos; | tee -a &quot;$v6_tmp&quot; | wc -l)
            v6_total=$((v6_total + v6_count))
        fi

        log &quot;  AS${ASN} ${NAME}: v4=${v4_count} v6=${HAS_V6:+&quot;$v6_count&quot;}&quot;
        rm -f &quot;$whois_out&quot;
    done

    # 更新 v4
    local v4_updated=0
    if [ &quot;$v4_total&quot; -lt 50 ]; then
        warn &quot;ASN v4 too few entries ($v4_total), keeping existing set&quot;
    elif is_changed &quot;asn_v4&quot; &quot;$v4_tmp&quot;; then
        log &quot;ASN v4 changed, swapping ipset...&quot;
        local new_set=&quot;bad_asn_v4_new&quot;
        ipset create &quot;$new_set&quot; hash:net family inet hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
        {
            echo &quot;create $new_set hash:net family inet hashsize 4096 maxelem 500000 -exist&quot;
            awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v4_tmp&quot;
        } | ipset restore -exist 2&amp;gt;/dev/null
        ipset swap &quot;$new_set&quot; bad_asn_v4
        ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
        cp &quot;$v4_tmp&quot; &quot;$v4_cidr&quot;
        update_cache &quot;asn_v4&quot; &quot;$v4_tmp&quot;
        v4_updated=1
        ok &quot;ASN v4 updated: $(fmt $(wc -l &amp;lt; &quot;$v4_cidr&quot;)) entries&quot;
    else
        ok &quot;ASN v4 unchanged ($(fmt $v4_total) entries), skipped&quot;
    fi

    # 更新 v6
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        if [ &quot;$v6_total&quot; -lt 50 ]; then
            warn &quot;ASN v6 too few entries ($v6_total), keeping existing set&quot;
        elif is_changed &quot;asn_v6&quot; &quot;$v6_tmp&quot;; then
            log &quot;ASN v6 changed, swapping ipset...&quot;
            local new_set=&quot;bad_asn_v6_new&quot;
            ipset create &quot;$new_set&quot; hash:net family inet6 hashsize 4096 maxelem 500000 -exist 2&amp;gt;/dev/null
            {
                echo &quot;create $new_set hash:net family inet6 hashsize 4096 maxelem 500000 -exist&quot;
                awk &apos;{print &quot;add &apos;&quot;$new_set&quot;&apos; &quot; $0}&apos; &quot;$v6_tmp&quot;
            } | ipset restore -exist 2&amp;gt;/dev/null
            ipset swap &quot;$new_set&quot; bad_asn_v6
            ipset destroy &quot;$new_set&quot; 2&amp;gt;/dev/null
            cp &quot;$v6_tmp&quot; &quot;$v6_cidr&quot;
            update_cache &quot;asn_v6&quot; &quot;$v6_tmp&quot;
            ok &quot;ASN v6 updated: $(fmt $(wc -l &amp;lt; &quot;$v6_cidr&quot;)) entries&quot;
        else
            ok &quot;ASN v6 unchanged ($(fmt $v6_total) entries), skipped&quot;
        fi
    fi

    rm -rf &quot;$work&quot;
}

# ===================== 打印统计 =====================

print_summary() {
    echo &quot;&quot;
    ln
    local asn_v4=$(ipset list bad_asn_v4 2&amp;gt;/dev/null | grep &quot;Number of entries&quot; | awk &apos;{print $NF}&apos;)
    echo &quot;  ASN v4:  ${asn_v4:-0} entries&quot;
    if [ &quot;$HAS_V6&quot; = &quot;1&quot; ]; then
        local asn_v6=$(ipset list bad_asn_v6 2&amp;gt;/dev/null | grep &quot;Number of entries&quot; | awk &apos;{print $NF}&apos;)
        echo &quot;  ASN v6:  ${asn_v6:-0} entries&quot;
    fi
    ln
}

# ===================== 主流程 =====================

main() {
    if [ &quot;$(id -u)&quot; != &quot;0&quot; ]; then
        die &quot;This script must be run as root&quot;
    fi

    echo &quot;&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo -e &quot;${GREEN}  ASN Blacklist Update${NC}&quot;
    echo -e &quot;${CYAN}========================================${NC}&quot;
    echo &quot;&quot;

    HAS_V6=$(check_v6)
    [ &quot;$HAS_V6&quot; = &quot;1&quot; ] &amp;amp;&amp;amp; ok &quot;IPv6 enabled&quot; || warn &quot;IPv6 disabled&quot;

    check_deps
    init_cache

    echo &quot;&quot;
    log &quot;Updating ASN blacklists...&quot;
    update_asn

    print_summary

    echo -e &quot;${GREEN}ASN blacklist update complete.${NC}&quot;
    echo &quot;&quot;
}

main &quot;$@&quot;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原子更新&lt;/strong&gt;：创建新集合 → 导入数据 → &lt;code&gt;ipset swap&lt;/code&gt; 切换 → 销毁旧集合，切换耗时毫秒级，更新期间不会出现空集合窗口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;：将解析后的 CIDR 列表存入 &lt;code&gt;/var/lib/seedbox-firewall/&lt;/code&gt;，下次运行时对比 SHA256，数据未变化则跳过更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错&lt;/strong&gt;：下载失败不销毁现有集合，部分源失败不影响已成功的更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4.4 首次加载黑名单并设置定时任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo /usr/local/bin/update_blacklists.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次运行会下载并导入所有 ASN 黑名单，耗时取决于网络和 VPS 性能&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
由于脚本采用原子 swap 更新，首次运行时 &lt;code&gt;deploy_firewall.sh&lt;/code&gt; 创建的集合可能为空，需要等待导入完成后才会有数据&lt;/p&gt;
&lt;p&gt;后续每周运行时，当前集合始终保持有效，不受更新过程影响&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;设置每周自动更新（cron）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
# 末尾添加（每周日凌晨 4 点）：
0 4 * * 0 /usr/local/bin/update_blacklists.sh &amp;gt; /var/log/blacklist-update.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4.5 验证规则&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo iptables -L INPUT -v -n --line-numbers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期输出类似（&lt;code&gt;bad_asn_v4&lt;/code&gt; 为全局 DROP，不限于 443 端口）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chain INPUT (policy DROP)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0
3        0     0 DROP       0    --  *      *       &amp;lt;NEIGHBOR_V4&amp;gt;        0.0.0.0/0
4        0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            match-set bad_asn_v4 src
5        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:&amp;lt;SSH_PORT&amp;gt;
6        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
7        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;bad_asn_v4 规则是全局 DROP（&lt;code&gt;prot 0&lt;/code&gt;），排在 ACCEPT 规则之前，因此先匹配黑名单丢弃，再放行白名单流量。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;验证 ipset 集合数据量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ipset list bad_asn_v4 | grep &quot;Number of entries&quot;
sudo ipset list bad_asn_v6 | grep &quot;Number of entries&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2.5 部署 Fail2ban（可选）&lt;/h2&gt;
&lt;p&gt;虽然已禁用密码登录，但公网上的端口探测依然会消耗系统资源。Fail2ban 可以动态封禁反复试探的 IP。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你后续计划部署零信任 SSH（第 6 章），SSH 端口会从公网彻底隐藏，届时 Fail2ban 将不再需要，可参考 6.6 节卸载。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建自定义配置，注意将 &lt;code&gt;port&lt;/code&gt; 改为你的 SSH 端口：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
直接复制下方代码块至终端回车执行：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/fail2ban/jail.local &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;

写入：

```ini
[sshd]
enabled = true
port = &amp;lt;SSH_PORT&amp;gt;
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;10 分钟内输错 3 次密码，封禁该 IP 24 小时。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动并设置开机自启：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;3. Cloudflare 配置&lt;/h1&gt;
&lt;h2&gt;3.1 添加 DNS 记录&lt;/h2&gt;
&lt;p&gt;将域名托管到 Cloudflare，添加 DNS 解析记录：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;记录类型&lt;/th&gt;
&lt;th&gt;子域名&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;小黄云（Proxy）&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;td&gt;CDN 回源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REALITY.&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPS IPv4&lt;/td&gt;
&lt;td&gt;关闭&lt;/td&gt;
&lt;td&gt;REALITY 握手直连&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;如果需要双栈，可额外添加 AAAA 记录，可复用同一个子域名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3.2 SSL/TLS 设置&lt;/h2&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 概述 -&amp;gt; 配置 -&amp;gt; 加密模式和源连接设置 -&amp;gt; 加密模式设置为 &lt;code&gt;完全（严格）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;SSL/TLS&lt;/strong&gt; -&amp;gt; 边缘证书 -&amp;gt; 开启 TLS 1.3&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; 开启 gRPC&lt;/p&gt;
&lt;h2&gt;3.3 缓存规则设置&lt;/h2&gt;
&lt;p&gt;为避免 XHTTP 请求被缓存，创建缓存规则：&lt;/p&gt;
&lt;p&gt;面板左侧 -&amp;gt; &lt;strong&gt;缓存&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt; -&amp;gt; 创建缓存规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名称：随意&lt;/li&gt;
&lt;li&gt;&lt;code&gt;如果传入请求匹配…&lt;/code&gt; -&amp;gt; 选择 &lt;code&gt;自定义筛选表达式&lt;/code&gt; -&amp;gt; 点击 &lt;code&gt;编辑表达式&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入（替换为你的域名和路径）：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;cdn.&amp;lt;YOUR_DOMAIN&amp;gt;&quot;) or (http.request.uri.path contains &quot;/&amp;lt;YOUR_XHTTP_PATH&amp;gt;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;缓存资格&lt;/code&gt; → 设置为 &lt;code&gt;绕过缓存&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 安装 Xray-core 与 Caddy&lt;/h1&gt;
&lt;h2&gt;4.1 安装 Xray-core&lt;/h2&gt;
&lt;p&gt;通过官方脚本裸装（Bare-metal）并使用 systemd 管理：&lt;/p&gt;
&lt;p&gt;推荐安装 Pre-release 版本，目前 Stable 版本还停留在 v26.3.27，新版本包含 XHTTP 修复和功能修复等&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;发版策略说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RPRX(Owner):&lt;/p&gt;
&lt;p&gt;忘公开说明一下了，关于 Xray-core 的发版策略， pre-release 有可能是实际意义上的 stable，而 latest 也不等于“没有 bug”&lt;/p&gt;
&lt;p&gt;没标 latest 通常是因为我觉得下个 stable 该包含什么但它还没有包含，&lt;s&gt;或者单纯懒得写 release notes 那就算了下次吧，感觉比写代码都麻烦&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;via https://t.me/projectXray/5113846&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;mihomo 客户端兼容性说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Xray-core v26.7.11 增加了 REALITY 最低客户端版本校验（&lt;code&gt;minClientVer&lt;/code&gt;），默认要求客户端版本 ≥ &lt;code&gt;26.3.27&lt;/code&gt;
由于 mihomo 底层硬编码了版本号 &lt;code&gt;1.8.2&lt;/code&gt;，两者不兼容时将导致 REALITY 握手失败&lt;/p&gt;
&lt;p&gt;本教程的服务端配置模板已在 &lt;code&gt;realitySettings&lt;/code&gt; 中显式添加 &lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt; 以绕过此限制，安装最新版 Xray-core 即可正常工作&lt;/p&gt;
&lt;p&gt;具体情况请见相关 Issue / PR：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/issues/6477&quot;&gt;Xray-core #6477&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MetaCubeX/mihomo/issues/2967&quot;&gt;mihomo #2967&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/pull/6181&quot;&gt;Xray-core PR #6181&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击一键吃瓜&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本教程的 Xray 服务端通过 REALITY 协议与 mihomo 客户端通信。在开始安装之前，有必要了解一起直接影响新版 Xray 与 mihomo 的兼容性社区事件，这也是后续配置中 &lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt; 这一行的由来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;2026-05-29&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Xray-core 维护者 RPRX 在 &lt;a href=&quot;https://github.com/XTLS/Xray-core/pull/6181&quot;&gt;uTLS 指纹更新 PR #6181&lt;/a&gt; 的讨论中，收到关于俄罗斯 GFW 针对 Chrome TLS 指纹实施封锁的报告。他在分析各大第三方客户端的应对策略时，了解 mihomo 与 sing-box 的做法后，表达了强烈的不认同：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chrome 浏览器是自动更新的，我认为无论是 mihomo 的选择不带 X25519MLKEM768 的 Chrome 120 指纹还是 sing-box 的在最新版 Chrome 指纹中移除 X25519MLKEM768 都会造成强特征，现在只是因为它们在俄罗斯的用户相对较少所以尚未被 GFW 针对而已，一旦被关注到那么这类强特征将是不可解决的，除非换成最新版且未修改的 Chrome 指纹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;s&gt;Sing-box 和 mihomo 这 Chrome 指纹问题。。。怎么感觉狼人越来越多了&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;2026-07-05&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Xray-core 维护者 RPRX 在 Telegram 发布&lt;s&gt;严正公告&lt;/s&gt;，宣布 Project X 即日起完全转向俄罗斯和伊朗市场，不再处理中国 GFW 相关事件：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;严正公告：由于中国翻墙娱乐圈傻逼太多带不动，&lt;s&gt;且几乎无国人捐款反而一直喂国字头 Surge&lt;/s&gt;，以及为了规避风险，Project X 即日起完全转向俄罗斯和伊朗，&lt;s&gt;严格禁止在中国大陆内使用&lt;/s&gt;(https://t.me/projectXtls/1513)，不再处理中国 GFW 相关事件，比如不会为了对抗中国 GFW 的最新封锁而迭代，且放弃兼容中国代理软件、机场等生态，比如下个版本开始 REALITY 服务端将默认限制客户端最小版本，这也同时阻止了有问题的客户端 TLS 指纹（&lt;a href=&quot;https://github.com/XTLS/Xray-core/pull/6181#issuecomment-4567373533&quot;&gt;其它两个内核的 Chrome 指纹均有问题&lt;/a&gt;），此外不建议使用其它两个内核搭建 REALITY 服务端，它们的实现均过时已久、存在严重特征，&lt;s&gt;不确定此前一些封锁报告的服务端内核是什么，有可能根本就不是 Xray 服务端&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;简单来说接触中国翻墙娱乐圈也有几年了，终于发现某些文化“培育”出的人简直烂透了没救了令人失望透顶，从开发者到 end user 再到机场主什么的全烂完了，本来还想列一下结果发现各种破事根本都列不完，就这样吧我也不想管了，绝大多数人本就根本不值得，谨此共勉&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Project X 群友1：疑惑，这个事件导火索到底是什么&lt;/p&gt;
&lt;p&gt;Project X 群友2：最开始是vless的流行压力surge支持vless协议，刘某不干，认为主流机场用户都是ss协议，然后群内气氛开始向用vless reality协议的直连用户低人一等，都是穷鬼用不起高端机场（因为高端机场用专线可以ss不走gfw），然后surge用户去攻击rprx支持者，然后今年上面对机场大打击，加上ss特征明显导致机场迎来毁灭性打击，r派系开始狂欢继续压力surge，随后双方矛盾更近一步，本来surge就有黑历史-刘某被公安喝茶🍵+闭源软件+国内公司（北京随行）开发报税，如此黑历史+surge最近只收钱不更新下刘某还挣的盆满钵满买房装修，反观rprx免费开发收获的捐赠几乎全来自于伊朗和俄罗斯，rprx觉得不值已有不满，加上目前所有主流机场秉持的原则是只要不被封，不管安不安全就用，典型的就是跳过证书验证，rprx非常反感此类行为，认为这是给gfw递刀子，机场贪图便利不为用户安全考虑，用户也不在意，加上surge用户维护surge情愿被割韭菜，几乎所有普通用户不管自身网络安全，秉持能用就行的原则，至此代理软件+机场+用户三位一体全部烂泥扶不上墙，rprx彻底爆发放弃对抗gfw&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;2026-07-07&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RPRX 更进一步，说下个版本还将禁止公网未加密代理协议出站：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;昨天发的有些人误解了，本来想解释一下，发现已经有人详细阐述了，&lt;a href=&quot;https://t.me/vps_xhq/814?comment=44635&quot;&gt;差不多就是这个意思，完全就是烂泥扶不上墙&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;压死骆驼的最后一根稻草就是 &lt;a href=&quot;https://t.me/projectXtls/3363&quot;&gt;大型机场为了赚 Surge 用户那点钱甚至敢全部换成能被 MITM 的自签证书&lt;/a&gt;，至此我才认识到不光是 Surge 那些人有问题，中国翻墙娱乐圈整个生态都烂透了没救了，真的没有多少人在意用户的安全性，而是能翻出去就行，&lt;s&gt;这与俄罗斯支持者真的是天壤之别&lt;/s&gt;，甚至用户自身也不在意，就如当初我们点出共用 SS 密码的机场 Surge 那边也是无所谓的态度，算了吧累了，我觉得“能翻出去就行、无所谓安全”的需求并不需要我的协议，&lt;s&gt;全是蜜罐你能翻不出去吗&lt;/s&gt;，况且既然用户自身都不在意了，我天天掀 GFW 的蜜罐纯粹是吃力不讨好而已，&lt;s&gt;还容易被上门&lt;/s&gt;，真的不会再干这种傻事了，还是明哲保身吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/commit/d7fa2076c3e5401173bf9b58f7b07f9aa5174443&quot;&gt;下个版本还会禁止公网未加密代理协议出站&lt;/a&gt;（除了 Socks、HTTP，这俩协议地球人都知道是明文），大概是继清零明文 HTTP 面板、&lt;s&gt;清退共用 SS 密码&lt;/s&gt;、删掉 allowInsecure 后，推动最基本的加密安全性的最后一块拼图，&lt;s&gt;加密后的特征是后话，但至少得有个加密吧&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;前天发个 &lt;a href=&quot;https://t.me/projectXtls/3373&quot;&gt;严正公告&lt;/a&gt; 没想到引起了广泛讨论，还是存在一些误解，比如下个版本开始 Xray REALITY 服务端只是会给“客户端最小版本”参数设默认值，若无所谓其它两个内核的 Chrome 指纹特征风险的话可以调低（若它们消除了相关特征才应改内置版本），&lt;s&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/discussions/6250#discussioncomment-17538177&quot;&gt;另外俄伊那边的 GFW 比中国更严，咳言尽于此&lt;/a&gt;&lt;/s&gt;，除了受够了中国翻墙娱乐圈的现状、选择与机场等生态切割、明哲保身外，&lt;strong&gt;我更多地是希望 Xray 完全自成一派，比如只要使用 Xray 相关生态就意味着有最基本的加密安全性，而不会被自己或别人可能因为缺乏相关知识而做出的离谱操作所坑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;各方反应也比较有意思，&lt;a href=&quot;https://t.me/jichangtj/1196&quot;&gt;有说 Surge 用户少所以机场转向 AnyTLS 与它关系不大的&lt;/a&gt;，然而薯条转向 VLESS 后为了兼容 Surge 还专门开了线路，以及 AnyTLS 机场有多少是自签的问题，&lt;a href=&quot;https://t.me/projectXtls/3364&quot;&gt;连大型机场的都是自签且不 pin 证书&lt;/a&gt;，Xray 移除 allowInsecure 也是阻力重重，还不多吗，甚至有些真证书都开它，&lt;s&gt;以及世某人说翻墙是伪命题什么的，言论真的是一年比一年魔幻，这言论都出来了还不得赶紧切割吗，我觉得吧特征问题还可以逐步处理，但至少别能被解密吧，还有以 mieq 为首的 SURGE PRO 群直接弹冠相庆，唉弱智 endest user 的代表，这次懒得评价了&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;我的态度很明确，有些人想瞎搞就瞎搞吧，历史会反省并给出公正评价，反正任何责任或后果都与我无关，且我现在只想要境内的翻墙行为和我没任何关系，&lt;s&gt;我可没那协议即使有人想上门也无法选中&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;2026-07-11&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RPRX 提交了 Commit &lt;a href=&quot;https://github.com/XTLS/Xray-core/commit/af7eb68028732a8ee3c0e5d6ab2b8a657bb2e770&quot;&gt;&lt;code&gt;af7eb68&lt;/code&gt;&lt;/a&gt;： REALITY server: Set default &lt;code&gt;&quot;minClientVer&quot;: &quot;26.3.27&quot;&lt;/code&gt; (change it at your own risk)&lt;/p&gt;
&lt;p&gt;RPRX再次评论：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;实现了 REALITY 的客户端不应支持该功能，如果 TLS 指纹符合规范，修改内置版本号至 &lt;a href=&quot;https://t.me/projectXtls/3380&quot;&gt;26.3.27&lt;/a&gt; 即可，该内置版本号应随 TLS 指纹更新，&lt;s&gt;不然 Xray 就得在 REALITY 服务端内置 JA4 指纹白名单了&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;对我们用户的问题在于：&lt;/p&gt;
&lt;p&gt;mihomo 在构造 REALITY ClientHello 时，其 TLS Session ID 中的版本号被硬编码为 &lt;code&gt;[1, 8, 2]&lt;/code&gt;（&lt;code&gt;component/tls/REALITY.go:74-76&lt;/code&gt;）。&lt;code&gt;1.8.2&lt;/code&gt; 远低于 &lt;code&gt;26.3.27&lt;/code&gt;，因此所有 mihomo 客户端的 REALITY 连接均被新版 Xray 服务端拒绝。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Now&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部分 mihomo 用户请求 mihomo 官方调整版本号以适配 Xray 的新要求。&lt;/p&gt;
&lt;p&gt;mihomo CTO wwqgtxx 回应并将 Issue 标记为 &lt;code&gt;wontfix&lt;/code&gt; 关闭：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们对 xray 的决定不做评论，但是也不会对我们的当前实现做出任何修改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;事已至此，双方均无意妥协&lt;/p&gt;
&lt;p&gt;目前对我们普通用户而言，&lt;strong&gt;解决路径仅存于服务端一侧&lt;/strong&gt;，在 Xray 的 &lt;code&gt;realitySettings&lt;/code&gt; 中显式配置 &lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt;，手动向服务端声明允许该版本的客户端接入&lt;/p&gt;
&lt;p&gt;本教程的配置模板已预置此行配置，按下文安装最新版 Xray-core 后即可正常工作，无需额外干预。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相关链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/pull/6181&quot;&gt;Xray-core PR #6181&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/commit/af7eb68&quot;&gt;Commit af7eb68&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/XTLS/Xray-core/issues/6477&quot;&gt;Xray-core Issue #6477&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MetaCubeX/mihomo/issues/2967&quot;&gt;mihomo Issue #2967&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;【吃瓜完毕】&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你依然偏向 &lt;code&gt;Stable&lt;/code&gt;，把命令的 &lt;code&gt;--beta&lt;/code&gt; 去掉即为下载“正式版”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装完成时会默认启动服务，需要先暂停：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop xray
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.2 生成凭据&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;生成 UUID（需要两组，分别用于 Vision 和 XHTTP）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行两次，得到两个不同的 UUID
xray uuid
xray uuid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别记为 &lt;code&gt;UUID_01&lt;/code&gt; 和 &lt;code&gt;UUID_02&lt;/code&gt;，保存待用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 REALITY 密钥对：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xray x25519
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存输出的 &lt;code&gt;Private key&lt;/code&gt; 和 &lt;code&gt;Public key&lt;/code&gt;，私钥填在服务端的 config.json，公钥填在本地客户端里。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 shortID：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl rand -hex 8
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.3 写入 Xray 配置文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
请在&lt;strong&gt;本地的文本编辑器&lt;/strong&gt;，将以下代码块中的占位符替换为你自己的真实信息。替换完成后，粘贴到 VPS 终端中并回车&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
占位符说明：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;占位符&lt;/th&gt;
&lt;th&gt;替换为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第一组 UUID（Vision 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UUID_02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第二组 UUID（XHTTP 用户）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_REALITY_PRIVATE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 Private key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_SHORT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才生成的 shortID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reality.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 REALITY 子域名（小黄云关）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cdn.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的 CDN 子域名（小黄云开）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/your-xhttp-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&quot;minClientVer&quot;: &quot;1.8.2&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保持默认，不要改&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /usr/local/etc/xray/config.json &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
{
  &quot;log&quot;: {
    &quot;loglevel&quot;: &quot;info&quot; // 调试完成后可改为 &quot;warning&quot;
  },
  &quot;inbounds&quot;: [
    {
      &quot;listen&quot;: &quot;0.0.0.0&quot;, // 如果需要 IPv6，改为监听 &quot;::&quot;
      &quot;port&quot;: 443,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_01&quot;, // 对应客户端出站 1
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;vision-user&quot;,
            &quot;flow&quot;: &quot;xtls-rprx-vision&quot;
          },
          {
            &quot;id&quot;: &quot;UUID_02&quot;, // 对应客户端出站 2/3/4/5
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;,
        &quot;fallbacks&quot;: [
          {
            &quot;dest&quot;: &quot;/run/xray/xhttp_in.sock&quot;, 
            // 处理“直连”的 XHTTP 请求 (对应客户端出站 2/3/5 的直连部分)
            // 当 Reality 识别出 VLESS 协议但没有 flow 时，直接丢给内部 XHTTP Socket
            &quot;xver&quot;: 0
          }
        ]
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;raw&quot;,
        &quot;security&quot;: &quot;reality&quot;,
        &quot;realitySettings&quot;: {
          &quot;show&quot;: false,
          &quot;target&quot;: &quot;/run/caddy/tls_gate.sock&quot;,
          // 处理“CDN 转发”或“普通 HTTPS”请求 (对应客户端出站 3/4/5 的 CDN 部分)
          // 任何 Reality 不识别的流量都丢给 Caddy 处理
          &quot;xver&quot;: 0,
          &quot;serverNames&quot;: [
            &quot;reality.example.com&quot;,
            &quot;cdn.example.com&quot;
          ],
          &quot;privateKey&quot;: &quot;YOUR_REALITY_PRIVATE_KEY&quot;,
          &quot;shortIds&quot;: [&quot;YOUR_SHORT_ID&quot;],
          &quot;minClientVer&quot;: &quot;1.8.2&quot;
        },
        &quot;sockopt&quot;: {
          &quot;tcpFastOpen&quot;: true,
          &quot;tcpcongestion&quot;: &quot;bbr&quot;,
          &quot;tcpMptcp&quot;: true,
          &quot;tcpNoDelay&quot;: true
        }
      },
      &quot;tag&quot;: &quot;VISION+REALITY&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    },
    {
      &quot;listen&quot;: &quot;/run/xray/xhttp_in.sock&quot;,
      &quot;protocol&quot;: &quot;vless&quot;,
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;UUID_02&quot;,
            &quot;level&quot;: 0,
            &quot;email&quot;: &quot;xhttp-user&quot;
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;xhttp&quot;,
        &quot;xhttpSettings&quot;: {
          &quot;host&quot;: &quot;&quot;,
          &quot;path&quot;: &quot;/your-xhttp-path&quot;, 
          &quot;mode&quot;: &quot;auto&quot;,
          &quot;extra&quot;: {
            &quot;noSSEHeader&quot;: false,
            &quot;scMaxEachPostBytes&quot;: 1000000,
            &quot;scMaxBufferedPosts&quot;: 30,
            &quot;xPaddingBytes&quot;: &quot;100-1000&quot;,
            &quot;xPaddingObfsMode&quot;: true,
            &quot;xPaddingMethod&quot;: &quot;tokenish&quot;, // 生成一个随机的 Base62 标记
            &quot;xPaddingPlacement&quot;: &quot;queryInHeader&quot;, // 填充嵌入 Referer URL query（CF 兼容）
            &quot;xPaddingKey&quot;: &quot;t&quot;, // URL query 参数名
            &quot;xPaddingHeader&quot;: &quot;Referer&quot;,
            &quot;sessionIDPlacement&quot;: &quot;path&quot;,
            &quot;sessionIDKey&quot;: &quot;SID&quot;,
            &quot;sessionIDTable&quot;: &quot;Base62&quot;,
            &quot;sessionIDLength&quot;: &quot;12-20&quot;
          }
        },
        &quot;sockopt&quot;: {
          &quot;tcpFastOpen&quot;: true,
          &quot;acceptProxyProtocol&quot;: false,
          &quot;tcpcongestion&quot;: &quot;bbr&quot;,
          &quot;tcpMptcp&quot;: true,
          &quot;tcpNoDelay&quot;: true
        }
      },
      &quot;tag&quot;: &quot;XHTTP_IN&quot;,
      &quot;sniffing&quot;: {
        &quot;enabled&quot;: true,
        &quot;destOverride&quot;: [&quot;http&quot;, &quot;tls&quot;, &quot;quic&quot;],
        &quot;metadataOnly&quot;: false,
        &quot;routeOnly&quot;: true
      }
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;protocol&quot;: &quot;freedom&quot;,
      &quot;tag&quot;: &quot;direct&quot;,
      &quot;settings&quot;: {
        &quot;finalRules&quot;: [
          {
            &quot;action&quot;: &quot;allow&quot;,
            &quot;network&quot;: &quot;tcp&quot;,
            &quot;port&quot;: &quot;22-65535&quot;,
            &quot;ip&quot;: [&quot;127.0.0.1/32&quot;, &quot;::1/128&quot;]
          }
        ]
      }
    },
    {
      &quot;protocol&quot;: &quot;blackhole&quot;,
      &quot;tag&quot;: &quot;blocked&quot;,
      &quot;settings&quot;: {}
    }
  ],
  &quot;routing&quot;: {
    &quot;domainStrategy&quot;: &quot;AsIs&quot;,
    &quot;rules&quot;: [
      {
        &quot;type&quot;: &quot;field&quot;,
        &quot;ip&quot;: [&quot;127.0.0.1&quot;, &quot;::1&quot;],
        &quot;port&quot;: &quot;22-65535&quot;,
        &quot;outboundTag&quot;: &quot;direct&quot;
      },
      {
        &quot;type&quot;: &quot;field&quot;,
        &quot;ip&quot;: [
          &quot;geoip:private&quot;
        ],
        &quot;outboundTag&quot;: &quot;blocked&quot;
      }
    ]
  }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Xray 配置中的路由已预置 &lt;code&gt;&quot;port&quot;: &quot;22-65535&quot;&lt;/code&gt; 的白名单规则，用于后续零信任 SSH 通道（&lt;a href=&quot;#6-%E5%8F%AF%E9%80%89%E8%BF%9B%E9%98%B6%E9%83%A8%E7%BD%B2%E9%9B%B6%E4%BF%A1%E4%BB%BB-ssh&quot;&gt;第 6 章&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;因为不同 VPS 厂商交付的 SSH 端口不同，故用范围端口而非固定端口，&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;4.4 安装 Caddy&lt;/h2&gt;
&lt;p&gt;使用 Caddy 官方针对 Debian 的软件源安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 导入 GPG 密钥
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 添加官方软件源
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 更新并安装
sudo apt update
sudo apt install caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.5 编写 Caddyfile&lt;/h2&gt;
&lt;p&gt;清空再编辑 Caddyfile：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
同理，请在本地编辑器中替换其中的占位符，替换后粘贴整段代码块至终端回车执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/caddy/Caddyfile &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
# 1. REALITY 域名区块（专供 REALITY 握手与伪装网页）
# 记得换成你自己的 REALITY 子域名！！！
reality.example.com {
        # 监听 Xray REALITY 回落的 Unix Socket
        bind unix//run/caddy/tls_gate.sock

        # 引用 acme.sh 申请的 Let&apos;s Encrypt 证书与私钥
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/reality_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 处理所有其他访问
        # 外部扫描器或浏览器访问，直接给出伪装网页
        handle {
                # 伪装网页路径：/var/www/html/index.html
                root * /var/www/html
                file_server
        }
}

# 2. CDN 域名区块（处理从 Xray 回落的 CDN 代理流量）
# 记得换成你自己的 CDN 子域名！！！
cdn.example.com {
        bind unix//run/caddy/tls_gate.sock

        # 申请的是多域名合并证书，引用相同的证书文件即可
        tls /etc/caddy/certs/reality.crt /etc/caddy/certs/reality.key

        log {
                output file /var/log/caddy/cdn_access.log {
                        roll_size     10mib
                        roll_keep     7
                        roll_keep_for 168h
                }
        }

        # 捕获套 CDN 的出站（出站 3/4/5）传来的合法的 XHTTP 流量
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        # 记得换成你自己的 XHTTP 路径！！！
        handle /your-xhttp-path/* {
                reverse_proxy unix//run/xray/xhttp_in.sock {
                        transport http {
                                versions 2
                        }
                        flush_interval -1
                }
        }
        
        # 可选：探针探活路径
        handle /status {
                respond &quot;ok&quot; 200
        }

        handle /ping {
                respond &quot;ok&quot; 200
        }

        # 对于扫描器，直接重定向到伪装网页防扫描
        # 记得换成你自己的 REALITY 子域名！！！
        handle {
                redir https://reality.example.com{uri}
        }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;请务必仔细检查你的 &lt;code&gt;handle&lt;/code&gt; 块配置，路径末尾的斜杠和星号 &lt;code&gt;/*&lt;/code&gt; 不能省略&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XHTTP 流量请求的 URL 是动态长随机混淆参数的&lt;/p&gt;
&lt;p&gt;如果前缀不通配，Caddy 就会将其视为未知的外部扫描探测，返回 302 伪装页&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;附：简单伪装导航页&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;如果你没有现成的网站，可以使用下面这段单文件 HTML 代码&lt;/p&gt;
&lt;p&gt;但是后期建议让 GenAI 丰富一下，换成个人博客、OpenList 什么的&lt;/p&gt;
&lt;p&gt;将以下代码块整体复制到终端回车执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/www/html
sudo tee /var/www/html/index.html &amp;gt;/dev/null &amp;lt;&amp;lt;&apos;EOF&apos;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Tech Hub&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif;
            background: linear-gradient(-45deg, #e0e7ff, #f3e8ff, #dbeafe, #ede9fe);
            background-size: 400% 400%;
            animation: gradientBG 18s ease infinite;
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        .wrapper {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 2rem;
            padding: 2rem;
            width: 100%;
            max-width: 720px;
        }

        .title {
            font-size: clamp(2.4rem, 6vw, 3.6rem);
            font-weight: 600;
            color: #1e293b;
            letter-spacing: -0.02em;
            text-align: center;
        }

        .sub {
            font-size: clamp(0.8rem, 1.5vw, 1rem);
            color: #64748b;
            text-transform: uppercase;
            letter-spacing: 0.2em;
            border-bottom: 1px solid #cbd5e1;
            padding-bottom: 1rem;
            width: 100%;
            text-align: center;
        }

        .nav {
            display: flex;
            gap: 1.5rem;
            padding: 1.5rem 2.5rem;
            border-radius: 80px;
            background: rgba(255, 255, 255, 0.6);
            backdrop-filter: blur(12px);
            -webkit-backdrop-filter: blur(12px);
            border: 1px solid rgba(255, 255, 255, 0.8);
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.06);
            flex-wrap: wrap;
            justify-content: center;
        }

        .nav-item {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 3.4rem;
            height: 3.4rem;
            border-radius: 50%;
            background: rgba(255, 255, 255, 0.4);
            transition: all 0.25s ease;
            text-decoration: none;
            border: 1px solid rgba(255, 255, 255, 0.6);
        }

        .nav-item img {
            width: 1.6rem;
            height: 1.6rem;
            transition: transform 0.2s ease;
        }

        .nav-item:hover {
            transform: translateY(-4px);
            background: rgba(255, 255, 255, 0.9);
            border-color: #94a3b8;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
        }

        .nav-item:hover img {
            transform: scale(1.1);
        }

        @media (max-width: 600px) {
            .wrapper { gap: 1.5rem; padding: 1rem; }
            .nav { padding: 1rem 1.5rem; gap: 1rem; border-radius: 2rem; }
            .nav-item { width: 2.8rem; height: 2.8rem; }
            .nav-item img { width: 1.3rem; height: 1.3rem; }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;wrapper&quot;&amp;gt;
        &amp;lt;h1 class=&quot;title&quot;&amp;gt;Dev Center&amp;lt;/h1&amp;gt;
        &amp;lt;div class=&quot;sub&quot;&amp;gt;Let there be light&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;nav&quot;&amp;gt;
            &amp;lt;a href=&quot;https://www.google.com&quot; class=&quot;nav-item&quot; title=&quot;Google&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/google/1e293b&quot; alt=&quot;Google&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://github.com&quot; class=&quot;nav-item&quot; title=&quot;GitHub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/github/1e293b&quot; alt=&quot;GitHub&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://dash.cloudflare.com&quot; class=&quot;nav-item&quot; title=&quot;Cloudflare&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/cloudflare/1e293b&quot; alt=&quot;Cloudflare&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://hub.docker.com&quot; class=&quot;nav-item&quot; title=&quot;Docker Hub&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/docker/1e293b&quot; alt=&quot;Docker&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://stackoverflow.com&quot; class=&quot;nav-item&quot; title=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/stackoverflow/1e293b&quot; alt=&quot;Stack Overflow&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://www.npmjs.com&quot; class=&quot;nav-item&quot; title=&quot;npm&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/npm/1e293b&quot; alt=&quot;npm&quot;&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;https://gitlab.com&quot; class=&quot;nav-item&quot; title=&quot;GitLab&quot;&amp;gt;&amp;lt;img src=&quot;https://cdn.simpleicons.org/gitlab/1e293b&quot; alt=&quot;GitLab&quot;&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;4.6 用户组与运行目录设置&lt;/h2&gt;
&lt;p&gt;启动 Xray 和 Caddy 前需统一运行用户为 &lt;code&gt;caddy&lt;/code&gt;，否则会出现 socket 权限问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Info] transport/internet/tcp: REALITY: failed to dial dest: dial unix /run/caddy/tls_gate.sock: connect: permission denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进一步，为避免两个服务重启时因 &lt;code&gt;RuntimeDirectory&lt;/code&gt; 被 systemd 清理而导致 UDS 套接字文件丢失，我们将双方的套接字放入各自所属服务的运行时目录（Xray 使用 &lt;code&gt;/run/xray/&lt;/code&gt;，Caddy 使用 &lt;code&gt;/run/caddy/&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 统一运行用户为 caddy
sudo mkdir -p /etc/systemd/system/xray.service.d
sudo tee /etc/systemd/system/xray.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
EOF

# 为 Caddy 启用独立的运行目录以放套接字
sudo mkdir -p /etc/systemd/system/caddy.service.d
sudo tee /etc/systemd/system/caddy.service.d/override.conf &amp;lt;&amp;lt;EOF
[Service]
User=caddy
RuntimeDirectory=caddy
EOF

# 重新加载 Systemd 配置
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.7 申请公有受信任证书&lt;/h2&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看：为什么不能用 Caddy 自带的自动申请证书功能&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Caddy 默认依赖 HTTP-01 或 TLS-ALPN-01 进行 ACME 自动化证书验证，此过程的硬性前置条件是 Web 服务器必须能够直接在操作系统层面接管并监听公网的 80 或 443 端口。&lt;/p&gt;
&lt;p&gt;在当前架构中，公网 443 端口由 Xray 独占监听，Caddy 仅绑定于内网的 Unix Socket 充当回落目标。当 Let&apos;s Encrypt 验证集群发起 TLS-ALPN-01 请求时，流量首先到达 Xray 的 REALITY 服务端。由于该请求不具备有效的 XTLS 身份特征，REALITY 服务端会将其视为未知流量，执行透明的双向 TCP 转发（直接回落至 Caddy 的 Unix Socket）。&lt;/p&gt;
&lt;p&gt;尽管验证流量最终送达了 Caddy，但证书申请依然会失败。因为 Caddy 的 ACME 模块在处理 TLS-ALPN-01 挑战时，强依赖于标准 443 端口监听器来挂载专用的验证证书。面对来自 Unix Socket 的回落流量，Caddy 的验证上下文无法正确匹配并下发该证书。即便 Caddy 异常响应了临时的 ACME 验证证书，由于 REALITY 服务端需持续抓取目标后端返回的 ServerHello 以缓存真实证书，这种非标准的临时证书将引发 REALITY 内部证书缓存逻辑链异常，导致整个 TLS 握手在链路中被异常阻断。&lt;/p&gt;
&lt;p&gt;所以转而使用 acme.sh 脚本动态下发 DNS TXT 记录（即基于 API 交互的 DNS-01 验证），以实现 TLS 证书合规签发。&lt;/p&gt;
&lt;p&gt;另外，REALITY 节点需使用真实 IP 直接承载直连流量（CDN Proxy OFF），若部署未受公共根证书信任的 Cloudflare Origin CA 证书，浏览器直接访问伪装站时会触发 TLS 错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：获取 Cloudflare API Token&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 Cloudflare 网页后台；&lt;/li&gt;
&lt;li&gt;展开左边栏 -&amp;gt; 选择 &lt;strong&gt;管理账户&lt;/strong&gt; -&amp;gt; &lt;strong&gt;账户 API 令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;创建令牌&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;令牌名称自定义；&lt;/li&gt;
&lt;li&gt;权限策略 -&amp;gt; 编辑策略：选择 &lt;code&gt;指定域名&lt;/code&gt;，然后下拉框选你的主域名；&lt;/li&gt;
&lt;li&gt;在下方的权限组列表中，点击展开 &lt;strong&gt;&lt;code&gt;DNS &amp;amp; Zones&lt;/code&gt;&lt;/strong&gt; 类别
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;区域 (Zone)&lt;/code&gt; -  勾选&lt;code&gt;读取 (Read)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;区域 (Zone)&lt;/code&gt; - &lt;code&gt;DNS&lt;/code&gt; - 勾选 &lt;code&gt;编辑 (Edit)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;令牌过期时间建议直接选择 &lt;strong&gt;“无过期时间”；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;客户端 IP 地址过滤，可以什么都不填，只要你不把 Token 泄露给别人，就是安全的；或者填上运行 &lt;code&gt;acme.sh&lt;/code&gt; 脚本的服务器的公网 IP 地址；&lt;/li&gt;
&lt;li&gt;审核令牌 -&amp;gt; 创建令牌；&lt;/li&gt;
&lt;li&gt;接着会给出 &lt;code&gt;账户ID&lt;/code&gt; 和 &lt;code&gt;CF_Token&lt;/code&gt;，复制并保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;第二步：在 VPS 切换至 root 并安装 acme.sh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了后续能够全自动在后台无感续签，这一步全程在 &lt;code&gt;root&lt;/code&gt; 用户下执行，以免权限不足导致续签后重载 Caddy 失败。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSH 登录 VPS 并切换到 root
sudo -i

# 设置你的真实邮箱，并安装 acme.sh
EMAIL=&quot;your_email@example.com&quot;
curl https://get.acme.sh | sh -s email=&quot;$EMAIL&quot;

# 切换默认颁发机构为 Let&apos;s Encrypt
ACME=/root/.acme.sh/acme.sh
$ACME --set-default-ca --server letsencrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第三步：隐式导入 Token 并申请证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为防止 Token 泄露到 &lt;code&gt;.bash_history&lt;/code&gt; 中，我们使用静默输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行后，直接粘贴你的 Token 并回车（屏幕上不会显示）
read -rsp &apos;Cloudflare API Token: &apos; CF_Token
echo
export CF_Token
export CF_Account_ID=&quot;你的Account_ID&quot;

# 申请证书 (必须同时包含 Reality 直连域名和 CDN 回源域名，否则 Cloudflare 在“完全(严格)”模式下回源会报 526 证书错误)
$ACME --issue --dns dns_cf -d &quot;reality.example.com&quot; -d &quot;cdn.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第四步：提取证书并配置自动授权重载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们需要把证书提取到 Caddy 的配置目录，每次续签后，私钥文件的属主会被重置为 root，这将导致低权限运行的 Caddy 无法读取私钥而崩溃。因此必须在 &lt;code&gt;--reloadcmd&lt;/code&gt; 中加入 &lt;code&gt;chown&lt;/code&gt; 权限交接命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建目录
mkdir -p /etc/caddy/certs

# 提取证书并设定重载命令
# 安装时只需要指定主域名（第一个 -d 域名），acme.sh 会自动关联
$ACME --install-cert -d &quot;reality.example.com&quot; \
--key-file       /etc/caddy/certs/reality.key \
--fullchain-file /etc/caddy/certs/reality.crt \
--reloadcmd     &quot;chown caddy:caddy /etc/caddy/certs/reality.* &amp;amp;&amp;amp; systemctl reload caddy&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
证书安装后，私钥文件默认权限为 &lt;code&gt;-rw-------&lt;/code&gt;（600），仅属主（root）可读写。&lt;br /&gt;
若 Caddy 以 &lt;code&gt;caddy&lt;/code&gt; 用户运行，需确保其能读取。上述 &lt;code&gt;reloadcmd&lt;/code&gt; 中的 &lt;code&gt;chown&lt;/code&gt; 已解决属主问题。&lt;br /&gt;
若需进一步限制权限，可额外执行 &lt;code&gt;chmod 640 /etc/caddy/certs/reality.key&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
此时报错 &lt;code&gt;Reload error for: reality.example.com / caddy.service is not active&lt;/code&gt; 无伤大雅，因为我们在下一步才正式启动应用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;完成后，输入 &lt;code&gt;exit&lt;/code&gt; 退出 root 环境，返回普通用户。&lt;/p&gt;
&lt;h2&gt;4.8 启动服务&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;启动前检查&lt;/strong&gt;&lt;br /&gt;
为避免 &lt;code&gt;permission denied&lt;/code&gt; 错误，请再次确认以下路径的属主正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Caddy 日志目录
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chmod 755 /var/log/caddy

# 证书文件
ls -la /etc/caddy/certs/
# 应显示 -rw-r--r-- 1 caddy caddy reality.crt
# 应显示 -rw------- 1 caddy caddy reality.key

# 若属主不是 caddy，请执行修正：
sudo chown -R caddy:caddy /var/log/caddy
sudo chown caddy:caddy /etc/caddy/certs/reality.*
sudo chmod 640 /etc/caddy/certs/reality.key
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;正式启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now xray caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;验证状态：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl show xray --property=User,Group
systemctl show caddy --property=User,Group
ls -l /run/xray/ /run/caddy/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理想输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User=caddy
Group=

---

User=caddy
Group=caddy

# /run/xray/
srwxr-xr-x 1 caddy caddy 0 ... xhttp_in.sock
-rw-r--r-- 1 caddy caddy 0 ... xhttp_in.sock.lock

# /run/caddy/
s-w------- 1 caddy caddy 0 ... tls_gate.sock
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.9 限制 Systemd Journal 日志大小&lt;/h2&gt;
&lt;p&gt;Caddy 已配置了原生内置的日志滚动机制，但 Systemd 的日志默认仅按系统空闲空间比例限制大小，需要手动限制最大占用空间。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果不需要保留访问日志，或者磁盘空间十分有限，可以直接将 Caddyfile 中的整个 &lt;code&gt;log { ... }&lt;/code&gt; 代码块移除。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Systemd 的日志（&lt;code&gt;journald&lt;/code&gt;）默认只按体积轮转但&lt;strong&gt;不设硬性上限&lt;/strong&gt;，需要手动限制最大占用空间。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/journald.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到并&lt;strong&gt;取消注释、修改&lt;/strong&gt;以下两行（若不存在则手动添加）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SystemMaxUse=100M
MaxFileSec=1week
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后重启服务，使新配置生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart systemd-journald
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.10 后续更新&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;更新 Xray-core&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官方安装脚本支持直接升级，重新运行安装命令即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查是否有新版本
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ check

# 升级到最新 Pre-release（推荐）
sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install --beta
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会自动检测版本号差异、下载新二进制、替换并重启服务。你的 &lt;code&gt;config.json&lt;/code&gt;、&lt;code&gt;override.conf&lt;/code&gt;、日志等配置文件&lt;strong&gt;全部保留&lt;/strong&gt;，不会被覆盖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;升级后 systemd 主 service 文件会被重写为默认的 &lt;code&gt;User=nobody&lt;/code&gt;，但 &lt;code&gt;override.conf&lt;/code&gt;（&lt;code&gt;User=caddy&lt;/code&gt;）优先级更高，运行时用户不受影响。
若要消除 &lt;code&gt;Special user nobody configured&lt;/code&gt; 警告，可手动修复：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sed -i &apos;s/User=nobody/User=caddy/&apos; /etc/systemd/system/xray.service
sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新 Caddy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过 apt 更新：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade caddy -y
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;5. 客户端配置&lt;/h1&gt;
&lt;h2&gt;5.1 mihomo 客户端&lt;/h2&gt;
&lt;p&gt;由于 mihomo GUI 繁多，此处仅给出裸核 config：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  # 1. XTLS(Vision) + REALITY 直连
  - name: &quot;出站1-XTLS+REALITY&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_01&quot;
    encryption: &quot;none&quot;
    flow: xtls-rprx-vision
    network: tcp
    # 以下两项取决于你的实际 UDP 使用场景，不需要请注释或删除
    # udp: true               # 需要走代理的境外游戏/QUIC/WebRTC 则开启
    # packet-encoding: xudp   # UDP 编码方式，开启后支持 FullCone NAT（默认即此值）
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;

  # 2. XHTTP + REALITY 直连
  - name: &quot;出站2-XHTTP+REALITY&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;
    xhttp-opts:
      path: /your-xhttp-path      # 必须与服务端配置的 path 一致
      mode: auto                  # Reality 模式下 auto 会自动选择 stream-one
      # host: &quot;reality.example.com&quot; # 直连时可省略，默认继承 servername
      session-table: &quot;Alphabet&quot;   # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;     # session ID 长度范围（起始值不可为 0，总 ID 空间须 &amp;gt; 21 亿）
      session-placement: path     # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true   # 启用填充混淆
      x-padding-method: tokenish  # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;          # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot; # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 3. 上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY（上下行不同 SNI）
  - name: &quot;出站3-CDN上行+XHTTP下行&quot;
    type: vless
    server: &quot;cdn.example.com&quot;      # CDN 域名或优选 IP (上行)
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    ech-opts: {enable: true}       # 隐藏 SNI
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h3]
    servername: &quot;cdn.example.com&quot;  # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
    client-fingerprint: chrome
    skip-cert-verify: false        # 强制校验服务端证书，防止中间人攻击
    xhttp-opts:  # 上行设置
      host: &quot;cdn.example.com&quot;      # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto                   # CDN 模式下 auto 会自动选择 stream-up (H2)
      session-table: &quot;Alphabet&quot;    # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;      # session ID 长度范围
      session-placement: path      # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true    # 启用填充混淆
      x-padding-method: tokenish   # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;           # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot;  # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 上行链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
      download-settings:            # 下行设置（Reality 不支持 h3，须显式覆盖为 h2）
        alpn: [h2]                  # 显式指定 h2，覆盖主代理继承来的 h3
        server: &quot;&amp;lt;YOUR_VPS_IP&amp;gt;&quot;     # 下行地址 (VPS 直连)
        port: 443
        servername: &quot;reality.example.com&quot; # Reality 伪装域名
        reality-opts:
          public-key: &quot;YOUR_PUB_KEY&quot;
          short-id: &quot;YOUR_SHORT_ID&quot;
          # host 继承自外层或省略；mode 强制继承外层
        reuse-settings:  # 下行链接复用设置（即XMUX）
          max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
          # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
          c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
          # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
          h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
          h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 4. XHTTP + TLS(ECH) 过 CDN（上下行不分离）
  - name: &quot;出站4-CDN上下行&quot;
    type: vless
    server: &quot;cdn.example.com&quot;     # CDN 域名或优选 IP
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    ech-opts: {enable: true}      # 隐藏 SNI
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h3]
    servername: &quot;cdn.example.com&quot; # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
    client-fingerprint: chrome
    skip-cert-verify: false       # 强制校验服务端证书，防止中间人攻击
    xhttp-opts:
      host: &quot;cdn.example.com&quot;     # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto
      session-table: &quot;Alphabet&quot;   # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;     # session ID 长度范围
      session-placement: path     # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true   # 启用填充混淆
      x-padding-method: tokenish  # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;          # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot; # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;   # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;     # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;     # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0     # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 5. 上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN（上下行不同 SNI）
  - name: &quot;出站5-上XHTTP+REALITY下XHTTP+TLS+CDN&quot;
    type: vless
    server: &quot;YOUR_VPS_IP&quot;
    port: 443
    uuid: &quot;YOUR_UUID_02&quot;
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    # udp: true
    # packet-encoding: xudp
    tls: true
    alpn: [h2]
    servername: &quot;reality.example.com&quot; # Reality 伪装域名
    client-fingerprint: chrome
    skip-cert-verify: false           # 强制校验服务端证书，防止中间人攻击
    reality-opts:
      public-key: &quot;YOUR_PUB_KEY&quot;
      short-id: &quot;YOUR_SHORT_ID&quot;
    xhttp-opts:
      host: &quot;cdn.example.com&quot;         # CDN 转发所需的 HTTP Host，与 servername 保持相同
      path: /your-xhttp-path
      mode: auto
      session-table: &quot;Alphabet&quot;       # 自定义 session ID 字符集，降低 CDN 特征识别
      session-length: &quot;12-20&quot;         # session ID 长度范围
      session-placement: path         # Session ID 放在 URL 路径中（path 模式下 session-key 无效）
      x-padding-obfs-mode: true       # 启用填充混淆
      x-padding-method: tokenish      # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
      x-padding-placement: queryInHeader # 填充嵌入 Referer URL query 中（CF 兼容）
      x-padding-key: &quot;t&quot;              # URL query 参数名，伪装成 analytics token
      x-padding-header: &quot;Referer&quot;     # 填充存放的 HTTP Header 名，默认 Referer（CF 兼容）
      sc-stream-up-server-secs: &quot;30-60&quot; # 单连接流控保活心跳间隔，减少 CDN 超时断开
      reuse-settings:  # 上行链接复用设置（即XMUX）
        max-concurrency: &quot;16-32&quot;      # 单连接最大并发请求数（0=不限制）
        # max-connections: &quot;3&quot;        # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
        c-max-reuse-times: &quot;0&quot;        # 单连接最大复用次数（0=不限制）
        # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
        h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
        h-keep-alive-period: 0        # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
      download-settings:              # 下行设置（CDN 路径，改用 h3）
        path: /your-xhttp-path
        host: &quot;&quot;                      # host 继承自外层或省略；mode 强制继承外层        
        server: &quot;cdn.example.com&quot;     # CDN / 优选 IP (下行连接地址)
        port: 443
        tls: true
        alpn: [h3]
        servername: &quot;cdn.example.com&quot; # 写你套 CDN 对应的子域名，CDN 通过它回源服务器
        client-fingerprint: chrome
        skip-cert-verify: false       # 强制校验服务端证书，防止中间人攻击
        ech-opts: {enable: true}      # 隐藏 SNI
        reality-opts: { public-key: &quot;&quot; } # 强制清空 Reality 公钥，否则下行连接 CDN 将会携带 Reality 握手
        reuse-settings:               # 下行链接复用设置（即XMUX）
          max-concurrency: &quot;16-32&quot;      # 单连接最大并发请求数（0=不限制）
          # max-connections: &quot;3&quot;        # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
          c-max-reuse-times: &quot;0&quot;        # 单连接最大复用次数（0=不限制）
          # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
          h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
          h-keep-alive-period: 0        # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;锚点写法&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 定义锚点
x-anchors:
  # 0. 用户变量 (请在此处统一修改为自己的配置，下方会自动引用)
  variables:
    vps_ip: &amp;amp;vps_ip &quot;YOUR_VPS_IP&quot;
    uuid_01: &amp;amp;uuid_01 &quot;YOUR_UUID_01&quot;
    uuid_02: &amp;amp;uuid_02 &quot;YOUR_UUID_02&quot;
    reality_domain: &amp;amp;reality_domain &quot;reality.example.com&quot;
    cdn_domain: &amp;amp;cdn_domain &quot;cdn.example.com&quot;
    xhttp_path: &amp;amp;xhttp_path &quot;/your-xhttp-path&quot;

  # 1. Reality 密钥配置
  reality-opts: &amp;amp;reality-opts
    public-key: &quot;YOUR_PUB_KEY&quot;
    short-id: &quot;YOUR_SHORT_ID&quot;

  # 2. 链接复用设置参数
  reuse-settings: &amp;amp;reuse-settings
    max-concurrency: &quot;16-32&quot;         # 单连接最大并发请求数（0=不限制）
    # max-connections: &quot;3&quot;           # 最大连接数（0=不限制）（与 max-concurrency 冲突，二选一）
    c-max-reuse-times: &quot;0&quot;           # 单连接最大复用次数（0=不限制）
    # h-max-request-times: &quot;600-900&quot; # 单连接累计 HTTP 请求数（不严谨，慎用）
    h-max-reusable-secs: &quot;1800-3000&quot; # 单连接最长复用时间（秒）
    h-keep-alive-period: 0           # H2/H3 保活间隔 (0=默认智能值, -1=关闭, 支持填正数范围但不推荐)

  # 3. XHTTP 混淆配置
  xhttp-obfs: &amp;amp;xhttp-obfs
    path: *xhttp_path
    mode: auto
    session-table: &quot;Alphabet&quot;           # 自定义 session ID 字符集，降低 CDN 特征识别
    session-length: &quot;12-20&quot;             # session ID 长度范围
    session-placement: path             # Session ID 放在 URL 路径中
    x-padding-obfs-mode: true           # 启用填充混淆
    x-padding-method: tokenish          # 随机 Base62 标记，HPACK 编码后精确匹配目标长度
    x-padding-placement: queryInHeader  # 填充嵌入 Referer URL query 中
    x-padding-key: &quot;t&quot;                  # URL query 参数名，伪装成 analytics token
    x-padding-header: &quot;Referer&quot;         # 填充存放的 HTTP Header 名，默认 Referer
    sc-stream-up-server-secs: &quot;30-60&quot;   # 单连接流控保活心跳间隔，减少 CDN 超时断开
    reuse-settings: *reuse-settings

  # 4. UDP 配置
  udp-opts: &amp;amp;udp-opts
    # 以下两项取决于你的实际 UDP 使用场景
    udp: false              # 境外游戏/QUIC/WebRTC 有需要走代理的则改为 true
    # packet-encoding: xudp # UDP 编码方式

# 最终节点配置
proxies:
  # 1. XTLS(Vision) + REALITY 直连
  - name: &quot;出站1-XTLS+REALITY&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_01
    encryption: &quot;none&quot;
    flow: xtls-rprx-vision
    network: tcp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    reality-opts: *reality-opts

  # 2. XHTTP + REALITY 直连
  - name: &quot;出站2-XHTTP+REALITY&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    reality-opts: *reality-opts
    xhttp-opts: *xhttp-obfs

  # 3. 上行 XHTTP + TLS(ECH) + CDN | 下行 XHTTP + REALITY
  - name: &quot;出站3-CDN上行+XHTTP下行&quot;
    type: vless
    server: *cdn_domain
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h3]
    servername: *cdn_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    ech-opts: {enable: true}
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain
      download-settings:
        server: *vps_ip
        port: 443
        tls: true
        alpn: [h2]
        servername: *reality_domain
        client-fingerprint: chrome
        reality-opts: *reality-opts
        reuse-settings: *reuse-settings

  # 4. XHTTP + TLS(ECH) 过 CDN（上下行不分离）
  - name: &quot;出站4-CDN上下行&quot;
    type: vless
    server: *cdn_domain
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h3]
    servername: *cdn_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    ech-opts: {enable: true}
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain

  # 5. 上行 XHTTP + REALITY | 下行 XHTTP + TLS(ECH) + CDN
  - name: &quot;出站5-上XHTTP+REALITY下XHTTP+TLS+CDN&quot;
    type: vless
    server: *vps_ip
    port: 443
    uuid: *uuid_02
    encryption: &quot;none&quot;
    flow: &quot;&quot;
    network: xhttp
    &amp;lt;&amp;lt;: *udp-opts
    tls: true
    alpn: [h2]
    servername: *reality_domain
    client-fingerprint: chrome
    skip-cert-verify: false
    reality-opts: *reality-opts
    xhttp-opts:
      &amp;lt;&amp;lt;: *xhttp-obfs
      host: *cdn_domain
      download-settings:
        server: *cdn_domain
        port: 443
        tls: true
        alpn: [h3]
        servername: *cdn_domain
        client-fingerprint: chrome
        skip-cert-verify: false
        ech-opts: {enable: true}
        path: *xhttp_path
        host: &quot;&quot;
        reality-opts: { public-key: &quot;&quot; }
        reuse-settings: *reuse-settings
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;5.2 ALPN、ECH 与 XMUX 说明&lt;/h2&gt;
&lt;h3&gt;ALPN&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mihomo v1.19.23：仅支持 &lt;code&gt;h2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mihomo v1.19.24+：支持 &lt;code&gt;http/1.1&lt;/code&gt; 和 &lt;code&gt;h3&lt;/code&gt;，但不支持多协议动态回退，写法如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: xxx
    alpn: [h2]           # 使用 HTTP/2（默认）
    # alpn: [http/1.1]   # 强制使用 HTTP/1.1
    # alpn: [h3]         # 强制使用 HTTP/3。注意：不支持 REALITY，必须 tls: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ECH&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: xxx
    ech-opts: {enable: true}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ssl/edge-certificates/ech/&quot;&gt;Cloudflare 免费版现已默认启用 ECH（Encrypted ClientHello）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;针对通过 CDN 回源的出站节点，加上此参数后，mihomo 会自动发起 HTTPS DNS 记录查询，拉取 Cloudflare 下发的 ECH 公钥，并在 TLS 握手时加密 SNI，可以有效防止 GFW 通过嗅探 SNI 来封锁连接，一定程度上提升连接的隐蔽性&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;只有套了 CDN 的节点才能用&lt;/li&gt;
&lt;li&gt;mihomo 需要写支持 DoH 解析的 DNS&lt;/li&gt;
&lt;li&gt;域名需要开启 TLS 1.3&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更多详情请查看末尾推荐的文章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;XMUX（链接复用）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Xray-core 近期的版本演进中（&lt;a href=&quot;https://github.com/XTLS/Xray-core/issues/6376&quot;&gt;Issue #6376&lt;/a&gt;），对 XMUX 的默认策略经历了多次调整（从最初的 &lt;code&gt;16-32&lt;/code&gt;，到 &lt;code&gt;1&lt;/code&gt;，再到 &lt;code&gt;3&lt;/code&gt;）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本模板中显式写了 &lt;code&gt;max-concurrency: &quot;16-32&quot;&lt;/code&gt;。效果是强制锁定在较稳定的多路复用状态，不会因继承内核默认值而导致并发 TCP 连接数突增（仅为个人理解）&lt;/li&gt;
&lt;li&gt;如果为了对抗严格的审查环境（像 issue 提到的俄罗斯抗 TSPU 封锁）的话，可改为 &lt;code&gt;max-connections: 3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;6. 可选进阶：部署零信任 SSH&lt;/h1&gt;
&lt;p&gt;本方案实现 VPS 不对外暴露 SSH 端口，外部扫描器无法探测到 SSH 服务存在。日常通过 mihomo 隧道直连，极端环境下走 Cloudflare Tunnel，实现&lt;strong&gt;主备双通道&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;6.1 前提条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VPS 完成了本章所有前置步骤（防火墙已部署、代理已在运行）&lt;/li&gt;
&lt;li&gt;本地已运行 mihomo 客户端且节点正常&lt;/li&gt;
&lt;li&gt;本地已安装 &lt;code&gt;cloudflared&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;先建逃生通道，最后再封门。&lt;/strong&gt;
顺序为：配置 Xray 白名单 → 放行 lo 环回 → 部署 mihomo 隧道并测试 → 部署 CF Tunnel 并测试
→ &lt;strong&gt;确认两条通道都能用&lt;/strong&gt; → 最后再 iptables DROP 公网端口。
如果先封门再建通道，一旦通道配置失败，将无法再连接服务器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;6.2 配置 Xray 路由白名单与 Freedom 放行规则&lt;/h2&gt;
&lt;p&gt;确认 Xray 配置中已有 SSH 环回白名单。&lt;/p&gt;
&lt;p&gt;cat 查看 &lt;code&gt;/usr/local/etc/xray/config.json&lt;/code&gt;，确认在 &lt;code&gt;routing.rules&lt;/code&gt; 中 &lt;code&gt;geoip:private -&amp;gt; blocked&lt;/code&gt; &lt;strong&gt;之前&lt;/strong&gt;存在以下规则：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;type&quot;: &quot;field&quot;,
  &quot;ip&quot;: [&quot;127.0.0.1&quot;, &quot;::1&quot;],
  &quot;port&quot;: &quot;22-65535&quot;,
  &quot;outboundTag&quot;: &quot;direct&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着确认 Freedom 放行规则&lt;/p&gt;
&lt;p&gt;Xray-core v26.7.11+ 在 freedom（直连）出站中内置了私网地址阻断，需在 &lt;code&gt;outbounds&lt;/code&gt; 的 &lt;code&gt;direct&lt;/code&gt; 出站中添加 &lt;code&gt;finalRules&lt;/code&gt; 以放行 SSH 环回：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;protocol&quot;: &quot;freedom&quot;,
  &quot;tag&quot;: &quot;direct&quot;,
  &quot;settings&quot;: {
    &quot;finalRules&quot;: [
      {
        &quot;action&quot;: &quot;allow&quot;,
        &quot;network&quot;: &quot;tcp&quot;,
        &quot;port&quot;: &quot;22-65535&quot;,
        &quot;ip&quot;: [&quot;127.0.0.1/32&quot;, &quot;::1/128&quot;]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;关于 finalRules 的说明&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Xray-core v26.7.11+ 在 freedom（直连）出站中内置了私网地址阻断（&lt;code&gt;defaultBlockPrivateRule&lt;/code&gt;），防止 VLESS/VMess 等代理被滥用扫描内网&lt;/p&gt;
&lt;p&gt;这是一项安全增强，默认阻断所有对 &lt;code&gt;127.0.0.1/8&lt;/code&gt;、&lt;code&gt;10.0.0.0/8&lt;/code&gt;、&lt;code&gt;172.16.0.0/12&lt;/code&gt;、&lt;code&gt;192.168.0.0/16&lt;/code&gt; 等私有地址的访问。&lt;/p&gt;
&lt;p&gt;本节 SSH 隧道依赖代理将流量路由到 &lt;code&gt;127.0.0.1:&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt;，必须在此阻断之上显式放行&lt;/p&gt;
&lt;p&gt;配置中的 &lt;code&gt;finalRules&lt;/code&gt; 即在 freedom 出站的终局检查阶段、在默认阻断之前插入一条 &lt;code&gt;allow&lt;/code&gt; 规则&lt;/p&gt;
&lt;p&gt;仅放行 &lt;code&gt;127.0.0.1&lt;/code&gt; 和 &lt;code&gt;::1&lt;/code&gt; 的 TCP 端口范围（&lt;code&gt;22-65535&lt;/code&gt;），不影响对其他私有 IP 的默认拦截&lt;/p&gt;
&lt;p&gt;另外，如果你觉得 22-65535 范围太大了，可以只放行 SSHD 实际监听的单个端口&lt;/p&gt;
&lt;p&gt;如果不配置此规则，SSH 隧道连接将被 Xray 拦截，日志表现为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxy/freedom: blocked target: tcp:127.0.0.1:&amp;lt;SSH_PORT&amp;gt;, blackholing connection for XXs
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果在 4.3 节使用了模板文件，这条规则已预置，只需确认即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;改完后需要重启 Xray：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;关于 UDS 套接字独立目录设计：&lt;/strong&gt;
在本方案的配置下，Xray 的套接字置于 &lt;code&gt;/run/xray/&lt;/code&gt;，Caddy 的套接字置于 &lt;code&gt;/run/caddy/&lt;/code&gt;。两者的运行目录生命周期已完全隔离，单独重启 Xray 或 Caddy 不再会清理对方的套接字，两服务可完全独立重启。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart xray
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6.3 主通道：mihomo 隧道&lt;/h2&gt;
&lt;h3&gt;6.3.1 VPS 端：确认 lo 环回放行&lt;/h3&gt;
&lt;p&gt;在第 2.4.2 节的初始化防火墙脚本中已全局放行了所有本地回环流量（&lt;code&gt;iptables -A INPUT -i lo -j ACCEPT&lt;/code&gt;），因此经过代理隧道到达 VPS 本地接口的流量会被自动放行，此处仅需确认即可。&lt;/p&gt;
&lt;h3&gt;6.3.2 本地：mihomo 配置添加隧道&lt;/h3&gt;
&lt;p&gt;在 mihomo 配置文件的顶级字段添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tunnels:
  # 类型, 本地监听端口, VPS 目标（127.0.0.1 = lo 环回）, 出站节点/组
  - tcp,127.0.0.1:42222,127.0.0.1:&amp;lt;SSH_PORT&amp;gt;,&amp;lt;YOUR_PROXIES&amp;gt;
  - tcp,127.0.0.1:42223,[::1]:&amp;lt;SSH_PORT&amp;gt;,&amp;lt;YOUR_PROXIES&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;42222/42223&lt;/code&gt; 是 Windows 本地监听端口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标填 &lt;code&gt;127.0.0.1&lt;/code&gt;（环回），不能填公网 IP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标端口填 SSHD 实际监听的端口&lt;/strong&gt;，执行 &lt;code&gt;sudo ss -tnlp | grep sshd&lt;/code&gt; 确认&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;重启 mihomo。&lt;/p&gt;
&lt;h3&gt;6.3.3 本地：SSH config&lt;/h3&gt;
&lt;p&gt;在 Windows 编辑 &lt;code&gt;~/.ssh/config&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 主通道：Mihomo 隧道（依赖本地 Mihomo 开对应端口）
Host my-vps-mihomo
    HostName 127.0.0.1
    Port 42222
    User &amp;lt;YOUR_USER&amp;gt;
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3

Host my-vps-mihomo-v6
    HostName 127.0.0.1
    Port 42223
    User &amp;lt;YOUR_USER&amp;gt;
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    AddressFamily inet6
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3.4 测试主通道&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ssh my-vps-mihomo
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果能登录则继续下一步&lt;/p&gt;
&lt;p&gt;如果不能登录，请检查 mihomo 隧道配置和节点状态，修好再走&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首次连接会提示主机指纹未识别，确认 &lt;code&gt;yes&lt;/code&gt; 即可。如果之前通过同一端口连过其他机器，会报 &lt;code&gt;REMOTE HOST IDENTIFICATION HAS CHANGED&lt;/code&gt;，需清除旧指纹：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -R &apos;[127.0.0.1]:42222&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6.4 备用通道：Cloudflare Tunnel&lt;/h2&gt;
&lt;h3&gt;6.4.1 CF 面板创建隧道&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Zero Trust → Networks（网络） → Connectors（连接器） → Create a tunnel（创建隧道）&lt;/li&gt;
&lt;li&gt;隧道类型 → 选择 &lt;code&gt;Cloudflared&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;命名 &lt;code&gt;xxxx-ssh&lt;/code&gt;（这里的命名是隧道的显示名称，随便取） → Save tunnel（保存隧道）&lt;/li&gt;
&lt;li&gt;CF 在这里会给出三个安装命令，复制粘贴执行前面两个即可&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.4.2 VPS 端安装 cloudflared&lt;/h3&gt;
&lt;p&gt;在 VPS 上执行安装命令（即 CF 给出的前两个命令）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 添加 Cloudflare apt 源
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-public-v2.gpg | sudo tee /usr/share/keyrings/cloudflare-public-v2.gpg &amp;gt;/dev/null
echo &apos;deb [signed-by=/usr/share/keyrings/cloudflare-public-v2.gpg] https://pkg.cloudflare.com/cloudflared any main&apos; | sudo tee /etc/apt/sources.list.d/cloudflared.list

# 安装 cloudflared
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install cloudflared -y

# 注册为系统服务（开机自启）
sudo cloudflared service install &amp;lt;YOUR_TOKEN&amp;gt;

# 确认服务已启动
sudo systemctl status cloudflared
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当执行完第二个命令之后，VPS 终端会输出类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;... INF Using Systemd
... INF Linux service for cloudflared installed successfully
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时 CF 面板应显示绿色的「已连接」。&lt;/p&gt;
&lt;h3&gt;6.4.3 面板配置路由&lt;/h3&gt;
&lt;p&gt;现在配置路由，在 Tunnel 面板的&lt;strong&gt;路由隧道&lt;/strong&gt;页面，按以下配置 Public Hostname（主机名）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain（子域名）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;YOUR_SSH_SUBDOMAIN&amp;gt;&lt;/code&gt;（子域名前缀，可自己取）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain（域）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;YOUR_DOMAIN&amp;gt;&lt;/code&gt; （下拉选择你已托管的域名）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path（路径）&lt;/td&gt;
&lt;td&gt;留空&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type（类型）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SSH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localhost:&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt;（填你设定的 SSH 端口）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;6.4.4 本地 SSH config + 测试备用通道&lt;/h3&gt;
&lt;p&gt;在 Windows 本地 &lt;code&gt;~/.ssh/config&lt;/code&gt; 添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host my-vps-cf
    HostName &amp;lt;YOUR_SSH_SUBDOMAIN&amp;gt;.&amp;lt;YOUR_DOMAIN&amp;gt;
    User &amp;lt;YOUR_USER&amp;gt;
    IdentityFile ~/.ssh/id_ed25519_vps
    IdentitiesOnly yes
    ProxyCommand cloudflared access ssh --hostname %h
    ServerAliveInterval 30
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;测试：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh my-vps-cf
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果能登录则继续下一步&lt;/p&gt;
&lt;p&gt;如果不能登录，请检查 cloudflared 状态和 Tunnel 路由配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;6.5 公网 SSH 隐身&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;确认两条通道都可用后&lt;/strong&gt;，执行以下操作封闭公网 SSH 端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 确认 SSHD 实际监听的端口
sudo ss -tnlp | grep sshd

# 赋值 SSHD 实际监听端口到本会话临时变量
SSH_PORT=$(sudo ss -tnlp | grep sshd | sed &apos;s/.*:\([0-9]*\) .*/\1/&apos; | head -1)

# 公网 DROP — 排除 lo 环回，避免误伤隧道流量
sudo iptables -I INPUT 2 ! -i lo -p tcp --dport $SSH_PORT -j DROP
sudo ip6tables -I INPUT 2 ! -i lo -p tcp --dport $SSH_PORT -j DROP

# 持久化
sudo netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;s&gt;我已踩过的坑&lt;/s&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;漏写 &lt;code&gt;! -i lo&lt;/code&gt;&lt;/strong&gt;：公网 DROP 同时也会丢弃 lo 环回上的隧道流量，两条通道都会断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端口写成 &lt;code&gt;22&lt;/code&gt;&lt;/strong&gt;：SSHD 实际可能监听在高位端口（如 54321），写错端口等于没封&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在配好通道之前执行&lt;/strong&gt;：没有任何逃生通道就封门，等于把自己锁在外面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果误操作导致失联，只能通过 VPS 厂商的 Rescue Mode 或 VNC 进入服务器，
挂载原系统磁盘删除 &lt;code&gt;/etc/iptables/rules.v4&lt;/code&gt; 和 &lt;code&gt;/etc/iptables/rules.v6&lt;/code&gt; 来恢复。
部分厂商可能不提供 Rescue/VNC，这种情况下只能重装系统。
&lt;strong&gt;请务必确认两条通道都测试通过后，再执行以下命令。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查看规则确认：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo iptables -L INPUT -v -n --line-numbers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期规则 2 应为 &lt;code&gt;DROP tcp dpt:&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt; 且 &lt;code&gt;!lo&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6.6 卸载 Fail2ban&lt;/h2&gt;
&lt;p&gt;封门后，公网 &lt;code&gt;&amp;lt;SSH_PORT&amp;gt;&lt;/code&gt; 已被 &lt;code&gt;iptables DROP&lt;/code&gt;，外部扫描连 SYN 包都到不了 SSHD，&lt;code&gt;/var/log/auth.log&lt;/code&gt; 不会有任何失败记录，Fail2ban 已无用武之地。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 停止并禁用
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban

# 卸载
sudo apt purge fail2ban -y

# 删除配置残留
sudo rm -rf /etc/fail2ban

# 确认已消失
sudo systemctl status fail2ban  # 应显示 Unit not found 或 inactive
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6.7 验证&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 主力通道 — 应正常登录
ssh my-vps-mihomo

# 备用通道 — 应正常登录
ssh my-vps-cf

# 直连 — 应超时（Connection timed out）
ssh &amp;lt;YOUR_USER&amp;gt;@&amp;lt;VPS_IP&amp;gt; -p &amp;lt;SSH_PORT&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;【完】&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;友情推荐&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 Nginx 作为反代的教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://smc.im/post/debian-13-xray-vless-reality-hardening/&quot;&gt;Debian 13 VPS 安全加固与 Xray VLESS + REALITY 手动部署&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;本文从中学习到了 &lt;code&gt;read -rsp&lt;/code&gt; 静默输入这一用法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECH 相关教程：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.litekin.org/archives/vless-xhttp-cloudflare-ech-doh-pei-zhi-zhu-yi-xiang&quot;&gt;XHTTP + CDN + ECH配置教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>mihomo 分流导致 Grok 下载失败排查</title><link>https://blog.rokutosei.com/posts/proxy/rule/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/rule/</guid><description>记录 mihomo 规则分流导致 Grok 相关下载失败的排查过程</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mihomo 代理核心有一个安卓应用黑白名单分流的功能，甚是好用，开启后核心占用更低更有效率，还能预防部分国产app出问题&lt;/p&gt;
&lt;p&gt;但是，这段时间我发现从Grok下载生成的图片，全部被小米澎湃魔改的 &lt;code&gt;下载管理&lt;/code&gt; 给接手了，手机没root，尚不知道如何更改这个默认的调用接管&lt;/p&gt;
&lt;p&gt;接手也就算了，我本以为将 &lt;code&gt;下载管理（前端）&lt;/code&gt; 、 &lt;code&gt;下载管理程序（后端）&lt;/code&gt; 加入mihomo 的白名单允许进入代理 &lt;code&gt;&quot;acceptList&quot;&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;但没想到依然下载失败，好吧，也许某个环节有问题，那我试试禁用黑白名单分流功能&lt;/p&gt;
&lt;p&gt;哎，结果当然是成功下载！&lt;/p&gt;
&lt;p&gt;真的是我的黑白名单有问题啊…… &lt;img src=&quot;https://www.nodeseek.com/static/image/sticker/xhj/031.png&quot; alt=&quot;xhj031&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着我打开 Debug 日志，终于发现端倪：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[TCP] 198.51.100.1:36532(com.android.soundpicker) --&amp;gt; assets.x.ai:443 match RuleSet(ai_chat_not_cn) using AIGC&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;我干！Grok你为什么要走 &lt;code&gt;soundpicker&lt;/code&gt; （声音）来下载资源？？？？&lt;/p&gt;
&lt;p&gt;于是我将它放入了白名单，本以为这次万事成功，却没想到还是下载失败&lt;/p&gt;
&lt;p&gt;@#￥%%……&amp;amp;……￥%#$#@#$%^&amp;amp;W……#&lt;/p&gt;
&lt;p&gt;经过我一番实验（ &lt;s&gt;其实是逐个排除&lt;/s&gt; ），最终发现还必须将 &lt;code&gt;com.android.mtp&lt;/code&gt; 这个应用放入白名单……&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.nodeseek.com/static/image/sticker/xhj/013.gif&quot; alt=&quot;xhj013&quot; /&gt; &lt;img src=&quot;https://www.nodeseek.com/static/image/sticker/xhj/013.gif&quot; alt=&quot;xhj013&quot; /&gt; &lt;img src=&quot;https://www.nodeseek.com/static/image/sticker/xhj/013.gif&quot; alt=&quot;xhj013&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结论就是，下列应用也许都需要加入白名单：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;com.android.soundrecorder          # 声音
com.android.providers.downloads    # 下载管理程序（后端）
com.android.providers.downloads.ui # 下载管理（前端）
com.android.providers.media        # 不知道是什么
com.android.mtp                    # MTP主机
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://pic1.zhimg.com/100/v2-5e2a2a7aca199fe0429e8879159365ef_r.jpeg?source=7e7ef6e2&amp;amp;needBackground=1&amp;amp;rawwidth=259&amp;amp;rawheight=300&amp;amp;customSceneCode=image_viewer&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>关于 PulsedMedia Seedbox 的一些使用记录</title><link>https://blog.rokutosei.com/posts/seedbox/pulsedmedia-seedbox/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/seedbox/pulsedmedia-seedbox/</guid><description>记录 PulsedMedia 低端 SSD 与 HDD 套餐的交付异常、宿主机宕机事件及磁盘性能实测数据</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录 PulsedMedia 旗下两款低价 Seedbox 套餐的实际部署与使用状况，并附带相关软硬件配置及磁盘 I/O 测试数据以供参考。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;涉及机型：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;M1000 SSD 230G&lt;/strong&gt;：购买于 2026-05-29，月付 1.99 欧元。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 TB HDD RAID5&lt;/strong&gt;：购买于 2026-06-02，月付 1.99 欧元。&lt;/li&gt;
&lt;li&gt;两款套餐均无 root 权限，预装 qBittorrent v4.5.2。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不得不吐槽，简单的 PayPal 退款申请，来回拉扯半个多月&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一眼顶真，鉴定为蠢蠢的大粪&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;附上我提出的三个工单情况总结：&lt;/p&gt;
&lt;h3&gt;工单 #525571&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事实陈述&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;用户新开通的 “Eternal Väinämöinen - Seedbox 1TB HDD” 服务存在 Dashboard 界面损坏问题，表现为顶部导航标签页（ruTorrent、File Manager 等）缺失，且 qBittorrent 标签页在 DOM 中完全缺失。直接访问 qBittorrent 的 URL 会返回 404 错误。用户通过 Chrome 开发者工具定位原因为 CSS/JS 加载失败及反向代理未配置。最终，用户通过修改配置文件自行修复了该问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部分原文&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Out of the box, the dashboard is completely broken, specifically missing the top navigation tabs... The required &lt;code&gt;.tabs-nav&lt;/code&gt; class is not being injected into the &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;... qBittorrent tab is entirely missing from the dashboard&apos;s index.php DOM.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I have already patched the issues myself... I manually routed the traffic via &lt;code&gt;~/.lighttpd/custom.d/&lt;/code&gt; and restored the frontend using &lt;code&gt;.customFrames&lt;/code&gt;.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事件节点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026年6月2日 03:20&lt;/strong&gt;：用户提交开单申请，报告界面损坏并给出了 Chrome F12 的排查结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月2日 04:13&lt;/strong&gt;：用户追加信息，报告 qBittorrent 反向代理未配置导致 404 错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月2日 05:58&lt;/strong&gt;：用户更新状态，表明已自行完成修复，并指出系统部署脚本存在 bug。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;工单 #705896&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事实陈述&lt;/strong&gt;：
用户因磁盘写入速度过慢（平均 7.5MB/s），在 14 天退款保障期内申请取消服务并退款到原 PayPal 账户。AI 客服批准了退款，但随后由于支付网关自动退款失败（原因为跨境货币不匹配），退款流程被反复积压。在历时 18 天的沟通中，全程由 AI 客服处理，期间用户明确拒绝账户余额（Account Credit）形式的补偿。最终因人工手动退款未能及时到账，用户在 PayPal 发起争议申诉。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部分原文&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Since I am canceling within your 14-day risk-free period, I am formally requesting a full refund to my original payment method...&quot;&lt;/p&gt;
&lt;p&gt;&quot;Your original payment went through PayPal in a different currency than the one our billing runs in. Our automated refund can only send a partial-amount refund, and PayPal rejects a partial refund when the currencies do not match.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I have just opened disputes on PayPal for both transactions and attached your written approvals. PayPal can handle this for you. Do not reply to me again.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重要事件节点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026年6月7日 06:15&lt;/strong&gt;：用户因写入速度慢申请退款。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月7日 09:24&lt;/strong&gt;：AI 客服确认批准全额退款，预计需要几个工作日。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月12日 18:28&lt;/strong&gt;：用户追问进度；AI 客服回复自动退款被拒，已升级至财务团队进行手动处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月17日 08:31&lt;/strong&gt;：用户再次催促，表示已过去 10 天且无法接受全额 AI 机器人的机械回复，明确拒绝账户余额。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月25日 14:38&lt;/strong&gt;：用户爆发，谴责 18 天来毫无进展且被真人客服无视；AI 客服于 15:08 回复解释了货币转换失败的技术原因，并表示已将此笔及另一笔一并加急催促手动处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月25日 15:48&lt;/strong&gt;：用户回复已在 PayPal 提起争议，要求其停止回复，工单随后关闭。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;工单 #842846&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事实陈述&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;用户报告其 M1000 SSD 230G 服务器彻底掉线（Web UI 超时且 SSH 连接被关闭），并对后台缺少自助重启按钮提出异议。AI 客服确认是整台宿主机级别的故障。由于服务器连续几天离线，用户在 14 天保障期内提出退款并取消服务。该工单的退款同样由于支付网关货币不匹配原因导致自动退款失败，经历了相同的 AI 话术流转与长达十余天的手动延期，最终处理结果与工单 #705896 同步，由用户发起 PayPal 争议结束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部分原文&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;My SSD seedbox is completely down and inaccessible... It is highly frustrating and unacceptable that there isn&apos;t even a basic reboot button in the client area...&quot;&lt;/p&gt;
&lt;p&gt;&quot;The server is currently unreachable on every level... This is now with our operations team to bring the server back online.&quot;&lt;/p&gt;
&lt;p&gt;&quot;The server has been offline for several days... I do not wish to continue waiting for the repair... I am requesting a refund under the guarantee and cancellation of the service.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事件节点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026年6月7日 04:55&lt;/strong&gt;：用户开单报告 SSD 服务器完全断连，要求执行硬重启。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月7日 09:13&lt;/strong&gt;：AI 客服确认整体节点下线，已移交运维团队，并解释由于是共享服务器故未提供自助重启按钮。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月8日 04:05&lt;/strong&gt;：用户表态不愿继续等待修复，正式申请 14 天保证期内退款。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月8日 04:24&lt;/strong&gt;：AI 客服批准退款，并透露自动退款被拒，需转为财务手动处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月12日 &amp;amp; 17日&lt;/strong&gt;：用户在多日未收到款项后进行跟进催促，重申不接受账户余额。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月20日 12:11&lt;/strong&gt;：AI 客服就手动退款积压致歉，并同步说明了 PayPal 汇率/货币转换拒绝自动退款的具体技术原因。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026年6月25日 15:48&lt;/strong&gt;：用户在该工单发出最后通牒（内容与 #705896 一致），表明已将两笔交易全部诉诸 PayPal 争议中心，工单结案。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;HDD 活动款&lt;/h2&gt;
&lt;p&gt;HDD 活动款实例在交付后存在自动化部署不完整的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;控制面板 UI 异常。&lt;/li&gt;
&lt;li&gt;qBittorrent 无法通过 Web 面板正常访问。&lt;/li&gt;
&lt;li&gt;缺少 Lighttpd 反向代理配置与自定义 UI 配置文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提单后未能获得即时响应，最终通过 SSH 登录实例自行修复代理配置。根据 Discord 社区反馈，该故障在同批次活动机中较为普遍，非个案。&lt;/p&gt;
&lt;p&gt;可供购买前自行评估。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;SSD 款&lt;/h2&gt;
&lt;p&gt;SSD 套餐于 2026-06-07 发生失联故障：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实例无法访问，SSH 连接提示 &lt;code&gt;Connection closed by remote host&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;控制面板未提供实例重启（Reboot）功能。&lt;/li&gt;
&lt;li&gt;提交工单后，由其 AI 客服确认该故障为宿主机（Node）级别网络/硬件宕机。&lt;/li&gt;
&lt;li&gt;服务条款（TOS）中规定此类故障的周末首期响应目标（SLA）为 72 小时内，且非 24/7 客服模式。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;实测数据&lt;/h2&gt;
&lt;p&gt;以下数据均为 SSH 登录后实际执行命令获得&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;套餐名称&lt;/td&gt;
&lt;td&gt;M1000 SSD 230G&lt;/td&gt;
&lt;td&gt;1 TB HDD RAID5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地区&lt;/td&gt;
&lt;td&gt;EU, Finland&lt;/td&gt;
&lt;td&gt;EU, Finland&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;套餐存储&lt;/td&gt;
&lt;td&gt;230 GiB Storage&lt;/td&gt;
&lt;td&gt;1 TB HDD RAID5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;套餐内存&lt;/td&gt;
&lt;td&gt;1 GB RAM&lt;/td&gt;
&lt;td&gt;1 GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;套餐网络&lt;/td&gt;
&lt;td&gt;1 Gbps Network&lt;/td&gt;
&lt;td&gt;10 Gbps shared&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;套餐流量&lt;/td&gt;
&lt;td&gt;4400 GiB Monthly Torrent Traffic (only upload counted)&lt;/td&gt;
&lt;td&gt;10 TB traffic / month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 配额&lt;/td&gt;
&lt;td&gt;未说明&lt;/td&gt;
&lt;td&gt;2 CPU cores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I/O 优先级&lt;/td&gt;
&lt;td&gt;未说明&lt;/td&gt;
&lt;td&gt;Low (100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 优先级&lt;/td&gt;
&lt;td&gt;未说明&lt;/td&gt;
&lt;td&gt;Medium (500)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主机名&lt;/td&gt;
&lt;td&gt;3-229mighty.pulsedmedia.com&lt;/td&gt;
&lt;td&gt;lt3-1-107-199clomarthu.pulsedmedia.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;Debian GNU/Linux 12 (bookworm)&lt;/td&gt;
&lt;td&gt;Debian GNU/Linux 12 (bookworm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内核&lt;/td&gt;
&lt;td&gt;5.10.0-42-amd64&lt;/td&gt;
&lt;td&gt;6.1.0-43-amd64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;虚拟化&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;kvm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;架构&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 型号&lt;/td&gt;
&lt;td&gt;AMD Ryzen 5 3400G with Radeon Vega Graphics&lt;/td&gt;
&lt;td&gt;未提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可见 CPU 数&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;未提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;总内存（free -h）&lt;/td&gt;
&lt;td&gt;31 GiB&lt;/td&gt;
&lt;td&gt;69 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swap&lt;/td&gt;
&lt;td&gt;90 GiB&lt;/td&gt;
&lt;td&gt;7.1 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;存储信息&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;数据盘&lt;/td&gt;
&lt;td&gt;md0&lt;/td&gt;
&lt;td&gt;vda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘大小&lt;/td&gt;
&lt;td&gt;3.6T&lt;/td&gt;
&lt;td&gt;46T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘文件系统&lt;/td&gt;
&lt;td&gt;ext4&lt;/td&gt;
&lt;td&gt;ext4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘挂载点&lt;/td&gt;
&lt;td&gt;/home&lt;/td&gt;
&lt;td&gt;/home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘已用&lt;/td&gt;
&lt;td&gt;2.1T&lt;/td&gt;
&lt;td&gt;28T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘可用&lt;/td&gt;
&lt;td&gt;1.6T&lt;/td&gt;
&lt;td&gt;19T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据盘使用率&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘&lt;/td&gt;
&lt;td&gt;/dev/nvme0n1p2&lt;/td&gt;
&lt;td&gt;/dev/sda1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘大小&lt;/td&gt;
&lt;td&gt;98G&lt;/td&gt;
&lt;td&gt;28G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘已用&lt;/td&gt;
&lt;td&gt;21G&lt;/td&gt;
&lt;td&gt;26G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘可用&lt;/td&gt;
&lt;td&gt;73G&lt;/td&gt;
&lt;td&gt;312M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘使用率&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;99%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;物理磁盘&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;磁盘 1&lt;/td&gt;
&lt;td&gt;Samsung SSD 870 QVO 2TB&lt;/td&gt;
&lt;td&gt;QEMU HARDDISK 35G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;磁盘 2&lt;/td&gt;
&lt;td&gt;Samsung SSD 870 QVO 2TB&lt;/td&gt;
&lt;td&gt;vda 45.5T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统盘型号&lt;/td&gt;
&lt;td&gt;ADATA SX8200PNP 238.5G&lt;/td&gt;
&lt;td&gt;QEMU HARDDISK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAID 信息&lt;/td&gt;
&lt;td&gt;md0: raid0 sdb[1] sda[0]&lt;/td&gt;
&lt;td&gt;无 md 设备&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;dd 测试结果&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;测试项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;写入命令&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dd if=/dev/zero of=test.img bs=1G count=1 oflag=direct&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dd if=/dev/zero of=test.img bs=1G count=1 oflag=direct&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写入结果①&lt;/td&gt;
&lt;td&gt;169 MB/s&lt;/td&gt;
&lt;td&gt;7.5 MB/s&amp;lt;br /&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写入结果②&lt;/td&gt;
&lt;td&gt;250 MB/s&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;读取命令&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dd if=test.img of=/dev/null bs=1G iflag=direct&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dd if=test.img of=/dev/null bs=1G iflag=direct&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;读取结果&lt;/td&gt;
&lt;td&gt;847 MB/s&lt;/td&gt;
&lt;td&gt;78.5 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;调度器&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;调度器输出&lt;/td&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;、&lt;code&gt;bfq&lt;/code&gt;、&lt;code&gt;mq-deadline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;、&lt;code&gt;bfq&lt;/code&gt;、&lt;code&gt;mq-deadline&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;RAID 信息&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;SSD Seedbox&lt;/th&gt;
&lt;th&gt;HDD Seedbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RAID 类型&lt;/td&gt;
&lt;td&gt;RAID0&lt;/td&gt;
&lt;td&gt;无法获取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAID 设备&lt;/td&gt;
&lt;td&gt;md0&lt;/td&gt;
&lt;td&gt;无法获取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成员盘&lt;/td&gt;
&lt;td&gt;sda、sdb&lt;/td&gt;
&lt;td&gt;无法获取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;md0 容量&lt;/td&gt;
&lt;td&gt;3906766848 blocks&lt;/td&gt;
&lt;td&gt;无法获取&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;strong&amp;gt;点击查看原始命令输出&amp;lt;/strong&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSD
username@domain:~$ uname -a
hostnamectl
systemd-detect-virt
Linux domain.pulsedmedia.com 5.10.0-42-amd64 #1 SMP Debian 5.10.251-4 (2026-05-08) x86_64 GNU/Linux
 Static hostname: domain.pulsedmedia.com
       Icon name: computer-desktop
         Chassis: desktop 🖥️
      Machine ID: 7f2bf056ed6e4769935f46ca43b17550
         Boot ID: f31f7a217eb64698bc6cac84adb74996
Operating System: Debian GNU/Linux 12 (bookworm)
          Kernel: Linux 5.10.0-42-amd64
    Architecture: x86-64
Firmware Version: P3.60
none
username@domain:~$ lscpu
Architecture:                x86_64
  CPU op-mode(s):            32-bit, 64-bit
  Address sizes:             43 bits physical, 48 bits virtual
  Byte Order:                Little Endian
CPU(s):                      8
  On-line CPU(s) list:       0-7
Vendor ID:                   AuthenticAMD
  Model name:                AMD Ryzen 5 3400G with Radeon Vega Graphi
                             cs
    CPU family:              23
    Model:                   24
    Thread(s) per core:      2
    Core(s) per socket:      4
    Socket(s):               1
    Stepping:                1
    Frequency boost:         enabled
    CPU(s) scaling MHz:      37%
    CPU max MHz:             3700.0000
    CPU min MHz:             1400.0000
    BogoMIPS:                7400.09
    Flags:                   fpu vme de pse tsc msr pae mce cx8 apic s
                             ep mtrr pge mca cmov pat pse36 clflush mm
                             x fxsr sse sse2 ht syscall nx mmxext fxsr
                             _opt pdpe1gb rdtscp lm constant_tsc rep_g
                             ood nopl nonstop_tsc cpuid extd_apicid ap
                             erfmperf pni pclmulqdq monitor ssse3 fma
                             cx16 sse4_1 sse4_2 movbe popcnt aes xsave
                              avx f16c rdrand lahf_lm cmp_legacy svm e
                             xtapic cr8_legacy abm sse4a misalignsse 3
                             dnowprefetch osvw skinit wdt tce topoext
                             perfctr_core perfctr_nb bpext perfctr_llc
                              mwaitx cpb hw_pstate ssbd ibpb vmmcall f
                             sgsbase bmi1 avx2 smep bmi2 rdseed adx sm
                             ap clflushopt sha_ni xsaveopt xsavec xget
                             bv1 clzero irperf xsaveerptr arat npt lbr
                             v svm_lock nrip_save tsc_scale vmcb_clean
                              flushbyasid decodeassists pausefilter pf
                             threshold avic v_vmsave_vmload vgif overf
                             low_recov succor smca sme sev sev_es ibpb
                             _exit_to_user
Virtualization features:
  Virtualization:            AMD-V
Caches (sum of all):
  L1d:                       128 KiB (4 instances)
  L1i:                       256 KiB (4 instances)
  L2:                        2 MiB (4 instances)
  L3:                        4 MiB (1 instance)
NUMA:
  NUMA node(s):              1
  NUMA node0 CPU(s):         0-7
Vulnerabilities:
  Gather data sampling:      Not affected
  Indirect target selection: Not affected
  Itlb multihit:             Not affected
  L1tf:                      Not affected
  Mds:                       Not affected
  Meltdown:                  Not affected
  Mmio stale data:           Not affected
  Reg file data sampling:    Not affected
  Retbleed:                  Mitigation; untrained return thunk; SMT v
                             ulnerable
  Spec rstack overflow:      Mitigation; safe RET
  Spec store bypass:         Mitigation; Speculative Store Bypass disa
                             bled via prctl and seccomp
  Spectre v1:                Mitigation; usercopy/swapgs barriers and
                             __user pointer sanitization
  Spectre v2:                Mitigation; Retpolines, IBPB conditional,
                              STIBP disabled, RSB filling, PBRSB-eIBRS
                              Not affected
  Srbds:                     Not affected
  Tsa:                       Not affected
  Tsx async abort:           Not affected
  Vmscape:                   Mitigation; IBPB before exit to userspace
username@domain:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1375.589
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1385.318
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 1
cpu cores       : 4
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 2
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1259.670
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 2
cpu cores       : 4
apicid          : 4
initial apicid  : 4
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 3
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1373.472
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 6
initial apicid  : 6
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 4
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1381.508
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 5
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1381.814
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 1
cpu cores       : 4
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 6
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1259.581
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 2
cpu cores       : 4
apicid          : 5
initial apicid  : 5
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

processor       : 7
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 24
model name      : AMD Ryzen 5 3400G with Radeon Vega Graphics
stepping        : 1
microcode       : 0x8108102
cpu MHz         : 1383.956
cache size      : 512 KB
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 7
initial apicid  : 7
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sme sev sev_es ibpb_exit_to_user
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed srso div0 ibpb_no_ret vmscape
bogomips        : 7400.09
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]

username@domain:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       6.6Gi       6.9Gi       119Mi        21Gi        24Gi
Swap:           90Gi       2.5Gi        88Gi
username@domain:~$ cat /proc/meminfo | head
MemTotal:       32796680 kB
MemFree:         7225136 kB
MemAvailable:   25916656 kB
Buffers:          543464 kB
Cached:         20862400 kB
SwapCached:       188668 kB
Active:         10353420 kB
Inactive:       13580724 kB
Active(anon):     963236 kB
Inactive(anon):  1697636 kB
username@domain:~$ lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
NAME          SIZE TYPE  MOUNTPOINT
sda           1.8T disk
└─md0         3.6T raid0 /home
sdb           1.8T disk
└─md0         3.6T raid0 /home
nvme0n1     238.5G disk
├─nvme0n1p1   499M part
├─nvme0n1p2  99.5G part  /
└─nvme0n1p3  90.8G part  [SWAP]
username@domain:~$ cat /sys/block/*/queue/scheduler
none
[none] mq-deadline bfq
mq-deadline [bfq] none
mq-deadline [bfq] none
username@domain:~$ lsblk -d -o NAME,MODEL,SIZE
NAME    MODEL                     SIZE
sda     Samsung SSD 870 QVO 2TB   1.8T
sdb     Samsung SSD 870 QVO 2TB   1.8T
nvme0n1 ADATA SX8200PNP         238.5G
username@domain:~$ sudo smartctl -i /dev/sda
[sudo] password for username:
username is not in the sudoers file.
username@domain:~$ cat /proc/mdstat
Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 sdb[1] sda[0]
      3906766848 blocks super 1.2 512k chunks

unused devices: &amp;lt;none&amp;gt;
username@domain:~$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs   16G     0   16G   0% /dev
tmpfs          tmpfs     3.2G   12M  3.2G   1% /run
/dev/nvme0n1p2 ext4       98G   21G   73G  22% /
tmpfs          tmpfs      16G     0   16G   0% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/md0       ext4      3.6T  2.1T  1.6T  58% /home
tmpfs          tmpfs     3.2G   12K  3.2G   1% /run/user/1007
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1000
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1021
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1036
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1035
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1042
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1100
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1109
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1085
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1112
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1119
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1120
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1116
tmpfs          tmpfs     3.2G     0  3.2G   0% /run/user/0
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1121
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1122
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1069
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1123
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1124
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1125
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1126
tmpfs          tmpfs     3.2G   44K  3.2G   1% /run/user/1127
username@domain:~$ fio --name=randread \
    --ioengine=libaio \
    --rw=randread \
    --bs=4k \
    --size=1G \
    --numjobs=1 \
    --runtime=30 \
    --time_based
-bash: fio: command not found
username@domain:~$ dd if=/dev/zero of=test.img bs=1G count=1 oflag=direct status=progress
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6 s, 169 MB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.35951 s, 169 MB/s
username@domain:~$ rm test.img
username@domain:~$ dd if=test.img of=/dev/null bs=1G iflag=direct status=progress
dd: failed to open &apos;test.img&apos;: No such file or directory
username@domain:~$ dd if=/dev/zero of=test.img bs=1G count=1 oflag=direct status=progress
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4 s, 250 MB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.30053 s, 250 MB/s
username@domain:~$ dd if=test.img of=/dev/null bs=1G iflag=direct status=progress
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1 s, 847 MB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.26795 s, 847 MB/s
username@domain:~$ rm test.img
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# HDD
username@domain:~$ uname -a
hostnamectl
systemd-detect-virt
Linux domain.pulsedmedia.com 6.1.0-43-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.162-1 (2026-02-08) x86_64 GNU/Linux
 Static hostname: domain.pulsedmedia.com
       Icon name: computer-vm
         Chassis: vm 🖴
      Machine ID: 8448a59d627540e8ad0e80e8678fef52
         Boot ID: c32dafcab3e0436b8e3a87fe0b44cdf2
  Virtualization: kvm
Operating System: Debian GNU/Linux 12 (bookworm)
          Kernel: Linux 6.1.0-43-amd64
    Architecture: x86-64
 Hardware Vendor: QEMU
  Hardware Model: Standard PC _i440FX + PIIX, 1996_
Firmware Version: rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org
kvm
username@domain:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            69Gi       7.0Gi        42Gi       131Mi        23Gi        62Gi
Swap:          7.1Gi       2.5Gi       4.5Gi
username@domain:~$ cat /proc/meminfo | head
MemTotal:       72490320 kB
MemFree:        44875384 kB
MemAvailable:   65076480 kB
Buffers:          586840 kB
Cached:         22501456 kB
SwapCached:       497424 kB
Active:         12847892 kB
Inactive:       12605524 kB
Active(anon):    2257560 kB
Inactive(anon):   251288 kB
username@domain:~$ cat /sys/block/*/queue/scheduler
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
[none] mq-deadline bfq
mq-deadline [bfq] none
mq-deadline [bfq] none
mq-deadline [bfq] none
username@domain:~$ lsblk -d -o NAME,MODEL,SIZE
NAME MODEL          SIZE
sda  QEMU HARDDISK   35G
sr0  QEMU DVD-ROM  1024M
vda                45.5T
username@domain:~$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: &amp;lt;none&amp;gt;
username@domain:~$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs   48G     0   48G   0% /dev
tmpfs          tmpfs     9.5G   16M  9.5G   1% /run
/dev/sda1      ext4       28G   26G  312M  99% /
tmpfs          tmpfs      48G     0   48G   0% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/vda       ext4       46T   28T   19T  60% /home
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1006
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1017
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1011
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1018
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1019
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1025
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1021
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1022
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1030
tmpfs          tmpfs     9.5G     0  9.5G   0% /run/user/0
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1031
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1032
tmpfs          tmpfs     9.5G   24K  9.5G   1% /run/user/1009
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1033
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1034
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1035
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1036
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1037
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1038
tmpfs          tmpfs     9.5G   44K  9.5G   1% /run/user/1039
username@domain:~$ dd if=/dev/zero of=test.img bs=1G count=1 oflag=direct status=progress
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 144 s, 7.5 MB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 143.58 s, 7.5 MB/s
username@domain:~$ dd if=test.img of=/dev/null bs=1G iflag=direct status=progress
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 14 s, 78.5 MB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 13.6841 s, 78.5 MB/s
username@domain:~$ rm test.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>QQ微信在Chrome网页无法调用插件扫码登录</title><link>https://blog.rokutosei.com/posts/others/qqwxscan/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/others/qqwxscan/</guid><description>N/A</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome 147.0.7727.102 默认启用 &lt;code&gt;#local-network-access-check&lt;/code&gt;），&lt;/p&gt;
&lt;p&gt;拦截了插件对 &lt;code&gt;open.weixin.qq.com&lt;/code&gt; 的跨域/本地网络请求，导致 DNS 解析失败假象&lt;/p&gt;
&lt;p&gt;解决方法：在 &lt;code&gt;chrome://flags&lt;/code&gt; 中将 &lt;code&gt;#local-network-access-check&lt;/code&gt;）设为 &lt;strong&gt;Disabled&lt;/strong&gt; 并重启浏览器，即可恢复插件扫码登录功能&lt;/p&gt;
</content:encoded></item><item><title>mihomo 链式代理（dialer-proxy）</title><link>https://blog.rokutosei.com/posts/proxy/dialer-proxy/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/proxy/dialer-proxy/</guid><description>N/A</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dialer-proxy&lt;/code&gt; 是 mihomo 内置于每个代理节点上的参数&lt;/p&gt;
&lt;p&gt;当节点配置了此参数时，该节点的&lt;strong&gt;底层网络连接&lt;/strong&gt;会通过指定的另一个代理建立，而不是直接从本机发出。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;节点 A (dialer-proxy → 节点 B)
         ↓
节点 A 的底层连接：本地 → 节点 B 服务端 → 节点 A 服务端 → 目标
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个过程中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标网站看到的来源 IP 是&lt;strong&gt;节点 A 服务端&lt;/strong&gt;的 IP&lt;/li&gt;
&lt;li&gt;本地网络运营商只能看到你在连接&lt;strong&gt;节点 B&lt;/strong&gt;，不知道节点 A 和目标的存在&lt;/li&gt;
&lt;li&gt;节点 B 的服务端知道自己转发了流量到节点 A，但不知道最终访问的是什么目标&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;code&gt;dialer-proxy&lt;/code&gt; 值&lt;/h2&gt;
&lt;p&gt;值可以为任意已定义的&lt;strong&gt;代理节点名称&lt;/strong&gt;或&lt;strong&gt;策略组名称&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: &quot;落地节点&quot;
    dialer-proxy: 拨号策略组
    # ... 其他参数

  - name: &quot;前置节点&quot;
    # ...

proxy-groups:
  - name: 拨号策略组
    type: select
    proxies:
      - 前置节点
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 &lt;code&gt;dialer-proxy&lt;/code&gt; 指向策略组时，内核会在每次建立连接时根据该策略组的选中的节点进行拨号，同时允许在运行时通过切换策略组中的节点来更换前置链路。&lt;/p&gt;
&lt;h2&gt;限制&lt;/h2&gt;
&lt;h3&gt;不允许在策略组上设置 &lt;code&gt;dialer-proxy&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if _, ok := config[&quot;dialer-proxy&quot;]; ok {
    log.Errorln(&quot;The group [%s] with dialer-proxy configuration is not allowed, ...&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;dialer-proxy&lt;/code&gt; 只能写在代理节点上，策略组上写此字段会报错且不生效。&lt;/p&gt;
&lt;h3&gt;禁止循环引用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;return fmt.Errorf(&quot;proxy [%s] has circular dialer-proxy dependency&quot;, name)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 &lt;code&gt;dialer-proxy&lt;/code&gt; 引用了自身，或引用的链路上存在环，启动时会报错并退出，允许链式嵌套，但不可成环。&lt;/p&gt;
&lt;h3&gt;不支持 relay 类型（已移除）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;return nil, fmt.Errorf(&quot;%w: The group [%s] with relay type was removed, please using dialer-proxy instead&quot;, ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;过往的 &lt;code&gt;relay&lt;/code&gt; 策略组类型已被移除，应统一使用 &lt;code&gt;dialer-proxy&lt;/code&gt; 实现链式代理。&lt;/p&gt;
&lt;h2&gt;适用场景&lt;/h2&gt;
&lt;h3&gt;通过订阅节点中转自建节点&lt;/h3&gt;
&lt;p&gt;当自建 VPS 的 IP 被封禁（或被限速）且不想更换 IP 时，可通过已有的机场订阅节点作为前置，中转流量到自建节点落地：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxy-providers:
  airport:
    type: http
    url: &quot;https://example.com/sub&quot;

proxy-groups:
  - name: 拨号组
    type: select
    use: [airport]

proxies:
  - name: &quot;落地节点&quot;
    type: ss
    server: &amp;lt;YOUR_VPS_IP&amp;gt;
    port: 443
    cipher: chacha20-ietf-poly1305
    password: &amp;lt;YOUR_PASSWORD&amp;gt;
    dialer-proxy: 拨号组

rules:
  - MATCH,落地节点
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;流量路径为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本地 → 订阅节点（前置）→ 自建 VPS 落地 → 目标网站
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
前置节点本质上是在为落地节点建立 TCP 隧道，因此落地节点应选择不依赖 UDP 的协议（SS/VMess/VLESS over TCP 等）。&lt;/p&gt;
&lt;p&gt;若落地节点使用 hy2/tuic/wireguard 等纯 UDP 协议，或带有 REALITY/shadowtls 等 TLS 伪装层，前置节点（订阅节点）很可能无法正确转发这些连接。&lt;/p&gt;
&lt;p&gt;落地节点推荐使用 &lt;code&gt;ss + chacha20-ietf-poly1305&lt;/code&gt; 或 &lt;code&gt;vmess + tcp&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;总控模式切换&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;个人玩法，不泛用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当同时维护自建直连、链式代理、机场订阅三种模式时，可借助 &lt;code&gt;proxy-providers&lt;/code&gt; 的 &lt;code&gt;override&lt;/code&gt; 机制，对同一份节点文件分别产生&quot;直连&quot;和&quot;链式&quot;两组配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxy-providers:
  # 机场订阅
  airport:
    type: http
    url: &quot;https://example.com/sub&quot;

  # 自建节点（原始）
  mine:
    type: file
    path: ./proxy_provider/mine.yaml

  # 自建节点（加了 dialer-proxy，用于链式模式）
  mine-land:
    type: file
    path: ./proxy_provider/mine.yaml
    override:
      dialer-proxy: 链式前置

proxy-groups:
  # 总开关
  - name: PROXY
    type: select
    proxies: [机场节点, 链式代理, 自建直连]

  - name: 机场节点
    type: select
    use: [airport]

  - name: 链式前置
    type: select
    use: [airport]

  - name: 链式代理
    type: select
    use: [mine-land]     # 引用加了 override 的文件

  - name: 自建直连
    type: select
    use: [mine]           # 引用原始文件（无 dialer-proxy）

rules:
  - DOMAIN-SUFFIX,google.com,PROXY
  - MATCH,PROXY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;override&lt;/code&gt; 会对 provider 中所有节点批量添加 &lt;code&gt;dialer-proxy&lt;/code&gt; 字段（代码位置 &lt;code&gt;adapter/provider/override.go:58-59&lt;/code&gt;）。同一份 &lt;code&gt;mine.yaml&lt;/code&gt; 文件被引用两次，一次保持原样（自建直连），一次批量添加拨号配置（链式模式）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    U[客户端流量]
    P[PROXY 总开关]

    A[机场节点]
    L[链式代理&amp;lt;br/&amp;gt;mine-land]
    M[自建直连&amp;lt;br/&amp;gt;mine]

    D[链式前置]
    AS[机场服务端]
    LS[落地服务端]
    MS[自建服务端]
    T[目标网站]

    U --&amp;gt; P
    P --&amp;gt; A
    P --&amp;gt; L
    P --&amp;gt; M

    A --&amp;gt; AS --&amp;gt; T
    M --&amp;gt; MS --&amp;gt; T
    L --&amp;gt; D --&amp;gt; AS --&amp;gt; LS --&amp;gt; T
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.metacubex.one/config/proxies/dialer-proxy/&quot;&gt;虚空终端&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;友情推荐 &lt;a href=&quot;https://ryanvan.com/t/topic/59&quot;&gt;草履虫也能学会的 Clash 配置：UI界面一键配置精确分流、链式代理&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows 系统下通过注册表配置 NTP 时间同步</title><link>https://blog.rokutosei.com/posts/windows/synctime/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/windows/synctime/</guid><description>在 Windows 系统下通过修改注册表指定 NTP 时间服务器与同步轮询间隔</description><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文记录 Windows 系统下通过注册表配置 NTP 时间服务器及同步周期的步骤。适用于工作组环境或非域成员主机。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;注册表配置项&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;regedit&lt;/code&gt; 定位并修改以下路径中的项。&lt;/p&gt;
&lt;h3&gt;1. 配置时间服务器与类型&lt;/h3&gt;
&lt;p&gt;路径：&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;NtpServer&lt;/code&gt;&lt;/strong&gt; (REG_SZ)：指定时间服务器地址。多个地址以空格分隔，且每个地址后须追加位标志 &lt;code&gt;,0x9&lt;/code&gt;（主动同步）。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;推荐值&lt;/em&gt;：&lt;code&gt;ntp.ntsc.ac.cn,0x9 ntp.aliyun.com,0x9 time1.cloud.tencent.com,0x9&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Type&lt;/code&gt;&lt;/strong&gt; (REG_SZ)：&lt;code&gt;NTP&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 配置同步轮询周期与客户端状态&lt;/h3&gt;
&lt;p&gt;路径：&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SpecialPollInterval&lt;/code&gt;&lt;/strong&gt; (REG_DWORD)：同步周期（单位：秒）。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;推荐值&lt;/em&gt;：十进制 &lt;code&gt;3600&lt;/code&gt;（1小时）或 &lt;code&gt;1800&lt;/code&gt;（30分钟）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Enabled&lt;/code&gt;&lt;/strong&gt; (REG_DWORD)：&lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CrossSiteSyncFlags&lt;/code&gt;&lt;/strong&gt; (REG_DWORD)：&lt;code&gt;2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;快捷配置脚本 (.reg)&lt;/h2&gt;
&lt;p&gt;新建文本文件，命名为 &lt;code&gt;w32time.reg&lt;/code&gt;，写入以下内容并双击导入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
&quot;NtpServer&quot;=&quot;ntp.ntsc.ac.cn,0x9 ntp.aliyun.com,0x9 time1.cloud.tencent.com,0x9&quot;
&quot;Type&quot;=&quot;NTP&quot;

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]
&quot;Enabled&quot;=dword:00000001
&quot;SpecialPollInterval&quot;=dword:00000e10
&quot;CrossSiteSyncFlags&quot;=dword:00000002
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;服务重启与状态查询&lt;/h2&gt;
&lt;p&gt;以管理员权限运行命令提示符（CMD）执行以下命令使配置生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 重启时间服务
net stop w32time &amp;amp;&amp;amp; net start w32time

# 强制立即进行时间同步
w32tm /resync

# 查询当前生效的配置结构
w32tm /query /configuration

# 查询时间同步状态与源
w32tm /query /status
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;防火墙策略须放行 UDP 端口 &lt;code&gt;123&lt;/code&gt; 出站访问。&lt;/li&gt;
&lt;li&gt;域环境（Active Directory）下此配置会被组策略强制覆盖，此方法仅对工作组模式生效。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;最后可访问 &lt;a href=&quot;https://time.is/&quot;&gt;TIME.IS&lt;/a&gt; 了解本机时间准确性&lt;/p&gt;
</content:encoded></item><item><title>仅在需要时激活 Conda 环境</title><link>https://blog.rokutosei.com/posts/windows/condaenv/</link><guid isPermaLink="true">https://blog.rokutosei.com/posts/windows/condaenv/</guid><description>优化 PowerShell 中 Conda 自动加载导致的启动延迟，改为手动按需初始化</description><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Conda 默认生成的 &lt;code&gt;conda init&lt;/code&gt; 初始化配置会随终端每次启动而加载，导致 PowerShell 出现明显的启动延迟。&lt;/p&gt;
&lt;p&gt;本配置将自动加载改为手动别名激活。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;配置文件修改&lt;/h2&gt;
&lt;p&gt;编辑 PowerShell 配置文件 &lt;code&gt;$PROFILE&lt;/code&gt;。注释掉 Conda 默认生成的初始化 Hook 脚本块，并写入自定义的别名激活函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# region conda initialize (disabled by default)
# !! Contents within this block are managed by &apos;conda init&apos; !!
# If (Test-Path &quot;D:\Develop\miniconda3\Scripts\conda.exe&quot;) {
#     (&amp;amp; &quot;D:\Develop\miniconda3\Scripts\conda.exe&quot; &quot;shell.powershell&quot; &quot;hook&quot;) | Out-String | ?{$_} | Invoke-Expression
# }
# endregion

# Custom Conda Loader
function global:conda-init {
    Write-Host &quot;Initializing Conda...&quot; -ForegroundColor Green
    $condaScript = &quot;D:\Develop\miniconda3\Scripts\conda.exe&quot;
    if (Test-Path $condaScript) {
        (&amp;amp; &quot;$condaScript&quot; &quot;shell.powershell&quot; &quot;hook&quot;) | Out-String | Where-Object { $_ } | Invoke-Expression
        Write-Host &quot;Conda initialized.&quot; -ForegroundColor Cyan
    } else {
        Write-Error &quot;Conda executable not found at: $condaScript&quot;
    }
}
Set-Alias -Name ci -Value conda-init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：请根据实际安装路径修改 &lt;code&gt;$condaScript&lt;/code&gt; 变量中的绝对路径。&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;日常启动&lt;/strong&gt;：直接打开 PowerShell，此时不再初始化 Conda，Shell 启动延迟消失。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按需初始化&lt;/strong&gt;：在需要执行 Conda 命令时，在命令行运行 &lt;code&gt;ci&lt;/code&gt; 或 &lt;code&gt;conda-init&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境激活&lt;/strong&gt;：运行初始化命令后，执行标准命令 &lt;code&gt;conda activate &amp;lt;env_name&amp;gt;&lt;/code&gt; 切换至目标环境。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>