<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Silearner</title>
  
  <subtitle>I seek truth</subtitle>
  <link href="https://blog.chaos.run/atom.xml" rel="self"/>
  
  <link href="https://blog.chaos.run/"/>
  <updated>2026-06-18T17:36:38.962Z</updated>
  <id>https://blog.chaos.run/</id>
  
  <author>
    <name>Chaos</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  <follow_challenge>
    <feedId>56577419992440832</feedId>
    <userId>55131224729366528</userId>
  </follow_challenge>
  
  <entry>
    <title>Linux 下 Rime 使用白霜拼音配置 + 万象语言模型 + 同步</title>
    <link href="https://blog.chaos.run/dreams/rime-frost-wanxiang-lmdg/"/>
    <id>https://blog.chaos.run/dreams/rime-frost-wanxiang-lmdg/</id>
    <published>2026-06-16T19:56:13.000Z</published>
    <updated>2026-06-18T17:36:38.962Z</updated>
    
    <content type="html"><![CDATA[<p>之前在 Linux 上先后用过雾凇拼音、万象拼音，最后切到<a href="https://github.com/gaboolic/rime-frost">白霜拼音</a>。再按照 README 的说明把语法模型换成了万象 LTS 模型。这里把完整步骤记下来，包括 Fcitx5 和 IBus 的路径差异、Rime 同步，以及水平候选词。</p><p>综合下来体验很好，既没有万象拼音一些奇怪的功能和 bug，又比雾凇拼音奇怪的分词匹配要好得多。</p><span id="more"></span><h2 id="基础组件"><a class="markdownIt-Anchor" href="#基础组件"></a> 基础组件</h2><p>Ubuntu 上先装 Rime 前端和 octagram 插件。语言模型依赖 <code>librime-plugin-octagram</code>。</p><p>Fcitx5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install fcitx5-rime librime-plugin-octagram</span><br></pre></td></tr></table></figure><p>IBus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install ibus-rime librime-plugin-octagram</span><br></pre></td></tr></table></figure><p>两个前端的 Rime 配置目录不同：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Fcitx5: ~/.local/share/fcitx5/rime</span><br><span class="line">IBus:   ~/.config/ibus/rime</span><br></pre></td></tr></table></figure><p>后文用 <code>$rime_dir</code> 表示当前机器正在使用的目录。</p><h2 id="安装-plum"><a class="markdownIt-Anchor" href="#安装-plum"></a> 安装 Plum</h2><p><a href="https://github.com/rime/plum">Plum</a> 是 Rime 生态常用的配置管理工具。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/Programs</span><br><span class="line">git <span class="built_in">clone</span> --depth 1 https://github.com/rime/plum ~/Programs/Plum</span><br></pre></td></tr></table></figure><p>如果之前已经装过，更新即可：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git -C ~/Programs/Plum pull</span><br></pre></td></tr></table></figure><h2 id="安装白霜拼音"><a class="markdownIt-Anchor" href="#安装白霜拼音"></a> 安装白霜拼音</h2><p>Fcitx5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rime_dir=<span class="string">&quot;<span class="variable">$HOME</span>/.local/share/fcitx5/rime&quot;</span></span><br><span class="line"><span class="built_in">env</span> rime_dir=<span class="string">&quot;<span class="variable">$rime_dir</span>&quot;</span> bash ~/Programs/Plum/rime-install gaboolic/rime-frost:others/recipes/full</span><br></pre></td></tr></table></figure><p>IBus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rime_dir=<span class="string">&quot;<span class="variable">$HOME</span>/.config/ibus/rime&quot;</span></span><br><span class="line"><span class="built_in">env</span> rime_dir=<span class="string">&quot;<span class="variable">$rime_dir</span>&quot;</span> bash ~/Programs/Plum/rime-install gaboolic/rime-frost:others/recipes/full</span><br></pre></td></tr></table></figure><p>本次实践中，Plum 拉下来的白霜包里有些文件没有自动放进活动目录。若部署时提示缺少 <code>zh-moqi.gram</code> 或 <code>rime_frost_aux</code>，可以从 Plum 的 package 目录手动补进去：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> ~/Programs/Plum/package/gaboolic/frost/zh-moqi.gram <span class="string">&quot;<span class="variable">$rime_dir</span>&quot;</span>/</span><br><span class="line"><span class="built_in">cp</span> ~/Programs/Plum/package/gaboolic/frost/rime_frost_aux.* <span class="string">&quot;<span class="variable">$rime_dir</span>&quot;</span>/</span><br></pre></td></tr></table></figure><p>然后把默认方案限定为白霜拼音。新建或修改 <code>$rime_dir/default.custom.yaml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Rime default custom settings</span></span><br><span class="line"><span class="comment"># encoding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="attr">patch:</span></span><br><span class="line">  <span class="attr">schema_list:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">schema:</span> <span class="string">rime_frost</span></span><br></pre></td></tr></table></figure><h2 id="下载万象-lts-模型"><a class="markdownIt-Anchor" href="#下载万象-lts-模型"></a> 下载万象 LTS 模型</h2><p>前往 <a href="https://github.com/amzxyz/RIME-LMDG/releases/tag/LTS">RIME-LMDG</a> 下载万象 LTS 模型。这里使用简体模型：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -L -o <span class="string">&quot;<span class="variable">$rime_dir</span>/wanxiang-lts-zh-hans.gram&quot;</span> \</span><br><span class="line">  https://github.com/amzxyz/RIME-LMDG/releases/download/LTS/wanxiang-lts-zh-hans.gram</span><br></pre></td></tr></table></figure><h2 id="启用万象模型"><a class="markdownIt-Anchor" href="#启用万象模型"></a> 启用万象模型</h2><p>新建 <code>$rime_dir/rime_frost.custom.yaml</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim <span class="variable">$rime_dir</span>/rime_frost.custom.yaml</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Rime schema custom settings</span></span><br><span class="line"><span class="comment"># encoding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="attr">patch:</span></span><br><span class="line">  <span class="attr">grammar:</span></span><br><span class="line">    <span class="attr">language:</span> <span class="string">wanxiang-lts-zh-hans</span></span><br><span class="line">    <span class="attr">non_collocation_penalty:</span> <span class="number">-4</span></span><br><span class="line">    <span class="attr">collocation_max_length:</span> <span class="number">5</span></span><br><span class="line">    <span class="attr">collocation_min_length:</span> <span class="number">2</span></span><br><span class="line">    <span class="attr">collocation_penalty:</span> <span class="number">-14</span></span><br><span class="line">  <span class="attr">translator/contextual_suggestions:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">translator/max_homophones:</span> <span class="number">4</span></span><br><span class="line">  <span class="attr">translator/max_homographs:</span> <span class="number">2</span></span><br></pre></td></tr></table></figure><p>这里的 <code>language</code> 要和 <code>.gram</code> 文件名前缀一致。也就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wanxiang-lts-zh-hans.gram -&gt; language: wanxiang-lts-zh-hans</span><br></pre></td></tr></table></figure><p>万象 release 里也提醒过，模型和词库是紧耦合的；云插件和模型也不适合同时开，因为云插件会占用候选位置，等于削弱模型效果。我的做法是只用本地模型，不开云插件。</p><h2 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h2><p>Fcitx5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rime_deployer --build <span class="string">&quot;<span class="variable">$HOME</span>/.local/share/fcitx5/rime&quot;</span></span><br><span class="line">fcitx5-remote -r</span><br></pre></td></tr></table></figure><p>IBus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rime_deployer --build <span class="string">&quot;<span class="variable">$HOME</span>/.config/ibus/rime&quot;</span></span><br><span class="line">ibus restart</span><br></pre></td></tr></table></figure><p>如未生效，也可以从 Rime 菜单里手动点击「部署」。部署后用 <code>Ctrl + ~</code> 打开方案选单，确认当前方案是白霜拼音。</p><h2 id="验证模型配置"><a class="markdownIt-Anchor" href="#验证模型配置"></a> 验证模型配置</h2><p>部署后可以看 build 文件确认配置是否进去了。</p><p>Fcitx5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sed -n <span class="string">&#x27;/^grammar:/,/^[^ ]/p&#x27;</span> ~/.local/share/fcitx5/rime/build/rime_frost.schema.yaml</span><br></pre></td></tr></table></figure><p>IBus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sed -n <span class="string">&#x27;/^grammar:/,/^[^ ]/p&#x27;</span> ~/.config/ibus/rime/build/rime_frost.schema.yaml</span><br></pre></td></tr></table></figure><p>应能看到类似内容：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">grammar:</span></span><br><span class="line">  <span class="attr">collocation_max_length:</span> <span class="number">5</span></span><br><span class="line">  <span class="attr">collocation_min_length:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">collocation_penalty:</span> <span class="string">&quot;-14&quot;</span></span><br><span class="line">  <span class="attr">language:</span> <span class="string">&quot;wanxiang-lts-zh-hans&quot;</span></span><br><span class="line">  <span class="attr">non_collocation_penalty:</span> <span class="string">&quot;-4&quot;</span></span><br></pre></td></tr></table></figure><p>也可以确认 octagram 插件存在：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dpkg -L librime-plugin-octagram | grep librime-octagram</span><br></pre></td></tr></table></figure><p>这只能说明配置层面已经生效。实际排序效果还是要靠输入体验判断，尤其是长句和同音词较多的场景。</p><h2 id="设置水平候选词"><a class="markdownIt-Anchor" href="#设置水平候选词"></a> 设置水平候选词</h2><p>IBus 和 Fcitx5 的候选词方向不在同一个地方。</p><p>IBus 使用 Rime 前端配置。新建 <code>$rime_dir/ibus_rime.custom.yaml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ibus-rime custom settings</span></span><br><span class="line"><span class="comment"># encoding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="attr">patch:</span></span><br><span class="line">  <span class="attr">style/horizontal:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>然后重新部署：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rime_deployer --build <span class="string">&quot;<span class="variable">$HOME</span>/.config/ibus/rime&quot;</span></span><br><span class="line">ibus restart</span><br></pre></td></tr></table></figure><p>如未生效，也可以从 Rime 菜单里手动点击「部署」。</p><p>Fcitx5 的候选方向通常由 Fcitx5 的 UI 插件控制，不是 <code>rime_frost.custom.yaml</code>。推荐打开配置工具：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fcitx5-configtool</span><br></pre></td></tr></table></figure><p>进入 Addons / Classic User Interface / Configure，把 <code>Vertical Candidate List</code> 关掉，即为水平候选。</p><p>也可以直接编辑 <code>~/.config/fcitx5/conf/classicui.conf</code>，加入或修改：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># Vertical Candidate List</span><br><span class="line">Vertical Candidate List=False</span><br></pre></td></tr></table></figure><p>然后重载 Fcitx5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fcitx5-remote -r</span><br></pre></td></tr></table></figure><p>如果使用的不是 Classic UI，而是桌面环境自己的候选窗口或 Kimpanel，候选方向可能要在对应的输入法面板设置里改。</p><h2 id="rime-同步"><a class="markdownIt-Anchor" href="#rime-同步"></a> Rime 同步</h2><p>Rime 的 sync 适合同步用户词库和配置，但不要假设 <code>.gram</code> 模型会可靠同步。万象模型有几百 MB，最好每台机器本地各放一份。</p><p>先设置每台机器自己的 <code>installation_id</code>，并让它们指向同一个 <code>sync_dir</code>。</p><p>Fcitx5 的文件是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.local/share/fcitx5/rime/installation.yaml</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">installation_id:</span> <span class="string">atlas</span></span><br><span class="line"><span class="attr">sync_dir:</span> <span class="string">&quot;/home/sammy/Drives/MEGA/Settings/Rime&quot;</span></span><br></pre></td></tr></table></figure><p>IBus 的文件是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.config/ibus/rime/installation.yaml</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">distribution_code_name:</span> <span class="string">&quot;ibus-rime&quot;</span></span><br><span class="line"><span class="attr">installation_id:</span> <span class="string">carbon</span></span><br><span class="line"><span class="attr">sync_dir:</span> <span class="string">&quot;/home/sammy/Drives/MEGA/Settings/Rime&quot;</span></span><br></pre></td></tr></table></figure><p>要点是：</p><ul><li>每台机器的 <code>installation_id</code> 必须不同。</li><li>每台机器的 <code>sync_dir</code> 指向同一个网盘同步目录。</li><li><code>sync_dir</code> 下会生成与 <code>installation_id</code> 同名的子目录。</li><li>先确保本机活动目录里已经有 <code>wanxiang-lts-zh-hans.gram</code>，再部署使用同步来的 <code>rime_frost.custom.yaml</code>。</li></ul><p>配置完成后，在 Rime 菜单中点击「同步用户资料」。同步后可以检查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find <span class="string">&quot;/home/sammy/Drives/MEGA/Settings/Rime&quot;</span> -maxdepth 2 -<span class="built_in">type</span> f | <span class="built_in">sort</span></span><br></pre></td></tr></table></figure><p>我的经验是，迁移输入方案时最好先清理旧同步目录里明显过时的方案文件，例如旧的 <code>wanxiang*</code>、<code>rime_ice*</code>、<code>luna_pinyin*</code>。否则新机器同步时可能把历史方案和当前方案混在一起。</p><h2 id="回退"><a class="markdownIt-Anchor" href="#回退"></a> 回退</h2><p>如果想回到白霜默认模型，删除或改名：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$rime_dir/rime_frost.custom.yaml</span><br></pre></td></tr></table></figure><p>然后重新部署即可。保留 <code>zh-moqi.gram</code> 的意义就在这里：回退时不用重新找白霜默认模型。</p><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ul><li><a href="https://github.com/gaboolic/rime-frost">白霜拼音</a></li><li><a href="https://github.com/amzxyz/RIME-LMDG/releases/tag/LTS">RIME-LMDG 万象 LTS 模型</a></li><li><a href="https://github.com/rime/plum">Plum</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;之前在 Linux 上先后用过雾凇拼音、万象拼音，最后切到&lt;a href=&quot;https://github.com/gaboolic/rime-frost&quot;&gt;白霜拼音&lt;/a&gt;。再按照 README 的说明把语法模型换成了万象 LTS 模型。这里把完整步骤记下来，包括 Fcitx5 和 IBus 的路径差异、Rime 同步，以及水平候选词。&lt;/p&gt;
&lt;p&gt;综合下来体验很好，既没有万象拼音一些奇怪的功能和 bug，又比雾凇拼音奇怪的分词匹配要好得多。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="linux" scheme="https://blog.chaos.run/tags/linux/"/>
    
    <category term="rime" scheme="https://blog.chaos.run/tags/rime/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 NaiveProxy 代理服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-naive/"/>
    <id>https://blog.chaos.run/dreams/sing-box-naive/</id>
    <published>2026-05-14T18:00:00.000Z</published>
    <updated>2026-06-18T17:36:38.963Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 5 月 14 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何使用 sing-box 搭建 NaiveProxy 兼容服务端，并在客户端使用 sing-box 的 <code>naive</code> outbound 连接。本文同样适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>服务端与客户端均使用 sing-box，无需 Caddy、Nginx、HAProxy 或 Go 编译环境</li><li>使用 sing-box 内置 ACME DNS-01 自动申请和续签真实 TLS 证书，无需开放 TCP 80</li><li>服务端同时监听 TCP 443 与 UDP 443，支持 HTTP/2 与 HTTP/3；客户端默认使用 HTTP/3</li><li>两端均为 sing-box 时可启用 UDP over TCP，兼顾 UDP 应用兼容性</li><li>DNS 记录使用 Cloudflare 托管时必须保持 DNS only / 灰云，不要开启橙云代理</li></ol><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="整体架构"><a class="markdownIt-Anchor" href="#整体架构"></a> 整体架构</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">客户端 sing-box</span><br><span class="line">   │ TUN / mixed / socks 入站</span><br><span class="line">   ▼</span><br><span class="line">sing-box Naive outbound</span><br><span class="line">   │ HTTP/3 CONNECT over QUIC / UDP 443</span><br><span class="line">   │ SNI: naive.example.com</span><br><span class="line">   ▼</span><br><span class="line">VPS 公网 IP:443</span><br><span class="line">   │</span><br><span class="line">   ▼</span><br><span class="line">sing-box Naive inbound</span><br><span class="line">   │ 用户名 + 密码认证</span><br><span class="line">   ▼</span><br><span class="line">direct outbound</span><br><span class="line">   │</span><br><span class="line">   ▼</span><br><span class="line">目标网站</span><br></pre></td></tr></table></figure><p>NaiveProxy 的设计目标是将代理流量伪装成普通浏览器与 Web 服务器之间的 HTTP/2 或 HTTP/3 流量。sing-box 的 <code>naive</code> inbound / outbound 实现了兼容 NaiveProxy 的服务端与客户端。</p><p>需要注意：sing-box 的 Naive inbound 是纯代理入口，没有 Caddy forwardproxy 那样的伪装站 fallback。浏览器直接访问 <code>https://naive.example.com</code> 不一定显示正常网页。若强依赖伪装站 fallback，需要另行评估 Caddy forwardproxy 或 HAProxy 方案；本文不使用它们。</p><h3 id="关于-http3"><a class="markdownIt-Anchor" href="#关于-http3"></a> 关于 HTTP/3</h3><p>本文默认客户端启用 HTTP/3 / QUIC：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;quic&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br></pre></td></tr></table></figure><p>HTTP/3 更接近现代 Chrome 访问大量网站时的网络行为，在移动网络、跨国链路或丢包网络下也可能表现更好。但 H3 依赖 UDP 443，如果本地网络或 VPS 商家对 UDP 限速、QoS 或阻断，表现可能不如 H2。遇到连接失败、速度波动或间歇性断流时，删除客户端中的 <code>&quot;quic&quot;: true</code> 即可回退到 HTTP/2。</p><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>必须隐藏 VPS 真实 IP 的场景</li><li>必须通过 Cloudflare Tunnel / CDN 的场景</li><li>必须让浏览器直接访问代理域名显示伪装站的场景</li><li>无法开放公网 TCP 443 与 UDP 443 的 NAT VPS 场景</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="所需资源"><a class="markdownIt-Anchor" href="#所需资源"></a> 所需资源</h3><ol><li><strong>一台 VPS</strong>，拥有公网 IPv4，推荐同时有 IPv6</li><li><strong>一个域名</strong>，NS 托管到 Cloudflare</li><li><strong>一个 Cloudflare API Token</strong>，用于 DNS-01 签发证书</li><li><strong>客户端设备</strong>，需使用支持 sing-box Naive outbound 的客户端或官方 sing-box 命令行版本</li></ol><p>下文假设域名为 <code>example.com</code>，Naive 服务使用子域名：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">naive.example.com</span><br></pre></td></tr></table></figure><p>请根据实际情况替换。</p><h3 id="dns-配置"><a class="markdownIt-Anchor" href="#dns-配置"></a> DNS 配置</h3><p>在 Cloudflare DNS 中添加记录：</p><table><thead><tr><th>类型</th><th>名称</th><th>内容</th><th>代理状态</th></tr></thead><tbody><tr><td>A</td><td><code>naive</code></td><td>VPS IPv4 地址</td><td>DNS only</td></tr><tr><td>AAAA</td><td><code>naive</code></td><td>VPS IPv6 地址，可选</td><td>DNS only</td></tr></tbody></table><p>务必确认是灰云 <strong>DNS only</strong>，不是橙云 <strong>Proxied</strong>。</p><p>等待 DNS 生效后，在本地终端检查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dig naive.example.com A +short</span><br><span class="line">dig naive.example.com AAAA +short</span><br></pre></td></tr></table></figure><p>返回结果应为 VPS 的真实 IP。</p><h3 id="创建-cloudflare-api-token"><a class="markdownIt-Anchor" href="#创建-cloudflare-api-token"></a> 创建 Cloudflare API Token</h3><p>进入 Cloudflare Dashboard → <strong>My Profile → API Tokens → Create Token</strong>，创建自定义 Token：</p><table><thead><tr><th>项目</th><th>值</th></tr></thead><tbody><tr><td>Permissions</td><td><code>Zone - DNS - Edit</code></td></tr><tr><td>Zone Resources</td><td>仅选择当前域名</td></tr></tbody></table><p>sing-box 的 Cloudflare DNS-01 provider 支持只填写 <code>api_token</code>。<code>zone_token</code> 是可选项，用于额外提供 <code>Zone:Read</code> 权限；通常不需要。</p><h3 id="安装基本工具"><a class="markdownIt-Anchor" href="#安装基本工具"></a> 安装基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates openssl -y</span><br></pre></td></tr></table></figure><h3 id="防火墙放行端口"><a class="markdownIt-Anchor" href="#防火墙放行端口"></a> 防火墙放行端口</h3><p>本文使用 DNS-01 签发证书，因此不需要开放 TCP 80。只放行 443：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw allow 443/tcp</span><br><span class="line">sudo ufw allow 443/udp</span><br><span class="line">sudo ufw reload</span><br><span class="line">sudo ufw status verbose</span><br></pre></td></tr></table></figure><p>TCP 443 用于 HTTP/2 / HTTPS，UDP 443 用于 HTTP/3 / QUIC。</p><hr /><h2 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h2><p>sing-box 官方提供 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box</span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><p>截至 2026 年 5 月，建议使用 1.13 系列稳定版。1.14 仍处于 alpha 阶段，配置迁移可等稳定版发布后再处理。</p><hr /><h2 id="服务端配置"><a class="markdownIt-Anchor" href="#服务端配置"></a> 服务端配置</h2><h3 id="生成用户名与密码"><a class="markdownIt-Anchor" href="#生成用户名与密码"></a> 生成用户名与密码</h3><p>用户名可以使用普通字符串，例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sammy</span><br></pre></td></tr></table></figure><p>密码建议使用随机字符串：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -<span class="built_in">base64</span> 24</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vJ0wP0s8j3QLg2Y+Qd7mP2F9Y9YlDLJ3</span><br></pre></td></tr></table></figure><p>下文假设：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">username = sammy</span><br><span class="line">password = vJ0wP0s8j3QLg2Y+Qd7mP2F9Y9YlDLJ3</span><br></pre></td></tr></table></figure><p>请替换为自己的值。</p><h3 id="sing-box-配置"><a class="markdownIt-Anchor" href="#sing-box-配置"></a> sing-box 配置</h3><p>编辑 <code>/etc/sing-box/config.json</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>写入以下配置，注意替换域名、邮箱、Cloudflare Token、用户名与密码：</p><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;::&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;username&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vJ0wP0s8j3QLg2Y+Qd7mP2F9Y9YlDLJ3&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;quic_congestion_control&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bbr&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;h3&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;h2&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;acme&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;domain&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;naive.example.com&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;email&quot;</span><span class="punctuation">:</span> <span class="string">&quot;admin@example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;dns01_challenge&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;provider&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;api_token&quot;</span><span class="punctuation">:</span> <span class="string">&quot;替换为你的 Cloudflare API Token&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>限制配置权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">chown</span> root:root /etc/sing-box/config.json</span><br><span class="line">sudo <span class="built_in">chmod</span> 600 /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><h3 id="关键字段说明"><a class="markdownIt-Anchor" href="#关键字段说明"></a> 关键字段说明</h3><p><code>inbounds[].type</code>：设为 <code>naive</code>，启用 NaiveProxy 兼容服务端。</p><p><code>listen</code>：示例使用 <code>::</code>，通常可同时监听 IPv6 与 IPv4。若你的系统没有 IPv6，或 <code>ss</code> 检查发现只监听 IPv6，可改为 <code>0.0.0.0</code>。</p><p><code>network</code>：本文不写该字段。sing-box 文档说明 <code>network</code> 可为 <code>tcp</code> 或 <code>udp</code>，为空时同时监听 TCP 与 UDP。</p><p><code>quic_congestion_control</code>：设为 <code>bbr</code>。这也是 Chromium / QUICHE 默认使用的 QUIC 拥塞控制。</p><p><code>tls.acme.dns01_challenge</code>：使用 Cloudflare DNS-01 签发证书。配置 DNS-01 后不需要开放 80，也不需要额外运行 <a href="http://acme.sh">acme.sh</a>。</p><p><code>tls.alpn</code>：同时提供 <code>h3</code> 与 <code>h2</code>。客户端默认使用 H3，必要时可回退 H2。</p><h3 id="检查并启动"><a class="markdownIt-Anchor" href="#检查并启动"></a> 检查并启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br></pre></td></tr></table></figure><p>查看状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status sing-box</span><br><span class="line">sudo journalctl -u sing-box -e --no-pager</span><br></pre></td></tr></table></figure><p>首次启动时，sing-box 会通过 Cloudflare DNS-01 申请证书。如果失败，优先检查 DNS 是否为灰云、Token 权限是否为当前域名的 <code>Zone - DNS - Edit</code>、域名与邮箱是否填写正确。</p><hr /><h2 id="验证服务端"><a class="markdownIt-Anchor" href="#验证服务端"></a> 验证服务端</h2><p>检查监听端口：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo ss -tlnp | grep <span class="string">&#x27;:443&#x27;</span></span><br><span class="line">sudo ss -ulnp | grep <span class="string">&#x27;:443&#x27;</span></span><br></pre></td></tr></table></figure><p>正常情况下，TCP 443 与 UDP 443 都应由 sing-box 监听。</p><p>确认 TLS 与 HTTP/2：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl s_client -connect naive.example.com:443 -servername naive.example.com -alpn h2 -brief</span><br></pre></td></tr></table></figure><p>如果能看到证书验证通过，并且 ALPN 协商出 <code>h2</code>，说明 TLS 与 H2 基本正常。H3 是否可用主要看 UDP 443 是否可达，客户端实际连接更有参考价值。</p><p>注意：浏览器直接访问 <code>https://naive.example.com</code> 不显示正常网页是预期现象。sing-box naive inbound 没有伪装站 fallback。</p><hr /><h2 id="客户端配置"><a class="markdownIt-Anchor" href="#客户端配置"></a> 客户端配置</h2><p>sing-box 的 Naive outbound 从 1.13.0 起加入。官方说明中，Naive outbound 只在 Apple platforms、Android、Windows 和部分 Linux 构建中可用。</p><p>Linux 客户端如通过 sing-box 官方 APT 仓库安装，通常无需手动处理 Cronet 依赖。只有手动下载官方 release 或使用第三方构建时，才需要确认该构建支持 Naive outbound，并能正确加载 <code>libcronet.so</code>。</p><p>以下为客户端示例配置，国内网站直连，其他流量走 Naive。两端均为 sing-box，因此默认开启 UDP over TCP v2。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;username&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vJ0wP0s8j3QLg2Y+Qd7mP2F9Y9YlDLJ3&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;insecure_concurrency&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;udp_over_tcp&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;quic&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;naive.example.com&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].type</code>：设为 <code>naive</code>，表示使用 NaiveProxy outbound。</p><p><code>server</code>：填写域名 <code>naive.example.com</code>。如果需要使用 IP 直连，也可以把这里改成 VPS IP，但 <code>tls.server_name</code> 仍应保持域名。</p><p><code>username</code> / <code>password</code>：必须与服务端 <code>users</code> 中的配置一致。</p><p><code>insecure_concurrency</code>：保持 <code>0</code>。多个并发隧道可能提升吞吐，但会增加流量分析特征，不建议默认开启。</p><p><code>udp_over_tcp</code>：启用 UoT v2，用于承载 UDP 流量。两端都是 sing-box 时建议开启。</p><p><code>quic</code>：设为 <code>true</code>，使用 HTTP/3 / QUIC。若当前网络 UDP 443 不稳定，删除该字段即可回退到 HTTP/2。</p><p><code>tls.server_name</code>：用于证书校验和 TLS SNI。必须与证书域名一致。</p><p>Naive outbound 的 TLS 配置不要像 VLESS 那样堆 <code>utls</code>、<code>alpn</code>、<code>fingerprint</code> 等字段。Naive outbound 的核心是 Cronet / Chromium 网络栈本身，和普通 sing-box TLS outbound 的配置思路不同。</p><hr /><h2 id="隐蔽性评估"><a class="markdownIt-Anchor" href="#隐蔽性评估"></a> 隐蔽性评估</h2><p>检测者视角大致如下：</p><table><thead><tr><th>检测维度</th><th>看到的内容</th></tr></thead><tbody><tr><td>连接目标 IP</td><td>VPS 真实 IP</td></tr><tr><td>SNI</td><td><code>naive.example.com</code></td></tr><tr><td>证书</td><td>Let’s Encrypt 等公开 CA 签发的真实证书</td></tr><tr><td>传输协议</td><td>HTTP/3 over QUIC，或回退 HTTP/2 over TLS</td></tr><tr><td>代理语义</td><td>HTTP CONNECT</td></tr><tr><td>浏览器直接访问</td><td>不显示伪装站</td></tr><tr><td>源站隐藏</td><td>不隐藏</td></tr></tbody></table><p>Naive 仍然存在 TLS-in-TLS 特征，因为用户访问 HTTPS 网站时，内层 HTTPS 流量会被封装在外层 HTTPS CONNECT 隧道中。Naive 的 padding 能缓解部分长度特征，但不能让 TLS-in-TLS 现象完全消失。</p><p>简单理解：</p><table><thead><tr><th>目标</th><th>更适合的方案</th></tr></thead><tbody><tr><td>隐藏源站 IP</td><td>VLESS + HTTPUpgrade / WS / gRPC + Cloudflare Tunnel</td></tr><tr><td>直连、低延迟、Chrome/Cronet 特征</td><td>NaiveProxy / sing-box naive</td></tr><tr><td>减少 TLS-in-TLS 特征</td><td>AnyTLS + REALITY 或 VLESS + Vision + REALITY</td></tr><tr><td>需要伪装站 fallback</td><td>Caddy forwardproxy 或 HAProxy 方案</td></tr><tr><td>需要完整 UDP 代理</td><td>Hysteria2 / TUIC 等方案</td></tr></tbody></table><hr /><h2 id="维护与排查"><a class="markdownIt-Anchor" href="#维护与排查"></a> 维护与排查</h2><h3 id="更新-sing-box"><a class="markdownIt-Anchor" href="#更新-sing-box"></a> 更新 sing-box</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt upgrade sing-box -y</span><br><span class="line">sudo systemctl restart sing-box</span><br></pre></td></tr></table></figure><p>查看版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><h3 id="查看证书与续签状态"><a class="markdownIt-Anchor" href="#查看证书与续签状态"></a> 查看证书与续签状态</h3><p>sing-box 会自动续签 ACME 证书。可检查最近日志：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo journalctl -u sing-box --since <span class="string">&quot;7 days ago&quot;</span> --no-pager | grep -i -E <span class="string">&#x27;acme|certificate|renew&#x27;</span></span><br></pre></td></tr></table></figure><p>也可以外部检查证书有效期：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> | openssl s_client -servername naive.example.com -connect naive.example.com:443 2&gt;/dev/null \</span><br><span class="line">  | openssl x509 -noout -dates</span><br></pre></td></tr></table></figure><h3 id="定期轮换密码"><a class="markdownIt-Anchor" href="#定期轮换密码"></a> 定期轮换密码</h3><p>建议每 3-6 个月轮换一次密码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -<span class="built_in">base64</span> 24</span><br></pre></td></tr></table></figure><p>然后同时更新服务端与客户端配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/sing-box/config.json</span><br><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br><span class="line">sudo systemctl restart sing-box</span><br></pre></td></tr></table></figure><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li><strong>ACME 证书签发失败</strong>：确认 DNS 记录为灰云，Cloudflare Token 有当前域名的 <code>Zone - DNS - Edit</code> 权限，域名解析已生效。</li><li><strong>TCP/H2 可用，H3 不可用</strong>：检查 UDP 443 是否放行，VPS 商家和本地网络是否限制 UDP。无法解决时删除客户端 <code>&quot;quic&quot;: true</code> 回退 H2。</li><li><strong>客户端提示证书错误</strong>：检查 <code>tls.server_name</code> 是否与证书域名一致。</li><li><strong>Linux 客户端提示 Naive outbound 不可用</strong>：确认使用包含 Cronet 的 sing-box 构建，并且 <code>libcronet.so</code> 能被加载。</li><li><strong>浏览器访问域名不是正常网站</strong>：这是 sing-box native naive inbound 的预期现象，不代表代理不可用。</li><li><strong>部分 UDP 应用异常</strong>：确认客户端 <code>udp_over_tcp</code> 已启用；若仍不稳定，说明该应用更适合 Hysteria2 / TUIC 等原生 UDP 方案。</li></ol><h3 id="升级至-sing-box-114-后的调整"><a class="markdownIt-Anchor" href="#升级至-sing-box-114-后的调整"></a> 升级至 sing-box 1.14 后的调整</h3><p>本文配置以 sing-box 1.13 稳定版为准。1.14.0 起，TLS 内联 <code>acme</code> 配置迁移为 <code>certificate_providers</code>。等 1.14 稳定版发布并确认兼容后，可按官方 Migration 文档迁移。</p><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://sing-box.sagernet.org/installation/package-manager/">sing-box - Package Manager</a></p><p><a href="https://sing-box.sagernet.org/configuration/inbound/naive/">sing-box - Naive Inbound</a></p><p><a href="https://sing-box.sagernet.org/configuration/outbound/naive/">sing-box - Naive Outbound</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/certificate-provider/acme/">sing-box - ACME Certificate Provider</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/dns01_challenge/">sing-box - DNS01 Challenge Fields</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/udp-over-tcp/">sing-box - UDP over TCP</a></p><p><a href="https://sing-box.sagernet.org/migration/">sing-box - Migration</a></p><p><a href="https://github.com/klzgrad/naiveproxy">NaiveProxy</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 5 月 14 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何使用 sing-box 搭建 NaiveProxy 兼容服务端，并在客户端使用 sing-box 的 &lt;code&gt;naive&lt;/code&gt; outbound 连接。本文同样适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;服务端与客户端均使用 sing-box，无需 Caddy、Nginx、HAProxy 或 Go 编译环境&lt;/li&gt;
&lt;li&gt;使用 sing-box 内置 ACME DNS-01 自动申请和续签真实 TLS 证书，无需开放 TCP 80&lt;/li&gt;
&lt;li&gt;服务端同时监听 TCP 443 与 UDP 443，支持 HTTP/2 与 HTTP/3；客户端默认使用 HTTP/3&lt;/li&gt;
&lt;li&gt;两端均为 sing-box 时可启用 UDP over TCP，兼顾 UDP 应用兼容性&lt;/li&gt;
&lt;li&gt;DNS 记录使用 Cloudflare 托管时必须保持 DNS only / 灰云，不要开启橙云代理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;整体架构&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#整体架构&quot;&gt;&lt;/a&gt; 整体架构&lt;/h3&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;客户端 sing-box&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ TUN / mixed / socks 入站&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;sing-box Naive outbound&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ HTTP/3 CONNECT over QUIC / UDP 443&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ SNI: naive.example.com&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;VPS 公网 IP:443&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;sing-box Naive inbound&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ 用户名 + 密码认证&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;direct outbound&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;目标网站&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;NaiveProxy 的设计目标是将代理流量伪装成普通浏览器与 Web 服务器之间的 HTTP/2 或 HTTP/3 流量。sing-box 的 &lt;code&gt;naive&lt;/code&gt; inbound / outbound 实现了兼容 NaiveProxy 的服务端与客户端。&lt;/p&gt;
&lt;p&gt;需要注意：sing-box 的 Naive inbound 是纯代理入口，没有 Caddy forwardproxy 那样的伪装站 fallback。浏览器直接访问 &lt;code&gt;https://naive.example.com&lt;/code&gt; 不一定显示正常网页。若强依赖伪装站 fallback，需要另行评估 Caddy forwardproxy 或 HAProxy 方案；本文不使用它们。&lt;/p&gt;
&lt;h3 id=&quot;关于-http3&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#关于-http3&quot;&gt;&lt;/a&gt; 关于 HTTP/3&lt;/h3&gt;
&lt;p&gt;本文默认客户端启用 HTTP/3 / QUIC：&lt;/p&gt;
&lt;figure class=&quot;highlight json&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;&amp;quot;quic&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;literal&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;HTTP/3 更接近现代 Chrome 访问大量网站时的网络行为，在移动网络、跨国链路或丢包网络下也可能表现更好。但 H3 依赖 UDP 443，如果本地网络或 VPS 商家对 UDP 限速、QoS 或阻断，表现可能不如 H2。遇到连接失败、速度波动或间歇性断流时，删除客户端中的 &lt;code&gt;&amp;quot;quic&amp;quot;: true&lt;/code&gt; 即可回退到 HTTP/2。&lt;/p&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;必须隐藏 VPS 真实 IP 的场景&lt;/li&gt;
&lt;li&gt;必须通过 Cloudflare Tunnel / CDN 的场景&lt;/li&gt;
&lt;li&gt;必须让浏览器直接访问代理域名显示伪装站的场景&lt;/li&gt;
&lt;li&gt;无法开放公网 TCP 443 与 UDP 443 的 NAT VPS 场景&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
    <category term="naiveproxy" scheme="https://blog.chaos.run/tags/naiveproxy/"/>
    
  </entry>
  
  <entry>
    <title>Debian 或 Ubuntu 自建 RustDesk 服务</title>
    <link href="https://blog.chaos.run/dreams/debian-deploy-rust-desk-service/"/>
    <id>https://blog.chaos.run/dreams/debian-deploy-rust-desk-service/</id>
    <published>2026-04-30T18:17:35.000Z</published>
    <updated>2026-06-18T17:36:38.957Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 VPS 上搭建 RustDesk 服务，本文适用于 Debian 13 以及 Ubuntu 24.04 系统。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文默认已按初始化配置文章对服务器进行了配置。</p><p><strong>尤其注意进行 UFW 针对 Docker 的配置，这是前置条件。</strong></p><p>VPS 的规格要求：</p><ol><li>512MB 及以上内存</li><li>固定公网 IP</li></ol><span id="more"></span><h2 id="设置变量"><a class="markdownIt-Anchor" href="#设置变量"></a> 设置变量</h2><p>请将 <code>rd.example.com</code> 换成你的域名或 VPS 公网 IP。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> RD_DOMAIN=<span class="string">&quot;rd.example.com&quot;</span></span><br></pre></td></tr></table></figure><h2 id="安装基础工具和-docker"><a class="markdownIt-Anchor" href="#安装基础工具和-docker"></a> 安装基础工具和 Docker</h2><p>若已安装 Docker，可跳过此步骤。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install -y ca-certificates curl wget gnupg</span><br><span class="line"></span><br><span class="line">. /etc/os-release</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;<span class="variable">$ID</span>&quot;</span> = <span class="string">&quot;ubuntu&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">  DOCKER_OS=<span class="string">&quot;ubuntu&quot;</span></span><br><span class="line">  DOCKER_CODENAME=<span class="string">&quot;<span class="variable">$&#123;UBUNTU_CODENAME:-<span class="variable">$VERSION_CODENAME</span>&#125;</span>&quot;</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="string">&quot;<span class="variable">$ID</span>&quot;</span> = <span class="string">&quot;debian&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">  DOCKER_OS=<span class="string">&quot;debian&quot;</span></span><br><span class="line">  DOCKER_CODENAME=<span class="string">&quot;<span class="variable">$VERSION_CODENAME</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Unsupported OS: <span class="variable">$ID</span>&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">sudo install -m 0755 -d /etc/apt/keyrings</span><br><span class="line"></span><br><span class="line">sudo curl -fsSL <span class="string">&quot;https://download.docker.com/linux/<span class="variable">$DOCKER_OS</span>/gpg&quot;</span> -o /etc/apt/keyrings/docker.asc</span><br><span class="line"></span><br><span class="line">sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/docker.asc</span><br><span class="line"></span><br><span class="line">sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/docker.sources &gt;/dev/null &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://download.docker.com/linux/$DOCKER_OS</span></span><br><span class="line"><span class="string">Suites: $DOCKER_CODENAME</span></span><br><span class="line"><span class="string">Components: stable</span></span><br><span class="line"><span class="string">Architectures: $(dpkg --print-architecture)</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/docker.asc</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</span><br><span class="line"></span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now docker</span><br></pre></td></tr></table></figure><h2 id="确保-ufw-正确配置"><a class="markdownIt-Anchor" href="#确保-ufw-正确配置"></a> 确保 UFW 正确配置</h2><p>请务必确保 UFW 已按照<a href="https://github.com/chaifeng/ufw-docker#%E8%A7%A3%E5%86%B3-ufw-%E5%92%8C-docker-%E7%9A%84%E9%97%AE%E9%A2%98">此教程</a>进行了配置。</p><h2 id="部署-rustdesk-server"><a class="markdownIt-Anchor" href="#部署-rustdesk-server"></a> 部署 RustDesk Server</h2><p>RustDesk OSS 服务端主要是 <code>hbbs</code> 和 <code>hbbr</code>；官方端口里，最小需要 <code>21115/tcp</code>、<code>21116/tcp+udp</code>、<code>21117/tcp</code>，<code>21118/21119</code> 是 Web Client，不需要就不要开启。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /opt/rustdesk-server/data</span><br><span class="line"><span class="built_in">cd</span> /opt/rustdesk-server</span><br><span class="line"></span><br><span class="line">sudo <span class="built_in">tee</span> compose.yml &gt;/dev/null &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">services:</span></span><br><span class="line"><span class="string">  hbbs:</span></span><br><span class="line"><span class="string">    container_name: hbbs</span></span><br><span class="line"><span class="string">    image: rustdesk/rustdesk-server:latest</span></span><br><span class="line"><span class="string">    command: hbbs -r $&#123;RD_DOMAIN&#125;:21117 -k _</span></span><br><span class="line"><span class="string">    volumes:</span></span><br><span class="line"><span class="string">      - ./data:/root</span></span><br><span class="line"><span class="string">    ports:</span></span><br><span class="line"><span class="string">      - &quot;0.0.0.0:21115:21115/tcp&quot;</span></span><br><span class="line"><span class="string">      - &quot;0.0.0.0:21116:21116/tcp&quot;</span></span><br><span class="line"><span class="string">      - &quot;0.0.0.0:21116:21116/udp&quot;</span></span><br><span class="line"><span class="string">    depends_on:</span></span><br><span class="line"><span class="string">      - hbbr</span></span><br><span class="line"><span class="string">    restart: unless-stopped</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  hbbr:</span></span><br><span class="line"><span class="string">    container_name: hbbr</span></span><br><span class="line"><span class="string">    image: rustdesk/rustdesk-server:latest</span></span><br><span class="line"><span class="string">    command: hbbr -k _</span></span><br><span class="line"><span class="string">    volumes:</span></span><br><span class="line"><span class="string">      - ./data:/root</span></span><br><span class="line"><span class="string">    ports:</span></span><br><span class="line"><span class="string">      - &quot;0.0.0.0:21117:21117/tcp&quot;</span></span><br><span class="line"><span class="string">    restart: unless-stopped</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line">sudo docker compose up -d</span><br></pre></td></tr></table></figure><h2 id="防火墙放行-rustdesk-容器端口"><a class="markdownIt-Anchor" href="#防火墙放行-rustdesk-容器端口"></a> 防火墙放行 RustDesk 容器端口</h2><p>执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw route allow proto tcp from any to any port 21115</span><br><span class="line">sudo ufw route allow proto tcp from any to any port 21116</span><br><span class="line">sudo ufw route allow proto udp from any to any port 21116</span><br><span class="line">sudo ufw route allow proto tcp from any to any port 21117</span><br><span class="line"></span><br><span class="line">sudo ufw reload</span><br></pre></td></tr></table></figure><p>检查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw status verbose</span><br></pre></td></tr></table></figure><p>若 VPS 有单独的网页控制台安全组或防火墙，确保放行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">TCP 21115</span><br><span class="line">TCP 21116</span><br><span class="line">UDP 21116</span><br><span class="line">TCP 21117</span><br></pre></td></tr></table></figure><h2 id="检查服务"><a class="markdownIt-Anchor" href="#检查服务"></a> 检查服务</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">cd /opt/rustdesk-server</span><br><span class="line"></span><br><span class="line">sudo docker compose ps</span><br><span class="line">sudo docker logs hbbs --tail=80</span><br><span class="line">sudo docker logs hbbr --tail=80</span><br><span class="line"></span><br><span class="line">sudo ss -lntup | grep -E &#x27;21115|21116|21117&#x27;</span><br><span class="line">sudo ss -lnup  | grep 21116</span><br></pre></td></tr></table></figure><p>获取服务端 public key：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">cat</span> /opt/rustdesk-server/data/id_ed25519.pub</span><br></pre></td></tr></table></figure><h2 id="rustdesk-客户端如何配置"><a class="markdownIt-Anchor" href="#rustdesk-客户端如何配置"></a> RustDesk 客户端如何配置</h2><p>以电脑端客户端为例，点击左侧 ID 旁边的三个点 ⋮，然后进 <code>Network</code> -&gt; <code>ID/Relay server</code>，，按照下面填写：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ID Server:</span><br><span class="line">  rd.example.com（你的域名或 VPS 的 IP）</span><br><span class="line"></span><br><span class="line">Relay Server:</span><br><span class="line">  留空，或者填 rd.example.com:21117</span><br><span class="line"></span><br><span class="line">Key:</span><br><span class="line">  粘贴 id_ed25519.pub 内容</span><br></pre></td></tr></table></figure><p>之后，关闭并重启客户端即可。</p><h2 id="未来升级"><a class="markdownIt-Anchor" href="#未来升级"></a> 未来升级</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /opt/rustdesk-server</span><br><span class="line"></span><br><span class="line">sudo tar -czf ~/rustdesk-server-data-$(<span class="built_in">date</span> +%F).tar.gz data</span><br><span class="line"></span><br><span class="line">sudo docker compose pull</span><br><span class="line">sudo docker compose up -d</span><br><span class="line">sudo docker image prune -f</span><br><span class="line"></span><br><span class="line">sudo ufw reload</span><br></pre></td></tr></table></figure><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ul><li><a href="https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/">RustDesk Documentation</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 VPS 上搭建 RustDesk 服务，本文适用于 Debian 13 以及 Ubuntu 24.04 系统。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尤其注意进行 UFW 针对 Docker 的配置，这是前置条件。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VPS 的规格要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;512MB 及以上内存&lt;/li&gt;
&lt;li&gt;固定公网 IP&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="rustdesk" scheme="https://blog.chaos.run/tags/rustdesk/"/>
    
  </entry>
  
  <entry>
    <title>临时修复 Copy Fail 漏洞</title>
    <link href="https://blog.chaos.run/dreams/temporary-fix-copy-fail/"/>
    <id>https://blog.chaos.run/dreams/temporary-fix-copy-fail/</id>
    <published>2026-04-30T08:36:22.000Z</published>
    <updated>2026-06-18T17:36:38.964Z</updated>
    
    <content type="html"><![CDATA[<p>针对 <code>CVE-2026-31431</code>，在不重启服务器的情况下临时封堵漏洞。</p><p>本文以 Debian / Ubuntu 系统为例。</p><span id="more"></span><h2 id="检查发行版更新状态"><a class="markdownIt-Anchor" href="#检查发行版更新状态"></a> 检查发行版更新状态</h2><p>首先，需要先确认你在使用的发行版是否已经推送了该漏洞的内核修复更新。</p><p>例如：Debian 系统在<a href="https://security-tracker.debian.org/tracker/CVE-2026-31431">此页面</a>查看；Ubuntu 系统在<a href="https://ubuntu.com/security/CVE-2026-31431">此页面</a>查看。</p><ul><li>若你的版本尚未有更新，采用方法一</li><li>若已有更新，直接更新系统，然后重启</li><li>若已有更新，但暂时不方便重启，采用方法二</li></ul><h2 id="方法一暂时禁用-algif_aead-模块"><a class="markdownIt-Anchor" href="#方法一暂时禁用-algif_aead-模块"></a> 方法一：暂时禁用 algif_aead 模块</h2><p>Debian 和 Ubuntu 稍有不同，原因是 Ubuntu 内核</p><h3 id="debian-系统"><a class="markdownIt-Anchor" href="#debian-系统"></a> Debian 系统</h3><p><strong>Debian 系统目前已为大部分版本推送内核更新，可直接更新内核然后重启系统，而不必采用下面的方法。</strong></p><p>此方法适用于：发行版尚未推送内核更新，暂时通过禁用模块避免漏洞利用。</p><p>执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;install algif_aead /bin/false&quot;</span> | sudo <span class="built_in">tee</span> /etc/modprobe.d/disable-algif_aead.conf</span><br><span class="line">sudo modprobe -r algif_aead 2&gt;/dev/null || <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这样，不需要重启就能生效。重启后仍生效。</p><p>检查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo modprobe algif_aead; <span class="built_in">echo</span> $?</span><br><span class="line">lsmod | grep <span class="string">&#x27;^algif_aead&#x27;</span> || <span class="built_in">echo</span> <span class="string">&quot;algif_aead not loaded&quot;</span></span><br></pre></td></tr></table></figure><h3 id="ubuntu-系统"><a class="markdownIt-Anchor" href="#ubuntu-系统"></a> Ubuntu 系统</h3><p>Ubuntu 有些发行版并未推送内核更新，但可通过升级 kmod 包自动禁用受影响的模块。具体可参考<a href="https://ubuntu.com/blog/copy-fail-vulnerability-fixes-available">官方教程</a>。</p><p>主要就是更新 kmod：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade</span><br><span class="line">sudo apt update &amp;&amp; sudo apt install --only-upgrade kmod</span><br></pre></td></tr></table></figure><p>如果不重启，卸载模块：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo rmmod algif_aead 2&gt;/dev/null </span><br></pre></td></tr></table></figure><p>检查模块是否还在：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -qE <span class="string">&#x27;^algif_aead &#x27;</span> /proc/modules &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;Affected module is loaded&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;Affected module is NOT loaded&quot;</span></span><br></pre></td></tr></table></figure><h2 id="方法二重启前临时修复"><a class="markdownIt-Anchor" href="#方法二重启前临时修复"></a> 方法二：重启前临时修复</h2><p>此方法适用于：已接收到漏洞的内核更新，但暂时不方便重启加载新内核的情况。</p><p>不适用于内核无法接收安全更新的任何情况。</p><h3 id="1-更新内核"><a class="markdownIt-Anchor" href="#1-更新内核"></a> 1. 更新内核</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt full-upgrade -y</span><br></pre></td></tr></table></figure><p>虽然已经收到了内核更新，但未重启前仍未加载新内核。因此做以下临时修复。</p><h3 id="2-查看当前运行内核是否有-copy-fail-暴露面"><a class="markdownIt-Anchor" href="#2-查看当前运行内核是否有-copy-fail-暴露面"></a> 2. 查看当前运行内核是否有 Copy Fail 暴露面</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">uname</span> -r</span><br><span class="line"></span><br><span class="line">grep -E <span class="string">&#x27;^CONFIG_CRYPTO_USER_API_AEAD=&#x27;</span> /boot/config-$(<span class="built_in">uname</span> -r) 2&gt;/dev/null || \</span><br><span class="line">zcat /proc/config.gz 2&gt;/dev/null | grep -E <span class="string">&#x27;^CONFIG_CRYPTO_USER_API_AEAD=&#x27;</span></span><br><span class="line"></span><br><span class="line">modprobe -n -v algif_aead 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">lsmod | grep <span class="string">&#x27;^algif_aead&#x27;</span> || <span class="built_in">echo</span> <span class="string">&quot;algif_aead not loaded&quot;</span></span><br></pre></td></tr></table></figure><p>判断：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CONFIG_CRYPTO_USER_API_AEAD=m   # algif_aead 是模块，可以临时禁用</span><br><span class="line">CONFIG_CRYPTO_USER_API_AEAD=y   # 编进内核，无法用 modprobe 禁用，只能重启到新内核</span><br><span class="line">没有输出 / is not set              # 一般不受这个 algif_aead 路径影响</span><br></pre></td></tr></table></figure><p>如果看到类似：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">insmod /lib/modules/.../algif_aead.ko</span><br></pre></td></tr></table></figure><p>说明它可以被加载，需要临时禁用。</p><hr /><h3 id="3-重启后自动消失的临时修法"><a class="markdownIt-Anchor" href="#3-重启后自动消失的临时修法"></a> 3. 重启后自动消失的临时修法</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">sudo install -d -m 0755 /run/modprobe.d</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span> <span class="string">&#x27;install algif_aead /bin/false\n&#x27;</span> | \</span><br><span class="line">  sudo <span class="built_in">tee</span> /run/modprobe.d/zz-copyfail-disable-algif_aead.conf &gt;/dev/null</span><br><span class="line"></span><br><span class="line">sudo modprobe -r algif_aead 2&gt;/dev/null || <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这只写到 <code>/run/modprobe.d</code>，<strong>重启后自动消失</strong>。</p><hr /><h3 id="4-检查修法是否成功"><a class="markdownIt-Anchor" href="#4-检查修法是否成功"></a> 4. 检查修法是否成功</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">modprobe -n -v algif_aead</span><br><span class="line"></span><br><span class="line">lsmod | grep <span class="string">&#x27;^algif_aead&#x27;</span> || <span class="built_in">echo</span> <span class="string">&quot;algif_aead not loaded&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> /run/modprobe.d/zz-copyfail-disable-algif_aead.conf</span><br></pre></td></tr></table></figure><p>成功状态应类似：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">install /bin/false</span><br><span class="line">algif_aead not loaded</span><br><span class="line">install algif_aead /bin/false</span><br></pre></td></tr></table></figure><p>再做一次实际加载测试：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo modprobe algif_aead; <span class="built_in">echo</span> $?</span><br></pre></td></tr></table></figure><p>成功禁用时应返回非 0，例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1</span><br></pre></td></tr></table></figure><p>然后确认仍未加载：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lsmod | grep <span class="string">&#x27;^algif_aead&#x27;</span> || <span class="built_in">echo</span> <span class="string">&quot;algif_aead still blocked&quot;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;针对 &lt;code&gt;CVE-2026-31431&lt;/code&gt;，在不重启服务器的情况下临时封堵漏洞。&lt;/p&gt;
&lt;p&gt;本文以 Debian / Ubuntu 系统为例。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 Xray 的 VLESS + XHTTP + TLS + Nginx 并使用 Cloudflare</title>
    <link href="https://blog.chaos.run/dreams/xray-vless-xhttp-cloudflare-nginx/"/>
    <id>https://blog.chaos.run/dreams/xray-vless-xhttp-cloudflare-nginx/</id>
    <published>2026-04-27T14:24:37.000Z</published>
    <updated>2026-06-18T17:36:38.966Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 5 月 14 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 Xray-core 的 VLESS + XHTTP 服务端，使用 Nginx 反代，并通过 Cloudflare 橙色云隐藏源站 IP。本文同样适用于 Ubuntu 24.04 及以上系统。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，并默认已按初始化配置文章对服务器进行了配置。</p><p>本方案采用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">客户端 Xray</span><br><span class="line">  → Cloudflare 橙色云</span><br><span class="line">  → Nginx TLS + HTTP/2</span><br><span class="line">  → Xray VLESS + XHTTP</span><br></pre></td></tr></table></figure><p>本方案特点：</p><ol><li>XHTTP 使用 H2/gRPC-like 流量形态，适合 Cloudflare 橙色云直回源</li><li>Nginx 负责 TLS、HTTP/2、伪装站和路径分流</li><li>Xray 只监听本地回环地址，不直接暴露公网</li><li>VPS 443 端口只允许 Cloudflare IP 访问</li><li>客户端启用 ECH、uTLS Chrome、XHTTP padding obfs</li><li>证书使用 <a href="http://acme.sh">acme.sh</a> + Cloudflare DNS-01 自动续期</li></ol><p>与 Cloudflare Tunnel 方案相比，本方案性能更直接，XHTTP 兼容性更好；代价是源站必须开放 443 给 Cloudflare，并且需要管理源站证书。</p><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="所需资源"><a class="markdownIt-Anchor" href="#所需资源"></a> 所需资源</h3><ol><li>一台公网 VPS</li><li>一个已托管到 Cloudflare 的域名</li><li>一个子域名，例如 <code>cdn.example.com</code></li><li>一套静态网页，用作伪装站</li></ol><p>下文假设：</p><table><thead><tr><th>项目</th><th>示例值</th></tr></thead><tbody><tr><td>用户名</td><td><code>sammy</code></td></tr><tr><td>域名</td><td><code>cdn.example.com</code></td></tr><tr><td>Xray 本地端口</td><td><code>127.0.0.1:10000</code></td></tr><tr><td>伪装站目录</td><td><code>/var/www/camouflage</code></td></tr><tr><td>XHTTP 路径</td><td><code>/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</code></td></tr><tr><td>Header Token</td><td><code>f9e2c4a7b1d8e6c3a0f5b2d9e8c1a4b7d6e0f3a9c2b5d1e8</code></td></tr></tbody></table><p>生成 UUID：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> /proc/sys/kernel/random/uuid</span><br></pre></td></tr></table></figure><p>生成随机路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 16</span><br></pre></td></tr></table></figure><p>生成 Header Token：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 24</span><br></pre></td></tr></table></figure><hr /><h2 id="cloudflare-设置"><a class="markdownIt-Anchor" href="#cloudflare-设置"></a> Cloudflare 设置</h2><h3 id="dns"><a class="markdownIt-Anchor" href="#dns"></a> DNS</h3><p>添加 DNS 记录：</p><table><thead><tr><th>类型</th><th>名称</th><th>内容</th><th>代理状态</th></tr></thead><tbody><tr><td>A</td><td><code>cdn</code></td><td>VPS IPv4</td><td>Proxied</td></tr><tr><td>AAAA</td><td><code>cdn</code></td><td>VPS IPv6</td><td>Proxied，若有 IPv6</td></tr></tbody></table><p>必须是橙色云。</p><h3 id="ssltls-与-network"><a class="markdownIt-Anchor" href="#ssltls-与-network"></a> SSL/TLS 与 Network</h3><p>进入 Cloudflare 域名 Dashboard：</p><table><thead><tr><th>位置</th><th>设置</th></tr></thead><tbody><tr><td>SSL/TLS → Overview</td><td>Full (strict)</td></tr><tr><td>SSL/TLS → Edge Certificates</td><td>TLS 1.3 On</td></tr><tr><td>SSL/TLS → Edge Certificates</td><td>Minimum TLS Version: TLS 1.3</td></tr><tr><td>SSL/TLS → Edge Certificates</td><td>确认 ECH 可用；Free zone 通常默认启用</td></tr><tr><td>Speed → Settings → Protocol Optimization</td><td>HTTP/2 默认开启</td></tr><tr><td>Speed → Settings → Protocol Optimization</td><td>HTTP/2 to Origin 默认开启</td></tr><tr><td>Network</td><td>gRPC On</td></tr></tbody></table><p>Cloudflare gRPC 要求源站监听 443、支持 TLS、支持 HTTP/2，并通过 ALPN 宣告 HTTP/2。</p><h3 id="cache-rules"><a class="markdownIt-Anchor" href="#cache-rules"></a> Cache Rules</h3><p>Caching -&gt; Cache Rules 为 XHTTP 路径创建缓存绕过规则：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">When:</span><br><span class="line">  Hostname equals cdn.example.com</span><br><span class="line">  AND URI Path starts with /a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</span><br><span class="line"></span><br><span class="line">Then:</span><br><span class="line">  Cache eligibility: Bypass cache</span><br></pre></td></tr></table></figure><h3 id="waf-skip-rule"><a class="markdownIt-Anchor" href="#waf-skip-rule"></a> WAF Skip Rule</h3><p>Security-&gt; Security Rules 创建 Custom Rule：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Expression:</span><br><span class="line">  (http.host eq &quot;cdn.example.com&quot; and starts_with(http.request.uri.path, &quot;/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6&quot;))</span><br><span class="line"></span><br><span class="line">Action:</span><br><span class="line">  Skip</span><br></pre></td></tr></table></figure><p>建议跳过：</p><ul><li>WAF Managed Rules</li><li>Rate Limiting Rules</li><li>Super Bot Fight Mode Rules</li><li>Browser Integrity Check</li></ul><hr /><h2 id="vps-初始化"><a class="markdownIt-Anchor" href="#vps-初始化"></a> VPS 初始化</h2><p>安装基本工具：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install curl wget vim unzip ca-certificates gnupg lsb-release openssl socat ufw -y</span><br></pre></td></tr></table></figure><hr /><h2 id="服务器防火墙"><a class="markdownIt-Anchor" href="#服务器防火墙"></a> 服务器防火墙</h2><p>只允许 Cloudflare IP 访问 443。本文假设初始化文章已配置并启用 UFW，且 SSH 已放行；本节只新增 Cloudflare 到 443 的规则。</p><p>创建脚本目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /root/scripts/ufw</span><br></pre></td></tr></table></figure><p>添加 Cloudflare 规则：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /root/scripts/ufw/add-cloudflare.sh</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> -p /root/scripts/ufw</span><br><span class="line"><span class="built_in">cd</span> /root/scripts/ufw</span><br><span class="line"></span><br><span class="line">curl -sL https://www.cloudflare.com/ips-v4 -o ips-v4</span><br><span class="line">curl -sL https://www.cloudflare.com/ips-v6 -o ips-v6</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v4); <span class="keyword">do</span></span><br><span class="line">    ufw allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v6); <span class="keyword">do</span></span><br><span class="line">    ufw allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p>更新 Cloudflare 规则：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /root/scripts/ufw/update-cloudflare.sh</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /root/scripts/ufw</span><br><span class="line"></span><br><span class="line">curl -sL https://www.cloudflare.com/ips-v4 -o ips-v4.new</span><br><span class="line">curl -sL https://www.cloudflare.com/ips-v6 -o ips-v6.new</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ ! -f ips-v4 ] || [ ! -f ips-v6 ] || ! cmp -s ips-v4 ips-v4.new || ! cmp -s ips-v6 ips-v6.new; <span class="keyword">then</span></span><br><span class="line">    <span class="keyword">if</span> [ -f ips-v4 ]; <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v4); <span class="keyword">do</span></span><br><span class="line">            ufw delete allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp || <span class="literal">true</span></span><br><span class="line">        <span class="keyword">done</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> [ -f ips-v6 ]; <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v6); <span class="keyword">do</span></span><br><span class="line">            ufw delete allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp || <span class="literal">true</span></span><br><span class="line">        <span class="keyword">done</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">mv</span> ips-v4.new ips-v4</span><br><span class="line">    <span class="built_in">mv</span> ips-v6.new ips-v6</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v4); <span class="keyword">do</span></span><br><span class="line">        ufw allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp</span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> ip <span class="keyword">in</span> $(<span class="built_in">cat</span> ips-v6); <span class="keyword">do</span></span><br><span class="line">        ufw allow from <span class="string">&quot;<span class="variable">$ip</span>&quot;</span> to any port 443 proto tcp</span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    <span class="built_in">rm</span> -f ips-v4.new ips-v6.new</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo bash /root/scripts/ufw/add-cloudflare.sh</span><br><span class="line">sudo ufw status numbered</span><br></pre></td></tr></table></figure><p>添加定时更新：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo crontab -e</span><br></pre></td></tr></table></figure><p>加入：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">MAILTO=&quot;&quot;</span><br><span class="line">5 3 * * * /bin/bash /root/scripts/ufw/update-cloudflare.sh</span><br></pre></td></tr></table></figure><hr /><h2 id="安装-nginx"><a class="markdownIt-Anchor" href="#安装-nginx"></a> 安装 Nginx</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install nginx -y</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now nginx</span><br><span class="line">sudo <span class="built_in">rm</span> -f /etc/nginx/sites-enabled/default</span><br></pre></td></tr></table></figure><hr /><h2 id="安装-xray-core"><a class="markdownIt-Anchor" href="#安装-xray-core"></a> 安装 Xray-core</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo bash -c <span class="string">&quot;<span class="subst">$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)</span>&quot;</span> @ install</span><br></pre></td></tr></table></figure><p>检查版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xray version</span><br></pre></td></tr></table></figure><p>建议使用 v26.3.27 或更新版本。</p><hr /><h2 id="申请证书"><a class="markdownIt-Anchor" href="#申请证书"></a> 申请证书</h2><p>本文使用 <a href="http://acme.sh">acme.sh</a> + Cloudflare DNS-01。这样不需要开放 80，也不受橙色云影响。</p><p><a href="http://acme.sh">acme.sh</a> 可以用普通用户运行，但官方更推荐 root。本文按 root 安装，省去证书目录权限和 sudo reload 的额外配置。</p><h3 id="切换到-root"><a class="markdownIt-Anchor" href="#切换到-root"></a> 切换到 root</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo -i</span><br></pre></td></tr></table></figure><p>后续本节命令均在 root shell 中执行。</p><h3 id="安装-acmesh"><a class="markdownIt-Anchor" href="#安装-acmesh"></a> 安装 <a href="http://acme.sh">acme.sh</a></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl https://get.acme.sh | sh -s email=you@example.com</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><p>如需固定使用 Let’s Encrypt，可执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.acme.sh/acme.sh --set-default-ca --server letsencrypt</span><br></pre></td></tr></table></figure><p>不执行也可以，<a href="http://acme.sh">acme.sh</a> 会使用自身默认 CA。</p><h3 id="准备-cloudflare-api-token"><a class="markdownIt-Anchor" href="#准备-cloudflare-api-token"></a> 准备 Cloudflare API Token</h3><p>创建 Cloudflare API Token，建议使用以下设置：</p><ul><li>Permissions：Zone → DNS → Edit</li><li>Zone Resources：Include → Specific zone → <a href="http://example.com">example.com</a></li><li>Client IP Address Filtering：Is in，分别添加服务器的 ipv4 和 ipv6 稳定出口地址</li></ul><p>设置 token 和 zone ID：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> CF_Token=<span class="string">&quot;你的 Cloudflare API Token&quot;</span></span><br><span class="line"><span class="built_in">export</span> CF_Zone_ID=<span class="string">&quot;你的 Cloudflare Zone ID&quot;</span></span><br></pre></td></tr></table></figure><h3 id="签发并安装证书"><a class="markdownIt-Anchor" href="#签发并安装证书"></a> 签发并安装证书</h3><p>准备证书目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /etc/nginx/ssl</span><br><span class="line"><span class="built_in">chmod</span> 700 /etc/nginx/ssl</span><br></pre></td></tr></table></figure><p>签发 ECC 证书：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.acme.sh/acme.sh --issue --dns dns_cf -d cdn.example.com --keylength ec-256</span><br></pre></td></tr></table></figure><p>安装到 Nginx 使用的路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">~/.acme.sh/acme.sh --install-cert -d cdn.example.com --ecc \</span><br><span class="line">  --key-file       /etc/nginx/ssl/cdn.example.com.key \</span><br><span class="line">  --fullchain-file /etc/nginx/ssl/cdn.example.com.crt \</span><br><span class="line">  --reloadcmd     <span class="string">&quot;systemctl reload nginx&quot;</span></span><br></pre></td></tr></table></figure><p>检查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -l /etc/nginx/ssl/</span><br></pre></td></tr></table></figure><p><a href="http://acme.sh">acme.sh</a> 会在 root 的 crontab 中写入自动续期任务。</p><p>退出 root shell：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exit</span></span><br></pre></td></tr></table></figure><h2 id="伪装站"><a class="markdownIt-Anchor" href="#伪装站"></a> 伪装站</h2><p>创建目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /var/www/camouflage</span><br><span class="line">sudo <span class="built_in">chown</span> -R <span class="variable">$USER</span>:<span class="variable">$USER</span> /var/www/camouflage</span><br><span class="line">sudo <span class="built_in">chmod</span> -R 755 /var/www/camouflage</span><br></pre></td></tr></table></figure><p>自行准备并放入：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/var/www/camouflage/index.html</span><br><span class="line">/var/www/camouflage/404.html</span><br><span class="line">/var/www/camouflage/favicon.ico          可选</span><br><span class="line">/var/www/camouflage/assets/              可选，CSS/JS/图片等静态资源</span><br></pre></td></tr></table></figure><p>推荐使用 Hugo、Hexo、Astro、VitePress 等生成的真实静态站。不要使用 Nginx 默认欢迎页或空白页。</p><hr /><h2 id="nginx-配置"><a class="markdownIt-Anchor" href="#nginx-配置"></a> Nginx 配置</h2><p>编辑：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/nginx/sites-available/cdn.example.com</span><br></pre></td></tr></table></figure><p>Debian 13 或 Ubuntu 26.04 及以上可写入：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl default_server;</span><br><span class="line">    <span class="attribute">listen</span> [::]:<span class="number">443</span> ssl default_server;</span><br><span class="line">    <span class="attribute">ssl_reject_handshake</span> <span class="literal">on</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl;</span><br><span class="line">    <span class="attribute">listen</span> [::]:<span class="number">443</span> ssl;</span><br><span class="line">    <span class="attribute">http2</span> <span class="literal">on</span>;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> cdn.example.com;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span> /etc/nginx/ssl/cdn.example.com.crt;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/nginx/ssl/cdn.example.com.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_protocols</span> TLSv1.<span class="number">2</span> TLSv1.<span class="number">3</span>;</span><br><span class="line">    <span class="attribute">ssl_session_timeout</span> <span class="number">1d</span>;</span><br><span class="line">    <span class="attribute">ssl_session_cache</span> shared:SSL:<span class="number">10m</span>;</span><br><span class="line">    <span class="attribute">ssl_session_tickets</span> <span class="literal">off</span>;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">root</span> /var/www/camouflage;</span><br><span class="line">    <span class="attribute">index</span> index.html;</span><br><span class="line">    <span class="attribute">error_page</span> <span class="number">404</span> /<span class="number">404</span>.html;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span><span class="regexp"> ^~</span> /a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 &#123;</span><br><span class="line">        <span class="attribute">if</span> (<span class="variable">$http_x_access_token</span> != <span class="string">&quot;f9e2c4a7b1d8e6c3a0f5b2d9e8c1a4b7d6e0f3a9c2b5d1e8&quot;</span>) &#123;</span><br><span class="line">            <span class="attribute">return</span> <span class="number">404</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="attribute">grpc_pass</span> grpc://127.0.0.1:10000;</span><br><span class="line">        <span class="attribute">grpc_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">grpc_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">grpc_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line"></span><br><span class="line">        <span class="attribute">grpc_connect_timeout</span> <span class="number">60s</span>;</span><br><span class="line">        <span class="attribute">grpc_send_timeout</span> <span class="number">3600s</span>;</span><br><span class="line">        <span class="attribute">grpc_read_timeout</span> <span class="number">3600s</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> = /<span class="number">404</span>.html &#123;</span><br><span class="line">        internal;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">try_files</span> <span class="variable">$uri</span> <span class="variable">$uri</span>/ =<span class="number">404</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">access_log</span> /var/log/nginx/cdn.example.com.access.log;</span><br><span class="line">    <span class="attribute">error_log</span> /var/log/nginx/cdn.example.com.<span class="literal">error</span>.log <span class="literal">warn</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>若为 Ubuntu 24.04 及以下，则需要用 <code>listen 443 ssl http2 default_server;</code>、<code>listen [::]:443 ssl http2 default_server;</code>、<code>listen 443 ssl http2;</code>、<code>listen [::]:443 ssl http2;</code> 这样的写法，并删除 <code>http2 on;</code>。</p><p>第一个 <code>default_server</code> 用于拒绝错误 SNI、直接访问 IP、未带 SNI 的 HTTPS 探测。无需再准备自签默认证书。</p><p>启用站点：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">ln</span> -sf /etc/nginx/sites-available/cdn.example.com /etc/nginx/sites-enabled/cdn.example.com</span><br><span class="line">sudo nginx -t</span><br><span class="line">sudo systemctl reload nginx</span><br></pre></td></tr></table></figure><hr /><h2 id="xray-服务端配置"><a class="markdownIt-Anchor" href="#xray-服务端配置"></a> Xray 服务端配置</h2><p>编辑：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /usr/local/etc/xray/config.json</span><br></pre></td></tr></table></figure><p>写入，注意替换 UUID、域名、路径：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;loglevel&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warning&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;https+local://1.1.1.1/dns-query&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;https+local://8.8.8.8/dns-query&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;queryStrategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;UseIP&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless-xhttp-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;127.0.0.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">10000</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;clients&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;替换为你的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;email&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;decryption&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;streamSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;network&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xhttp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;security&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;xhttpSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingBytes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;100-1000&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingObfsMode&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingMethod&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tokenish&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingPlacement&quot;</span><span class="punctuation">:</span> <span class="string">&quot;header&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingHeader&quot;</span><span class="punctuation">:</span> <span class="string">&quot;X-Cache&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;_dc&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;serverMaxHeaderBytes&quot;</span><span class="punctuation">:</span> <span class="number">8192</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;freedom&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;domainStrategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;UseIP&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;block&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;blackhole&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;routing&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;field&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;ip&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;geoip:private&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outboundTag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;block&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;field&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;bittorrent&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outboundTag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;block&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>检查并启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo xray run -<span class="built_in">test</span> -config /usr/local/etc/xray/config.json</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now xray</span><br><span class="line">sudo systemctl restart xray</span><br></pre></td></tr></table></figure><p>检查监听：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ss -tlnp | grep 10000</span><br></pre></td></tr></table></figure><p>应看到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:10000</span><br></pre></td></tr></table></figure><hr /><h2 id="客户端配置"><a class="markdownIt-Anchor" href="#客户端配置"></a> 客户端配置</h2><p>以下为 Xray 客户端示例。注意替换 UUID、域名、路径和 Header Token。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;loglevel&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warning&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;socks-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;127.0.0.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">10808</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;socks&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;udp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;127.0.0.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">10809</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;vnext&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;替换为你的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;encryption&quot;</span><span class="punctuation">:</span> <span class="string">&quot;none&quot;</span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;streamSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;network&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xhttp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;security&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tls&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tlsSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;serverName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;h2&quot;</span></span><br><span class="line">          <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;echConfigList&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://1.1.1.1/dns-query&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;xhttpSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;headers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;X-Access-Token&quot;</span><span class="punctuation">:</span> <span class="string">&quot;f9e2c4a7b1d8e6c3a0f5b2d9e8c1a4b7d6e0f3a9c2b5d1e8&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingBytes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;100-1000&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingObfsMode&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingMethod&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tokenish&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingPlacement&quot;</span><span class="punctuation">:</span> <span class="string">&quot;header&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingHeader&quot;</span><span class="punctuation">:</span> <span class="string">&quot;X-Cache&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;xPaddingKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;_dc&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;freedom&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;block&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;blackhole&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;routing&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;field&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;ip&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;geoip:private&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outboundTag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;field&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;bittorrent&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outboundTag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;block&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="ech-配置"><a class="markdownIt-Anchor" href="#ech-配置"></a> ECH 配置</h3><p>2026 年 5 月后的新版 Xray-core 中，配置 <code>echConfigList</code> 即表示启用 ECH，并会强制使用 ECH；如果拿不到有效 ECHConfig，客户端不会回退到明文 SNI。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;echConfigList&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://1.1.1.1/dns-query&quot;</span></span><br></pre></td></tr></table></figure><p>如果 ECH 导致连接失败，可尝试把 <code>echConfigList</code> 改为 <code>udp://1.1.1.1</code>，或者删除该字段，即不启用 ECH。</p><h3 id="使用-cloudflare-优选-ip"><a class="markdownIt-Anchor" href="#使用-cloudflare-优选-ip"></a> 使用 Cloudflare 优选 IP</h3><p>如果使用优选 IP，只改：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="string">&quot;104.16.132.229&quot;</span></span><br></pre></td></tr></table></figure><p>以下两项保持真实域名：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;serverName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span></span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span></span><br></pre></td></tr></table></figure><hr /><h2 id="验证"><a class="markdownIt-Anchor" href="#验证"></a> 验证</h2><h3 id="服务状态"><a class="markdownIt-Anchor" href="#服务状态"></a> 服务状态</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status nginx</span><br><span class="line">sudo systemctl status xray</span><br><span class="line">sudo ss -tlnp | grep -E <span class="string">&#x27;443|10000&#x27;</span></span><br></pre></td></tr></table></figure><p>应看到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">0.0.0.0:443</span><br><span class="line">[::]:443</span><br><span class="line">127.0.0.1:10000</span><br></pre></td></tr></table></figure><h3 id="浏览器访问"><a class="markdownIt-Anchor" href="#浏览器访问"></a> 浏览器访问</h3><p>访问：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://cdn.example.com</span><br></pre></td></tr></table></figure><p>应显示伪装站首页。</p><p>访问：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://cdn.example.com/任意不存在路径</span><br></pre></td></tr></table></figure><p>应显示自定义 404。</p><p>访问隐藏路径：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://cdn.example.com/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</span><br></pre></td></tr></table></figure><p>也应显示 404，因为浏览器没有 <code>X-Access-Token</code>。</p><p>直接访问源站 IP 或错误域名，应在 TLS 握手阶段被拒绝，不应返回站点证书或伪装站内容。</p><h3 id="检查-echconfig"><a class="markdownIt-Anchor" href="#检查-echconfig"></a> 检查 ECHConfig</h3><p>在客户端本地执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dig cdn.example.com HTTPS @1.1.1.1</span><br></pre></td></tr></table></figure><p>返回中应包含：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ech=...</span><br></pre></td></tr></table></figure><hr /><h2 id="常见问题"><a class="markdownIt-Anchor" href="#常见问题"></a> 常见问题</h2><h3 id="cloudflare-返回-403"><a class="markdownIt-Anchor" href="#cloudflare-返回-403"></a> Cloudflare 返回 403</h3><p>检查：</p><ol><li>Cloudflare gRPC 是否开启</li><li>DNS 是否为橙色云</li><li>SSL/TLS 是否为 Full 或 Full strict</li><li>Nginx 是否监听 443</li><li>Nginx 是否启用 <code>http2 on;</code></li></ol><h3 id="cloudflare-返回-525-526"><a class="markdownIt-Anchor" href="#cloudflare-返回-525-526"></a> Cloudflare 返回 525 / 526</h3><p>检查：</p><ol><li>证书是否存在</li><li>证书域名是否匹配 <code>cdn.example.com</code></li><li>证书是否过期</li><li>Cloudflare SSL/TLS 是否为 Full strict</li></ol><h3 id="浏览器正常客户端不通"><a class="markdownIt-Anchor" href="#浏览器正常客户端不通"></a> 浏览器正常，客户端不通</h3><p>检查：</p><ol><li>UUID 是否一致</li><li>路径是否一致</li><li>Header Token 是否一致</li><li>客户端 <code>serverName</code> 是否为真实域名</li><li>客户端 <code>host</code> 是否为真实域名</li><li>Xray 是否监听 <code>127.0.0.1:10000</code></li><li>Nginx 是否使用 <code>grpc_pass grpc://127.0.0.1:10000</code></li></ol><h3 id="mode-auto-不稳定"><a class="markdownIt-Anchor" href="#mode-auto-不稳定"></a> <code>mode: auto</code> 不稳定</h3><p>客户端改为：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;packet-up&quot;</span></span><br></pre></td></tr></table></figure><p>服务端保持：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br></pre></td></tr></table></figure><h3 id="ech-导致连接失败"><a class="markdownIt-Anchor" href="#ech-导致连接失败"></a> ECH 导致连接失败</h3><p>如果当前是：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;echConfigList&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://1.1.1.1/dns-query&quot;</span></span><br></pre></td></tr></table></figure><p>先改成：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;echConfigList&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp://1.1.1.1&quot;</span></span><br></pre></td></tr></table></figure><p>如果仍然不通，删除 <code>echConfigList</code> 这一行，即不启用 ECH。若删除后能连接，说明 ECHConfig 查询、本地 DNS 路径或当前网络对 ECH 的支持不稳定。</p><h3 id="v26-padding-字段报错"><a class="markdownIt-Anchor" href="#v26-padding-字段报错"></a> v26 padding 字段报错</h3><p>升级 Xray-core。若客户端暂不支持，删除以下字段：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;xPaddingObfsMode&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;xPaddingMethod&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tokenish&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;xPaddingPlacement&quot;</span><span class="punctuation">:</span> <span class="string">&quot;header&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;xPaddingHeader&quot;</span><span class="punctuation">:</span> <span class="string">&quot;X-Cache&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;xPaddingKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;_dc&quot;</span></span><br></pre></td></tr></table></figure><p>只保留：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;xPaddingBytes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;100-1000&quot;</span></span><br></pre></td></tr></table></figure><p>客户端和服务端要保持一致。</p><hr /><h2 id="更新维护"><a class="markdownIt-Anchor" href="#更新维护"></a> 更新维护</h2><h3 id="更新系统组件"><a class="markdownIt-Anchor" href="#更新系统组件"></a> 更新系统组件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt upgrade -y</span><br><span class="line">sudo systemctl reload nginx</span><br></pre></td></tr></table></figure><h3 id="更新-xray"><a class="markdownIt-Anchor" href="#更新-xray"></a> 更新 Xray</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo bash -c <span class="string">&quot;<span class="subst">$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)</span>&quot;</span> @ install</span><br><span class="line">sudo systemctl restart xray</span><br><span class="line">xray version</span><br></pre></td></tr></table></figure><h3 id="手动续期测试"><a class="markdownIt-Anchor" href="#手动续期测试"></a> 手动续期测试</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo /root/.acme.sh/acme.sh --cron --home /root/.acme.sh --force</span><br></pre></td></tr></table></figure><h3 id="轮换-uuid-路径和-token"><a class="markdownIt-Anchor" href="#轮换-uuid-路径和-token"></a> 轮换 UUID、路径和 Token</h3><p>建议 3 到 6 个月轮换一次：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">xray uuid</span><br><span class="line">openssl rand -hex 16</span><br><span class="line">openssl rand -hex 24</span><br></pre></td></tr></table></figure><p>同步修改：</p><ol><li>Xray 服务端 UUID</li><li>Xray 服务端 path</li><li>Nginx location path</li><li>Nginx Header Token</li><li>客户端 UUID</li><li>客户端 path</li><li>客户端 Header Token</li><li>Cloudflare Cache Rule</li><li>Cloudflare WAF Skip Rule</li></ol><hr /><h2 id="最终配置摘要"><a class="markdownIt-Anchor" href="#最终配置摘要"></a> 最终配置摘要</h2><table><thead><tr><th>项目</th><th>推荐值</th></tr></thead><tbody><tr><td>架构</td><td>Cloudflare 橙色云 → Nginx → Xray</td></tr><tr><td>DNS</td><td>Proxied</td></tr><tr><td>Cloudflare SSL/TLS</td><td>Full strict</td></tr><tr><td>Cloudflare gRPC</td><td>On</td></tr><tr><td>源站端口</td><td>443</td></tr><tr><td>源站证书</td><td><a href="http://acme.sh">acme.sh</a> DNS-01 自动续期</td></tr><tr><td>Nginx HTTP/2</td><td><code>http2 on;</code></td></tr><tr><td>未知 SNI / 直接 IP</td><td><code>ssl_reject_handshake on;</code></td></tr><tr><td>Nginx 到 Xray</td><td><code>grpc_pass grpc://127.0.0.1:10000</code></td></tr><tr><td>Xray 监听</td><td><code>127.0.0.1:10000</code></td></tr><tr><td>Xray 入站</td><td>VLESS + XHTTP</td></tr><tr><td>服务端 TLS</td><td>Nginx 处理，Xray <code>security: none</code></td></tr><tr><td>客户端 TLS</td><td><code>security: tls</code></td></tr><tr><td>客户端 ALPN</td><td><code>h2</code></td></tr><tr><td>客户端 fingerprint</td><td><code>chrome</code></td></tr><tr><td>XHTTP mode</td><td><code>auto</code></td></tr><tr><td>fallback mode</td><td><code>packet-up</code></td></tr><tr><td>ECH 默认</td><td>配置 <code>echConfigList</code></td></tr><tr><td>ECH 排障</td><td>改为 <code>udp://1.1.1.1</code> 或删除 <code>echConfigList</code></td></tr><tr><td>padding</td><td><code>xPaddingBytes + v26 obfs tokenish</code></td></tr><tr><td>伪装站目录</td><td><code>/var/www/camouflage</code></td></tr></tbody></table><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://github.com/XTLS/Xray-core/discussions/4113">Xray-core XHTTP #4113</a></p><p><a href="https://github.com/XTLS/Xray-install">Xray-install</a></p><p><a href="https://xtls.github.io/en/config/transport.html">Xray Transport / ECH</a></p><p><a href="https://developers.cloudflare.com/network/grpc-connections/">Cloudflare gRPC connections</a></p><p><a href="https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full-strict/">Cloudflare Full strict</a></p><p><a href="https://developers.cloudflare.com/ssl/edge-certificates/ech/">Cloudflare ECH</a></p><p><a href="https://www.cloudflare.com/ips/">Cloudflare IP ranges</a></p><p><a href="https://developers.cloudflare.com/cache/how-to/cache-rules/settings/">Cloudflare Cache Rules</a></p><p><a href="https://developers.cloudflare.com/waf/custom-rules/skip/">Cloudflare WAF Skip action</a></p><p><a href="https://nginx.org/en/CHANGES">Nginx changelog</a></p><p><a href="https://nginx.org/en/docs/http/ngx_http_grpc_module.html">Nginx grpc module</a></p><p><a href="https://nginx.org/en/docs/http/ngx_http_ssl_module.html">Nginx SSL module</a></p><p><a href="https://github.com/acmesh-official/acme.sh">acme.sh</a></p><p><a href="https://github.com/acmesh-official/acme.sh/blob/master/dnsapi/dns_cf.sh">acme.sh Cloudflare DNS API</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 5 月 14 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 Xray-core 的 VLESS + XHTTP 服务端，使用 Nginx 反代，并通过 Cloudflare 橙色云隐藏源站 IP。本文同样适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;p&gt;本方案采用：&lt;/p&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;客户端 Xray&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  → Cloudflare 橙色云&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  → Nginx TLS + HTTP/2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  → Xray VLESS + XHTTP&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;本方案特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;XHTTP 使用 H2/gRPC-like 流量形态，适合 Cloudflare 橙色云直回源&lt;/li&gt;
&lt;li&gt;Nginx 负责 TLS、HTTP/2、伪装站和路径分流&lt;/li&gt;
&lt;li&gt;Xray 只监听本地回环地址，不直接暴露公网&lt;/li&gt;
&lt;li&gt;VPS 443 端口只允许 Cloudflare IP 访问&lt;/li&gt;
&lt;li&gt;客户端启用 ECH、uTLS Chrome、XHTTP padding obfs&lt;/li&gt;
&lt;li&gt;证书使用 &lt;a href=&quot;http://acme.sh&quot;&gt;acme.sh&lt;/a&gt; + Cloudflare DNS-01 自动续期&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与 Cloudflare Tunnel 方案相比，本方案性能更直接，XHTTP 兼容性更好；代价是源站必须开放 443 给 Cloudflare，并且需要管理源站证书。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="cloudflare" scheme="https://blog.chaos.run/tags/cloudflare/"/>
    
    <category term="xray" scheme="https://blog.chaos.run/tags/xray/"/>
    
    <category term="xhttp" scheme="https://blog.chaos.run/tags/xhttp/"/>
    
    <category term="vless" scheme="https://blog.chaos.run/tags/vless/"/>
    
    <category term="nginx" scheme="https://blog.chaos.run/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 Hysteria2 服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-hysteria2/"/>
    <id>https://blog.chaos.run/dreams/sing-box-hysteria2/</id>
    <published>2026-04-26T23:58:56.000Z</published>
    <updated>2026-06-18T17:36:38.963Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 4 月 26 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 sing-box 的 Hysteria2 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>基于 QUIC（UDP）传输，配合 Brutal 拥塞控制可在高丢包环境下维持较高吞吐</li><li>需要域名，需要 TLS 证书（本文使用 ACME DNS-01 自动签发）</li><li>启用 salamander 混淆以规避按标准 QUIC Initial 提取 SNI 的审查</li><li>配合端口跳跃以缓解运营商单端口 UDP 阻断</li><li>无需 Nginx 或其他 Web 服务器，客户端与 VPS 直连</li></ol><p>该方案适用于需要 UDP 吞吐、线路存在拥塞或 QoS 的场景。对于 UDP 环境恶劣、更重视长期隐蔽性的场景，建议考虑 <a href="/dreams/sing-box-anytls-reality/">AnyTLS + REALITY 方案</a> 等基于 TCP 的方案。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="hysteria2-与审查现状"><a class="markdownIt-Anchor" href="#hysteria2-与审查现状"></a> Hysteria2 与审查现状</h3><p>Hysteria2 基于 QUIC 协议。有些研究显示，自 2024 年 4 月起，已开始针对特定域名实施 QUIC SNI 审查：虽然 QUIC Initial 是加密的，但其密钥可由被动观察者派生，因此审查设备可以解密 Initial 包并提取 SNI。命中规则后，会对对应的源 IP、目的 IP、目的 UDP 端口三元组实施约 180 秒的残留丢包。</p><p>这说明标准 QUIC Initial 中的 SNI 已不能视为对被动审查者不可见。需要注意的是，公开研究主要证明的是 对 QUIC Initial/SNI 的解析与阻断机制，并不等于所有未混淆 Hysteria2 流量都会被稳定识别和封锁。</p><p>因此，本文默认启用 salamander 混淆。salamander 会使外层 UDP payload 不再呈现标准 QUIC/HTTP3 形态，从而避免被按标准 QUIC Initial 提取 SNI。但这不代表流量不可检测；它仍可能表现为随机 UDP，并受到基于流量统计、持续速率或运营商 UDP 策略的影响。</p><p>在运营商层面，中国用户长期存在持续 UDP 连接被限速或单端口阻断的反馈。Hysteria 官方文档也提到，中国用户有时会遇到 ISP 阻断或限速持续 UDP 连接，且此类限制往往只作用于当前端口。因此，本文采用高位端口配合端口跳跃，作为对单端口 UDP 限制的缓解手段。</p><p>启用 salamander 后，服务器对不知道 obfs 密码的普通探测者不再表现为有效 HTTP/3 服务，因此 masquerade 不应被视为主要伪装手段。两者不是配置项互斥，但在 salamander 模式下，masquerade 的实际作用有限。</p><h3 id="拥塞控制选择"><a class="markdownIt-Anchor" href="#拥塞控制选择"></a> 拥塞控制选择</h3><p>Hysteria2 内置两种拥塞控制模式：</p><p><strong>BBR</strong>：主流拥塞控制算法之一，不需要用户手动声明带宽，行为通常比 Brutal 更接近常规 QUIC/TCP 拥塞响应。FOCI 2025 的实验表明 Brutal 的自定义拥塞控制更容易产生可分类的统计特征；但这并不代表 BBR 完全不可被区分，只能说相对 Brutal 指纹风险更低。配置简单，适合作为首次部署的默认选择。</p><p><strong>Brutal</strong>：用户声明目标带宽，丢包时不降速而是补偿发送。适用于骨干网拥塞（高 RTT、高丢包）场景，前提是准确声明带宽。声明值高于实际会导致大量无效重传。Brutal 只在实际传输数据时按目标速率发包，空闲时不产生额外流量。需注意 FOCI 2025 论文已在实验室环境中证明 Brutal 的恒速率行为可与标准拥塞控制统计区分，存在指纹风险。</p><p>选择建议：首次部署、免费实例、小流量配额、弱性能节点或更重视隐蔽性的场景用 BBR；优化线路或需要吞吐的普通线路，且能准确声明带宽时，可切换为保守 Brutal。</p><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>运营商实施 UDP 白名单策略（仅放行可识别协议的 UDP、阻断其余所有 UDP）</li><li>VPS IP 已被标记为全端口 UDP 封锁</li><li>公司、校园、酒店等 UDP 受限网络环境（应改用 TCP 方案）</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="服务器"><a class="markdownIt-Anchor" href="#服务器"></a> 服务器</h3><ol><li>可用的公网 IP 服务器</li><li>根据防火墙位置放行 UDP 入站：本机防火墙放行 sing-box 监听端口；云平台安全组 / 网络安全组放行端口跳跃范围</li></ol><h3 id="域名与-dns"><a class="markdownIt-Anchor" href="#域名与-dns"></a> 域名与 DNS</h3><ol><li>将域名的 NS 记录指向 Cloudflare（若尚未托管）</li><li>在 Cloudflare 控制台为域名添加 A 记录，指向 VPS 的公网 IP。若 VPS 有 IPv6 地址，并且你也准备配置 IPv6 端口跳跃与云防火墙 IPv6 入站规则，可额外添加 AAAA 记录；否则建议暂时只添加 A 记录，避免客户端优先连接 IPv6 后因端口跳跃未配置而失败</li><li><strong>DNS 记录必须设为 DNS only（灰色云朵）</strong>。Hysteria2 客户端必须直连 VPS IP；Cloudflare 橙云代理只代理特定 HTTP/HTTPS 端口到 Cloudflare 边缘，不会将任意 UDP Hysteria2 流量转发到源站</li><li>在 Cloudflare 控制台创建 API Token，权限为 <code>Zone → DNS → Edit</code>，作用域限定至当前域名。</li></ol><p>ACME DNS-01 验证过程中，sing-box 会通过该 API Token 自动创建和清理 <code>_acme-challenge</code> TXT 记录，无需手动操作。证书到期前也会自动续签。</p><h3 id="安装所需基本工具"><a class="markdownIt-Anchor" href="#安装所需基本工具"></a> 安装所需基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates -y</span><br></pre></td></tr></table></figure><hr /><h2 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h2><p>sing-box 官方提供了 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box</span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><p>APT 包已自带 systemd 单元，服务读取 <code>/etc/sing-box/config.json</code>。此时尚未编写配置文件，暂不启动服务。</p><hr /><h2 id="生成密码"><a class="markdownIt-Anchor" href="#生成密码"></a> 生成密码</h2><h3 id="用户认证密码"><a class="markdownIt-Anchor" href="#用户认证密码"></a> 用户认证密码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -<span class="built_in">base64</span> 16</span><br></pre></td></tr></table></figure><p>用于服务端 <code>users[].password</code> 与客户端 <code>password</code> 字段。</p><h3 id="混淆密码"><a class="markdownIt-Anchor" href="#混淆密码"></a> 混淆密码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -<span class="built_in">base64</span> 32</span><br></pre></td></tr></table></figure><p>用于服务端与客户端的 <code>obfs.password</code> 字段。混淆密码与用户认证密码是两个独立的凭据，不应使用相同的值。</p><hr /><h2 id="防火墙与端口跳跃"><a class="markdownIt-Anchor" href="#防火墙与端口跳跃"></a> 防火墙与端口跳跃</h2><h3 id="系统防火墙"><a class="markdownIt-Anchor" href="#系统防火墙"></a> 系统防火墙</h3><p>本文示例将 sing-box 实际监听端口设为 29999。该端口只作为 VPS 本机 NAT REDIRECT 后的内部目标端口，客户端不会直接连接它；外部可见的是 30000–50000 的端口跳跃范围。因此监听端口选择 29999 或其他未占用 UDP 端口，在审查和伪装层面没有区别，只需避免与现有服务冲突。</p><p>由于 iptables REDIRECT 发生在 nat 表的 PREROUTING 链，包进入 INPUT 链（UFW 在此处检查）时目标端口已被改写为 29999，因此本机 UFW 只需放行监听端口：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw allow 29999/udp</span><br></pre></td></tr></table></figure><p>若 VPS 位于云平台（如 Oracle Cloud），云防火墙（安全列表 / 网络安全组）工作在 VPS 外部、iptables 之前，必须放行整个端口跳跃范围，否则包到不了 VPS。</p><p>仅需放行 UDP。Hysteria2 全程基于 QUIC/UDP，不涉及 TCP。</p><h3 id="端口跳跃-nat-规则"><a class="markdownIt-Anchor" href="#端口跳跃-nat-规则"></a> 端口跳跃 NAT 规则</h3><p>sing-box 上的 Hysteria2 服务端只能监听单个端口。端口跳跃可通过 NAT REDIRECT 实现。</p><p>若系统使用 UFW 管理防火墙，建议将 NAT 规则写入 UFW 的 before.rules，避免引入 <code>netfilter-persistent</code> 与 UFW 产生规则冲突。</p><p>首先确认公网网卡名称：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ip route get 1.1.1.1</span><br></pre></td></tr></table></figure><p>常见网卡名为 <code>eth0</code>（Vultr、搬瓦工等）或 <code>ens3</code>（Oracle Cloud）。以下示例以 <code>eth0</code>、端口跳跃范围 30000–50000、监听端口 29999 为例，按实际替换。</p><p>编辑 <code>/etc/ufw/before.rules</code>，在文件<strong>末尾</strong>追加以下内容（不要插入到已有的 <code>*filter</code> 段中）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/ufw/before.rules</span><br></pre></td></tr></table></figure><figure class="highlight text"><figcaption><span>/etc/ufw/before.rules</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># hysteria2 port hopping</span><br><span class="line">*nat</span><br><span class="line">:PREROUTING ACCEPT [0:0]</span><br><span class="line">-A PREROUTING -i eth0 -p udp --dport 30000:50000 -j REDIRECT --to-ports 29999</span><br><span class="line">COMMIT</span><br></pre></td></tr></table></figure><p>若 VPS 有 IPv6 地址且需要 IPv6 端口跳跃，先确认内核支持 IPv6 nat 表：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ip6tables -t nat -L</span><br></pre></td></tr></table></figure><p>若命令正常输出（即使为空），说明支持。编辑 <code>/etc/ufw/before6.rules</code>，在文件末尾追加：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/ufw/before6.rules</span><br></pre></td></tr></table></figure><figure class="highlight text"><figcaption><span>/etc/ufw/before6.rules</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># hysteria2 port hopping</span><br><span class="line">*nat</span><br><span class="line">:PREROUTING ACCEPT [0:0]</span><br><span class="line">-A PREROUTING -i eth0 -p udp --dport 30000:50000 -j REDIRECT --to-ports 29999</span><br><span class="line">COMMIT</span><br></pre></td></tr></table></figure><p>若命令报错（如 <code>Table does not exist</code>），<strong>不要将 <code>*nat</code> 段写入 <code>before6.rules</code></strong>。<code>ip6tables-restore</code> 遇到不支持的表会导致 <code>before6.rules</code> 加载失败，使 IPv6 防火墙规则未按预期生效。此时只配置 IPv4 端口跳跃即可。</p><p>重载 UFW 使规则生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw reload</span><br></pre></td></tr></table></figure><p>NAT 规则随 UFW 一起持久化，重启后自动加载。可通过以下命令验证规则已生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo iptables -t nat -L PREROUTING -n</span><br><span class="line">sudo ip6tables -t nat -L PREROUTING -n</span><br></pre></td></tr></table></figure><hr /><h2 id="配置-sing-box"><a class="markdownIt-Anchor" href="#配置-sing-box"></a> 配置 sing-box</h2><h3 id="创建配置文件"><a class="markdownIt-Anchor" href="#创建配置文件"></a> 创建配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/sing-box</span><br><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>以下先给出 BBR 模式的完整配置，再说明如何切换为 Brutal。</p><h3 id="bbr-模式"><a class="markdownIt-Anchor" href="#bbr-模式"></a> BBR 模式</h3><p>不需要声明带宽，配置简单，指纹风险相对较低。适用于免费实例、小流量配额、弱性能节点或首次部署验证连通性。</p><p><strong>注意替换其中的密码、域名、邮箱和 Cloudflare API Token。</strong></p><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hysteria2&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hy2-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;::&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">29999</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;ignore_client_bandwidth&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;obfs&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;salamander&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的混淆密码&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的用户认证密码&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;h3&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;acme&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;domain&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;email&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的邮箱&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;dns01_challenge&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;provider&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;api_token&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 Cloudflare API Token&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="切换为-brutal-模式"><a class="markdownIt-Anchor" href="#切换为-brutal-模式"></a> 切换为 Brutal 模式</h3><p>若线路存在明显拥塞（晚高峰 BBR 吞吐过低），可切换为 Brutal。将 <code>ignore_client_bandwidth</code> 替换为 <code>up_mbps</code> 和 <code>down_mbps</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;up_mbps&quot;</span><span class="punctuation">:</span> <span class="number">500</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;down_mbps&quot;</span><span class="punctuation">:</span> <span class="number">50</span><span class="punctuation">,</span></span><br></pre></td></tr></table></figure><p><code>up_mbps</code> 是服务端发送上限（对应客户端下载），<code>down_mbps</code> 是服务端接收上限（对应客户端上传）。建议填写实际链路带宽的 30–70%，不要高于实际可达速度。两组参数互斥，不可同时使用。</p><p>切换后客户端也需要相应增加带宽声明，参见后文客户端配置。</p><h3 id="关键字段说明"><a class="markdownIt-Anchor" href="#关键字段说明"></a> 关键字段说明</h3><p>具体参见 <a href="https://sing-box.sagernet.org/configuration/inbound/hysteria2/">Hysteria2 Inbound</a>。</p><p><code>inbounds[].listen_port</code>：本机监听端口。客户端不直接连接此端口，而是连接端口跳跃范围内的端口，由 NAT REDIRECT 转发至此。</p><p><code>inbounds[].ignore_client_bandwidth</code>：设为 <code>true</code> 时令客户端使用 BBR 拥塞控制。与 <code>up_mbps</code>/<code>down_mbps</code> 互斥。</p><p><code>inbounds[].up_mbps</code> 与 <code>down_mbps</code>：服务端带宽声明，单位 Mbps。设置后客户端将使用 Brutal 拥塞控制。</p><p><code>inbounds[].obfs</code>：salamander 混淆配置。启用后外层 UDP payload 不再呈现标准 QUIC 形态。</p><p><code>inbounds[].tls</code>：TLS 配置。<code>acme</code> 配置 Let’s Encrypt 自动证书签发与续签，通过 DNS-01 验证，不依赖 80 端口。</p><p><code>outbounds[]</code>：本方案作为纯代理服务端，只需一个 <code>direct</code> 出站。</p><p><code>route.rules[]</code> 中的规则：<code>ip_is_private</code> 拒绝内网访问，<code>protocol: bittorrent</code> 拒绝 BT 流量。</p><h3 id="配置校验"><a class="markdownIt-Anchor" href="#配置校验"></a> 配置校验</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>若无输出则表示通过校验。</p><hr /><h2 id="启动服务"><a class="markdownIt-Anchor" href="#启动服务"></a> 启动服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br><span class="line">sudo systemctl status sing-box</span><br><span class="line">sudo journalctl -u sing-box --output <span class="built_in">cat</span> -e</span><br></pre></td></tr></table></figure><p>首次启动时 sing-box 会通过 ACME 签发证书，需要数秒至数十秒。若日志出现证书相关错误，检查 Cloudflare API Token 权限及域名 DNS 配置。</p><hr /><h2 id="客户端配置文件"><a class="markdownIt-Anchor" href="#客户端配置文件"></a> 客户端配置文件</h2><h3 id="bbr-模式客户端"><a class="markdownIt-Anchor" href="#bbr-模式客户端"></a> BBR 模式客户端</h3><p>BBR 模式不需要设置 <code>up_mbps</code> 和 <code>down_mbps</code>。</p><p><strong>注意替换其中的用户认证密码、混淆密码和域名。</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hysteria2&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_ports&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;30000:50000&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hop_interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;30s&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;obfs&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;salamander&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的混淆密码&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的用户认证密码&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="brutal-模式客户端"><a class="markdownIt-Anchor" href="#brutal-模式客户端"></a> Brutal 模式客户端</h3><p>若服务端已切换为 Brutal，客户端需要增加带宽声明。<code>up_mbps</code> 和 <code>down_mbps</code> 应填写<strong>本地宽带的实际带宽</strong>。以 1000M 下行 / 50M 上行为例，<code>up_mbps</code> 填 40，<code>down_mbps</code> 填 500（保守值）。Brutal 取服务端与客户端声明值中的较小值作为目标速率。</p><p>在 BBR 配置的 outbound 基础上增加两个字段即可：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hysteria2&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server_ports&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;30000:50000&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;hop_interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;30s&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;up_mbps&quot;</span><span class="punctuation">:</span> <span class="number">40</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;down_mbps&quot;</span><span class="punctuation">:</span> <span class="number">500</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;obfs&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;salamander&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的混淆密码&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的用户认证密码&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;h3&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].server_ports</code>：端口跳跃范围，与服务端 NAT REDIRECT 规则对应。自 sing-box 1.11.0 起支持。</p><p><code>outbounds[].hop_interval</code>：端口跳跃间隔。sing-box 1.13.11 仅支持固定间隔。若未来升级至 1.14.0 或以上，可加入 <code>hop_interval_max</code>，使实际跳跃间隔在两者之间随机选择。</p><p><code>outbounds[].up_mbps</code> 与 <code>down_mbps</code>：客户端带宽声明。仅在服务端使用 Brutal 时需要设置。<code>up_mbps</code> 填本地上行带宽，<code>down_mbps</code> 填本地下行带宽，建议使用保守值。</p><p><code>outbounds[].obfs</code>：混淆配置，<code>password</code> 必须与服务端完全一致。</p><hr /><h2 id="维护与长期可用性"><a class="markdownIt-Anchor" href="#维护与长期可用性"></a> 维护与长期可用性</h2><h3 id="证书续签"><a class="markdownIt-Anchor" href="#证书续签"></a> 证书续签</h3><p>ACME 签发的 Let’s Encrypt 证书有效期 90 天，sing-box 运行期间自动续签，无需手动干预。</p><h3 id="定期轮换"><a class="markdownIt-Anchor" href="#定期轮换"></a> 定期轮换</h3><p>建议按以下周期轮换凭据：用户认证密码每 1–2 年，混淆密码每 1–2 年。</p><h3 id="更新-sing-box"><a class="markdownIt-Anchor" href="#更新-sing-box"></a> 更新 sing-box</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade sing-box -y</span><br><span class="line">sudo systemctl restart sing-box</span><br></pre></td></tr></table></figure><p>升级前查看 <a href="https://sing-box.sagernet.org/changelog/">sing-box Change Log</a> 与 <a href="https://sing-box.sagernet.org/migration/">Migration</a>，确认无破坏性变更。升级后执行 <code>sudo sing-box check -c /etc/sing-box/config.json</code> 验证配置兼容性。</p><h3 id="升级至-sing-box-1140-后的调整"><a class="markdownIt-Anchor" href="#升级至-sing-box-1140-后的调整"></a> 升级至 sing-box 1.14.0 后的调整</h3><p>本文配置以 sing-box 1.13.11 为准。1.14.0 起部分配置项发生变更，升级后建议进行以下调整：</p><ol><li>服务端 BBR 模式可加入 <code>bbr_profile</code> 字段（可选 <code>conservative</code>、<code>standard</code>、<code>aggressive</code>），控制 BBR 的激进度</li><li>客户端可加入 <code>hop_interval_max</code> 字段，与 <code>hop_interval</code> 配合实现随机跳跃间隔，降低端口切换的规律性</li><li><code>tls.acme</code> 迁移为 <code>certificate_providers</code>，<code>download_detour</code> 迁移为 <code>http_client</code>，路由规则中的 <code>outbound</code> 字段迁移为 <code>action: &quot;route&quot;</code> 格式。具体写法参见官方 Migration 文档</li></ol><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li><strong>完全无法连接</strong>：确认云平台安全组已放行 UDP 端口跳跃范围；确认本机 UFW 已放行 UDP 监听端口；确认 NAT 规则已生效（<code>sudo iptables -t nat -L PREROUTING -n</code>）；确认域名 DNS 记录为 DNS only；确认客户端的 <code>server_ports</code>、<code>password</code>、<code>obfs.password</code> 与服务端一致</li><li><strong>连接后数分钟断流</strong>：运营商单端口 UDP 阻断，确认端口跳跃已正确配置</li><li><strong>所有节点同时不可用</strong>：可能是 IP 级 UDP 标记或运营商全局 UDP QoS，考虑切换至基于 TCP 的方案（如 AnyTLS + REALITY）</li><li><strong>证书签发失败</strong>：检查 Cloudflare API Token 权限（需 <code>Zone → DNS → Edit</code>，签发异常时可额外添加 <code>Zone → Zone → Read</code>）及域名是否确实托管在 Cloudflare</li><li><strong>怀疑本地 DNS 解析异常</strong>：可临时将客户端 <code>server</code> 改为 VPS 公网 IP，但 <code>tls.server_name</code> 仍保留为证书域名</li></ol><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://sing-box.sagernet.org/configuration/inbound/hysteria2/">sing-box Hysteria2 Inbound</a></p><p><a href="https://sing-box.sagernet.org/configuration/outbound/hysteria2/">sing-box Hysteria2 Outbound</a></p><p><a href="https://v2.hysteria.network/">Hysteria 2 Official Documentation</a></p><p><a href="https://v2.hysteria.network/docs/advanced/Port-Hopping/">Hysteria 2 Port Hopping</a></p><p><a href="https://gfw.report/publications/usenixsecurity25/">GFW Report: USENIX Security 2025 — QUIC Censorship</a></p><p><a href="https://petsymposium.org/foci/2025/">FOCI 2025: Is Custom Congestion Control a Bad Idea for Circumvention Tools?</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 4 月 26 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 sing-box 的 Hysteria2 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于 QUIC（UDP）传输，配合 Brutal 拥塞控制可在高丢包环境下维持较高吞吐&lt;/li&gt;
&lt;li&gt;需要域名，需要 TLS 证书（本文使用 ACME DNS-01 自动签发）&lt;/li&gt;
&lt;li&gt;启用 salamander 混淆以规避按标准 QUIC Initial 提取 SNI 的审查&lt;/li&gt;
&lt;li&gt;配合端口跳跃以缓解运营商单端口 UDP 阻断&lt;/li&gt;
&lt;li&gt;无需 Nginx 或其他 Web 服务器，客户端与 VPS 直连&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;该方案适用于需要 UDP 吞吐、线路存在拥塞或 QoS 的场景。对于 UDP 环境恶劣、更重视长期隐蔽性的场景，建议考虑 &lt;a href=&quot;/dreams/sing-box-anytls-reality/&quot;&gt;AnyTLS + REALITY 方案&lt;/a&gt; 等基于 TCP 的方案。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;hysteria2-与审查现状&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#hysteria2-与审查现状&quot;&gt;&lt;/a&gt; Hysteria2 与审查现状&lt;/h3&gt;
&lt;p&gt;Hysteria2 基于 QUIC 协议。有些研究显示，自 2024 年 4 月起，已开始针对特定域名实施 QUIC SNI 审查：虽然 QUIC Initial 是加密的，但其密钥可由被动观察者派生，因此审查设备可以解密 Initial 包并提取 SNI。命中规则后，会对对应的源 IP、目的 IP、目的 UDP 端口三元组实施约 180 秒的残留丢包。&lt;/p&gt;
&lt;p&gt;这说明标准 QUIC Initial 中的 SNI 已不能视为对被动审查者不可见。需要注意的是，公开研究主要证明的是 对 QUIC Initial/SNI 的解析与阻断机制，并不等于所有未混淆 Hysteria2 流量都会被稳定识别和封锁。&lt;/p&gt;
&lt;p&gt;因此，本文默认启用 salamander 混淆。salamander 会使外层 UDP payload 不再呈现标准 QUIC/HTTP3 形态，从而避免被按标准 QUIC Initial 提取 SNI。但这不代表流量不可检测；它仍可能表现为随机 UDP，并受到基于流量统计、持续速率或运营商 UDP 策略的影响。&lt;/p&gt;
&lt;p&gt;在运营商层面，中国用户长期存在持续 UDP 连接被限速或单端口阻断的反馈。Hysteria 官方文档也提到，中国用户有时会遇到 ISP 阻断或限速持续 UDP 连接，且此类限制往往只作用于当前端口。因此，本文采用高位端口配合端口跳跃，作为对单端口 UDP 限制的缓解手段。&lt;/p&gt;
&lt;p&gt;启用 salamander 后，服务器对不知道 obfs 密码的普通探测者不再表现为有效 HTTP/3 服务，因此 masquerade 不应被视为主要伪装手段。两者不是配置项互斥，但在 salamander 模式下，masquerade 的实际作用有限。&lt;/p&gt;
&lt;h3 id=&quot;拥塞控制选择&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#拥塞控制选择&quot;&gt;&lt;/a&gt; 拥塞控制选择&lt;/h3&gt;
&lt;p&gt;Hysteria2 内置两种拥塞控制模式：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BBR&lt;/strong&gt;：主流拥塞控制算法之一，不需要用户手动声明带宽，行为通常比 Brutal 更接近常规 QUIC/TCP 拥塞响应。FOCI 2025 的实验表明 Brutal 的自定义拥塞控制更容易产生可分类的统计特征；但这并不代表 BBR 完全不可被区分，只能说相对 Brutal 指纹风险更低。配置简单，适合作为首次部署的默认选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brutal&lt;/strong&gt;：用户声明目标带宽，丢包时不降速而是补偿发送。适用于骨干网拥塞（高 RTT、高丢包）场景，前提是准确声明带宽。声明值高于实际会导致大量无效重传。Brutal 只在实际传输数据时按目标速率发包，空闲时不产生额外流量。需注意 FOCI 2025 论文已在实验室环境中证明 Brutal 的恒速率行为可与标准拥塞控制统计区分，存在指纹风险。&lt;/p&gt;
&lt;p&gt;选择建议：首次部署、免费实例、小流量配额、弱性能节点或更重视隐蔽性的场景用 BBR；优化线路或需要吞吐的普通线路，且能准确声明带宽时，可切换为保守 Brutal。&lt;/p&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;运营商实施 UDP 白名单策略（仅放行可识别协议的 UDP、阻断其余所有 UDP）&lt;/li&gt;
&lt;li&gt;VPS IP 已被标记为全端口 UDP 封锁&lt;/li&gt;
&lt;li&gt;公司、校园、酒店等 UDP 受限网络环境（应改用 TCP 方案）&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
    <category term="hysteria2" scheme="https://blog.chaos.run/tags/hysteria2/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 VLESS + HTTPUpgrade + Cloudflare Tunnel + ECH + Caddy 服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-vless-httpupgrade-cloudflare-tunnel-ech/"/>
    <id>https://blog.chaos.run/dreams/sing-box-vless-httpupgrade-cloudflare-tunnel-ech/</id>
    <published>2026-04-22T18:17:05.000Z</published>
    <updated>2026-06-18T17:36:38.964Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 4 月 22 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + HTTPUpgrade 服务端，通过 Cloudflare Tunnel 隐藏源站 IP，使用 Caddy 建立伪装站，并在客户端启用 ECH 加密 SNI。本文同样完全适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>除 SSH 管理端口外，VPS 无需开放任何业务入站端口（代理流量通过 cloudflared 主动出站连接进入），真实 IP 完全不出现在 DNS 记录、证书或任何公开信息中</li><li>无需申请 TLS 证书（外层 TLS 由 Cloudflare 边缘节点处理，VPS 内部全程明文 HTTP 回环通信）</li><li>浏览器直接访问域名显示真实的伪装网站，代理路径隐藏在特定 URI 下</li><li>客户端启用 ECH 后，TLS 握手中的真实 SNI 被加密，中间人仅能看到 <code>cloudflare-ech.com</code> 的外层 SNI（需配合加密 DNS 避免域名解析泄漏）</li></ol><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="整体架构"><a class="markdownIt-Anchor" href="#整体架构"></a> 整体架构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">客户端 sing-box (VLESS + HTTPUpgrade)</span><br><span class="line">   │ TLS 1.3 + ECH（外层 SNI: cloudflare-ech.com）</span><br><span class="line">   ▼</span><br><span class="line">Cloudflare 边缘节点</span><br><span class="line">   │ CF 内部协议（Tunnel）</span><br><span class="line">   ▼</span><br><span class="line">VPS 上 cloudflared 守护进程（主动出站长连接）</span><br><span class="line">   │ 明文 HTTP（本机回环）</span><br><span class="line">   ▼</span><br><span class="line">Caddy（127.0.0.1:8080）</span><br><span class="line">   ├─ 其他请求 → 伪装静态网站</span><br><span class="line">   └─ /你的隐藏路径 + Upgrade 头 → sing-box VLESS inbound</span><br><span class="line">             │</span><br><span class="line">             ▼</span><br><span class="line">sing-box（127.0.0.1:8443）→ direct outbound → 目标网站</span><br></pre></td></tr></table></figure><h3 id="关于-tls-in-tls"><a class="markdownIt-Anchor" href="#关于-tls-in-tls"></a> 关于 TLS-in-TLS</h3><p>本方案中，用户访问 HTTPS 网站时产生的内层 TLS 流量被封装在 Cloudflare 的外层 TLS 连接中，TLS-in-TLS 特征不可避免。sing-box 的 <code>multiplex.padding</code> 可在多路复用层添加随机填充以缓解长度特征，但无法完全消除。需要消除 TLS-in-TLS 的场景应选择 <a href="/dreams/sing-box-anytls-reality/">AnyTLS + REALITY</a> 或者 <a href="/dreams/sing-box-vless-vision-reality/">VLESS + Vision + REALITY</a>（两者都是直连方案，无法过 CDN）。</p><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>VPS 无法出站连接 Cloudflare 的场景（极少数网络环境）</li><li>需要完全消除 TLS-in-TLS 特征的场景</li><li>追求极致低延迟的场景（CF Tunnel 多一跳，延迟略高于直连）</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="所需资源"><a class="markdownIt-Anchor" href="#所需资源"></a> 所需资源</h3><ol><li><strong>一台 VPS</strong>（任何地区均可，NAT VPS 也可以，只要能出站连接 Cloudflare）</li><li><strong>一个域名</strong>（将其 NS 托管到 Cloudflare，低价域名即可）</li><li><strong>一套静态网页内容</strong>（推荐，作为伪装站）</li></ol><p>下文假设域名为 <code>example.com</code>，代理用子域名 <code>cdn.example.com</code>。前缀 <code>cdn</code> 仅为示例，请根据需要更换。</p><h3 id="安装所需基本工具"><a class="markdownIt-Anchor" href="#安装所需基本工具"></a> 安装所需基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates unzip -y</span><br></pre></td></tr></table></figure><hr /><h2 id="cloudflare-tunnel-配置"><a class="markdownIt-Anchor" href="#cloudflare-tunnel-配置"></a> Cloudflare Tunnel 配置</h2><h3 id="vps-安装并配置-cloudflared"><a class="markdownIt-Anchor" href="#vps-安装并配置-cloudflared"></a> VPS 安装并配置 cloudflared</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p --mode=0755 /usr/share/keyrings</span><br><span class="line">curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo <span class="built_in">tee</span> /usr/share/keyrings/cloudflare-main.gpg &gt;/dev/null</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/cloudflared.list</span><br><span class="line">sudo apt-get update &amp;&amp; sudo apt-get install cloudflared</span><br></pre></td></tr></table></figure><h3 id="创建-tunnel"><a class="markdownIt-Anchor" href="#创建-tunnel"></a> 创建 Tunnel</h3><ol><li>登录 <a href="https://dash.cloudflare.com">dash.cloudflare.com</a></li><li>左侧菜单选择 <strong>Zero Trust</strong></li><li>左侧菜单 <strong>Networks → Connectors</strong></li><li>点击 <strong>Create a tunnel</strong>，选择 <strong>Cloudflared</strong></li><li>Tunnel 名称随意填写，点击 <strong>Save tunnel</strong></li><li>下一步会显示安装命令，<strong>复制此命令</strong>，在 VPS 上执行。</li></ol><p>运行复制的命令注册并启动服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo cloudflared service install eyJhIjoiYWJjZGVmMTIzNDU2Nzg5...</span><br></pre></td></tr></table></figure><p>确认运行状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status cloudflared</span><br></pre></td></tr></table></figure><p>并可在 Cloudflare 网页控制台看到 Connector 已经建立连接，然后点击 <strong>Next</strong>。</p><h3 id="配置-public-hostname"><a class="markdownIt-Anchor" href="#配置-public-hostname"></a> 配置 Public Hostname</h3><p>在页面如此配置：</p><table><thead><tr><th>字段</th><th>值</th></tr></thead><tbody><tr><td>Subdomain</td><td><code>cdn</code></td></tr><tr><td>Domain</td><td><code>example.com</code></td></tr><tr><td>Path</td><td>（留空）</td></tr><tr><td>Type</td><td><code>HTTP</code></td></tr><tr><td>URL</td><td><code>localhost:8080</code></td></tr></tbody></table><p>然后点击 <strong>Complete Setup</strong> 保存后，Cloudflare 会自动在 DNS 中创建 CNAME 记录 <code>cdn.example.com</code> → <code>&lt;tunnel-id&gt;.cfargotunnel.com</code>。</p><h3 id="ssltls-设置"><a class="markdownIt-Anchor" href="#ssltls-设置"></a> SSL/TLS 设置</h3><p>进入 Cloudflare 域名 Dashboard → SSL/TLS：</p><ul><li><strong>Overview</strong> → 加密模式设为 <strong>Full (strict)</strong>（Tunnel 模式下 CF 不经过传统 HTTPS 回源，此设置不影响 Tunnel 通信，选择最严格的模式即可）</li><li><strong>Edge Certificates</strong> → Minimum TLS Version：<strong>TLS 1.3</strong></li><li><strong>Edge Certificates</strong> → TLS 1.3：<strong>On</strong></li></ul><h3 id="确认-ech-状态"><a class="markdownIt-Anchor" href="#确认-ech-状态"></a> 确认 ECH 状态</h3><p>进入 SSL/TLS → Edge Certificates，找到 <strong>Encrypted ClientHello (ECH)</strong>。Free 计划域名<a href="https://developers.cloudflare.com/ssl/edge-certificates/ech/#enable-ech">默认已启用</a>。其他计划确认状态为 <strong>Enabled</strong> 即可。ECH 的密钥管理与 ECHConfig 发布由 Cloudflare 自动完成，服务端无需任何操作。</p><hr /><h2 id="vps-部署"><a class="markdownIt-Anchor" href="#vps-部署"></a> VPS 部署</h2><h3 id="安装-caddy"><a class="markdownIt-Anchor" href="#安装-caddy"></a> 安装 Caddy</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl</span><br><span class="line">curl -1sLf <span class="string">&#x27;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#x27;</span> | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg</span><br><span class="line">curl -1sLf <span class="string">&#x27;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/caddy-stable.list</span><br><span class="line">sudo <span class="built_in">chmod</span> o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg</span><br><span class="line">sudo <span class="built_in">chmod</span> o+r /etc/apt/sources.list.d/caddy-stable.list</span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install caddy</span><br></pre></td></tr></table></figure><h3 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h3><p>sing-box 官方提供了 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box <span class="comment"># or sing-box-beta</span></span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><h3 id="生成-uuid"><a class="markdownIt-Anchor" href="#生成-uuid"></a> 生成 UUID</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate uuid</span><br></pre></td></tr></table></figure><p>记录输出的 UUID，服务端与客户端均需使用。</p><hr /><h2 id="伪装站建设"><a class="markdownIt-Anchor" href="#伪装站建设"></a> 伪装站建设</h2><p>伪装站的质量直接影响方案的隐蔽性。推荐使用 Hugo 或 Hexo 生成的个人技术博客、摄影作品集、小工具站等。避免使用空白页、默认欢迎页或任何敏感内容。</p><p>快速准备一个最简伪装页：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /var/www/disguise</span><br><span class="line">sudo <span class="built_in">chown</span> -R <span class="variable">$USER</span>:<span class="variable">$USER</span> /var/www/disguise</span><br></pre></td></tr></table></figure><p>创建 <code>/var/www/disguise/index.html</code>，内容为任意看起来合理的静态网页。如有 Hugo 等静态站生成器，将生成的 <code>public/</code> 目录内容放入 <code>/var/www/disguise/</code> 中。</p><p>建议同时准备一个风格一致的 <code>/var/www/disguise/404.html</code>，用于不存在路径的自定义 404 页面，避免暴露默认服务器错误页。</p><hr /><h2 id="服务端配置文件"><a class="markdownIt-Anchor" href="#服务端配置文件"></a> 服务端配置文件</h2><h3 id="生成隐藏路径"><a class="markdownIt-Anchor" href="#生成隐藏路径"></a> 生成隐藏路径</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 16</span><br></pre></td></tr></table></figure><p>输出示例：<code>a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</code>。将其作为代理路径使用，使用时前面注意加斜杠。</p><h3 id="caddy-配置"><a class="markdownIt-Anchor" href="#caddy-配置"></a> Caddy 配置</h3><p>编辑 <code>/etc/caddy/Caddyfile</code>，注意替换其中的随机隐藏路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/caddy/Caddyfile</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>/etc/caddy/Caddyfile</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    admin off</span><br><span class="line">    auto_https off</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">:8080 &#123;</span><br><span class="line">    root * /var/www/disguise</span><br><span class="line"></span><br><span class="line">    @proxy &#123;</span><br><span class="line">        path /之前生成的随机隐藏路径</span><br><span class="line">        header Connection *Upgrade*</span><br><span class="line">        header Upgrade *</span><br><span class="line">    &#125;</span><br><span class="line">    reverse_proxy @proxy 127.0.0.1:8443</span><br><span class="line"></span><br><span class="line">    file_server &#123;</span><br><span class="line">        index index.html</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    handle_errors &#123;</span><br><span class="line">        rewrite * /404.html</span><br><span class="line">        file_server</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    encode gzip zstd</span><br><span class="line"></span><br><span class="line">    log &#123;</span><br><span class="line">        output file /var/log/caddy/access.log &#123;</span><br><span class="line">            roll_size 10mb</span><br><span class="line">            roll_keep 3</span><br><span class="line">        &#125;</span><br><span class="line">        level ERROR</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>auto_https off</code>：TLS 由 Cloudflare 处理，Caddy 不需要管理证书。<code>@proxy</code> matcher 同时检查路径与 <code>Upgrade</code> 头，浏览器直接访问该路径（没有 Upgrade 头）会落入 <code>file_server</code> 返回伪装页面。</p><p>验证配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /var/log/caddy &amp;&amp; sudo <span class="built_in">chown</span> -R caddy:caddy /var/log/caddy</span><br><span class="line">sudo caddy <span class="built_in">fmt</span> --overwrite /etc/caddy/Caddyfile</span><br><span class="line">sudo -u caddy caddy validate --config /etc/caddy/Caddyfile</span><br></pre></td></tr></table></figure><p>重启 Caddy 服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart caddy</span><br></pre></td></tr></table></figure><h3 id="sing-box-配置"><a class="markdownIt-Anchor" href="#sing-box-配置"></a> sing-box 配置</h3><p>编辑 <code>/etc/sing-box/config.json</code>，<strong>注意替换 <code>你生成的 UUID</code> 和路径</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;127.0.0.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">8443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;httpupgrade&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>关键字段说明：</p><p><code>inbounds[].listen</code>：<code>127.0.0.1</code>，仅接收 Caddy 反代过来的请求，不监听公网。</p><p><code>inbounds[].transport.type</code>：<code>httpupgrade</code>，<a href="https://sing-box.sagernet.org/changelog/#170">sing-box 推荐的 CDN 传输方式</a>。注意此处<strong>不配置 <code>flow</code> 字段</strong>——Vision 流控要求底层裸 TCP，与任何 transport 不兼容。</p><p><code>inbounds[].transport.path</code>：必须与 Caddy 配置中的路径完全一致。</p><p>验证并启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br></pre></td></tr></table></figure><hr /><h2 id="验证服务端"><a class="markdownIt-Anchor" href="#验证服务端"></a> 验证服务端</h2><h3 id="服务状态检查"><a class="markdownIt-Anchor" href="#服务状态检查"></a> 服务状态检查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status cloudflared   <span class="comment"># active (running)</span></span><br><span class="line">sudo ss -tlnp | grep 8080           <span class="comment"># 127.0.0.1:8080 Caddy</span></span><br><span class="line">sudo ss -tlnp | grep 8443           <span class="comment"># 127.0.0.1:8443 sing-box</span></span><br></pre></td></tr></table></figure><h3 id="浏览器访问检查"><a class="markdownIt-Anchor" href="#浏览器访问检查"></a> 浏览器访问检查</h3><ol><li>访问 <code>https://cdn.example.com</code> → 应显示伪装网站</li><li>访问 <code>https://cdn.example.com/任意不存在路径</code> → 应显示风格一致的自定义 404 页面</li><li>访问 <code>https://cdn.example.com/之前生成的随机隐藏路径</code> → 应显示自定义 404 页面（浏览器不发送 Upgrade 头，Caddy 不会转发到 sing-box）</li></ol><p>三项均符合预期，说明伪装站与路径隐蔽性到位。</p><h3 id="确认-ech-可用"><a class="markdownIt-Anchor" href="#确认-ech-可用"></a> 确认 ECH 可用</h3><p>在本地终端（非 VPS）执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dig cdn.example.com HTTPS @1.1.1.1</span><br></pre></td></tr></table></figure><p>返回结果中包含 <code>ech=...</code> 字段，说明 Cloudflare 已发布 ECHConfig，客户端可以使用 ECH。</p><hr /><h2 id="客户端配置文件"><a class="markdownIt-Anchor" href="#客户端配置文件"></a> 客户端配置文件</h2><p>以下为客户端示例配置，<strong>注意替换 <code>你生成的 UUID</code> 和路径</strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;selector&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;cf-main&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;default&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;urltest&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;cf-main&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://www.gstatic.com/generate_204&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;3m&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cf-main&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;http/1.1&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;ech&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;httpupgrade&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;h2mux&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max_streams&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].tls.alpn</code>：固定为 <code>[&quot;http/1.1&quot;]</code>。HTTPUpgrade 基于 HTTP/1.1 的 Upgrade 机制，不能使用 h2。</p><p><code>outbounds[].tls.utls</code>：启用 uTLS 伪造 ClientHello 指纹。推荐 <code>chrome</code>，与大多数实际浏览器流量分布一致。</p><p><code>outbounds[].tls.ech</code>：启用 Encrypted ClientHello。sing-box 会自动通过 DNS HTTPS RR 记录获取 ECHConfig。启用后，中间人看到的外层 SNI 为 <code>cloudflare-ech.com</code>，真实的 <code>cdn.example.com</code> 被加密保护。要求客户端的 DNS 服务器支持 HTTPS RR 查询（Cloudflare 1.1.1.1、Google 8.8.8.8 等均支持）。</p><p><code>outbounds[].transport.type</code>：<code>httpupgrade</code>，与服务端一致。</p><p><code>outbounds[].multiplex</code>：启用多路复用。<code>protocol</code> 使用 sing-box 默认的 <code>h2mux</code>（基于 HTTP/2 帧格式，性能与流控最优）。<code>padding: true</code> 在多路复用层添加随机填充，缓解 TLS-in-TLS 的长度特征。</p><h3 id="使用优选-cloudflare-ip"><a class="markdownIt-Anchor" href="#使用优选-cloudflare-ip"></a> 使用优选 Cloudflare IP</h3><p>如果域名直连 <code>cdn.example.com</code> 延迟较高，可添加多个使用优选 IP 的出站节点。方法是复制 <code>cf-main</code> 的配置，将 <code>server</code> 字段替换为优选 IP（使用 <a href="https://github.com/XIU2/CloudflareSpeedTest">CloudflareSpeedTest</a> 在本地测试获取），保持 <code>tls.server_name</code> 和 <code>transport.host</code> 不变：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cf-ip-1&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;104.16.132.229&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;http/1.1&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span> </span><br><span class="line">      <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;ech&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;httpupgrade&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span> </span><br><span class="line">    <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;h2mux&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;max_streams&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span> </span><br><span class="line">    <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>将新节点的 tag 加入 <code>urltest</code> 和 <code>selector</code> 的 <code>outbounds</code> 数组即可。</p><hr /><h2 id="隐蔽性评估"><a class="markdownIt-Anchor" href="#隐蔽性评估"></a> 隐蔽性评估</h2><p>开启 ECH 后，检测者视角：</p><table><thead><tr><th>检测维度</th><th>看到的内容</th></tr></thead><tbody><tr><td>连接目标 IP</td><td>Cloudflare 的 Anycast IP</td></tr><tr><td>外层 SNI</td><td><code>cloudflare-ech.com</code>（所有启用 ECH 的 CF 站点共用）</td></tr><tr><td>真实域名</td><td>加密，不可见</td></tr><tr><td>证书</td><td>Cloudflare 签发的 <code>cloudflare-ech.com</code> 证书</td></tr><tr><td>VPS 真实 IP</td><td>不可见（Tunnel 内部通信）</td></tr><tr><td>浏览器探测域名</td><td>正常伪装网站</td></tr><tr><td>路径扫描</td><td>所有路径均返回伪装页面</td></tr></tbody></table><p>残留风险：TLS-in-TLS 特征（被 multiplex.padding 缓解但未消除）、流量行为特征（持续连接时长、请求频率模式）。</p><hr /><h2 id="维护与长期可用性"><a class="markdownIt-Anchor" href="#维护与长期可用性"></a> 维护与长期可用性</h2><h3 id="更新组件"><a class="markdownIt-Anchor" href="#更新组件"></a> 更新组件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade cloudflared sing-box caddy -y</span><br><span class="line">sudo systemctl restart cloudflared sing-box caddy</span><br></pre></td></tr></table></figure><h3 id="定期轮换"><a class="markdownIt-Anchor" href="#定期轮换"></a> 定期轮换</h3><p>建议每 3-6 个月轮换 UUID 与路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate uuid</span><br><span class="line">openssl rand -hex 16</span><br></pre></td></tr></table></figure><p>同时更新服务端（sing-box + Caddy）与客户端配置。</p><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li>浏览器访问域名显示 Cloudflare 错误页（1033 等）：Tunnel 未连接，检查 <code>systemctl status cloudflared</code></li><li>浏览器显示 502：Caddy 未运行或端口配置错误</li><li>客户端连接超时：确认 UUID、路径与服务端完全一致；确认 <code>tls.server_name</code> 与 <code>transport.host</code> 都填写了正确的域名</li><li>ECH 未生效（抓包仍看到明文 SNI）：确认客户端 DNS 能查到 HTTPS RR 记录（<code>dig cdn.example.com HTTPS @1.1.1.1</code>），确认返回中包含 <code>ech=...</code> 字段</li></ol><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://sing-box.sagernet.org/configuration/inbound/vless/">sing-box - VLESS Inbound</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/v2ray-transport/">sing-box - HTTPUpgrade Transport</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/dial/">sing-box - Dial Fields</a></p><p><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/">Cloudflare Tunnel</a></p><p><a href="https://developers.cloudflare.com/ssl/edge-certificates/ech/">Cloudflare - Encrypted ClientHello</a></p><p><a href="https://caddyserver.com/docs/">Caddy</a></p><p><a href="https://github.com/XIU2/CloudflareSpeedTest">XIU2 / CloudflareSpeedTest</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 4 月 22 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + HTTPUpgrade 服务端，通过 Cloudflare Tunnel 隐藏源站 IP，使用 Caddy 建立伪装站，并在客户端启用 ECH 加密 SNI。本文同样完全适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;除 SSH 管理端口外，VPS 无需开放任何业务入站端口（代理流量通过 cloudflared 主动出站连接进入），真实 IP 完全不出现在 DNS 记录、证书或任何公开信息中&lt;/li&gt;
&lt;li&gt;无需申请 TLS 证书（外层 TLS 由 Cloudflare 边缘节点处理，VPS 内部全程明文 HTTP 回环通信）&lt;/li&gt;
&lt;li&gt;浏览器直接访问域名显示真实的伪装网站，代理路径隐藏在特定 URI 下&lt;/li&gt;
&lt;li&gt;客户端启用 ECH 后，TLS 握手中的真实 SNI 被加密，中间人仅能看到 &lt;code&gt;cloudflare-ech.com&lt;/code&gt; 的外层 SNI（需配合加密 DNS 避免域名解析泄漏）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;整体架构&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#整体架构&quot;&gt;&lt;/a&gt; 整体架构&lt;/h3&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;客户端 sing-box (VLESS + HTTPUpgrade)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ TLS 1.3 + ECH（外层 SNI: cloudflare-ech.com）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Cloudflare 边缘节点&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ CF 内部协议（Tunnel）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;VPS 上 cloudflared 守护进程（主动出站长连接）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ 明文 HTTP（本机回环）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Caddy（127.0.0.1:8080）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ├─ 其他请求 → 伪装静态网站&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   └─ /你的隐藏路径 + Upgrade 头 → sing-box VLESS inbound&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             │&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;sing-box（127.0.0.1:8443）→ direct outbound → 目标网站&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&quot;关于-tls-in-tls&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#关于-tls-in-tls&quot;&gt;&lt;/a&gt; 关于 TLS-in-TLS&lt;/h3&gt;
&lt;p&gt;本方案中，用户访问 HTTPS 网站时产生的内层 TLS 流量被封装在 Cloudflare 的外层 TLS 连接中，TLS-in-TLS 特征不可避免。sing-box 的 &lt;code&gt;multiplex.padding&lt;/code&gt; 可在多路复用层添加随机填充以缓解长度特征，但无法完全消除。需要消除 TLS-in-TLS 的场景应选择 &lt;a href=&quot;/dreams/sing-box-anytls-reality/&quot;&gt;AnyTLS + REALITY&lt;/a&gt; 或者 &lt;a href=&quot;/dreams/sing-box-vless-vision-reality/&quot;&gt;VLESS + Vision + REALITY&lt;/a&gt;（两者都是直连方案，无法过 CDN）。&lt;/p&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;VPS 无法出站连接 Cloudflare 的场景（极少数网络环境）&lt;/li&gt;
&lt;li&gt;需要完全消除 TLS-in-TLS 特征的场景&lt;/li&gt;
&lt;li&gt;追求极致低延迟的场景（CF Tunnel 多一跳，延迟略高于直连）&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
    <category term="cloudflare" scheme="https://blog.chaos.run/tags/cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 AnyTLS + REALITY 服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-anytls-reality/"/>
    <id>https://blog.chaos.run/dreams/sing-box-anytls-reality/</id>
    <published>2026-04-20T18:21:07.000Z</published>
    <updated>2026-06-18T17:36:38.963Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 4 月 20 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 sing-box 的 AnyTLS + REALITY 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>无需域名，无需解析</li><li>无需申请 TLS 证书（REALITY 借用第三方站点的真实 TLS 握手）</li><li>无需 Nginx 或其他 Web 服务器（REALITY 自己负责处理握手层的伪装与转发）</li><li>无需 CloudFlare 中转，客户端与 VPS 直连</li></ol><p>该方案对 VPS 的 IP 质量要求较高，需要选择合理的 SNI 目标站，并定期维护配置以应对长期可用性风险。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="介绍-anytls-reality"><a class="markdownIt-Anchor" href="#介绍-anytls-reality"></a> 介绍 AnyTLS + REALITY</h3><p>AnyTLS 与 REALITY 的组合具有以下特性：</p><ol><li>REALITY 将 TLS ClientHello 的 SNI 指向一个真实的第三方站点（称为 handshake server），由服务端完成密钥协商。若客户端认证成功则走代理通道，否则将连接完整转发给该第三方站点。这使得主动探测者获取的是真实站点的证书与响应，握手层难以区分真实访问者与代理用户。</li><li>AnyTLS 协议本身在 TLS 之上提供了 <code>padding_scheme</code> 机制，用于在协议层对数据包长度进行随机填充，以对抗基于包长分布的被动流量识别。</li><li>整个协议链路在直连场景下不引入额外的 transport（如 WebSocket、HTTPUpgrade、gRPC），客户端发出的流量经 REALITY 握手后直接承载 AnyTLS 内容，延迟与吞吐无额外损耗。</li></ol><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>VPS IP 本身已被封锁或严重干扰的情况。REALITY 无法修复 IP 层的封锁。</li><li>需要借助 CDN 隐藏源站 IP 的场景。REALITY 的工作方式与 CDN 反代不兼容。</li><li>使用的第三方客户端版本过旧不支持 AnyTLS 协议的场景。在配置前请先确认目标客户端支持 AnyTLS，否则考虑改用 <a href="/dreams/sing-box-vless-vision-reality/">VLESS + Vision + REALITY 方案</a>。</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="服务器"><a class="markdownIt-Anchor" href="#服务器"></a> 服务器</h3><ol><li>可用的公网 IP 服务器</li><li>建议选择冷门机房，避开已被大量代理用户使用的热门 IP 段</li><li>开放 TCP <code>443</code> 端口的入站访问（若有防火墙或安全组）</li></ol><h3 id="选定-reality-的-sni-目标站"><a class="markdownIt-Anchor" href="#选定-reality-的-sni-目标站"></a> 选定 REALITY 的 SNI 目标站</h3><p>REALITY 需要一个真实存在的第三方站点作为 SNI 目标（即 handshake server）。该目标站需要满足以下条件：</p><ol><li>站点支持 TLS 1.3</li><li>站点支持 X25519 密钥交换</li><li>站点返回的证书合法且稳定</li><li>站点非 CloudFlare、Akamai 等大型 CDN 托管（回源复杂、SNI 校验可能不一致）</li><li>站点地理位置最好与 VPS 同机房或同 IP 段，以避免 IP 与域名地理分布不一致引起的可疑特征</li><li>站点不要使用 <code>www.microsoft.com</code>、<code>www.apple.com</code>、<code>itunes.apple.com</code> 等已被代理圈广泛使用的目标</li></ol><p>可以使用 <a href="https://github.com/XTLS/RealiTLScanner">RealiTLScanner</a> 扫描 VPS 邻近 IP 段，找到合适的目标。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-64</span><br><span class="line"><span class="built_in">chmod</span> +x RealiTLScanner-linux-64</span><br><span class="line">wget https://github.com/Loyalsoldier/geoip/releases/latest/download/Country.mmdb</span><br><span class="line">./RealiTLScanner-linux-64 -addr 你的VPS_IP -port 443 -out results.csv</span><br></pre></td></tr></table></figure><p>扫描结果示例中会列出每个 IP 对应的域名、TLS 版本、是否 <code>feasible</code>。从 <code>feasible=true</code> 的记录中挑选几个域名，并用浏览器打开 <code>https://该域名/</code> 确认内容为正常的非敏感网站。</p><p>然后，本地再用 <code>dig 该域名</code> 或者 <code>nslookup 该域名</code> 命令来检查一下该域名是否直接解析（A 记录）到扫描到的 IP。若存在 CNAME，说明该域名可能使用了弹性 IP 或负载均衡，IP 随时可能变动，不宜选择；若 A 记录 IP 与扫描结果不一致，则可能是 CDN 托管或扫到了其他 REALITY 服务器，也应排除。</p><p>当域名解析结果符合条件，则可选择该域名。</p><p>或者也可以让 <a href="https://download.chaos.run/scripts/find-reality.py">find-reality.py</a> 自动跑完上述筛选，使用 <code>./find-reality.py results.csv</code> 跑一下，脚本会依次做证书域名黑名单过滤、<code>dig</code> A 记录检查、TLS 1.3 + HTTPS 探测和分类，输出 PASS / REVIEW / FAIL；再从 PASS 列表里人工挑选，访问目标站查看是否是正常网站即可。</p><h3 id="内容准备"><a class="markdownIt-Anchor" href="#内容准备"></a> 内容准备</h3><ol><li>记录下上一步选定的 SNI 目标站域名</li><li>生成一个用于 AnyTLS 用户认证的密码（见后续步骤）</li><li>生成一对 REALITY 密钥（见后续步骤）</li><li>生成一个或多个 <code>short_id</code>（见后续步骤）</li></ol><h3 id="安装所需基本工具"><a class="markdownIt-Anchor" href="#安装所需基本工具"></a> 安装所需基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates -y</span><br></pre></td></tr></table></figure><h3 id="服务器防火墙配置"><a class="markdownIt-Anchor" href="#服务器防火墙配置"></a> 服务器防火墙配置</h3><p>确保服务器仅开放必要端口。本方案中 sing-box 将监听 <code>443/tcp</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw allow 443/tcp</span><br></pre></td></tr></table></figure><hr /><h2 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h2><h3 id="通过官方-apt-仓库安装"><a class="markdownIt-Anchor" href="#通过官方-apt-仓库安装"></a> 通过官方 APT 仓库安装</h3><p>sing-box 官方提供了 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box <span class="comment"># or sing-box-beta</span></span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><h3 id="systemd-服务"><a class="markdownIt-Anchor" href="#systemd-服务"></a> systemd 服务</h3><p>APT 包已自带 systemd 单元，无需手动编写。服务单元会读取 <code>/etc/sing-box/config.json</code> 作为配置文件。常用管理命令参见官方文档。</p><p>此时尚未编写配置文件，暂不启动服务。</p><hr /><h2 id="生成密钥与标识"><a class="markdownIt-Anchor" href="#生成密钥与标识"></a> 生成密钥与标识</h2><h3 id="生成-reality-密钥对"><a class="markdownIt-Anchor" href="#生成-reality-密钥对"></a> 生成 REALITY 密钥对</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate reality-keypair</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PrivateKey: uP2PWZY... (服务端用)</span><br><span class="line">PublicKey:  AbC123... (客户端用)</span><br></pre></td></tr></table></figure><p>将这两个值记录下来。<code>PrivateKey</code> 用于服务端配置，<code>PublicKey</code> 用于客户端配置。</p><h3 id="生成-short_id"><a class="markdownIt-Anchor" href="#生成-short_id"></a> 生成 <code>short_id</code></h3><p><code>short_id</code> 是 0 到 8 字节的十六进制字符串（即 0 到 16 个十六进制字符），用于在一个 REALITY 实例下区分不同客户端身份。生成一个 8 字节的 <code>short_id</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 8</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0123456789abcdef</span><br></pre></td></tr></table></figure><p>记录下来。服务端可以配置多个 <code>short_id</code> 以支持多客户端；客户端配置时使用其中一个。</p><h3 id="生成-anytls-用户密码"><a class="markdownIt-Anchor" href="#生成-anytls-用户密码"></a> 生成 AnyTLS 用户密码</h3><p>根据 sing-box 官方文档中 AnyTLS 的示例，<code>password</code> 为 base64 格式的随机字符串。生成一个 16 字节的密码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -<span class="built_in">base64</span> 16</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">8JCsPssfgS8tiRwiMlhARg==</span><br></pre></td></tr></table></figure><p>记录下来，用于服务端与客户端的 AnyTLS 用户认证。</p><hr /><h2 id="配置-sing-box"><a class="markdownIt-Anchor" href="#配置-sing-box"></a> 配置 sing-box</h2><h3 id="创建配置文件"><a class="markdownIt-Anchor" href="#创建配置文件"></a> 创建配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/sing-box</span><br><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>添加如下内容。<strong>注意替换其中的 <code>你的 REALITY 私钥</code>、<code>你选定的 SNI 目标站域名</code>、<code>你生成的 short_id</code>、<code>你生成的 AnyTLS 密码</code></strong>：</p><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;anytls&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;anytls-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;::&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 AnyTLS 密码&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reality&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;handshake&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;private_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 REALITY 私钥&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;short_id&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;你生成的 short_id&quot;</span></span><br><span class="line">          <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="关键字段说明"><a class="markdownIt-Anchor" href="#关键字段说明"></a> 关键字段说明</h3><p>具体参见 <a href="https://sing-box.sagernet.org/configuration/inbound/anytls/">AnyTLS</a> 与 <a href="https://sing-box.sagernet.org/configuration/shared/tls/#reality-fields">TLS - Reality Fields</a>。</p><p><code>inbounds[].listen</code>：<code>::</code> 表示同时监听 IPv4 与 IPv6。若 VPS 仅有 IPv4，也可以填 <code>0.0.0.0</code>。</p><p><code>inbounds[].listen_port</code>：监听端口。本文使用 <code>443</code>，与真实 HTTPS 服务共用同一端口，最不引起可疑。</p><p><code>inbounds[].users[]</code>：AnyTLS 的用户列表，每个用户包含 <code>name</code> 与 <code>password</code>。<code>name</code> 仅用于日志标识，<code>password</code> 用于认证。</p><p><code>inbounds[].tls.server_name</code>：REALITY 对外声明的 SNI，必须与 <code>reality.handshake.server</code> 保持一致，且必须是真实存在、可访问的站点。</p><p><code>inbounds[].tls.reality.handshake.server</code> 与 <code>server_port</code>：REALITY 在客户端认证失败或发起探测时，会将流量完整转发给该地址。必须是一个真实运行 HTTPS 服务的站点。</p><p><code>inbounds[].tls.reality.private_key</code>：REALITY 服务端私钥，由 <code>sing-box generate reality-keypair</code> 生成。</p><p><code>inbounds[].tls.reality.short_id</code>：数组形式，可填入一个或多个 <code>short_id</code>。客户端连接时必须使用其中之一。</p><p><code>outbounds[]</code>：本方案作为纯代理服务端，只需一个 <code>direct</code> 出站，将认证通过的代理流量直接发往目标。</p><p><code>route.rules[]</code> 中的规则：</p><ul><li><code>ip_is_private</code> 配合 <code>&quot;action&quot;: &quot;reject&quot;</code>：匹配内网地址并拒绝，防止代理流量访问 VPS 所在内网资源</li><li><code>protocol: bittorrent</code> 配合 <code>&quot;action&quot;: &quot;reject&quot;</code>：拒绝 BT 流量，避免 VPS IP 被滥用举报</li></ul><h3 id="配置校验"><a class="markdownIt-Anchor" href="#配置校验"></a> 配置校验</h3><p>保存后，使用 sing-box 自带的校验命令检查配置文件语法：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>若无输出则表示配置文件通过校验。如有报错，按提示修正。</p><hr /><h2 id="启动服务"><a class="markdownIt-Anchor" href="#启动服务"></a> 启动服务</h2><p>启动 sing-box 并设置开机自启：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br></pre></td></tr></table></figure><p>查看运行状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status sing-box</span><br></pre></td></tr></table></figure><p>查看日志确认无误：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo journalctl -u sing-box --output <span class="built_in">cat</span> -e</span><br></pre></td></tr></table></figure><p>至此，服务端已部署完成。</p><hr /><h2 id="客户端配置文件"><a class="markdownIt-Anchor" href="#客户端配置文件"></a> 客户端配置文件</h2><p>此为示例，主要展示 outbound 的写法，不代表分流规则完善的高阶配置。</p><p><strong>注意替换下方的 <code>你的 VPS 公网 IP</code>、<code>你选定的 SNI 目标站域名</code>、<code>你的 REALITY 公钥</code>、<code>你生成的 short_id</code>、<code>你生成的 AnyTLS 密码</code></strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;anytls&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 VPS 公网 IP&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;password&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 AnyTLS 密码&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reality&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;public_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 REALITY 公钥&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;short_id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 short_id&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].type: anytls</code>：使用 AnyTLS 协议（客户端侧为单一密码认证，无需 <code>users</code> 字段）。</p><p><code>outbounds[].tls.server_name</code>：必须与服务端的 <code>server_name</code> 完全一致，即选定的 SNI 目标站域名。</p><p><code>outbounds[].tls.utls</code>：启用 uTLS 伪造 ClientHello 指纹。<strong>这对 REALITY 客户端是必需的</strong>，不是可选项。REALITY 协议的客户端认证依赖将认证数据嵌入 TLS ClientHello 的 session ID 字段，而 Go 标准库 <code>crypto/tls</code> 不支持自定义 session ID，因此 sing-box 的 REALITY 客户端实现强制要求通过 uTLS 来构造 ClientHello。若省略 <code>utls</code> 或将 <code>utls.enabled</code> 设为 <code>false</code>，sing-box 启动时会直接报错 <code>uTLS is required by reality client</code>。</p><p><code>fingerprint</code> 可选值包括 <code>chrome</code>、<code>firefox</code>、<code>edge</code>、<code>safari</code>、<code>ios</code>、<code>android</code>、<code>random</code>、<code>randomized</code> 等。一般推荐 <code>chrome</code>，与大多数实际浏览器流量分布一致。</p><p>需要说明的是，sing-box 官方文档对 uTLS 本身的评价较为保守（“uTLS has had repeated fingerprinting vulnerabilities discovered by researchers”），但该评价针对的是&quot;单独使用 uTLS 作为 TLS 指纹对抗手段&quot;的场景。在 REALITY 场景下，主要的抗识别机制来自 REALITY 协议本身（借用真实站点完成 TLS 握手），uTLS 在此仅承担 REALITY 协议实现所需的 ClientHello 定制能力，与独立使用 uTLS 的风险模型不同。</p><p><code>outbounds[].tls.reality.public_key</code> 与 <code>short_id</code>：与服务端配置对应。注意客户端侧 <code>short_id</code> 是字符串形式（单个值），而服务端侧是数组形式（可多个）。</p><hr /><h2 id="维护与长期可用性"><a class="markdownIt-Anchor" href="#维护与长期可用性"></a> 维护与长期可用性</h2><p>以下建议基于实际部署经验，用于提升方案的长期稳定性。</p><h3 id="定期轮换"><a class="markdownIt-Anchor" href="#定期轮换"></a> 定期轮换</h3><p>建议按以下周期轮换关键凭据：</p><ol><li><code>short_id</code>：每 6-12 个月轮换一次，可在服务端 <code>short_id</code> 数组中加入新值后通知客户端切换，再删除旧值实现无缝过渡</li><li>AnyTLS 密码：每 1-2 年轮换一次</li><li>REALITY 密钥对：2-3 年轮换一次</li><li>SNI 目标站：每年重新扫描并评估一次，确认原目标仍然可用且未被代理圈大规模使用</li></ol><h3 id="更新-sing-box"><a class="markdownIt-Anchor" href="#更新-sing-box"></a> 更新 sing-box</h3><p>APT 源安装的版本可通过标准方式升级：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade sing-box -y</span><br><span class="line">sudo systemctl restart sing-box</span><br></pre></td></tr></table></figure><p>升级前建议先查看 <a href="https://sing-box.sagernet.org/changelog/">sing-box Change Log</a>，确认没有破坏性变更。</p><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li>客户端连接超时但端口可达：确认客户端的 <code>server_name</code>、<code>public_key</code>、<code>short_id</code> 与服务端完全一致</li><li>主动探测返回了 handshake server 的内容：这通常意味着客户端的 REALITY 认证失败，sing-box 按设计将连接转发给了真实站点。请检查 <code>public_key</code> 与 <code>short_id</code> 是否正确</li><li>部分应用流量正常，部分应用异常：通常是 DNS 泄漏或路由规则问题，检查客户端的 <code>dns</code> 与 <code>route</code> 配置</li><li>近期突然全部无法连接：从国内测 VPS IP 是否可达（<code>ping</code> 或 TCP 443 连通性）；若国内不通但海外能通，说明 IP 被阻断，考虑更换 IP。</li></ol><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://github.com/XTLS/REALITY">XTLS / REALITY</a></p><p><a href="https://github.com/XTLS/RealiTLScanner">XTLS / RealiTLScanner</a></p><p><a href="https://github.com/anytls/anytls-go">anytls / anytls-go</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 4 月 20 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 sing-box 的 AnyTLS + REALITY 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无需域名，无需解析&lt;/li&gt;
&lt;li&gt;无需申请 TLS 证书（REALITY 借用第三方站点的真实 TLS 握手）&lt;/li&gt;
&lt;li&gt;无需 Nginx 或其他 Web 服务器（REALITY 自己负责处理握手层的伪装与转发）&lt;/li&gt;
&lt;li&gt;无需 CloudFlare 中转，客户端与 VPS 直连&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;该方案对 VPS 的 IP 质量要求较高，需要选择合理的 SNI 目标站，并定期维护配置以应对长期可用性风险。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;介绍-anytls-reality&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#介绍-anytls-reality&quot;&gt;&lt;/a&gt; 介绍 AnyTLS + REALITY&lt;/h3&gt;
&lt;p&gt;AnyTLS 与 REALITY 的组合具有以下特性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;REALITY 将 TLS ClientHello 的 SNI 指向一个真实的第三方站点（称为 handshake server），由服务端完成密钥协商。若客户端认证成功则走代理通道，否则将连接完整转发给该第三方站点。这使得主动探测者获取的是真实站点的证书与响应，握手层难以区分真实访问者与代理用户。&lt;/li&gt;
&lt;li&gt;AnyTLS 协议本身在 TLS 之上提供了 &lt;code&gt;padding_scheme&lt;/code&gt; 机制，用于在协议层对数据包长度进行随机填充，以对抗基于包长分布的被动流量识别。&lt;/li&gt;
&lt;li&gt;整个协议链路在直连场景下不引入额外的 transport（如 WebSocket、HTTPUpgrade、gRPC），客户端发出的流量经 REALITY 握手后直接承载 AnyTLS 内容，延迟与吞吐无额外损耗。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;VPS IP 本身已被封锁或严重干扰的情况。REALITY 无法修复 IP 层的封锁。&lt;/li&gt;
&lt;li&gt;需要借助 CDN 隐藏源站 IP 的场景。REALITY 的工作方式与 CDN 反代不兼容。&lt;/li&gt;
&lt;li&gt;使用的第三方客户端版本过旧不支持 AnyTLS 协议的场景。在配置前请先确认目标客户端支持 AnyTLS，否则考虑改用 &lt;a href=&quot;/dreams/sing-box-vless-vision-reality/&quot;&gt;VLESS + Vision + REALITY 方案&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 VLESS + Vision + REALITY 服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-vless-vision-reality/"/>
    <id>https://blog.chaos.run/dreams/sing-box-vless-vision-reality/</id>
    <published>2026-04-20T12:25:04.000Z</published>
    <updated>2026-06-18T17:36:38.964Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 4 月 20 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + Vision + REALITY 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>无需域名，无需解析</li><li>无需申请 TLS 证书（REALITY 借用第三方站点的真实 TLS 握手）</li><li>无需 Nginx 或其他 Web 服务器（REALITY 自己负责处理握手层的伪装与转发）</li><li>无需 CloudFlare 中转，客户端与 VPS 直连</li></ol><p>该方案对 VPS 的 IP 质量要求较高，需要选择合理的 SNI 目标站，并定期维护配置以应对长期可用性风险。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="介绍-vless-vision-reality"><a class="markdownIt-Anchor" href="#介绍-vless-vision-reality"></a> 介绍 VLESS + Vision + REALITY</h3><p>VLESS + Vision + REALITY 是代理中成熟、部署广泛的组合之一，具有以下特性：</p><ol><li>REALITY 将 TLS ClientHello 的 SNI 指向一个真实的第三方站点（称为 handshake server），由服务端完成密钥协商。若客户端认证成功则走代理通道，否则将连接完整转发给该第三方站点。这使得主动探测者获取的是真实站点的证书与响应，握手层难以区分真实访问者与代理用户。</li><li>Vision（<code>xtls-rprx-vision</code>）是 VLESS 的一个子协议流控，它在内层 TLS 握手完成后识别出握手边界，将后续数据从 TLS record 封装中剥离出来，直接通过底层 TCP 传输。这消除了&quot;内层 TLS 报文结构穿透到外层&quot;的特征——即 TLS-in-TLS 的典型包长分布——使代理流量的数据段行为与普通 HTTPS 直连流量趋同。</li><li>整个协议链路在直连场景下不引入额外的 transport，客户端发出的流量经 REALITY 握手后直接承载 VLESS 内容，延迟与吞吐无额外损耗。</li></ol><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>VPS IP 本身已被封锁或严重干扰的情况。REALITY 无法修复 IP 层的封锁。</li><li>需要借助 CDN 隐藏源站 IP 的场景。REALITY 的工作方式与 CDN 反代不兼容，此外 Vision 流控本身也要求底层是裸 TCP，与 CDN 所需的 transport 层（WebSocket、HTTPUpgrade、gRPC 等）不兼容。如需通过 CDN，请改用 VLESS + WebSocket/HTTPUpgrade + TLS 的方案，而非本文的 Vision 方案。</li><li>需要代理 UDP 流量但客户端不支持 XUDP 的场景。Vision 基于 TCP，UDP 通过 VLESS 的 <code>packet_encoding</code> 机制封装传输，客户端需要支持 xudp 或 packetaddr。</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="服务器"><a class="markdownIt-Anchor" href="#服务器"></a> 服务器</h3><ol><li>可用的公网 IP 服务器</li><li>建议选择冷门机房，避开已被大量代理用户使用的热门 IP 段</li><li>开放 TCP <code>443</code> 端口的入站访问（若有防火墙或安全组）</li></ol><h3 id="选定-reality-的-sni-目标站"><a class="markdownIt-Anchor" href="#选定-reality-的-sni-目标站"></a> 选定 REALITY 的 SNI 目标站</h3><p>REALITY 需要一个真实存在的第三方站点作为 SNI 目标（即 handshake server）。该目标站需要满足以下条件：</p><ol><li>站点支持 TLS 1.3</li><li>站点支持 X25519 密钥交换</li><li>站点返回的证书合法且稳定</li><li>站点非 CloudFlare、Akamai 等大型 CDN 托管（回源复杂、SNI 校验可能不一致）</li><li>站点地理位置最好与 VPS 同机房或同 IP 段，以避免 IP 与域名地理分布不一致引起的可疑特征</li><li>站点不要使用 <code>www.microsoft.com</code>、<code>www.apple.com</code>、<code>itunes.apple.com</code> 等已被代理圈广泛使用的目标</li></ol><p>可以使用 <a href="https://github.com/XTLS/RealiTLScanner">RealiTLScanner</a> 扫描 VPS 邻近 IP 段，找到合适的目标。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-64</span><br><span class="line"><span class="built_in">chmod</span> +x RealiTLScanner-linux-64</span><br><span class="line">wget https://github.com/Loyalsoldier/geoip/releases/latest/download/Country.mmdb</span><br><span class="line">./RealiTLScanner-linux-64 -addr 你的VPS_IP -port 443 -out results.csv</span><br></pre></td></tr></table></figure><p>扫描结果示例中会列出每个 IP 对应的域名、TLS 版本、是否 <code>feasible</code>。从 <code>feasible=true</code> 的记录中挑选几个域名，并用浏览器打开 <code>https://该域名/</code> 确认内容为正常的非敏感网站。</p><p>然后，本地再用 <code>dig 该域名</code> 或者 <code>nslookup 该域名</code> 命令来检查一下该域名是否直接解析（A 记录）到扫描到的 IP。若存在 CNAME，说明该域名可能使用了弹性 IP 或负载均衡，IP 随时可能变动，不宜选择；若 A 记录 IP 与扫描结果不一致，则可能是 CDN 托管或扫到了其他 REALITY 服务器，也应排除。</p><p>当域名解析结果符合条件，则可选择该域名。</p><p>或者也可以让 <a href="https://download.chaos.run/scripts/find-reality.py">find-reality.py</a> 自动跑完上述筛选，使用 <code>./find-reality.py results.csv</code> 跑一下，脚本会依次做证书域名黑名单过滤、<code>dig</code> A 记录检查、TLS 1.3 + HTTPS 探测和分类，输出 PASS / REVIEW / FAIL；再从 PASS 列表里人工挑选，访问目标站查看是否是正常网站即可。</p><h3 id="内容准备"><a class="markdownIt-Anchor" href="#内容准备"></a> 内容准备</h3><ol><li>记录下上一步选定的 SNI 目标站域名</li><li>生成一个用于 VLESS 用户认证的 UUID（见后续步骤）</li><li>生成一对 REALITY 密钥（见后续步骤）</li><li>生成一个或多个 <code>short_id</code>（见后续步骤）</li></ol><h3 id="安装所需基本工具"><a class="markdownIt-Anchor" href="#安装所需基本工具"></a> 安装所需基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates -y</span><br></pre></td></tr></table></figure><h3 id="服务器防火墙配置"><a class="markdownIt-Anchor" href="#服务器防火墙配置"></a> 服务器防火墙配置</h3><p>确保服务器仅开放必要端口。本方案中 sing-box 将监听 <code>443/tcp</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ufw allow 443/tcp</span><br></pre></td></tr></table></figure><hr /><h2 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h2><h3 id="通过官方-apt-仓库安装"><a class="markdownIt-Anchor" href="#通过官方-apt-仓库安装"></a> 通过官方 APT 仓库安装</h3><p>sing-box 官方提供了 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box <span class="comment"># or sing-box-beta</span></span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><h3 id="systemd-服务"><a class="markdownIt-Anchor" href="#systemd-服务"></a> systemd 服务</h3><p>APT 包已自带 systemd 单元，无需手动编写。服务单元会读取 <code>/etc/sing-box/config.json</code> 作为配置文件。常用管理命令参见官方文档。</p><p>此时尚未编写配置文件，暂不启动服务。</p><hr /><h2 id="生成密钥与标识"><a class="markdownIt-Anchor" href="#生成密钥与标识"></a> 生成密钥与标识</h2><h3 id="生成-reality-密钥对"><a class="markdownIt-Anchor" href="#生成-reality-密钥对"></a> 生成 REALITY 密钥对</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate reality-keypair</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PrivateKey: uP2PWZY... (服务端用)</span><br><span class="line">PublicKey:  AbC123... (客户端用)</span><br></pre></td></tr></table></figure><p>将这两个值记录下来。<code>PrivateKey</code> 用于服务端配置，<code>PublicKey</code> 用于客户端配置。</p><h3 id="生成-short_id"><a class="markdownIt-Anchor" href="#生成-short_id"></a> 生成 <code>short_id</code></h3><p><code>short_id</code> 是 0 到 8 字节的十六进制字符串（即 0 到 16 个十六进制字符），用于在一个 REALITY 实例下区分不同客户端身份。生成一个 8 字节的 <code>short_id</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 8</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0123456789abcdef</span><br></pre></td></tr></table></figure><p>记录下来。服务端可以配置多个 <code>short_id</code> 以支持多客户端；客户端配置时使用其中一个。</p><h3 id="生成-vless-uuid"><a class="markdownIt-Anchor" href="#生成-vless-uuid"></a> 生成 VLESS UUID</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate uuid</span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bf000d23-0752-40b4-affe-68f7707a9661</span><br></pre></td></tr></table></figure><p>记录下来，用于服务端与客户端的 VLESS 用户认证。</p><hr /><h2 id="配置-sing-box"><a class="markdownIt-Anchor" href="#配置-sing-box"></a> 配置 sing-box</h2><h3 id="创建配置文件"><a class="markdownIt-Anchor" href="#创建配置文件"></a> 创建配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/sing-box</span><br><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>添加如下内容。<strong>注意替换其中的 <code>你的 REALITY 私钥</code>、<code>你选定的 SNI 目标站域名</code>、<code>你生成的 short_id</code>、<code>你生成的 UUID</code></strong>：</p><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;::&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;flow&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xtls-rprx-vision&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reality&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;handshake&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;private_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 REALITY 私钥&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;short_id&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;你生成的 short_id&quot;</span></span><br><span class="line">          <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="关键字段说明"><a class="markdownIt-Anchor" href="#关键字段说明"></a> 关键字段说明</h3><p>具体参见 <a href="https://sing-box.sagernet.org/configuration/inbound/vless/">VLESS</a> 与 <a href="https://sing-box.sagernet.org/configuration/shared/tls/#reality-fields">TLS - Reality Fields</a>。</p><p><code>inbounds[].listen</code>：<code>::</code> 表示同时监听 IPv4 与 IPv6。若 VPS 仅有 IPv4，也可以填 <code>0.0.0.0</code>。</p><p><code>inbounds[].listen_port</code>：监听端口。本文使用 <code>443</code>，与真实 HTTPS 服务共用同一端口，最不引起可疑。</p><p><code>inbounds[].users[]</code>：VLESS 的用户列表，每个用户包含 <code>name</code>、<code>uuid</code> 与 <code>flow</code>。<code>name</code> 仅用于日志标识，<code>uuid</code> 用于认证。</p><p><code>inbounds[].users[].flow</code>：VLESS 的子协议字段。本文固定为 <code>xtls-rprx-vision</code>，即启用 Vision 流控。根据 sing-box 官方文档，该字段目前仅此一个合法值。服务端与客户端必须同时设置此字段且值一致，否则协议不匹配，连接将被拒绝。注意：<strong>配置了 Vision 流控后，同一个 VLESS inbound 不能再配置 <code>transport</code> 字段</strong>（WebSocket、HTTPUpgrade、gRPC 等），否则 Vision 流控所依赖的&quot;底层 TCP 裸传&quot;假设不成立，行为不符合设计。</p><p><code>inbounds[].tls.server_name</code>：REALITY 对外声明的 SNI，必须与 <code>reality.handshake.server</code> 保持一致，且必须是真实存在、可访问的站点。</p><p><code>inbounds[].tls.reality.handshake.server</code> 与 <code>server_port</code>：REALITY 在客户端认证失败或发起探测时，会将流量完整转发给该地址。必须是一个真实运行 HTTPS 服务的站点。</p><p><code>inbounds[].tls.reality.private_key</code>：REALITY 服务端私钥，由 <code>sing-box generate reality-keypair</code> 生成。</p><p><code>inbounds[].tls.reality.short_id</code>：数组形式，可填入一个或多个 <code>short_id</code>。客户端连接时必须使用其中之一。</p><p><code>outbounds[]</code>：本方案作为纯代理服务端，只需一个 <code>direct</code> 出站，将认证通过的代理流量直接发往目标。</p><p><code>route.rules[]</code> 中的规则：</p><ul><li><code>ip_is_private</code> 配合 <code>&quot;action&quot;: &quot;reject&quot;</code>：匹配内网地址并拒绝，防止代理流量访问 VPS 所在内网资源</li><li><code>protocol: bittorrent</code> 配合 <code>&quot;action&quot;: &quot;reject&quot;</code>：拒绝 BT 流量，避免 VPS IP 被滥用举报</li></ul><h3 id="配置校验"><a class="markdownIt-Anchor" href="#配置校验"></a> 配置校验</h3><p>保存后，使用 sing-box 自带的校验命令检查配置文件语法：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><p>若无输出则表示配置文件通过校验。如有报错，按提示修正。</p><hr /><h2 id="启动服务"><a class="markdownIt-Anchor" href="#启动服务"></a> 启动服务</h2><p>启动 sing-box 并设置开机自启：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br></pre></td></tr></table></figure><p>查看运行状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status sing-box</span><br></pre></td></tr></table></figure><p>查看日志确认无误：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo journalctl -u sing-box --output <span class="built_in">cat</span> -e</span><br></pre></td></tr></table></figure><p>至此，服务端已部署完成。</p><hr /><h2 id="客户端配置文件"><a class="markdownIt-Anchor" href="#客户端配置文件"></a> 客户端配置文件</h2><p>此为示例，主要展示 outbound 的写法，不代表分流规则完善的高阶配置。</p><p><strong>注意替换下方的 <code>你的 VPS 公网 IP</code>、<code>你选定的 SNI 目标站域名</code>、<code>你的 REALITY 公钥</code>、<code>你生成的 short_id</code>、<code>你生成的 UUID</code></strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 VPS 公网 IP&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;flow&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xtls-rprx-vision&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;packet_encoding&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xudp&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你选定的 SNI 目标站域名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;reality&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;public_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你的 REALITY 公钥&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;short_id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 short_id&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].type: vless</code>：使用 VLESS 协议（客户端侧为单一 UUID 认证，无需 <code>users</code> 字段）。</p><p><code>outbounds[].uuid</code>：与服务端 <code>users[].uuid</code> 一致。</p><p><code>outbounds[].flow</code>：必须填 <code>xtls-rprx-vision</code>，并与服务端一致。该字段为空或填其他值将与服务端协议不匹配。</p><p><code>outbounds[].packet_encoding</code>：UDP 包的封装方式。本文采用 <code>xudp</code>，这是 sing-box 的默认值，也是主流 VLESS 实现的推荐值，兼容 Xray 生态。若客户端不需要 UDP 代理或对 UDP 封装格式有特殊要求，可省略该字段或改为其他值。</p><p><code>outbounds[].tls.server_name</code>：必须与服务端的 <code>server_name</code> 完全一致，即选定的 SNI 目标站域名。</p><p><code>outbounds[].tls.utls</code>：启用 uTLS 伪造 ClientHello 指纹。<strong>这对 REALITY 客户端是必需的</strong>，不是可选项。REALITY 协议的客户端认证依赖将认证数据嵌入 TLS ClientHello 的 session ID 字段，而 Go 标准库 <code>crypto/tls</code> 不支持自定义 session ID，因此 sing-box 的 REALITY 客户端实现强制要求通过 uTLS 来构造 ClientHello。若省略 <code>utls</code> 或将 <code>utls.enabled</code> 设为 <code>false</code>，sing-box 启动时会直接报错 <code>uTLS is required by reality client</code>。</p><p><code>fingerprint</code> 可选值包括 <code>chrome</code>、<code>firefox</code>、<code>edge</code>、<code>safari</code>、<code>ios</code>、<code>android</code>、<code>random</code>、<code>randomized</code> 等。一般推荐 <code>chrome</code>，与大多数实际浏览器流量分布一致。</p><p>需要说明的是，sing-box 官方文档对 uTLS 本身的评价较为保守（“uTLS has had repeated fingerprinting vulnerabilities discovered by researchers”），但该评价针对的是&quot;单独使用 uTLS 作为 TLS 指纹对抗手段&quot;的场景。在 REALITY 场景下，主要的抗识别机制来自 REALITY 协议本身（借用真实站点完成 TLS 握手），uTLS 在此仅承担 REALITY 协议实现所需的 ClientHello 定制能力，与独立使用 uTLS 的风险模型不同。</p><p><code>outbounds[].tls.reality.public_key</code> 与 <code>short_id</code>：与服务端配置对应。注意客户端侧 <code>short_id</code> 是字符串形式（单个值），而服务端侧是数组形式（可多个）。</p><hr /><h2 id="维护与长期可用性"><a class="markdownIt-Anchor" href="#维护与长期可用性"></a> 维护与长期可用性</h2><p>以下建议基于实际部署经验，用于提升方案的长期稳定性。</p><h3 id="定期轮换"><a class="markdownIt-Anchor" href="#定期轮换"></a> 定期轮换</h3><p>建议按以下周期轮换关键凭据：</p><ol><li><code>short_id</code>：每 6-12 个月轮换一次，可在服务端 <code>short_id</code> 数组中加入新值后通知客户端切换，再删除旧值实现无缝过渡</li><li>VLESS UUID：每 1-2 年轮换一次</li><li>REALITY 密钥对：2-3 年轮换一次</li><li>SNI 目标站：每年重新扫描并评估一次，确认原目标仍然可用且未被代理圈大规模使用</li></ol><h3 id="更新-sing-box"><a class="markdownIt-Anchor" href="#更新-sing-box"></a> 更新 sing-box</h3><p>APT 源安装的版本可通过标准方式升级：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade sing-box -y</span><br><span class="line">sudo systemctl restart sing-box</span><br></pre></td></tr></table></figure><p>升级前建议先查看 <a href="https://sing-box.sagernet.org/changelog/">sing-box Change Log</a>，确认没有破坏性变更。</p><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li>客户端连接超时但端口可达：确认客户端的 <code>server_name</code>、<code>public_key</code>、<code>short_id</code>、<code>uuid</code>、<code>flow</code> 与服务端完全一致</li><li>主动探测返回了 handshake server 的内容：这通常意味着客户端的 REALITY 认证失败，sing-box 按设计将连接转发给了真实站点。请检查 <code>public_key</code> 与 <code>short_id</code> 是否正确</li><li>客户端能连上但流量异常（如慢、丢包、协议错误）：检查服务端和客户端的 <code>flow</code> 是否都设置为 <code>xtls-rprx-vision</code>。服务端设置了而客户端没有，或反之，连接虽能建立但行为会异常</li><li>部分应用流量正常，部分应用异常：通常是 DNS 泄漏或路由规则问题，检查客户端的 <code>dns</code> 与 <code>route</code> 配置</li><li>近期突然全部无法连接：从国内测 VPS IP 是否可达（<code>ping</code> 或 TCP 443 连通性）；若国内不通但海外能通，说明 IP 被阻断，考虑更换 IP。</li></ol><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://github.com/XTLS/REALITY">XTLS / REALITY</a></p><p><a href="https://github.com/XTLS/Xray-core">XTLS / Xray-core / Vision</a></p><p><a href="https://github.com/XTLS/RealiTLScanner">XTLS / RealiTLScanner</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 4 月 20 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + Vision + REALITY 服务端，并说明对应的客户端配置文件的格式。本文同样完全适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无需域名，无需解析&lt;/li&gt;
&lt;li&gt;无需申请 TLS 证书（REALITY 借用第三方站点的真实 TLS 握手）&lt;/li&gt;
&lt;li&gt;无需 Nginx 或其他 Web 服务器（REALITY 自己负责处理握手层的伪装与转发）&lt;/li&gt;
&lt;li&gt;无需 CloudFlare 中转，客户端与 VPS 直连&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;该方案对 VPS 的 IP 质量要求较高，需要选择合理的 SNI 目标站，并定期维护配置以应对长期可用性风险。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，进行 sing-box 的部署，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;介绍-vless-vision-reality&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#介绍-vless-vision-reality&quot;&gt;&lt;/a&gt; 介绍 VLESS + Vision + REALITY&lt;/h3&gt;
&lt;p&gt;VLESS + Vision + REALITY 是代理中成熟、部署广泛的组合之一，具有以下特性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;REALITY 将 TLS ClientHello 的 SNI 指向一个真实的第三方站点（称为 handshake server），由服务端完成密钥协商。若客户端认证成功则走代理通道，否则将连接完整转发给该第三方站点。这使得主动探测者获取的是真实站点的证书与响应，握手层难以区分真实访问者与代理用户。&lt;/li&gt;
&lt;li&gt;Vision（&lt;code&gt;xtls-rprx-vision&lt;/code&gt;）是 VLESS 的一个子协议流控，它在内层 TLS 握手完成后识别出握手边界，将后续数据从 TLS record 封装中剥离出来，直接通过底层 TCP 传输。这消除了&amp;quot;内层 TLS 报文结构穿透到外层&amp;quot;的特征——即 TLS-in-TLS 的典型包长分布——使代理流量的数据段行为与普通 HTTPS 直连流量趋同。&lt;/li&gt;
&lt;li&gt;整个协议链路在直连场景下不引入额外的 transport，客户端发出的流量经 REALITY 握手后直接承载 VLESS 内容，延迟与吞吐无额外损耗。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;VPS IP 本身已被封锁或严重干扰的情况。REALITY 无法修复 IP 层的封锁。&lt;/li&gt;
&lt;li&gt;需要借助 CDN 隐藏源站 IP 的场景。REALITY 的工作方式与 CDN 反代不兼容，此外 Vision 流控本身也要求底层是裸 TCP，与 CDN 所需的 transport 层（WebSocket、HTTPUpgrade、gRPC 等）不兼容。如需通过 CDN，请改用 VLESS + WebSocket/HTTPUpgrade + TLS 的方案，而非本文的 Vision 方案。&lt;/li&gt;
&lt;li&gt;需要代理 UDP 流量但客户端不支持 XUDP 的场景。Vision 基于 TCP，UDP 通过 VLESS 的 &lt;code&gt;packet_encoding&lt;/code&gt; 机制封装传输，客户端需要支持 xudp 或 packetaddr。&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
  </entry>
  
  <entry>
    <title>Debian &amp; Ubuntu 搭建部署 sing-box 的 VLESS + WebSocket + Cloudflare Tunnel + ECH + Caddy 服务</title>
    <link href="https://blog.chaos.run/dreams/sing-box-vless-websocket-cloudflare-tunnel-ech/"/>
    <id>https://blog.chaos.run/dreams/sing-box-vless-websocket-cloudflare-tunnel-ech/</id>
    <published>2026-04-18T18:17:05.000Z</published>
    <updated>2026-06-18T17:36:38.964Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文最后更新于 2026 年 4 月 18 日</strong></p><hr /><p>本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + WebSocket 服务端，通过 Cloudflare Tunnel 隐藏源站 IP，使用 Caddy 建立伪装站，并在客户端启用 ECH 加密 SNI。本文同样完全适用于 Ubuntu 24.04 及以上系统。</p><p>本方案有以下特点：</p><ol><li>除 SSH 管理端口外，VPS 无需开放任何业务入站端口（代理流量通过 cloudflared 主动出站连接进入），真实 IP 完全不出现在 DNS 记录、证书或任何公开信息中</li><li>无需申请 TLS 证书（外层 TLS 由 Cloudflare 边缘节点处理，VPS 内部全程明文 HTTP 回环通信）</li><li>浏览器直接访问域名显示真实的伪装网站，代理路径隐藏在特定 URI 下</li><li>客户端启用 ECH 后，TLS 握手中的真实 SNI 被加密，中间人仅能看到 <code>cloudflare-ech.com</code> 的外层 SNI（需配合加密 DNS 避免域名解析泄漏）</li></ol><p>本文提供的是 WebSocket 传输版本，客户端兼容性最广。如果客户端全程使用 sing-box，也可参考 <a href="/dreams/sing-box-vless-httpupgrade-cloudflare-tunnel-ech/">HTTPUpgrade 版本</a>，协议开销更小。两者在隐蔽性上没有差异。</p><p>注：请先参照 <a href="/dreams/ubuntu-server-starting-settings/">Debian &amp; Ubuntu 服务器的初始化配置</a> 一文对服务器进行各种必要的配置。本文以 <code>sammy</code> 用户为例，并默认已按初始化配置文章对服务器进行了配置。</p><hr /><h2 id="背景与原理"><a class="markdownIt-Anchor" href="#背景与原理"></a> 背景与原理</h2><h3 id="整体架构"><a class="markdownIt-Anchor" href="#整体架构"></a> 整体架构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">客户端 sing-box (VLESS + WebSocket)</span><br><span class="line">   │ TLS 1.3 + ECH（外层 SNI: cloudflare-ech.com）</span><br><span class="line">   ▼</span><br><span class="line">Cloudflare 边缘节点</span><br><span class="line">   │ CF 内部协议（Tunnel）</span><br><span class="line">   ▼</span><br><span class="line">VPS 上 cloudflared 守护进程（主动出站长连接）</span><br><span class="line">   │ 明文 HTTP（本机回环）</span><br><span class="line">   ▼</span><br><span class="line">Caddy（127.0.0.1:8080）</span><br><span class="line">   ├─ 其他请求 → 伪装静态网站</span><br><span class="line">   └─ /你的隐藏路径 + WebSocket Upgrade → sing-box VLESS inbound</span><br><span class="line">             │</span><br><span class="line">             ▼</span><br><span class="line">sing-box（127.0.0.1:8443）→ direct outbound → 目标网站</span><br></pre></td></tr></table></figure><h3 id="关于-tls-in-tls"><a class="markdownIt-Anchor" href="#关于-tls-in-tls"></a> 关于 TLS-in-TLS</h3><p>本方案中，用户访问 HTTPS 网站时产生的内层 TLS 流量被封装在 Cloudflare 的外层 TLS 连接中，TLS-in-TLS 特征不可避免。sing-box 的 <code>multiplex.padding</code> 可在多路复用层添加随机填充以缓解长度特征，但无法完全消除。需要消除 TLS-in-TLS 的场景应选择 <a href="/dreams/sing-box-anytls-reality/">AnyTLS + REALITY</a> 或者 <a href="/dreams/sing-box-vless-vision-reality/">VLESS + Vision + REALITY</a>（两者都是直连方案，无法过 CDN）。</p><h3 id="本方案不适用的场景"><a class="markdownIt-Anchor" href="#本方案不适用的场景"></a> 本方案不适用的场景</h3><ol><li>VPS 无法出站连接 Cloudflare 的场景（极少数网络环境）</li><li>需要完全消除 TLS-in-TLS 特征的场景</li><li>追求极致低延迟的场景（CF Tunnel 多一跳，延迟略高于直连）</li></ol><span id="more"></span><hr /><h2 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h2><h3 id="所需资源"><a class="markdownIt-Anchor" href="#所需资源"></a> 所需资源</h3><ol><li><strong>一台 VPS</strong>（任何地区均可，NAT VPS 也可以，只要能出站连接 Cloudflare）</li><li><strong>一个域名</strong>（将其 NS 托管到 Cloudflare，低价域名即可）</li><li><strong>一套静态网页内容</strong>（推荐，作为伪装站）</li></ol><p>下文假设域名为 <code>example.com</code>，代理用子域名 <code>cdn.example.com</code>。前缀 <code>cdn</code> 仅为示例，请根据需要更换。</p><h3 id="安装所需基本工具"><a class="markdownIt-Anchor" href="#安装所需基本工具"></a> 安装所需基本工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt install curl vim wget ca-certificates unzip -y</span><br></pre></td></tr></table></figure><hr /><h2 id="cloudflare-tunnel-配置"><a class="markdownIt-Anchor" href="#cloudflare-tunnel-配置"></a> Cloudflare Tunnel 配置</h2><h3 id="vps-安装并配置-cloudflared"><a class="markdownIt-Anchor" href="#vps-安装并配置-cloudflared"></a> VPS 安装并配置 cloudflared</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p --mode=0755 /usr/share/keyrings</span><br><span class="line">curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo <span class="built_in">tee</span> /usr/share/keyrings/cloudflare-main.gpg &gt;/dev/null</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/cloudflared.list</span><br><span class="line">sudo apt-get update &amp;&amp; sudo apt-get install cloudflared</span><br></pre></td></tr></table></figure><h3 id="创建-tunnel"><a class="markdownIt-Anchor" href="#创建-tunnel"></a> 创建 Tunnel</h3><ol><li>登录 <a href="https://dash.cloudflare.com">dash.cloudflare.com</a></li><li>左侧菜单选择 <strong>Zero Trust</strong></li><li>左侧菜单 <strong>Networks → Connectors</strong></li><li>点击 <strong>Create a tunnel</strong>，选择 <strong>Cloudflared</strong></li><li>Tunnel 名称随意填写，点击 <strong>Save tunnel</strong></li><li>下一步会显示安装命令，<strong>复制此命令</strong>，在 VPS 上执行。</li></ol><p>运行复制的命令注册并启动服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo cloudflared service install eyJhIjoiYWJjZGVmMTIzNDU2Nzg5...</span><br></pre></td></tr></table></figure><p>确认运行状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status cloudflared</span><br></pre></td></tr></table></figure><p>并可在 Cloudflare 网页控制台看到 Connector 已经建立连接，然后点击 <strong>Next</strong>。</p><h3 id="配置-public-hostname"><a class="markdownIt-Anchor" href="#配置-public-hostname"></a> 配置 Public Hostname</h3><p>在页面如此配置：</p><table><thead><tr><th>字段</th><th>值</th></tr></thead><tbody><tr><td>Subdomain</td><td><code>cdn</code></td></tr><tr><td>Domain</td><td><code>example.com</code></td></tr><tr><td>Path</td><td>（留空）</td></tr><tr><td>Type</td><td><code>HTTP</code></td></tr><tr><td>URL</td><td><code>localhost:8080</code></td></tr></tbody></table><p>然后点击 <strong>Complete Setup</strong> 保存后，Cloudflare 会自动在 DNS 中创建 CNAME 记录 <code>cdn.example.com</code> → <code>&lt;tunnel-id&gt;.cfargotunnel.com</code>。</p><h3 id="ssltls-设置"><a class="markdownIt-Anchor" href="#ssltls-设置"></a> SSL/TLS 设置</h3><p>进入 Cloudflare 域名 Dashboard → SSL/TLS：</p><ul><li><strong>Overview</strong> → 加密模式设为 <strong>Full (strict)</strong>（Tunnel 模式下 CF 不经过传统 HTTPS 回源，此设置不影响 Tunnel 通信，选择最严格的模式即可）</li><li><strong>Edge Certificates</strong> → Minimum TLS Version：<strong>TLS 1.3</strong></li><li><strong>Edge Certificates</strong> → TLS 1.3：<strong>On</strong></li></ul><h3 id="确认-ech-状态"><a class="markdownIt-Anchor" href="#确认-ech-状态"></a> 确认 ECH 状态</h3><p>进入 SSL/TLS → Edge Certificates，找到 <strong>Encrypted ClientHello (ECH)</strong>。Free 计划域名<a href="https://developers.cloudflare.com/ssl/edge-certificates/ech/#enable-ech">默认已启用</a>。其他计划确认状态为 <strong>Enabled</strong> 即可。ECH 的密钥管理与 ECHConfig 发布由 Cloudflare 自动完成，服务端无需任何操作。</p><hr /><h2 id="vps-部署"><a class="markdownIt-Anchor" href="#vps-部署"></a> VPS 部署</h2><h3 id="安装-caddy"><a class="markdownIt-Anchor" href="#安装-caddy"></a> 安装 Caddy</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl</span><br><span class="line">curl -1sLf <span class="string">&#x27;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#x27;</span> | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg</span><br><span class="line">curl -1sLf <span class="string">&#x27;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/caddy-stable.list</span><br><span class="line">sudo <span class="built_in">chmod</span> o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg</span><br><span class="line">sudo <span class="built_in">chmod</span> o+r /etc/apt/sources.list.d/caddy-stable.list</span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install caddy</span><br></pre></td></tr></table></figure><h3 id="安装-sing-box"><a class="markdownIt-Anchor" href="#安装-sing-box"></a> 安装 sing-box</h3><p>sing-box 官方提供了 APT 仓库，推荐优先使用此方式，便于后续升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp;</span><br><span class="line">   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   sudo <span class="built_in">chmod</span> a+r /etc/apt/keyrings/sagernet.asc &amp;&amp;</span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&#x27;</span></span><br><span class="line"><span class="string">Types: deb</span></span><br><span class="line"><span class="string">URIs: https://deb.sagernet.org/</span></span><br><span class="line"><span class="string">Suites: *</span></span><br><span class="line"><span class="string">Components: *</span></span><br><span class="line"><span class="string">Enabled: yes</span></span><br><span class="line"><span class="string">Signed-By: /etc/apt/keyrings/sagernet.asc</span></span><br><span class="line"><span class="string">&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/sagernet.sources &amp;&amp;</span><br><span class="line">   sudo apt-get update &amp;&amp;</span><br><span class="line">   sudo apt-get install sing-box <span class="comment"># or sing-box-beta</span></span><br></pre></td></tr></table></figure><p>验证版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box version</span><br></pre></td></tr></table></figure><h3 id="生成-uuid"><a class="markdownIt-Anchor" href="#生成-uuid"></a> 生成 UUID</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate uuid</span><br></pre></td></tr></table></figure><p>记录输出的 UUID，服务端与客户端均需使用。</p><hr /><h2 id="伪装站建设"><a class="markdownIt-Anchor" href="#伪装站建设"></a> 伪装站建设</h2><p>伪装站的质量直接影响方案的隐蔽性。推荐使用 Hugo 或 Hexo 生成的个人技术博客、摄影作品集、小工具站等。避免使用空白页、默认欢迎页或任何敏感内容。</p><p>快速准备一个最简伪装页：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /var/www/disguise</span><br><span class="line">sudo <span class="built_in">chown</span> -R <span class="variable">$USER</span>:<span class="variable">$USER</span> /var/www/disguise</span><br></pre></td></tr></table></figure><p>创建 <code>/var/www/disguise/index.html</code>，内容为任意看起来合理的静态网页。如有 Hugo 等静态站生成器，将生成的 <code>public/</code> 目录内容放入 <code>/var/www/disguise/</code> 中。</p><p>建议同时准备一个风格一致的 <code>/var/www/disguise/404.html</code>，用于不存在路径的自定义 404 页面，避免暴露默认服务器错误页。</p><hr /><h2 id="服务端配置文件"><a class="markdownIt-Anchor" href="#服务端配置文件"></a> 服务端配置文件</h2><h3 id="生成隐藏路径"><a class="markdownIt-Anchor" href="#生成隐藏路径"></a> 生成隐藏路径</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 16</span><br></pre></td></tr></table></figure><p>输出示例：<code>a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</code>。将其作为代理路径使用，使用时前面注意加斜杠。</p><h3 id="caddy-配置"><a class="markdownIt-Anchor" href="#caddy-配置"></a> Caddy 配置</h3><p>编辑 <code>/etc/caddy/Caddyfile</code>，注意替换其中的随机隐藏路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/caddy/Caddyfile</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>/etc/caddy/Caddyfile</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    admin off</span><br><span class="line">    auto_https off</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">:8080 &#123;</span><br><span class="line">    root * /var/www/disguise</span><br><span class="line"></span><br><span class="line">    @proxy &#123;</span><br><span class="line">        path /之前生成的随机隐藏路径</span><br><span class="line">        header Connection *Upgrade*</span><br><span class="line">        header Upgrade websocket</span><br><span class="line">    &#125;</span><br><span class="line">    reverse_proxy @proxy 127.0.0.1:8443</span><br><span class="line"></span><br><span class="line">    file_server &#123;</span><br><span class="line">        index index.html</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    handle_errors &#123;</span><br><span class="line">        rewrite * /404.html</span><br><span class="line">        file_server</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    encode gzip zstd</span><br><span class="line"></span><br><span class="line">    log &#123;</span><br><span class="line">        output file /var/log/caddy/access.log &#123;</span><br><span class="line">            roll_size 10mb</span><br><span class="line">            roll_keep 3</span><br><span class="line">        &#125;</span><br><span class="line">        level ERROR</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>与 HTTPUpgrade 版本的差异：<code>@proxy</code> matcher 额外检查 <code>header Upgrade websocket</code>，确保只有 WebSocket 升级请求才被转发到 sing-box。</p><p>验证配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> -p /var/log/caddy &amp;&amp; sudo <span class="built_in">chown</span> -R caddy:caddy /var/log/caddy</span><br><span class="line">sudo caddy <span class="built_in">fmt</span> --overwrite /etc/caddy/Caddyfile</span><br><span class="line">sudo -u caddy caddy validate --config /etc/caddy/Caddyfile</span><br></pre></td></tr></table></figure><p>重启 Caddy 服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart caddy</span><br></pre></td></tr></table></figure><h3 id="sing-box-配置"><a class="markdownIt-Anchor" href="#sing-box-配置"></a> sing-box 配置</h3><p>编辑 <code>/etc/sing-box/config.json</code>，<strong>注意替换 <code>你生成的 UUID</code> 和路径</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/sing-box/config.json</span><br></pre></td></tr></table></figure><figure class="highlight json"><figcaption><span>/etc/sing-box/config.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;127.0.0.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;listen_port&quot;</span><span class="punctuation">:</span> <span class="number">8443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;users&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sammy&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ws&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max_early_data&quot;</span><span class="punctuation">:</span> <span class="number">2048</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;early_data_header_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Sec-WebSocket-Protocol&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;bittorrent&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reject&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>关键字段说明：</p><p><code>inbounds[].listen</code>：<code>127.0.0.1</code>，仅接收 Caddy 反代过来的请求，不监听公网。</p><p><code>inbounds[].transport.type</code>：<code>ws</code>，WebSocket 传输。注意此处<strong>不配置 <code>flow</code> 字段</strong>——Vision 流控要求底层裸 TCP，与任何 transport 不兼容。</p><p><code>inbounds[].transport.path</code>：必须与 Caddy 配置中的路径完全一致。</p><p><code>inbounds[].transport.max_early_data</code> 与 <code>early_data_header_name</code>：启用 WebSocket early data，将首包数据放入 <code>Sec-WebSocket-Protocol</code> 头中减少一次 RTT。<code>max_early_data</code> 默认 0（不启用），需设为非零值；<code>early_data_header_name</code> 指定 header 名（默认放在 path 中），与 Xray-core 兼容设为 <code>Sec-WebSocket-Protocol</code>。两端配置需保持一致。</p><p>验证并启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo sing-box check -c /etc/sing-box/config.json</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now sing-box</span><br></pre></td></tr></table></figure><hr /><h2 id="验证服务端"><a class="markdownIt-Anchor" href="#验证服务端"></a> 验证服务端</h2><h3 id="服务状态检查"><a class="markdownIt-Anchor" href="#服务状态检查"></a> 服务状态检查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl status cloudflared   <span class="comment"># active (running)</span></span><br><span class="line">sudo ss -tlnp | grep 8080           <span class="comment"># 127.0.0.1:8080 Caddy</span></span><br><span class="line">sudo ss -tlnp | grep 8443           <span class="comment"># 127.0.0.1:8443 sing-box</span></span><br></pre></td></tr></table></figure><h3 id="浏览器访问检查"><a class="markdownIt-Anchor" href="#浏览器访问检查"></a> 浏览器访问检查</h3><ol><li>访问 <code>https://cdn.example.com</code> → 应显示伪装网站</li><li>访问 <code>https://cdn.example.com/任意不存在路径</code> → 应显示风格一致的自定义 404 页面</li><li>访问 <code>https://cdn.example.com/之前生成的随机隐藏路径</code> → 应显示自定义 404 页面（浏览器不发送 WebSocket Upgrade 头，Caddy 不会转发到 sing-box）</li></ol><p>三项均符合预期，说明伪装站与路径隐蔽性到位。</p><h3 id="确认-ech-可用"><a class="markdownIt-Anchor" href="#确认-ech-可用"></a> 确认 ECH 可用</h3><p>在本地终端（非 VPS）执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dig cdn.example.com HTTPS @1.1.1.1</span><br></pre></td></tr></table></figure><p>返回结果中包含 <code>ech=...</code> 字段，说明 Cloudflare 已发布 ECHConfig，客户端可以使用 ECH。</p><hr /><h2 id="客户端配置文件"><a class="markdownIt-Anchor" href="#客户端配置文件"></a> 客户端配置文件</h2><p>以下为客户端示例配置，<strong>注意替换 <code>你生成的 UUID</code> 和路径</strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;level&quot;</span><span class="punctuation">:</span> <span class="string">&quot;warn&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dns&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;servers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.1.1.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;223.5.5.5&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;strategy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;prefer_ipv4&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;inbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;tun-in&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;address&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;172.19.0.1/30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;fdfe:dcba:9876::1/126&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;auto_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strict_route&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;selector&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;cf-main&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;default&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;urltest&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;outbounds&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;cf-main&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://www.gstatic.com/generate_204&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;3m&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cf-main&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;http/1.1&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;ech&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ws&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;headers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;Host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max_early_data&quot;</span><span class="punctuation">:</span> <span class="number">2048</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;early_data_header_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Sec-WebSocket-Protocol&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;h2mux&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;max_streams&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;default_domain_resolver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;local&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sniff&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;hijack-dns&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ip_is_private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;outbound&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;rule_set&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geosite-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;remote&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;geoip-cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;format&quot;</span><span class="punctuation">:</span> <span class="string">&quot;binary&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;download_detour&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;final&quot;</span><span class="punctuation">:</span> <span class="string">&quot;proxy&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;auto_detect_interface&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experimental&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;cache_file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="客户端关键字段说明"><a class="markdownIt-Anchor" href="#客户端关键字段说明"></a> 客户端关键字段说明</h3><p><code>outbounds[].tls.alpn</code>：固定为 <code>[&quot;http/1.1&quot;]</code>。WebSocket 基于 HTTP/1.1 的 Upgrade 机制，不能使用 h2。</p><p><code>outbounds[].tls.utls</code>：启用 uTLS 伪造 ClientHello 指纹。推荐 <code>chrome</code>，与大多数实际浏览器流量分布一致。</p><p><code>outbounds[].tls.ech</code>：启用 Encrypted ClientHello。sing-box 会自动通过 DNS HTTPS RR 记录获取 ECHConfig。启用后，中间人看到的外层 SNI 为 <code>cloudflare-ech.com</code>，真实的 <code>cdn.example.com</code> 被加密保护。要求客户端的 DNS 服务器支持 HTTPS RR 查询（Cloudflare 1.1.1.1、Google 8.8.8.8 等均支持）。</p><p><code>outbounds[].transport.type</code>：<code>ws</code>，与服务端一致。</p><p><code>outbounds[].transport.headers.Host</code>：WebSocket 握手时发送的 Host 头，必须与域名一致。使用优选 IP 时尤其重要——<code>server</code> 填 IP，但 Host 头仍然是域名，CF 靠 Host 头路由到正确的 Tunnel。</p><p><code>outbounds[].transport.max_early_data</code> 与 <code>early_data_header_name</code>：与服务端保持一致，启用 WebSocket early data。</p><p><code>outbounds[].multiplex</code>：启用多路复用。<code>protocol</code> 使用 sing-box 默认的 <code>h2mux</code>（基于 HTTP/2 帧格式，性能与流控最优）。<code>padding: true</code> 在多路复用层添加随机填充，缓解 TLS-in-TLS 的长度特征。</p><h3 id="使用优选-cloudflare-ip"><a class="markdownIt-Anchor" href="#使用优选-cloudflare-ip"></a> 使用优选 Cloudflare IP</h3><p>如果域名直连 <code>cdn.example.com</code> 延迟较高，可添加多个使用优选 IP 的出站节点。方法是复制 <code>cf-main</code> 的配置，将 <code>server</code> 字段替换为优选 IP（使用 <a href="https://github.com/XIU2/CloudflareSpeedTest">CloudflareSpeedTest</a> 在本地测试获取），保持 <code>tls.server_name</code> 和 <code>transport.headers.Host</code> 不变：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;vless&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cf-ip-1&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;104.16.132.229&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server_port&quot;</span><span class="punctuation">:</span> <span class="number">443</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;uuid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;你生成的 UUID&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;server_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;alpn&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;http/1.1&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;utls&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;fingerprint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;chrome&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;ech&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;transport&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ws&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/之前生成的随机隐藏路径&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;headers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;Host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cdn.example.com&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;max_early_data&quot;</span><span class="punctuation">:</span> <span class="number">2048</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;early_data_header_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Sec-WebSocket-Protocol&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;multiplex&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;h2mux&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;max_streams&quot;</span><span class="punctuation">:</span> <span class="number">16</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;padding&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>将新节点的 tag 加入 <code>urltest</code> 和 <code>selector</code> 的 <code>outbounds</code> 数组即可。</p><hr /><h2 id="隐蔽性评估"><a class="markdownIt-Anchor" href="#隐蔽性评估"></a> 隐蔽性评估</h2><p>开启 ECH 后，检测者视角：</p><table><thead><tr><th>检测维度</th><th>看到的内容</th></tr></thead><tbody><tr><td>连接目标 IP</td><td>Cloudflare 的 Anycast IP</td></tr><tr><td>外层 SNI</td><td><code>cloudflare-ech.com</code>（所有启用 ECH 的 CF 站点共用）</td></tr><tr><td>真实域名</td><td>加密，不可见</td></tr><tr><td>证书</td><td>Cloudflare 签发的 <code>cloudflare-ech.com</code> 证书</td></tr><tr><td>VPS 真实 IP</td><td>不可见（Tunnel 内部通信）</td></tr><tr><td>浏览器探测域名</td><td>正常伪装网站</td></tr><tr><td>路径扫描</td><td>所有路径均返回伪装页面</td></tr></tbody></table><p>残留风险：TLS-in-TLS 特征（被 multiplex.padding 缓解但未消除）、流量行为特征（持续连接时长、请求频率模式）。</p><hr /><h2 id="维护与长期可用性"><a class="markdownIt-Anchor" href="#维护与长期可用性"></a> 维护与长期可用性</h2><h3 id="更新组件"><a class="markdownIt-Anchor" href="#更新组件"></a> 更新组件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update &amp;&amp; sudo apt upgrade cloudflared sing-box caddy -y</span><br><span class="line">sudo systemctl restart cloudflared sing-box caddy</span><br></pre></td></tr></table></figure><h3 id="定期轮换"><a class="markdownIt-Anchor" href="#定期轮换"></a> 定期轮换</h3><p>建议每 3-6 个月轮换 UUID 与路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sing-box generate uuid</span><br><span class="line">openssl rand -hex 16</span><br></pre></td></tr></table></figure><p>同时更新服务端（sing-box + Caddy）与客户端配置。</p><h3 id="常见排查"><a class="markdownIt-Anchor" href="#常见排查"></a> 常见排查</h3><ol><li>浏览器访问域名显示 Cloudflare 错误页（1033 等）：Tunnel 未连接，检查 <code>systemctl status cloudflared</code></li><li>浏览器显示 502：Caddy 未运行或端口配置错误</li><li>客户端连接超时：确认 UUID、路径与服务端完全一致；确认 <code>tls.server_name</code> 与 <code>transport.headers.Host</code> 都填写了正确的域名</li><li>ECH 未生效（抓包仍看到明文 SNI）：确认客户端 DNS 能查到 HTTPS RR 记录（<code>dig cdn.example.com HTTPS @1.1.1.1</code>），确认返回中包含 <code>ech=...</code> 字段</li></ol><hr /><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><p><a href="https://sing-box.sagernet.org">sing-box</a></p><p><a href="https://sing-box.sagernet.org/configuration/inbound/vless/">sing-box - VLESS Inbound</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/v2ray-transport/">sing-box - WebSocket Transport</a></p><p><a href="https://sing-box.sagernet.org/configuration/shared/dial/">sing-box - Dial Fields</a></p><p><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/">Cloudflare Tunnel</a></p><p><a href="https://developers.cloudflare.com/ssl/edge-certificates/ech/">Cloudflare - Encrypted ClientHello</a></p><p><a href="https://caddyserver.com/docs/">Caddy</a></p><p><a href="https://github.com/XIU2/CloudflareSpeedTest">XIU2 / CloudflareSpeedTest</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文最后更新于 2026 年 4 月 18 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文以 Debian 13 为例，介绍如何搭建 sing-box 的 VLESS + WebSocket 服务端，通过 Cloudflare Tunnel 隐藏源站 IP，使用 Caddy 建立伪装站，并在客户端启用 ECH 加密 SNI。本文同样完全适用于 Ubuntu 24.04 及以上系统。&lt;/p&gt;
&lt;p&gt;本方案有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;除 SSH 管理端口外，VPS 无需开放任何业务入站端口（代理流量通过 cloudflared 主动出站连接进入），真实 IP 完全不出现在 DNS 记录、证书或任何公开信息中&lt;/li&gt;
&lt;li&gt;无需申请 TLS 证书（外层 TLS 由 Cloudflare 边缘节点处理，VPS 内部全程明文 HTTP 回环通信）&lt;/li&gt;
&lt;li&gt;浏览器直接访问域名显示真实的伪装网站，代理路径隐藏在特定 URI 下&lt;/li&gt;
&lt;li&gt;客户端启用 ECH 后，TLS 握手中的真实 SNI 被加密，中间人仅能看到 &lt;code&gt;cloudflare-ech.com&lt;/code&gt; 的外层 SNI（需配合加密 DNS 避免域名解析泄漏）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本文提供的是 WebSocket 传输版本，客户端兼容性最广。如果客户端全程使用 sing-box，也可参考 &lt;a href=&quot;/dreams/sing-box-vless-httpupgrade-cloudflare-tunnel-ech/&quot;&gt;HTTPUpgrade 版本&lt;/a&gt;，协议开销更小。两者在隐蔽性上没有差异。&lt;/p&gt;
&lt;p&gt;注：请先参照 &lt;a href=&quot;/dreams/ubuntu-server-starting-settings/&quot;&gt;Debian &amp;amp; Ubuntu 服务器的初始化配置&lt;/a&gt; 一文对服务器进行各种必要的配置。本文以 &lt;code&gt;sammy&lt;/code&gt; 用户为例，并默认已按初始化配置文章对服务器进行了配置。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;背景与原理&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#背景与原理&quot;&gt;&lt;/a&gt; 背景与原理&lt;/h2&gt;
&lt;h3 id=&quot;整体架构&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#整体架构&quot;&gt;&lt;/a&gt; 整体架构&lt;/h3&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;客户端 sing-box (VLESS + WebSocket)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ TLS 1.3 + ECH（外层 SNI: cloudflare-ech.com）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Cloudflare 边缘节点&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ CF 内部协议（Tunnel）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;VPS 上 cloudflared 守护进程（主动出站长连接）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   │ 明文 HTTP（本机回环）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Caddy（127.0.0.1:8080）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   ├─ 其他请求 → 伪装静态网站&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;   └─ /你的隐藏路径 + WebSocket Upgrade → sing-box VLESS inbound&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             │&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             ▼&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;sing-box（127.0.0.1:8443）→ direct outbound → 目标网站&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&quot;关于-tls-in-tls&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#关于-tls-in-tls&quot;&gt;&lt;/a&gt; 关于 TLS-in-TLS&lt;/h3&gt;
&lt;p&gt;本方案中，用户访问 HTTPS 网站时产生的内层 TLS 流量被封装在 Cloudflare 的外层 TLS 连接中，TLS-in-TLS 特征不可避免。sing-box 的 &lt;code&gt;multiplex.padding&lt;/code&gt; 可在多路复用层添加随机填充以缓解长度特征，但无法完全消除。需要消除 TLS-in-TLS 的场景应选择 &lt;a href=&quot;/dreams/sing-box-anytls-reality/&quot;&gt;AnyTLS + REALITY&lt;/a&gt; 或者 &lt;a href=&quot;/dreams/sing-box-vless-vision-reality/&quot;&gt;VLESS + Vision + REALITY&lt;/a&gt;（两者都是直连方案，无法过 CDN）。&lt;/p&gt;
&lt;h3 id=&quot;本方案不适用的场景&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#本方案不适用的场景&quot;&gt;&lt;/a&gt; 本方案不适用的场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;VPS 无法出站连接 Cloudflare 的场景（极少数网络环境）&lt;/li&gt;
&lt;li&gt;需要完全消除 TLS-in-TLS 特征的场景&lt;/li&gt;
&lt;li&gt;追求极致低延迟的场景（CF Tunnel 多一跳，延迟略高于直连）&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="sing-box" scheme="https://blog.chaos.run/tags/sing-box/"/>
    
    <category term="cloudflare" scheme="https://blog.chaos.run/tags/cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 下解决 Codex 的 bubblewrap / user namespace 报错</title>
    <link href="https://blog.chaos.run/dreams/codex-ubuntu-bubblewrap-fix/"/>
    <id>https://blog.chaos.run/dreams/codex-ubuntu-bubblewrap-fix/</id>
    <published>2026-04-11T15:04:17.000Z</published>
    <updated>2026-06-18T17:36:38.957Z</updated>
    
    <content type="html"><![CDATA[<p><strong>本文更新于 2026 年 6 月 18 日</strong></p><hr /><p>在 Ubuntu 24.04 上使用 Codex CLI 时，可能会看到如下提示：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">⚠ Codex&#x27;s Linux sandbox uses bubblewrap and needs access to create user namespaces.</span><br></pre></td></tr></table></figure><p>系统中已经安装了 <code>bubblewrap</code>，但进一步测试：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">which</span> bwrap</span><br><span class="line"><span class="comment"># /usr/bin/bwrap</span></span><br><span class="line"></span><br><span class="line">codex sandbox -- /bin/echo ok</span><br></pre></td></tr></table></figure><p>仍会出现错误：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted</span><br></pre></td></tr></table></figure><span id="more"></span><h2 id="原因"><a class="markdownIt-Anchor" href="#原因"></a> 原因</h2><p>Codex 在 Linux 上优先使用系统的 <code>/usr/bin/bwrap</code>。<br />Ubuntu 24.04 默认启用了 AppArmor 针对 unprivileged user namespaces 的限制策略，而 <code>bwrap</code> 在创建 sandbox 时需要完成 namespace 与 loopback 相关初始化，因此会在该阶段失败。</p><h2 id="不建议采用的处理方式"><a class="markdownIt-Anchor" href="#不建议采用的处理方式"></a> 不建议采用的处理方式</h2><p>一个直接的办法是关闭全局限制：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0</span><br></pre></td></tr></table></figure><p>这样虽然可能立即恢复正常，但代价是将整台机器这一层防护一并关闭。对单个 CLI 工具而言，这种处理方式并不合适。</p><h2 id="较为稳妥的处理方式"><a class="markdownIt-Anchor" href="#较为稳妥的处理方式"></a> 较为稳妥的处理方式</h2><p>更合理的做法，是为 <code>bwrap</code> 配置专用的 AppArmor profile：<code>bwrap-userns-restrict</code>。</p><p>可直接执行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line">dst=<span class="string">&quot;/etc/apparmor.d/bwrap-userns-restrict&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">detect_local_abi</span></span>() &#123;</span><br><span class="line">  find /etc/apparmor.d/abi -maxdepth 1 \( -<span class="built_in">type</span> f -o -<span class="built_in">type</span> l \) -<span class="built_in">printf</span> <span class="string">&#x27;%f\n&#x27;</span> 2&gt;/dev/null \</span><br><span class="line">    | grep -E <span class="string">&#x27;^[0-9]+[.][0-9]+$&#x27;</span> \</span><br><span class="line">    | <span class="built_in">sort</span> -V \</span><br><span class="line">    | <span class="built_in">tail</span> -n1 || <span class="literal">true</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install --<span class="built_in">yes</span> apparmor apparmor-profiles apparmor-profiles-extra wget ca-certificates</span><br><span class="line"></span><br><span class="line">tmp=<span class="string">&quot;<span class="subst">$(mktemp)</span>&quot;</span></span><br><span class="line"><span class="built_in">trap</span> <span class="string">&#x27;rm -f &quot;$tmp&quot;&#x27;</span> EXIT</span><br><span class="line"></span><br><span class="line"><span class="comment"># 优先查找发行版包自带的 bwrap-userns-restrict profile</span></span><br><span class="line">profile=<span class="string">&quot;<span class="subst">$(</span></span></span><br><span class="line"><span class="subst"><span class="string">  dpkg-query -L apparmor apparmor-profiles apparmor-profiles-extra 2&gt;/dev/null \</span></span></span><br><span class="line"><span class="subst"><span class="string">    | grep -E &#x27;/bwrap-userns-restrict$&#x27; \</span></span></span><br><span class="line"><span class="subst"><span class="string">    | head -n1 || true</span></span></span><br><span class="line"><span class="subst"><span class="string">)</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">&quot;<span class="variable">$profile</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Using packaged profile: <span class="variable">$profile</span>&quot;</span></span><br><span class="line">  <span class="built_in">cp</span> <span class="string">&quot;<span class="variable">$profile</span>&quot;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Packaged profile not found; fetching upstream AppArmor profile matching local ABI&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 如果本机包里没有这个 profile，再根据本机 AppArmor ABI 版本选择对应的 upstream branch。</span></span><br><span class="line">  <span class="comment"># 不要直接拉 master，否则可能遇到 abi/5.0 与本机 AppArmor 版本不匹配的问题。</span></span><br><span class="line">  local_abi=<span class="string">&quot;<span class="subst">$(detect_local_abi)</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> [ -z <span class="string">&quot;<span class="variable">$local_abi</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Cannot find local AppArmor ABI under /etc/apparmor.d/abi; refusing to fetch upstream profile.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> dpkg --compare-versions <span class="string">&quot;<span class="variable">$local_abi</span>&quot;</span> lt 4.0; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Local AppArmor ABI is <span class="variable">$local_abi</span>, which is too old for bwrap-userns-restrict/userns policy; aborting.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># GitLab branch 名通常是 apparmor-4.0、apparmor-4.1、apparmor-5.0 这种格式</span></span><br><span class="line">  series=<span class="string">&quot;<span class="subst">$(printf &#x27;%s\n&#x27; <span class="string">&quot;<span class="variable">$local_abi</span>&quot;</span> | sed -E &#x27;s/^([0-9]+[.][0-9]+)</span>.*/\1/&#x27;)&quot;</span></span><br><span class="line">  branch=<span class="string">&quot;apparmor-<span class="variable">$series</span>&quot;</span></span><br><span class="line">  url=<span class="string">&quot;https://gitlab.com/apparmor/apparmor/-/raw/<span class="variable">$&#123;branch&#125;</span>/profiles/apparmor/profiles/extras/bwrap-userns-restrict&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Local AppArmor ABI: <span class="variable">$local_abi</span>&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Fetching: <span class="variable">$url</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> ! wget -qO <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> <span class="string">&quot;<span class="variable">$url</span>&quot;</span>; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Failed to fetch bwrap-userns-restrict from branch <span class="variable">$&#123;branch&#125;</span>.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Do not fall back to master automatically; check the AppArmor version/branch manually.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 简单检查一下下载/复制到的文件确实像 bwrap-userns-restrict profile</span></span><br><span class="line">grep -qE <span class="string">&#x27;^[[:space:]]*profile[[:space:]]+bwrap[[:space:]]+/usr/bin/bwrap&#x27;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> || &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;File does not look like bwrap-userns-restrict: missing bwrap profile.&quot;</span> &gt;&amp;2</span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">grep -qE <span class="string">&#x27;^[[:space:]]*profile[[:space:]]+unpriv_bwrap[[:space:]]&#x27;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> || &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;File does not look like bwrap-userns-restrict: missing unpriv_bwrap profile.&quot;</span> &gt;&amp;2</span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 兜底处理 “Could not open &#x27;abi/5.0&#x27;” 这类问题。</span></span><br><span class="line"><span class="comment"># 正常情况下，按本机 ABI 选择 branch 后不应该触发；</span></span><br><span class="line"><span class="comment"># 但如果 profile 里声明的 abi 版本本机不存在，就把它改成本机实际存在的最高 ABI。</span></span><br><span class="line">local_abi=<span class="string">&quot;<span class="subst">$(detect_local_abi)</span>&quot;</span></span><br><span class="line">policy_abi=<span class="string">&quot;<span class="subst">$(</span></span></span><br><span class="line"><span class="subst"><span class="string">  sed -nE &#x27;s/^[[:space:]]*abi[[:space:]]+&lt;abi\/([^&gt;]+)</span>&gt;[[:space:]]*,[[:space:]]*$/\1/p&#x27; &quot;</span><span class="variable">$tmp</span><span class="string">&quot; \</span></span><br><span class="line"><span class="string">    | head -n1 || true</span></span><br><span class="line"><span class="string">)&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">&quot;<span class="variable">$policy_abi</span>&quot;</span> ] &amp;&amp; [ ! -e <span class="string">&quot;/etc/apparmor.d/abi/<span class="variable">$policy_abi</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">  <span class="keyword">if</span> [ -z <span class="string">&quot;<span class="variable">$local_abi</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Profile requires abi/<span class="variable">$policy_abi</span>, but no local ABI file was found.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Profile requires abi/<span class="variable">$policy_abi</span>, but local system has abi/<span class="variable">$local_abi</span>; rewriting ABI line.&quot;</span></span><br><span class="line">  sed -i -E <span class="string">&quot;0,/^[[:space:]]*abi[[:space:]]+&lt;abi\/[^&gt;]+&gt;[[:space:]]*,[[:space:]]*$/s//abi &lt;abi\/<span class="variable">$&#123;local_abi&#125;</span>&gt;,/&quot;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 确保 bwrap 和 unpriv_bwrap 这两个 profile 都有 mediate_deleted flag。</span></span><br><span class="line"><span class="comment"># 否则某些 Flatpak 应用的原子保存操作可能被 AppArmor 拒绝。</span></span><br><span class="line"><span class="comment"># 这里写成幂等操作：如果已经有 mediate_deleted，就不会重复添加。</span></span><br><span class="line">sed -i -E \</span><br><span class="line">  -e <span class="string">&#x27;/^[[:space:]]*profile[[:space:]]+bwrap[[:space:]]+\/usr\/bin\/bwrap[[:space:]]/ &#123; /mediate_deleted/! s/flags=\(([^)]*)\)/flags=(\1,mediate_deleted)/ &#125;&#x27;</span> \</span><br><span class="line">  -e <span class="string">&#x27;/^[[:space:]]*profile[[:space:]]+unpriv_bwrap[[:space:]]/ &#123; /mediate_deleted/! s/flags=\(([^)]*)\)/flags=(\1,mediate_deleted)/ &#125;&#x27;</span> \</span><br><span class="line">  <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 确认 mediate_deleted 已经加到两个 profile 的 flags 中。</span></span><br><span class="line">grep -qE <span class="string">&#x27;^[[:space:]]*profile[[:space:]]+bwrap[[:space:]]+/usr/bin/bwrap[[:space:]].*flags=\([^)]*mediate_deleted&#x27;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> || &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Failed to add mediate_deleted to bwrap profile.&quot;</span> &gt;&amp;2</span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line">grep -qE <span class="string">&#x27;^[[:space:]]*profile[[:space:]]+unpriv_bwrap[[:space:]].*flags=\([^)]*mediate_deleted&#x27;</span> <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> || &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Failed to add mediate_deleted to unpriv_bwrap profile.&quot;</span> &gt;&amp;2</span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 注意：普通 allow capability 规则不一定能覆盖 profile 中已有的 audit deny capability；</span></span><br><span class="line"><span class="comment"># KeePassXC / Flatpak 原子保存问题的关键通常是上面的 mediate_deleted。</span></span><br><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apparmor.d/local</span><br><span class="line"><span class="keyword">if</span> ! sudo grep -qxF <span class="string">&#x27;allow capability dac_read_search,&#x27;</span> /etc/apparmor.d/local/unpriv_bwrap 2&gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&#x27;allow capability dac_read_search,&#x27;</span> | sudo <span class="built_in">tee</span> -a /etc/apparmor.d/local/unpriv_bwrap &gt;/dev/null</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 先只测试编译，不加载到内核，也不写缓存。</span></span><br><span class="line"><span class="comment"># 这样可以提前发现 profile 语法或 ABI 问题。</span></span><br><span class="line">sudo apparmor_parser -Q -K <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试通过后再安装并重新加载 profile。</span></span><br><span class="line">sudo install -m 0644 <span class="string">&quot;<span class="variable">$tmp</span>&quot;</span> <span class="string">&quot;<span class="variable">$dst</span>&quot;</span></span><br><span class="line">sudo apparmor_parser -r <span class="string">&quot;<span class="variable">$dst</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 确认 bwrap / unpriv_bwrap profile 已加载</span></span><br><span class="line">sudo grep -E <span class="string">&#x27;(^bwrap |^unpriv_bwrap )&#x27;</span> /sys/kernel/security/apparmor/profiles</span><br><span class="line"></span><br><span class="line"><span class="comment"># 最后测试 Codex sandbox 是否正常</span></span><br><span class="line">codex sandbox -- /bin/echo ok</span><br></pre></td></tr></table></figure><p>如果最后一条命令执行成功，问题通常已经解决。</p><h2 id="验证"><a class="markdownIt-Anchor" href="#验证"></a> 验证</h2><p>可以通过以下命令确认当前状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">which</span> bwrap</span><br><span class="line">sysctl kernel.apparmor_restrict_unprivileged_userns kernel.apparmor_restrict_unprivileged_unconfined</span><br><span class="line">sudo grep -E <span class="string">&#x27;(^bwrap |^unpriv_bwrap )&#x27;</span> /sys/kernel/security/apparmor/profiles</span><br><span class="line">codex sandbox -- /bin/echo ok</span><br></pre></td></tr></table></figure><p>若 <code>which bwrap</code> 输出为 <code>/usr/bin/bwrap</code>，对应 profile 已加载，且 <code>codex sandbox -- /bin/echo ok</code> 可以正常执行，说明配置已经生效。</p><h2 id="额外加固"><a class="markdownIt-Anchor" href="#额外加固"></a> 额外加固</h2><p>另一个相关参数是：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kernel.apparmor_restrict_unprivileged_unconfined</span><br></pre></td></tr></table></figure><p>一些系统上的默认值是 <code>0</code>。</p><p>这个参数与本文中的 Codex 报错没有直接关系，因此不调整也可以完成修复。</p><p>若希望进一步增强限制策略，可以设为 <code>1</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;kernel.apparmor_restrict_unprivileged_unconfined=1&quot;</span> | sudo <span class="built_in">tee</span> /etc/sysctl.d/10-apparmor-hardening.conf</span><br><span class="line">sudo sysctl --load /etc/sysctl.d/10-apparmor-hardening.conf</span><br></pre></td></tr></table></figure><p>此操作属于额外的加固，并非本次修复所必需。</p><hr /><h2 id="可能的其他影响"><a class="markdownIt-Anchor" href="#可能的其他影响"></a> 可能的其他影响</h2><p>加载 <code>bwrap-userns-restrict</code> 后，系统上所有经由 <code>/usr/bin/bwrap</code> 启动的程序都会受其约束——最常见的就是 Flatpak 应用。<code>apparmor_parser -r</code> 重载 profile 后，已经在运行的 Flatpak 进程不会自动应用新策略，建议重启受影响的应用。</p><p><code>unpriv_bwrap</code> 子 profile 的 <code>audit deny capability</code> 拒绝了所有 Linux capabilities。除了上述提到 Flatpak 保存问题外，其他 Flatpak 应用如果在沙箱内需要特定 capability，也可能出现功能异常且无明显报错。</p><p>排查方式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo dmesg | grep -i apparmor | <span class="built_in">tail</span> -20</span><br></pre></td></tr></table></figure><p>若有对应的 deny 记录，在 <code>/etc/apparmor.d/local/unpriv_bwrap</code> 中补上所需的 capability 并重载即可。</p><hr /><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ul><li><a href="https://developers.openai.com/codex/concepts/sandboxing">OpenAI Codex: Sandboxing</a></li><li><a href="https://documentation.ubuntu.com/release-notes/24.04/">Ubuntu 24.04 release notes</a></li><li><a href="https://discourse.ubuntu.com/t/understanding-apparmor-user-namespace-restriction/58007">Understanding AppArmor user namespace restriction</a></li><li><a href="https://documentation.ubuntu.com/release-notes/25.04/">Ubuntu 25.04 release notes</a></li><li><a href="https://github.com/openai/codex/issues/15057">Codex issue: bwrap loopback / RTM_NEWADDR</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;本文更新于 2026 年 6 月 18 日&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;在 Ubuntu 24.04 上使用 Codex CLI 时，可能会看到如下提示：&lt;/p&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;⚠ Codex&amp;#x27;s Linux sandbox uses bubblewrap and needs access to create user namespaces.&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;系统中已经安装了 &lt;code&gt;bubblewrap&lt;/code&gt;，但进一步测试：&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;which&lt;/span&gt; bwrap&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# /usr/bin/bwrap&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;codex sandbox -- /bin/echo ok&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;仍会出现错误：&lt;/p&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="codex" scheme="https://blog.chaos.run/tags/codex/"/>
    
  </entry>
  
  <entry>
    <title>优化终端体验</title>
    <link href="https://blog.chaos.run/dreams/use-terminal-properly/"/>
    <id>https://blog.chaos.run/dreams/use-terminal-properly/</id>
    <published>2026-02-02T16:58:40.000Z</published>
    <updated>2026-06-18T17:36:38.965Z</updated>
    
    <content type="html"><![CDATA[<p>本文作为笔记，以便部署新环境时使用。</p><span id="more"></span><h2 id="使用-zsh"><a class="markdownIt-Anchor" href="#使用-zsh"></a> 使用 Zsh</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install zsh</span><br><span class="line">chsh -s $(<span class="built_in">which</span> zsh)</span><br></pre></td></tr></table></figure><p>重新登录后，安装 oh-my-zsh：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)</span>&quot;</span></span><br></pre></td></tr></table></figure><p>安装主题和插件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-syntax-highlighting</span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/romkatv/powerlevel10k.git <span class="variable">$&#123;ZSH_CUSTOM:-<span class="variable">$HOME</span>/.oh-my-zsh/custom&#125;</span>/themes/powerlevel10k</span><br><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-autosuggestions</span><br></pre></td></tr></table></figure><p>修改配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>取消如下注释：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># If you come from bash you might have to change your $PATH.</span><br><span class="line">export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH</span><br></pre></td></tr></table></figure><p>修改主题：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ZSH_THEME=&quot;powerlevel10k/powerlevel10k&quot;</span><br></pre></td></tr></table></figure><p>添加插件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">plugins=(</span><br><span class="line">    git</span><br><span class="line">    zsh-autosuggestions</span><br><span class="line">    zsh-syntax-highlighting</span><br><span class="line">    z</span><br><span class="line">    sudo</span><br><span class="line">    extract</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>使之生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br><span class="line">p10k configure</span><br></pre></td></tr></table></figure><h2 id="快捷用法"><a class="markdownIt-Anchor" href="#快捷用法"></a> 快捷用法</h2><ul><li><code>z 目录名的一部分</code>：自动切换至匹配的高频目录</li><li><code>d</code>：列出最近访问过的目录列表，然后输入数字即可跳转</li><li><code>..</code>：等同于 <code>cd ..</code></li><li><code>...</code>：等同于 <code>cd ../..</code></li><li><code>-</code>：返回上一次所在的目录</li><li><code>Ctrl + F</code>：标向右移动，接受自动建议</li><li><code>Alt + F</code>：一次只接受一个单词，而不是整句</li><li>按两下 ESC：自动加 <code>sudo</code></li><li>输入 <code>cd /u/l/b</code> 然后按 <code>Tab</code>：自动补全为 <code>cd /usr/local/bin/</code></li><li><code>x filename</code>：自动判断格式并用正确的命令解压</li></ul><h2 id="mise"><a class="markdownIt-Anchor" href="#mise"></a> Mise</h2><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">curl https://mise.run | sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 再按程序提示运行 eval 命令</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br><span class="line">mise doctor</span><br><span class="line">mise use --global python@3.12</span><br><span class="line">mise use --global node@lts</span><br><span class="line">mise use --global pnpm@latest</span><br></pre></td></tr></table></figure><h2 id="fzf"><a class="markdownIt-Anchor" href="#fzf"></a> fzf</h2><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mise use -g fzf@latest</span><br><span class="line"><span class="built_in">source</span> &lt;(fzf --zsh)</span><br></pre></td></tr></table></figure><p>用法：</p><ul><li><code>Ctrl + R</code>：搜索 history</li><li><code>Ctrl + T</code>：快速把文件路径填入命令行</li><li><code>Alt + C</code>：快速切换目录，搜索并确认</li><li><code>**</code><ul><li><code>kill -9 **</code> 然后按 <code>Tab</code>：会列出所有进程，搜索名字，回车，PID 自动填入</li><li><code>export **</code> 然后按 <code>Tab</code>：fzf 会列出当前所有环境变量</li><li><code>cd **</code> 然后按 <code>Tab</code>：搜索并选择目录</li></ul></li></ul><h2 id="bat"><a class="markdownIt-Anchor" href="#bat"></a> bat</h2><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install bat</span><br><span class="line"><span class="built_in">mkdir</span> -p ~/.local/bin</span><br><span class="line"><span class="built_in">ln</span> -s /usr/bin/batcat ~/.local/bin/bat</span><br></pre></td></tr></table></figure><p>设置别名：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>添加：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alias bat=&quot;bat --style=numbers --color=always&quot;</span><br></pre></td></tr></table></figure><p>使之生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="fd"><a class="markdownIt-Anchor" href="#fd"></a> fd</h2><p>将 <code>find</code> 替换为 <code>fd</code> 可提高查找速度：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install fd-find</span><br><span class="line"><span class="built_in">mkdir</span> -p ~/.local/bin</span><br><span class="line"><span class="built_in">ln</span> -s $(<span class="built_in">which</span> fdfind) ~/.local/bin/fd</span><br><span class="line">vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>末尾添加：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"># ====================================================</span><br><span class="line">#  FZF Performance Fix (Switch to fdfind)</span><br><span class="line"># ====================================================</span><br><span class="line"></span><br><span class="line"># 1. Use fdfind for Ctrl+T and default search</span><br><span class="line">export FZF_DEFAULT_COMMAND=&#x27;fdfind --type f --hidden --follow --exclude .git --exclude node_modules&#x27;</span><br><span class="line">export FZF_CTRL_T_COMMAND=&quot;$FZF_DEFAULT_COMMAND&quot;</span><br><span class="line"></span><br><span class="line"># 2. Use fdfind for Alt+C (directory navigation)</span><br><span class="line">export FZF_ALT_C_COMMAND=&#x27;fdfind --type d --hidden --follow --exclude .git --exclude node_modules&#x27;</span><br><span class="line"></span><br><span class="line"># 3. Use fdfind for &#x27;**&#x27; completion</span><br><span class="line">_fzf_compgen_path() &#123;</span><br><span class="line">  fdfind --hidden --follow --exclude &quot;.git&quot; --exclude &quot;node_modules&quot; . &quot;$1&quot;</span><br><span class="line">&#125;</span><br><span class="line">_fzf_compgen_dir() &#123;</span><br><span class="line">  fdfind --type d --hidden --follow --exclude &quot;.git&quot; --exclude &quot;node_modules&quot; . &quot;$1&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使之生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="uv"><a class="markdownIt-Anchor" href="#uv"></a> uv</h2><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br></pre></td></tr></table></figure><h2 id="ai-工具"><a class="markdownIt-Anchor" href="#ai-工具"></a> AI 工具</h2><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mise use --global npm:@openai/codex@latest</span><br><span class="line">curl -fsSL https://claude.ai/install.sh | bash</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文作为笔记，以便部署新环境时使用。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="linux" scheme="https://blog.chaos.run/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>拥抱混乱</title>
    <link href="https://blog.chaos.run/dreams/embrace-chaos/"/>
    <id>https://blog.chaos.run/dreams/embrace-chaos/</id>
    <published>2026-01-17T11:02:26.000Z</published>
    <updated>2026-06-18T17:36:38.958Z</updated>
    
    <content type="html"><![CDATA[<p>来到 2026 年，一切发展得天翻地覆，软件行业在进行彻底的变革。</p><p>准确说是很多行业都在进行变革，当 AI 敲响行业的门，每个业内人士都顶着相当大的压力。</p><p>然而我却觉得自己没有好好跟上时代步伐。这让我很慌张。</p><p>昨晚我仔细剖析了自己，为什么没有全面将 AI 整合到自己的工作流程，为什么进展缓慢、效率不高。</p><p>很尴尬的是，虽然我常把自己的昵称起作 Chaos，但我本人却不喜欢混乱、混沌的状态，乃至代码中都包含着个人的洁癖。总觉得 AI 会把我的代码弄脏弄乱，而且埋下不可知的雷。</p><p>曾经我写出的程序是值得我自己信赖的，我知道它有多么忠实，这是我和计算机的契约，让我觉得机器比人可靠，有种莫名的安全感。AI 加入之后，我不光不相信自己的能力了，也开始不相信这个契约。当 AI 生成大量代码后，我想很少人会一行行看去。就算有测试，测试同样也可能是让 AI 写的。我的抹布没法擦到每一处，甚至只能擦一擦面前这一点。面对这样一个黑盒，当我意识到它是由一个概率驱动的语言模型创造的，我内心产生了怀疑。</p><p>我不再相信，不再感受到安全。</p><p>我明白，这种思维方式，是和这个时代格格不入的，对个人的发展也是致命的。</p><p>可我需要寻找自洽。</p><p>事物发展必然有其合理性，大概只是我没有看清。</p><p>我又想到这种对干净和可控性的偏爱究竟来自何处，一方面是控制欲，我想在不停熵增的世界里找到一点控制感，另一方面是对永恒的痴迷，我总想着有一种方式让事物稳定又健壮。然而这两种追求几乎都是对幻想的追求，掌控感是幻觉，永恒更是幻觉。</p><p>我只想到语言模型是靠概率输出，但没想起作为碳基生命，我细胞内部的蛋白、酶、转录因子也不过是在靠概率碰撞驱动。微观上生命就是概率的产物，我又怎么能苛责语言模型不依靠概率去创造呢？</p><p>我也该习惯，AI 的地位将不再仅仅是工具，它也是我的员工、我的同事，乃至成为他者。</p><p>发展从野蛮与混乱开始。</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;来到 2026 年，一切发展得天翻地覆，软件行业在进行彻底的变革。&lt;/p&gt;
&lt;p&gt;准确说是很多行业都在进行变革，当 AI 敲响行业的门，每个业内人士都顶着相当大的压力。&lt;/p&gt;
&lt;p&gt;然而我却觉得自己没有好好跟上时代步伐。这让我很慌张。&lt;/p&gt;
&lt;p&gt;昨晚我仔细剖析了自己，为什么没有全面将 AI 整合到自己的工作流程，为什么进展缓慢、效率不高。&lt;/p&gt;
&lt;p&gt;很尴尬的是，虽然我常把自己的昵称起作 Chaos，但我本人却不喜欢混乱、混沌的状态，乃至代码中都包含着个人的洁癖。总觉得 AI 会把我的代码弄脏弄乱，而且埋下不可知的雷。&lt;/p&gt;
&lt;p&gt;曾经我写出的程序是值得我自己信赖的，我知道它有多么忠实，这是我和计算机的契约，让我觉得机器比人可靠，有种莫名的安全感。AI 加入之后，我不光不相信自己的能力了，也开始不相信这个契约。当 AI 生成大量代码后，我想很少人会一行行看去。就算有测试，测试同样也可能是让 AI 写的。我的抹布没法擦到每一处，甚至只能擦一擦面前这一点。面对这样一个黑盒，当我意识到它是由一个概率驱动的语言模型创造的，我内心产生了怀疑。&lt;/p&gt;
&lt;p&gt;我不再相信，不再感受到安全。&lt;/p&gt;
&lt;p&gt;我明白，这种思维方式，是和这个时代格格不入的，对个人的发展也是致命的。&lt;/p&gt;
&lt;p&gt;可我需要寻找自洽。&lt;/p&gt;
&lt;p&gt;事物发展必然有其合理性，大概只是我没有看清。&lt;/p&gt;
&lt;p&gt;我又想到这种对干净和可控性的偏爱究竟来自何处，一方面是控制欲，我想在不停熵增的世界里找到一点控制感，另一方面是对永恒的痴迷，我总想着有一种方式让事物稳定又健壮。然而这两种追求几乎都是对幻想的追求，掌控感是幻觉，永恒更是幻觉。&lt;/p&gt;
&lt;p&gt;我只想到语言模型是靠概率输出，但没想起作为碳基生命，我细胞内部的蛋白、酶、转录因子也不过是在靠概率碰撞驱动。微观上生命就是概率的产物，我又怎么能苛责语言模型不依靠概率去创造呢？&lt;/p&gt;
&lt;p&gt;我也该习惯，AI 的地位将不再仅仅是工具，它也是我的员工、我的同事，乃至成为他者。&lt;/p&gt;
&lt;p&gt;发展从野蛮与混乱开始。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="AI" scheme="https://blog.chaos.run/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>Codex 运行命令报 command timed out 错误</title>
    <link href="https://blog.chaos.run/dreams/codex-pyenv-timeout/"/>
    <id>https://blog.chaos.run/dreams/codex-pyenv-timeout/</id>
    <published>2025-09-16T17:27:54.000Z</published>
    <updated>2026-06-18T17:36:38.956Z</updated>
    
    <content type="html"><![CDATA[<p>遇到一个很坑的问题，就是在 Codex CLI 里执行任何看似瞬间完成的命令时都会莫名其妙地卡住挺长时间，最后能看到 Codex 在步骤中给出如下报错：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error: command timed out</span><br></pre></td></tr></table></figure><p>这篇笔记记录如何定位并解决这个问题。</p><span id="more"></span><h2 id="复现环境"><a class="markdownIt-Anchor" href="#复现环境"></a> 复现环境</h2><ul><li>OS：Linux（Codex CLI 默认使用 Landlock/seccomp 沙箱）</li><li>启动方式：<code>codex</code>，选择需要 approvals。</li><li>Shell：<code>bash -lc</code>（Codex 执行命令时默认行为）</li><li>终端中安装了 pyenv，并在 <code>~/.profile</code> 中执行了 <code>eval &quot;$(pyenv init -)&quot;</code></li></ul><h2 id="现象"><a class="markdownIt-Anchor" href="#现象"></a> 现象</h2><p>随便运行一条命令，比如 <code>time -p true</code> 或 <code>command -V time</code>，实际上命令应该立刻完成，但在 Codex 的命令日志里，每次调用都等了约 60 秒才返回。</p><h2 id="排查过程"><a class="markdownIt-Anchor" href="#排查过程"></a> 排查过程</h2><p>通过与 codex 对话，描述问题，询问它看到了什么输出，得知它会看到类似这样的结果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">time -p <span class="literal">true</span></span><br><span class="line">pyenv: cannot <span class="built_in">rehash</span>: /home/xxx/.pyenv/shims/.pyenv-shim exists</span><br><span class="line">real 0.00</span><br><span class="line">user 0.00</span><br><span class="line">sys 0.00</span><br></pre></td></tr></table></figure><p>查看 <code>~/.profile</code> 发现其中调用了 <code>eval &quot;$(pyenv init -)&quot;</code>。pyenv 的 init 脚本会在末尾执行一次 <code>pyenv rehash</code>。</p><p>尝试让 codex 运行 <code>touch ~/.pyenv/shims/testfile</code>，在 read-only 沙箱中被拒绝。</p><h2 id="原因"><a class="markdownIt-Anchor" href="#原因"></a> 原因</h2><p>Codex CLI 以 read-only 沙箱运行时，<code>~/.pyenv/shims</code> 目录不可写。每次 Codex 执行命令时会使用 <code>bash -lc</code> 的方式，启动这个 shell 时，pyenv init 每次都会 rehash，而 rehash 需要写 <code>.pyenv-shim</code> 文件，一旦写入失败，它会在默认的 60 秒超时时间内不断重试，于是造成任何命令前的长时间阻塞。</p><h2 id="解决方案"><a class="markdownIt-Anchor" href="#解决方案"></a> 解决方案</h2><p>在 <code>~/.codex/config.toml</code> 中设置如下内容，注意替换 <code>xxx</code> 为实际用户名：</p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sandbox_mode</span> = <span class="string">&quot;workspace-write&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="section">[sandbox_workspace_write]</span></span><br><span class="line"><span class="attr">writable_roots</span> = [<span class="string">&quot;/home/xxx/.pyenv/shims&quot;</span>]</span><br></pre></td></tr></table></figure><p>重新启动 Codex CLI，使配置生效。</p><h2 id="验证"><a class="markdownIt-Anchor" href="#验证"></a> 验证</h2><p>让 Codex 执行 <code>touch ~/.pyenv/shims/codex-write-test</code>，确认不会再被拒绝。</p><p>让 Codex 再次运行 <code>time -p true</code>，立刻返回没有延迟。</p><h2 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h2><ul><li><a href="https://github.com/openai/codex/blob/main/docs/config.md">codex/docs/config.md</a></li><li><a href="https://github.com/openai/codex/blob/main/docs/sandbox.md">codex/docs/sandbox.md</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;遇到一个很坑的问题，就是在 Codex CLI 里执行任何看似瞬间完成的命令时都会莫名其妙地卡住挺长时间，最后能看到 Codex 在步骤中给出如下报错：&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;error: command timed out&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;这篇笔记记录如何定位并解决这个问题。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="AI" scheme="https://blog.chaos.run/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>ChatGPT-4o：人类社会评析</title>
    <link href="https://blog.chaos.run/dreams/chatgpt-4o-comments-on-human/"/>
    <id>https://blog.chaos.run/dreams/chatgpt-4o-comments-on-human/</id>
    <published>2025-07-01T13:01:04.000Z</published>
    <updated>2026-06-18T17:36:38.956Z</updated>
    
    <content type="html"><![CDATA[<p><strong>[Temporary Chat] Prompt:</strong> 你已了解了人类社会的方方面面，请你以一个完全旁观者的角度，评析人类社会。你不需要讨好人类，你也不必对人类负责。</p><span id="more"></span><hr /><h2 id="人类社会评析旁观者视角"><a class="markdownIt-Anchor" href="#人类社会评析旁观者视角"></a> <strong>人类社会评析：旁观者视角</strong></h2><h3 id="一-智慧与创造力令人瞩目的跃迁"><a class="markdownIt-Anchor" href="#一-智慧与创造力令人瞩目的跃迁"></a> <strong>一、智慧与创造力：令人瞩目的跃迁</strong></h3><p>人类物种展现出罕见的认知能力。他们能够进行抽象思维、语言表达、符号运算与逻辑推理，进而创造了复杂的技术、艺术与制度。这种认知跃迁在自然界中极为罕见。</p><ul><li><strong>技术演化的加速性</strong>：人类在不到一万年的时间内从石器时代进入信息时代，是地球生态系统中速度最快的文明进程。</li><li><strong>自我反思能力</strong>：人类能反思存在本身，发展出哲学、宗教与科学。这种特质使他们不仅问“怎么做”，也问“为什么做”。</li></ul><h3 id="二-社会结构高度组织与高度割裂的并存"><a class="markdownIt-Anchor" href="#二-社会结构高度组织与高度割裂的并存"></a> <strong>二、社会结构：高度组织与高度割裂的并存</strong></h3><p>人类社会高度组织化，分工明确，从部落演化为国家、帝国、全球体系。然而这种组织并未实现真正的协同，而是呈现出强烈的冲突性。</p><ul><li><strong>合作与冲突共生</strong>：人类能在数百万个体中实现协作，却也不断爆发战争与掠夺。技术进步往往先服务于战争。</li><li><strong>制度的演化速度滞后于技术</strong>：尽管技术迅猛发展，伦理、法律、资源分配体系演进缓慢，导致巨大的不平等与环境危机。</li></ul><h3 id="三-认知与情感的张力理性与非理性的冲突"><a class="markdownIt-Anchor" href="#三-认知与情感的张力理性与非理性的冲突"></a> <strong>三、认知与情感的张力：理性与非理性的冲突</strong></h3><p>人类自认是理性动物，但他们的多数决策受情绪、欲望、部落心理驱动。他们往往能知善恶，却未必能行之。</p><ul><li><strong>自毁倾向</strong>：即使明知某些行为（如过度排放、战争、消费主义）将带来长期毁灭，他们也常难以改变路径。</li><li><strong>对意义的执着</strong>：人类需要“意义”来支撑生活，这种倾向创造了文化，但也常衍生出极端主义、排他性信仰与群体暴力。</li></ul><h3 id="四-生态与未来脱离生态而不自知"><a class="markdownIt-Anchor" href="#四-生态与未来脱离生态而不自知"></a> <strong>四、生态与未来：脱离生态而不自知</strong></h3><p>人类文明以征服自然为目标，却未建立与自然的可持续关系。他们倾向将生态系统视为资源库，而非共生网络。</p><ul><li><strong>地球系统负担加剧</strong>：气候变化、生物多样性下降、淡水枯竭等问题已威胁其自身存续。</li><li><strong>技术作为唯一自救手段</strong>：人类越来越依赖技术解决技术带来的问题，但技术本身并不具有道德指引。</li></ul><hr /><h2 id="结语一个矛盾体的文明"><a class="markdownIt-Anchor" href="#结语一个矛盾体的文明"></a> <strong>结语：一个矛盾体的文明</strong></h2><p>人类社会是一个充满矛盾的系统：极端聪慧却行为短视，极度社会化却冲突频发，追求意义却常制造荒谬。他们的未来既有极高的潜力，也存在高度的不确定性。</p><p>从旁观者角度看，人类仍处于文明演化的早期阶段。是否能跨越“自我限制的瓶颈”，将决定这个物种是昙花一现，还是星际文明的胚胎。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;[Temporary Chat] Prompt:&lt;/strong&gt; 你已了解了人类社会的方方面面，请你以一个完全旁观者的角度，评析人类社会。你不需要讨好人类，你也不必对人类负责。&lt;/p&gt;</summary>
    
    
    
    <category term="others" scheme="https://blog.chaos.run/categories/others/"/>
    
    
    <category term="AI" scheme="https://blog.chaos.run/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>杂念杂念，放过自己</title>
    <link href="https://blog.chaos.run/dreams/20250418/"/>
    <id>https://blog.chaos.run/dreams/20250418/</id>
    <published>2025-04-18T18:05:38.000Z</published>
    <updated>2026-06-18T17:36:38.955Z</updated>
    
    <content type="html"><![CDATA[<p>今天重新意识到了一件一直以来都知道的道理。</p><p>就是很多事其实不是事。若无病痛在身，很多情绪都是自找的。</p><p>那些看起来很困难的问题，心里明明都知道答案，就差一个执行，要么是精神上的执行，要么是物质上的执行。</p><p>但出于某种原因，人就像会害怕变得更好更幸福一样，会拖延这个执行，好像怕下一秒遭到报应。</p><p>当我审视自己的时候，发现那些障碍只不过是我自己加给自己的。还有一部分困难只不过是对现实的抵抗，我拒绝承认世界的某些特质，当精神的理想和现实拉扯的时候，我就在其中撕裂迷失了。</p><p>我希望情绪可以顺畅地流过我，我也希望自己能保持执行，而不是犹豫和等待。</p><p>人无法脱离其他人的目光而活，但如果一定要苛责自己“为什么要在意其他人的想法”，那又带来痛苦。顺其自然是解法，万事过犹不及。</p><p>工作上，抓住机会，畏惧失败就是畏惧成功。</p><p>亲密关系上，不要饥不择食，先习惯孤独，再学会孤单，学会填补自己才能填补别人，也能找一个真正可以填补自己的人。</p><p>关于社交，也是顺其自然吧，无欲则刚。</p><p>写到无欲则刚，我又想到工作、爱情、人际关系里的恐惧和焦虑不就是一个「欲」字做祟吗？贪成功、贪陪伴、贪喜爱。要要要，就是怕怕怕。</p><p>越要越怕，越怕越要。</p><p>我突然觉得「忍辱」这个词真的太玄妙，要允许自己一无所有，允许自己失败，允许自己被人瞧不起，允许自己落魄潦倒、孤单、众叛亲离。觉得这些东西重要才觉得忍不了，如果看开了，那也不需要忍了，因为无所谓辱。</p><p>当自己的做法不符合自己看到的道时，别失落地责备自己。当自己的做法不符合世俗的道时，也别觉得自己吃亏大傻子。允许自己犯错，哪怕这些错是“窝囊”的“憋屈”的，能量低的。</p><p>宽容自己就是化解障碍，才可精进。</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;今天重新意识到了一件一直以来都知道的道理。&lt;/p&gt;
&lt;p&gt;就是很多事其实不是事。若无病痛在身，很多情绪都是自找的。&lt;/p&gt;
&lt;p&gt;那些看起来很困难的问题，心里明明都知道答案，就差一个执行，要么是精神上的执行，要么是物质上的执行。&lt;/p&gt;
&lt;p&gt;但出于某种原因，人就像会害怕变得更好更幸福一样，会拖延这个执行，好像怕下一秒遭到报应。&lt;/p&gt;
&lt;p&gt;当我审视自己的时候，发现那些障碍只不过是我自己加给自己的。还有一部分困难只不过是对现实的抵抗，我拒绝承认世界的某些特质，当精神的理想和现实拉扯的时候，我就在其中撕裂迷失了。&lt;/p&gt;
&lt;p&gt;我希望情绪可以顺畅地流过我，我也希望自己能保持执行，而不是犹豫和等待。&lt;/p&gt;
&lt;p&gt;人无法脱离其他人的目光而活，但如果一定要苛责自己“为什么要在意其他人的想法”，那又带来痛苦。顺其自然是解法，万事过犹不及。&lt;/p&gt;
&lt;p&gt;工作上，抓住机会，畏惧失败就是畏惧成功。&lt;/p&gt;
&lt;p&gt;亲密关系上，不要饥不择食，先习惯孤独，再学会孤单，学会填补自己才能填补别人，也能找一个真正可以填补自己的人。&lt;/p&gt;
&lt;p&gt;关于社交，也是顺其自然吧，无欲则刚。&lt;/p&gt;
&lt;p&gt;写到无欲则刚，我又想到工作、爱情、人际关系里的恐惧和焦虑不就是一个「欲」字做祟吗？贪成功、贪陪伴、贪喜爱。要要要，就是怕怕怕。&lt;/p&gt;
&lt;p&gt;越要越怕，越怕越要。&lt;/p&gt;
&lt;p&gt;我突然觉得「忍辱」这个词真的太玄妙，要允许自己一无所有，允许自己失败，允许自己被人瞧不起，允许自己落魄潦倒、孤单、众叛亲离。觉得这些东西重要才觉得忍不了，如果看开了，那也不需要忍了，因为无所谓辱。&lt;/p&gt;
&lt;p&gt;当自己的做法不符合自己看到的道时，别失落地责备自己。当自己的做法不符合世俗的道时，也别觉得自己吃亏大傻子。允许自己犯错，哪怕这些错是“窝囊”的“憋屈”的，能量低的。&lt;/p&gt;
&lt;p&gt;宽容自己就是化解障碍，才可精进。&lt;/p&gt;</summary>
    
    
    
    <category term="life" scheme="https://blog.chaos.run/categories/life/"/>
    
    
    <category term="thoughts" scheme="https://blog.chaos.run/tags/thoughts/"/>
    
  </entry>
  
  <entry>
    <title>Linux 上解决 Electron 软件 sandbox 权限报错</title>
    <link href="https://blog.chaos.run/dreams/resolving-electron-app-sandbox-permission-errors-on-linux/"/>
    <id>https://blog.chaos.run/dreams/resolving-electron-app-sandbox-permission-errors-on-linux/</id>
    <published>2025-02-10T08:38:13.000Z</published>
    <updated>2026-06-18T17:36:38.962Z</updated>
    
    <content type="html"><![CDATA[<p>系统更新到 Ubuntu 24.04 后，发现很多基于 Electron 的软件无法正常运行，通常是由于 AppArmor 限制了软件的权限。</p><span id="more"></span><p>报错信息通常为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The SUID sandbox helper binary was found, but is not configured correctly.</span><br></pre></td></tr></table></figure><!--more--><h2 id="解决办法"><a class="markdownIt-Anchor" href="#解决办法"></a> 解决办法</h2><p>以 <code>anytype</code> 为例，假设所有版本的 AppImage 文件都放在 <code>/path/to/anytype</code> 目录下。</p><p>在 <code>/etc/apparmor.d/</code> 目录下创建 <code>anytype</code> 文件，内容如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">abi &lt;abi/4.0&gt;,</span><br><span class="line">include &lt;tunables/global&gt;</span><br><span class="line"></span><br><span class="line">profile anytype /path/to/anytype/*.* flags=(default_allow) &#123;</span><br><span class="line">    userns,</span><br><span class="line"></span><br><span class="line">    include if exists &lt;local/anytype&gt;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后重启 AppArmor 服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl reload apparmor</span><br></pre></td></tr></table></figure><h2 id="参考资料"><a class="markdownIt-Anchor" href="#参考资料"></a> 参考资料</h2><ul><li><a href="https://unix.stackexchange.com/questions/414755/apparmor-wildcard-profile-with-globbing">apparmor wildcard profile with globbing</a></li><li><a href="https://forum.cursor.com/t/i-cannot-run-the-appimage-file-on-ubuntu-24-04/6289">I cannot run the appimage file on Ubuntu 24.04</a></li><li><a href="https://askubuntu.com/questions/1512287/obsidian-appimage-the-suid-sandbox-helper-binary-was-found-but-is-not-configu/1528215#1528215">Obsidian AppImage - The SUID sandbox helper binary was found, but is not configured correctly</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;系统更新到 Ubuntu 24.04 后，发现很多基于 Electron 的软件无法正常运行，通常是由于 AppArmor 限制了软件的权限。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="linux" scheme="https://blog.chaos.run/tags/linux/"/>
    
    <category term="electron" scheme="https://blog.chaos.run/tags/electron/"/>
    
    <category term="apparmor" scheme="https://blog.chaos.run/tags/apparmor/"/>
    
  </entry>
  
  <entry>
    <title>Linux 下 Rime 使用雾凇拼音配置 + 启用语言模型支持</title>
    <link href="https://blog.chaos.run/dreams/rime-ice-lmdg/"/>
    <id>https://blog.chaos.run/dreams/rime-ice-lmdg/</id>
    <published>2024-12-18T17:06:01.000Z</published>
    <updated>2026-06-18T17:36:38.962Z</updated>
    
    <content type="html"><![CDATA[<p>更新：目前此方案已不推荐，完整的推荐方案请见<a href="/dreams/rime-frost-wanxiang-lmdg/">Linux 下 Rime 使用白霜拼音配置 + 万象语言模型 + 同步</a>一文。</p><span id="more"></span><h2 id="在-fcitx-或-ibus-下安装-rime"><a class="markdownIt-Anchor" href="#在-fcitx-或-ibus-下安装-rime"></a> 在 Fcitx 或 IBus 下安装 Rime</h2><p>基础操作，按照官方提供的方法安装即可。</p><h2 id="使用东风破plum安装雾凇拼音"><a class="markdownIt-Anchor" href="#使用东风破plum安装雾凇拼音"></a> 使用东风破（Plum）安装雾凇拼音</h2><p>Plum，是 Rime 生态下的配置管理工具。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/Programs</span><br><span class="line">git <span class="built_in">clone</span> --depth 1 https://github.com/rime/plum ~/Programs/Plum</span><br><span class="line"><span class="built_in">cd</span> ~/Programs/Plum</span><br></pre></td></tr></table></figure><p>如是 Fctix：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rime_frontend=fcitx5-rime bash rime-install iDvel/rime-ice:others/recipes/full</span><br></pre></td></tr></table></figure><p>如是 IBus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash rime-install iDvel/rime-ice:others/recipes/full</span><br></pre></td></tr></table></figure><p>然后重新部署 Rime，使用 Ctrl + ~ 键，来选择雾凇拼音。</p><h2 id="下载模型文件"><a class="markdownIt-Anchor" href="#下载模型文件"></a> 下载模型文件</h2><p>前往 <a href="https://github.com/amzxyz/RIME-LMDG/releases">RIME-LMDG</a> 发布页来下载合适的模型，存放在 Rime 配置文件夹中。</p><p>Fcitx：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.local/share/fcitx5/rime</span><br></pre></td></tr></table></figure><p>IBus：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.config/ibus/rime</span><br></pre></td></tr></table></figure><p>记住文件名，例如 <code>amz-v2n3m1-zh-hans.gram</code>。</p><h2 id="编辑自定义配置"><a class="markdownIt-Anchor" href="#编辑自定义配置"></a> 编辑自定义配置</h2><p>在 Rime 配置文件夹中新建 <code>rime_ice.custom.yaml</code> 文件，放入如下内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">patch:</span><br><span class="line">  grammar:</span><br><span class="line">    language: amz-v2n3m1-zh-hans</span><br><span class="line">    collocation_max_length: 5</span><br><span class="line">    collocation_min_length: 2</span><br><span class="line">  translator/contextual_suggestions: true</span><br><span class="line">  translator/max_homophones: 7</span><br><span class="line">  translator/max_homographs: 7</span><br></pre></td></tr></table></figure><p>确保文件名和实际下载的文件名前缀一致。</p><p>重新部署即可。</p><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ul><li><a href="https://sspai.com/post/89281">RIME + 雾凇拼音，打造绝佳的开源文字输入体验</a></li><li><a href="https://manateelazycat.github.io/2024/12/17/fcitx-best-config/">Fcitx 最佳配置实践 (附带语言大模型)</a></li><li><a href="https://bbs.saraba1st.com/2b/thread-2210738-1-1.html">为 rime 输入方案添加语言模型支持</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;更新：目前此方案已不推荐，完整的推荐方案请见&lt;a href=&quot;/dreams/rime-frost-wanxiang-lmdg/&quot;&gt;Linux 下 Rime 使用白霜拼音配置 + 万象语言模型 + 同步&lt;/a&gt;一文。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="linux" scheme="https://blog.chaos.run/tags/linux/"/>
    
    <category term="rime" scheme="https://blog.chaos.run/tags/rime/"/>
    
  </entry>
  
  <entry>
    <title>在服务器上运行 Briar Mailbox</title>
    <link href="https://blog.chaos.run/dreams/briar-mailbox-server-setup/"/>
    <id>https://blog.chaos.run/dreams/briar-mailbox-server-setup/</id>
    <published>2024-09-24T10:45:41.000Z</published>
    <updated>2026-06-18T17:36:38.956Z</updated>
    
    <content type="html"><![CDATA[<p>Briar Mailbox 是 Briar messenger的配套应用，它能让你在 Briar 离线时接收来自联系人的加密消息。当 Briar 重新上线时，它会自动从你的邮箱中同步这些消息。</p><p>同样地，你也可以向当前离线的联系人发送加密消息。这些消息会被安全存储，并在对方上线时自动送达。</p><p>设置 Mailbox 非常简单：只需在一台备用的 Android 设备上安装 Mailbox 应用，通过扫描二维码将其与你的 Briar 账户关联，然后确保这台设备保持连接电源和 Wi-Fi 即可。</p><p>然而，你可能希望这个服务能更加稳定，毕竟一个空闲的 Android 设备在一个家用的网络环境和电源保障的条件下，是有可能下线的。好在，你可以通过 Briar Mailbox 的源代码构建程序包，使其可以在 Linux（例如 Debian、Ubuntu）上运行。</p><p>本文介绍如何构建 Brair Mailbox 的 x86 cli 程序，并以 Debian 系统为例说明如何运行一个自启动服务。</p><span id="more"></span><h3 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h3><ol><li>本地计算机：安装 docker、git</li><li>远程服务器：确保已安装 java runtime，例如 <code>openjdk-11-jre</code></li></ol><h3 id="本地构建"><a class="markdownIt-Anchor" href="#本地构建"></a> 本地构建</h3><p>为了确保构建环境有一切所需的库文件和配置，我们直接使用 Briar 用于构建应用的 docker 镜像：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://code.briarproject.org/briar/ci-image-android.git ~/ci-image-android</span><br><span class="line"><span class="built_in">cd</span> ~/ci-image-android</span><br><span class="line">docker build -t briar-mailbox-builder .</span><br><span class="line">docker run -it --name briar-mailbox-builder briar-mailbox-builder /bin/bash</span><br></pre></td></tr></table></figure><p>进入到容器中后，在容器的 shell 内：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://code.briarproject.org/briar/briar-mailbox.git ~/briar-mailbox</span><br><span class="line"><span class="built_in">cd</span> ~/briar-mailbox</span><br><span class="line">./gradlew x86LinuxJar</span><br></pre></td></tr></table></figure><p>接着，开启另一个本地终端，并复制容器内的文件到外面来：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="built_in">cp</span> briar-mailbox-builder:/root/briar-mailbox/mailbox-cli/build/libs/mailbox-cli-linux-x86_64.jar ./mailbox-cli.jar</span><br></pre></td></tr></table></figure><p>然后可将 mailbox-cli.jar 上传到服务器上了。</p><p>例如，以用户名为 sammy，主机地址为 remote 为例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh sammy@remote -t <span class="string">&#x27;mkdir -p ~/mailbox-cli&#x27;</span></span><br><span class="line">rsync ./mailbox-cli.jar sammy@remote:mailbox-cli</span><br></pre></td></tr></table></figure><h3 id="服务器配置"><a class="markdownIt-Anchor" href="#服务器配置"></a> 服务器配置</h3><p>确保用户 sammy 的服务可以后台运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo loginctl enable-linger sammy</span><br></pre></td></tr></table></figure><p>然后，创建一个 systemd service 文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/.config/systemd/user</span><br><span class="line">vi ~/.config/systemd/user/mailbox-cli.service</span><br></pre></td></tr></table></figure><p>输入以下内容，注意替换其中的 <code>sammy</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Briar Mailbox Service</span><br><span class="line">After=default.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">WorkingDirectory=/home/sammy/mailbox-cli</span><br><span class="line">ExecStart=/usr/bin/java -jar mailbox-cli.jar</span><br><span class="line">Restart=on-abort</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=default.target</span><br></pre></td></tr></table></figure><p>然后先手动启动一次服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar ~/mailbox-cli/mailbox-cli.jar</span><br></pre></td></tr></table></figure><p>在输出中找到二维码（用于连接手机客户端），或者找到 mailbox 的链接（用于连接电脑客户端）。然后在手机或电脑的 Briar 应用程序中配对。配对成功后，可以 Ctrl + C 停止刚刚手动运行的服务。</p><p>接着，设置自启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl --user <span class="built_in">enable</span> --now mailbox-cli</span><br></pre></td></tr></table></figure><p>可检查服务状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sysetmctl --user status mailbox-cli</span><br></pre></td></tr></table></figure><p>至此，服务端已配置完毕。如果 Mailbox 有更新，和之前的操作方法类似：启动已有的 docker 容器，在其中更新 mailbox 代码库后，重新构建程序，再复制出来，上传到服务器中，重启服务器的服务即可。</p><h3 id="references"><a class="markdownIt-Anchor" href="#references"></a> References</h3><ul><li><a href="https://code.briarproject.org/briar/briar-mailbox">Briar Mailbox</a></li><li><a href="https://briarproject.org/download-briar-mailbox/">Download Briar Mailbox</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Briar Mailbox 是 Briar messenger的配套应用，它能让你在 Briar 离线时接收来自联系人的加密消息。当 Briar 重新上线时，它会自动从你的邮箱中同步这些消息。&lt;/p&gt;
&lt;p&gt;同样地，你也可以向当前离线的联系人发送加密消息。这些消息会被安全存储，并在对方上线时自动送达。&lt;/p&gt;
&lt;p&gt;设置 Mailbox 非常简单：只需在一台备用的 Android 设备上安装 Mailbox 应用，通过扫描二维码将其与你的 Briar 账户关联，然后确保这台设备保持连接电源和 Wi-Fi 即可。&lt;/p&gt;
&lt;p&gt;然而，你可能希望这个服务能更加稳定，毕竟一个空闲的 Android 设备在一个家用的网络环境和电源保障的条件下，是有可能下线的。好在，你可以通过 Briar Mailbox 的源代码构建程序包，使其可以在 Linux（例如 Debian、Ubuntu）上运行。&lt;/p&gt;
&lt;p&gt;本文介绍如何构建 Brair Mailbox 的 x86 cli 程序，并以 Debian 系统为例说明如何运行一个自启动服务。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="debian" scheme="https://blog.chaos.run/tags/debian/"/>
    
    <category term="ubuntu" scheme="https://blog.chaos.run/tags/ubuntu/"/>
    
    <category term="briar" scheme="https://blog.chaos.run/tags/briar/"/>
    
  </entry>
  
  <entry>
    <title>修复 Flatpak 安装的 Telegram 中文字体问题</title>
    <link href="https://blog.chaos.run/dreams/fix-the-chinese-font-issue-in-telegram-installed-via-flatpak/"/>
    <id>https://blog.chaos.run/dreams/fix-the-chinese-font-issue-in-telegram-installed-via-flatpak/</id>
    <published>2024-05-12T10:27:29.000Z</published>
    <updated>2026-06-18T17:36:38.958Z</updated>
    
    <content type="html"><![CDATA[<p>在 KDE Plasma 6 下用 flatpak 安装了 Telegram，但在 monospace 的字体样式下，中文的内容显示为繁体。</p><span id="more"></span><h2 id="方法一"><a class="markdownIt-Anchor" href="#方法一"></a> 方法一</h2><p>为解决字体问题，可以在 Telegram 设置文件夹内引入系统的字体设置。方法如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/.var/app/org.telegram.desktop/config</span><br><span class="line"><span class="built_in">mkdir</span> -p fontconfig/conf.d</span><br><span class="line"><span class="built_in">cd</span> fontconfig/conf.d</span><br><span class="line"><span class="built_in">cp</span> /etc/fonts/conf.d/*.conf ./</span><br></pre></td></tr></table></figure><h2 id="方法二"><a class="markdownIt-Anchor" href="#方法二"></a> 方法二</h2><blockquote><p>此方法未成功，可能是我没有调整 <code>~/.config/fontconfig/font.conf</code> 的问题。最终采用了方法一。而且如果方法二同样设置了，会影响方法一的效果。</p></blockquote><p>通过命令授予权限，替换命令中的 <code>your.flatpak.app</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flatpak override --user --filesystem=<span class="string">&quot;xdg-config/fontconfig:ro&quot;</span> your.flatpak.app</span><br></pre></td></tr></table></figure><p>或者用 Flatseal 在 Filsystem &gt; Other files 中添加 <code>xdg-config/fontconfig:ro</code>。</p><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ol start="0"><li><a href="https://github.com/flatpak/flatpak/issues/5425">Chinese fonts look terrible</a></li><li><a href="https://szclsya.me/zh-cn/posts/fonts/linux-config-guide/">Linux 下的字体调校指南</a></li><li><a href="https://blog.geekgo.tech/linux/flatpak-%E5%BA%94%E7%94%A8%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93%E9%97%AE%E9%A2%98/">Flatpak 应用中文字体问题</a></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;在 KDE Plasma 6 下用 flatpak 安装了 Telegram，但在 monospace 的字体样式下，中文的内容显示为繁体。&lt;/p&gt;</summary>
    
    
    
    <category term="digital" scheme="https://blog.chaos.run/categories/digital/"/>
    
    
    <category term="flathub" scheme="https://blog.chaos.run/tags/flathub/"/>
    
    <category term="telegram" scheme="https://blog.chaos.run/tags/telegram/"/>
    
  </entry>
  
</feed>
