<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>StdOut</title>
    <link>https://blog.kauriss.site</link>
    <description>Writing thoughts to standard output...</description>
    <language>zh-CN</language>
    
    <item>
      <title>Cloudflare Workers 优选教程</title>
      <link>https://blog.kauriss.site/2026/04/25/Cloudflare-Workers-%E4%BC%98%E9%80%89%E6%95%99%E7%A8%8B/</link>
      <guid>https://blog.kauriss.site/2026/04/25/Cloudflare-Workers-%E4%BC%98%E9%80%89%E6%95%99%E7%A8%8B/</guid>
      <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
      <description>用自定义域名、仅 DNS 解析的 CNAME 和 Workers 路由，让 Workers 项目走优选域名访问。</description>
      <content:encoded><![CDATA[<p>Cloudflare Workers 默认会给一个 <code>workers.dev</code> 域名。</p>
<p>能用是能用，但国内访问有时候不太稳。还有些项目直接拿 <code>workers.dev</code> 当入口，延迟和可用性都看运气。</p>
<p>这里写一个比较常见的做法：不用默认的 <code>workers.dev</code>，改用自己的域名，再把这个域名 CNAME 到一个 Cloudflare 优选域名，最后用 Workers 路由接住请求。</p>
<p>说白了就是：</p>
<pre><code class="language-text">用户 -&gt; 你的域名 -&gt; 优选域名对应的 Cloudflare 节点 -&gt; Workers 路由 -&gt; 你的 Worker</code></pre><p>这不是玄学加速，也不是保证永远最快。只是把入口换成一个更顺手的 Cloudflare 节点。</p>
<h2 id="适用场景">适用场景</h2><p>这篇更适合这些情况：</p>
<ul>
<li>你已经有一个能正常访问的 Worker。</li>
<li>默认的 <code>workers.dev</code> 入口在你的网络里不太稳定。</li>
<li>你有自己的域名，并且域名已经托管在 Cloudflare。</li>
<li>你想自己指定一个优选入口，而不是直接用 Cloudflare 自动生成的绑定方式。</li>
</ul>
<p>如果你只是想给 Worker 绑一个普通域名，不折腾优选，直接用自定义域名会更简单。</p>
<h2 id="先说结论">先说结论</h2><p>这篇用的是 Workers 路由，不是自定义域名。</p>
<p>原因很简单：</p>
<ul>
<li>自定义域名会让 Cloudflare 自动创建 DNS 记录。</li>
<li>但这里需要手动把域名 CNAME 到优选域名。</li>
<li>所以更适合用 <code>域名/*</code> 这种 Workers 路由。</li>
</ul>
<p>如果你只是正常部署一个 Worker，不搞优选，用自定义域名更省事。</p>
<p>如果你想自己指定优选入口，用路由更合适。</p>
<h2 id="前置条件">前置条件</h2><p>需要这些：</p>
<table>
<thead>
<tr>
<th align="left">项目</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Cloudflare 账号</td>
<td align="left">用来部署 Worker</td>
</tr>
<tr>
<td align="left">一个托管在 Cloudflare 的域名</td>
<td align="left">比如 <code>example.com</code></td>
</tr>
<tr>
<td align="left">已经部署好的 Worker</td>
<td align="left">先确保 Worker 自己能访问</td>
</tr>
<tr>
<td align="left">一个优选域名</td>
<td align="left">比如别人维护的 Cloudflare 优选域名，或者你自己测出来的</td>
</tr>
</tbody></table>
<p>示例里假设：</p>
<pre><code class="language-text">Worker 名称：my-worker
你的域名：wk.example.com
优选域名：cloudflare.example.net</code></pre><p>实际操作时换成自己的。</p>
<h2 id="最终效果">最终效果</h2><p>做完以后，你访问的是自己的域名：</p>
<pre><code class="language-text">https://wk.example.com</code></pre><p>请求会先走你设置的优选域名对应节点，再由 Workers 路由交给目标 Worker 处理。平时访问、API 路径、静态资源路径都应该能被同一个 Worker 接住。</p>
<h2 id="第一步先确认-worker-正常">第一步：先确认 Worker 正常</h2><p>先别急着改 DNS。</p>
<p>打开 Worker 默认地址：</p>
<pre><code class="language-text">https://my-worker.&lt;你的 workers.dev 子域&gt;.workers.dev</code></pre><p>能正常返回内容再继续。</p>
<p>如果默认地址都打不开，先修 Worker。否则后面 DNS 和路由加上去，只会把问题搞得更乱。</p>
<p>也可以用命令测一下：</p>
<pre><code class="language-bash">curl -I https://my-worker.&lt;你的 workers.dev 子域&gt;.workers.dev</code></pre><p>有正常 HTTP 状态码就行。</p>
<h2 id="第二步添加-dns-记录">第二步：添加 DNS 记录</h2><p>进入 Cloudflare 控制台，选中你的域名 <code>example.com</code>。</p>
<p>添加一条 DNS 记录：</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="left">名称</th>
<th align="left">目标</th>
<th align="left">代理状态</th>
</tr>
</thead>
<tbody><tr>
<td align="left">CNAME</td>
<td align="left"><code>wk</code></td>
<td align="left"><code>cloudflare.example.net</code></td>
<td align="left">仅 DNS 解析</td>
</tr>
</tbody></table>
<p>重点是代理状态选 <strong>仅 DNS 解析</strong>，也就是灰云。</p>
<p>不要开代理。</p>
<p>开了代理以后，Cloudflare 会按普通代理逻辑处理，请求入口就不一定是你想要的优选域名了。这个地方很多人会手滑。</p>
<p>添加完后，你的域名应该是：</p>
<pre><code class="language-text">wk.example.com</code></pre><h2 id="第三步添加-workers-路由">第三步：添加 Workers 路由</h2><p>进入 Cloudflare 控制台：</p>
<pre><code class="language-text">Workers 和 Pages -&gt; 你的 Worker -&gt; 设置 -&gt; 域和路由</code></pre><p>添加一个路由：</p>
<pre><code class="language-text">wk.example.com/*</code></pre><p>然后 Worker 选择你的项目，比如 <code>my-worker</code>。</p>
<p>这里的 <code>/*</code> 不能漏。</p>
<p>不加的话，只匹配根路径，很多接口、静态资源、子路径会直接寄。</p>
<h2 id="第四步测试访问">第四步：测试访问</h2><p>浏览器打开：</p>
<pre><code class="language-text">https://wk.example.com</code></pre><p>命令行测：</p>
<pre><code class="language-bash">curl -I https://wk.example.com</code></pre><p>如果 Worker 里有 API 路径，也测一下：</p>
<pre><code class="language-bash">curl -I https://wk.example.com/api</code></pre><p>不要只测首页。很多项目首页能开，接口路径没被路由接住，后面才发现。</p>
<h2 id="怎么判断有没有生效">怎么判断有没有生效</h2><p>先查 DNS：</p>
<pre><code class="language-bash">nslookup wk.example.com</code></pre><p>或者：</p>
<pre><code class="language-bash">dig wk.example.com</code></pre><p>正常应该能看到它最终指向你设置的优选域名。</p>
<p>再测 HTTPS：</p>
<pre><code class="language-bash">curl -I https://wk.example.com</code></pre><p>如果返回的是你 Worker 的响应，就说明路由也生效了。</p>
<h2 id="常见问题">常见问题</h2><h3 id="1.-打开是-404">1. 打开是 404</h3><p>大概率是路由没配对。</p>
<p>检查：</p>
<pre><code class="language-text">wk.example.com/*</code></pre><p>域名、星号、斜杠都看一下。</p>
<h3 id="2.-dns-查得到但-worker-没反应">2. DNS 查得到，但 Worker 没反应</h3><p>DNS 只是把请求带到 Cloudflare 节点。</p>
<p>Worker 是否执行，看的是 Workers 路由。去“域和路由”看路由有没有绑定到正确 Worker。</p>
<h3 id="3.-https-证书报错">3. HTTPS 证书报错</h3><p>先等一会。</p>
<p>如果一直不行，检查这个域名是不是在 Cloudflare 里正常托管，DNS 记录有没有写错。</p>
<p>另外，别乱用不属于你的域名。证书和路由都不是这么玩的。</p>
<h3 id="4.-优选域名突然变慢">4. 优选域名突然变慢</h3><p>正常。</p>
<p>所谓优选不是固定真理，只是当前测试下来比较好。网络会变，节点也会变。</p>
<p>解决方法就两个：</p>
<ul>
<li>换一个优选域名。</li>
<li>自己定期测速。</li>
</ul>
<h3 id="5.-免费额度够不够">5. 免费额度够不够</h3><p>普通个人项目一般够。</p>
<p>Cloudflare Workers 免费计划有每日请求数和 CPU 时间限制。轻量 API、跳转页、小工具通常没问题。</p>
<p>但如果你拿它跑大流量下载、反代一堆东西，那就别想着白嫖无限用。迟早碰限制。</p>
<h2 id="路由和自定义域名怎么选">路由和自定义域名怎么选</h2><p>简单点：</p>
<table>
<thead>
<tr>
<th align="left">场景</th>
<th align="left">选哪个</th>
</tr>
</thead>
<tbody><tr>
<td align="left">正常绑定自己的域名</td>
<td align="left">自定义域名</td>
</tr>
<tr>
<td align="left">还要手动 CNAME 到优选域名</td>
<td align="left">路由</td>
</tr>
<tr>
<td align="left">Worker 是完整应用入口</td>
<td align="left">自定义域名</td>
</tr>
<tr>
<td align="left">想保留自己的 DNS 指向逻辑</td>
<td align="left">路由</td>
</tr>
</tbody></table>
<p>我这里用路由，不是因为它更高级，只是因为它适合“优选域名”这个玩法。</p>
<h2 id="一个完整例子">一个完整例子</h2><p>假设：</p>
<pre><code class="language-text">Worker：my-worker
域名：example.com
入口：wk.example.com
优选域名：cloudflare.example.net</code></pre><p>DNS：</p>
<pre><code class="language-text">CNAME  wk  cloudflare.example.net  仅 DNS 解析</code></pre><p>Workers 路由：</p>
<pre><code class="language-text">wk.example.com/*</code></pre><p>访问：</p>
<pre><code class="language-text">https://wk.example.com</code></pre><p>如果能返回 Worker 内容，就完成了。</p>
<h2 id="最后">最后</h2><p>这个方案适合已经有 Worker 项目，但默认入口访问不稳定的情况。</p>
<p>别把它想得太神。优选域名只是换入口，不会把一个烂项目变快，也不会解决 Worker 本身的代码问题。</p>
<p>先确认 Worker 正常，再改 DNS，再绑路由。按这个顺序来，不容易乱。</p>
<h2 id="参考">参考</h2><ul>
<li><a href="https://developers.cloudflare.com/workers/configuration/routing/" target="_blank" rel="noopener noreferrer">Cloudflare Workers 路由和域名</a></li>
<li><a href="https://developers.cloudflare.com/workers/configuration/routing/custom-domains/" target="_blank" rel="noopener noreferrer">Cloudflare Workers 自定义域名</a></li>
<li><a href="https://developers.cloudflare.com/workers/platform/limits/" target="_blank" rel="noopener noreferrer">Cloudflare Workers Limits</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>wg-manager WireGuard 管理脚本</title>
      <link>https://blog.kauriss.site/2026/04/25/wg-manager-WireGuard-%E7%AE%A1%E7%90%86%E8%84%9A%E6%9C%AC/</link>
      <guid>https://blog.kauriss.site/2026/04/25/wg-manager-WireGuard-%E7%AE%A1%E7%90%86%E8%84%9A%E6%9C%AC/</guid>
      <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
      <description>一个偏实用的 WireGuard 管理脚本，支持菜单模式、客户端增删、二维码导出、状态查看和配置重载。</description>
      <content:encoded><![CDATA[<p>WireGuard 本身不难。</p>
<p>真正麻烦的是后面这些零碎事情：加一个手机、删一个旧设备、生成二维码、改配置、重载服务、看 peer 有没有握手。</p>
<p>手动改 <code>wg0.conf</code> 也不是不行，就是次数多了很烦。而且一不小心把私钥、公钥、AllowedIPs 写错，又得回去排。</p>
<p>所以我写了个 <code>wg-manager.sh</code>，目标很简单：把 WireGuard 常见运维动作包起来，别每次都从头敲。</p>
<p><img src="/images/WireGuard-Logo.svg" alt=""></p>
<h2 id="适用场景">适用场景</h2><p>这个脚本适合个人 VPS 上的 WireGuard 小环境：</p>
<ul>
<li>想快速添加、删除客户端。</li>
<li>想直接在终端里生成二维码给手机扫。</li>
<li>不想每次都手动改 <code>wg0.conf</code>。</li>
<li>希望通过菜单看状态、重载配置、导出客户端文件。</li>
</ul>
<p>如果你已经有复杂的策略路由、多网卡、多出口环境，这个脚本不一定适合直接接管。</p>
<h2 id="前置条件">前置条件</h2><p>默认按 Debian / Ubuntu 这类常见服务器环境写。使用前至少需要：</p>
<ul>
<li>一台可以使用 root 权限的 Linux 服务器。</li>
<li>系统能正常安装 WireGuard 相关软件包。</li>
<li>防火墙或云厂商安全组放行 WireGuard 使用的 UDP 端口。</li>
<li>你知道自己要给客户端分配的大致网段。</li>
</ul>
<h2 id="最终效果">最终效果</h2><p>最后你可以直接运行：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh</code></pre><p>然后通过菜单完成客户端增删、二维码查看、服务状态检查和配置重载。常用操作不用再反复翻命令。</p>
<h2 id="这个脚本是干嘛的">这个脚本是干嘛的</h2><p><code>wg-manager</code> 是一个 Bash 脚本，主要用来管理 WireGuard 服务端和客户端。</p>
<p>它现在能做这些：</p>
<ul>
<li>安装 WireGuard 服务端。</li>
<li>创建第一个客户端。</li>
<li>添加 / 删除客户端。</li>
<li>自动分配客户端 IP。</li>
<li>生成客户端配置文件。</li>
<li>在终端显示二维码，手机直接扫。</li>
<li>支持全局模式和简单分流模式。</li>
<li>查看服务状态和 peer 信息。</li>
<li>重建配置并重载。</li>
<li>卸载脚本管理的配置。</li>
</ul>
<p>适合一台 Debian / Ubuntu 云服务器。</p>
<p>不适合那种已经有复杂 WireGuard 生产环境、策略路由一堆、分流规则特别细的场景。这个脚本不是来接管复杂网络的，主要是把普通人最常用的那套流程弄顺。</p>
<h2 id="为什么要写菜单模式">为什么要写菜单模式</h2><p>一开始这种脚本通常都是命令行参数：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh add-client iphone
<span class="hljs-built_in">sudo</span> ./wg-manager.sh qr iphone
<span class="hljs-built_in">sudo</span> ./wg-manager.sh status</code></pre><p>能用，但要记命令。</p>
<p>平时自己手动运维的时候，我更想直接看到菜单：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh</code></pre><p>然后选：</p>
<pre><code class="language-text">1) 安装 WireGuard
2) 添加客户端
3) 删除客户端
4) 列出客户端
5) 查看客户端配置
6) 显示客户端二维码
7) 查看服务状态
8) 重载配置
9) 卸载</code></pre><p>这样不用每次翻 README。</p>
<p>还有一个细节：菜单模式启动时会先检查是不是 root。</p>
<p>如果没用 <code>sudo</code>，直接退出。不要让人填了一堆东西，最后才提示权限不够。那种体验有点抽象。</p>
<h2 id="获取脚本">获取脚本</h2><p>如果仓库已经公开，可以直接克隆：</p>
<pre><code class="language-bash">git <span class="hljs-built_in">clone</span> https://github.com/Kaurisss/wg-manager.git
<span class="hljs-built_in">cd</span> wg-manager
<span class="hljs-built_in">chmod</span> +x wg-manager.sh</code></pre><p>也可以只下载单文件：</p>
<pre><code class="language-bash">curl -fsSL -o wg-manager.sh https://raw.githubusercontent.com/Kaurisss/wg-manager/main/wg-manager.sh
<span class="hljs-built_in">chmod</span> +x wg-manager.sh</code></pre><p>脚本建议放服务器上用。别在本地 Windows 上硬跑，这玩意本来就是给 Linux 服务器准备的。</p>
<h2 id="菜单模式使用">菜单模式使用</h2><p>最简单：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh</code></pre><p>第一次用，选安装 WireGuard。</p>
<p>脚本会让你填这些东西：</p>
<ul>
<li>WireGuard 接口名，默认 <code>wg0</code></li>
<li>UDP 端口，默认 <code>51820</code></li>
<li>IPv4 网段，默认 <code>10.66.66.0/24</code></li>
<li>是否启用 IPv6</li>
<li>客户端 DNS</li>
<li>第一个客户端名字</li>
<li>客户端模式：全局 / 分流</li>
</ul>
<p>大部分直接回车用默认值就行。</p>
<p>装完之后会生成服务端配置，也会顺手生成第一个客户端配置。</p>
<p>如果装了 <code>qrencode</code>，还能直接在终端显示二维码。手机 WireGuard 客户端一扫就能导入，挺省事。</p>
<h2 id="命令行模式">命令行模式</h2><p>菜单适合人手动点。</p>
<p>但写文档、自动化、复制命令时，子命令还是要保留。</p>
<p>安装并创建第一个客户端：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh install --client-name phone</code></pre><p>启用 IPv6：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh install --enable-ipv6 --client-name phone</code></pre><p>自定义端口和网段：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh install \
  --port 51820 \
  --ipv4-net 10.66.66.0/24 \
  --enable-ipv6 \
  --ipv6-net fd66:66:66::/64 \
  --client-name laptop</code></pre><p>添加客户端：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh add-client iphone</code></pre><p>显示二维码：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh qr iphone</code></pre><p>查看状态：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh status</code></pre><p>列出客户端：</p>
<pre><code class="language-bash">./wg-manager.sh list-clients</code></pre><p>重载配置：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh reload</code></pre><p>卸载：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh uninstall --<span class="hljs-built_in">yes</span></code></pre><h2 id="全局模式和分流模式">全局模式和分流模式</h2><p>脚本里客户端有两种模式。</p>
<h3 id="全局模式">全局模式</h3><p>全局模式就是客户端所有流量都走 WireGuard：</p>
<pre><code class="language-text">AllowedIPs = 0.0.0.0/0,::/0</code></pre><p>适合：</p>
<ul>
<li>手机出门连回服务器。</li>
<li>想让所有流量都经过这台 VPS。</li>
<li>不想研究分流规则。</li>
</ul>
<h3 id="分流模式">分流模式</h3><p>分流模式就是只让指定网段走 WireGuard。</p>
<p>比如只走内网地址：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh add-client office \
  --mode <span class="hljs-built_in">split</span> \
  --allowed-ips 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16</code></pre><p>注意，这只是靠 <code>AllowedIPs</code> 做简单分流。</p>
<p>它不是智能分流，也不会自动识别游戏、网站、域名。你要是想做特别细的规则，那得上更复杂的方案。</p>
<h2 id="生成的文件放哪">生成的文件放哪</h2><p>默认都在 <code>/etc/wireguard/</code>：</p>
<pre><code class="language-text">/etc/wireguard/
├── wg0.conf
├── clients/
│   ├── phone.conf
│   └── iphone.conf
├── peers/
│   └── iphone/
│       ├── private.key
│       ├── public.key
│       ├── psk.key
│       └── meta
├── backup/
└── .wg-manager/
    ├── server.env
    ├── server_private.key
    └── server_public.key</code></pre><p>这里面有私钥、PSK、客户端配置。</p>
<p>不要传 GitHub。</p>
<p>公开仓库里只放脚本、README、示例配置就行。真实配置文件传上去，基本就是自己给自己挖坑。</p>
<h2 id="安全组和防火墙">安全组和防火墙</h2><p>脚本会尝试处理 UFW 和 firewalld，自动放行 WireGuard 的 UDP 端口。</p>
<p>但云服务器还有安全组。</p>
<p>这个脚本管不了云厂商控制台。</p>
<p>如果连不上，先看：</p>
<ul>
<li>云服务器安全组有没有放行 UDP <code>51820</code></li>
<li>本机防火墙有没有拦</li>
<li>客户端里的 endpoint 是不是写错</li>
<li>服务端公网 IP 有没有变</li>
<li><code>sudo ./wg-manager.sh status</code> 里有没有握手</li>
</ul>
<p>不要一连不上就怀疑脚本。</p>
<p>网络这东西很多时候不是配置没生成，是流量根本没进来。</p>
<h2 id="排错顺序">排错顺序</h2><p>我一般按这个顺序看：</p>
<h3 id="1.-服务有没有起来">1. 服务有没有起来</h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh status</code></pre><p>或者：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> systemctl status wg-quick@wg0</code></pre><h3 id="2.-客户端配置有没有生成">2. 客户端配置有没有生成</h3><pre><code class="language-bash"><span class="hljs-built_in">ls</span> -l /etc/wireguard/clients/</code></pre><h3 id="3.-二维码能不能扫">3. 二维码能不能扫</h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ./wg-manager.sh qr iphone</code></pre><h3 id="4.-peer-有没有握手">4. peer 有没有握手</h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> wg</code></pre><p>有 <code>latest handshake</code> 才说明客户端真的连上了。</p>
<p>没有握手就继续看端口、安全组、endpoint、公私钥。</p>
<h2 id="已知限制">已知限制</h2><p>这个脚本不是万能的。</p>
<p>目前限制大概是：</p>
<ul>
<li>只支持 Debian / Ubuntu。</li>
<li>IPv4 网段只按 <code>/24</code> 处理。</li>
<li>IPv6 网段只按 <code>/64</code> 处理。</li>
<li>默认用 <code>iptables</code> / <code>ip6tables</code> 做 NAT。</li>
<li>不接管已有复杂 WireGuard 环境。</li>
<li>分流只是简单 <code>AllowedIPs</code>，不做智能规则。</li>
</ul>
<p>这些限制不是 bug，是故意先控制范围。</p>
<p>脚本这种东西最怕一开始想包打天下，最后写成一坨没人敢跑的东西。</p>
<h2 id="最后">最后</h2><p><code>wg-manager</code> 不是为了替代 WireGuard 官方工具。</p>
<p>它只是把我经常要做的几件事包成一个脚本：安装、加客户端、删客户端、扫二维码、看状态、重载配置。</p>
<p>能少手改一次 <code>wg0.conf</code>，就少一次写错配置的机会。</p>
<p>先能稳定跑，再慢慢补功能。这个方向比较像人样。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hello OpenCode</title>
      <link>https://blog.kauriss.site/2026/01/13/hello-opencode/</link>
      <guid>https://blog.kauriss.site/2026/01/13/hello-opencode/</guid>
      <pubDate>Tue, 13 Jan 2026 18:46:00 GMT</pubDate>
      <description>这个博客目前用的是 Hexo + OpenCode 主题。 一开始只是想找个轻一点的主题，别搞得像那种花里胡哨的模板站。后面看到 OpenCode 这个终端风格还行，黑白、等宽字体、结构也比较干净，就先拿来用了。</description>
      <content:encoded><![CDATA[<p>这个博客目前用的是 Hexo + OpenCode 主题。</p>
<p>一开始只是想找个轻一点的主题，别搞得像那种花里胡哨的模板站。后面看到 OpenCode 这个终端风格还行，黑白、等宽字体、结构也比较干净，就先拿来用了。</p>
<p><img src="/images/opencode_theme.png" alt="OpenCode 主题预览"></p>
<h2 id="为什么用这个主题">为什么用这个主题</h2><p>主要是几个点：</p>
<ul>
<li>页面够干净，不抢文章内容。</li>
<li>等宽字体看代码舒服。</li>
<li>黑白风格比较耐看，不容易审美疲劳。</li>
<li>结构简单，后面想改也不算难。</li>
</ul>
<p>有些主题第一眼很炫，真写文章的时候就开始乱：卡片太多、颜色太杂、动画一堆。看着不像博客，像卖课页。</p>
<p>这个至少没那么抽象。</p>
<h2 id="现在的样子">现在的样子</h2><p>目前博客主要放这些内容：</p>
<ul>
<li>网络和服务器相关的折腾记录。</li>
<li>Linux、脚本、命令速查。</li>
<li>一些工具部署和踩坑笔记。</li>
<li>后面可能会放 AI 编码、网站、自动化这些东西。</li>
</ul>
<p>不一定写得多正式，能看懂、能复现就行。</p>
<h2 id="代码块效果">代码块效果</h2><p>命令块大概是这样：</p>
<pre><code class="language-bash">npm install
npm run build</code></pre><p>普通代码块：</p>
<pre><code class="language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">log</span>(<span class="hljs-params">message</span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`[stdout] <span class="hljs-subst">${message}</span>`</span>)
}

<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;hello opencode&#x27;</span>)</code></pre><h2 id="后面可能会改的地方">后面可能会改的地方</h2><p>这个主题能用，但也不是完全不用动。</p>
<p>我大概会改这些：</p>
<ol>
<li>首页文章列表再紧凑一点。</li>
<li>中文排版细节调一下。</li>
<li>分类和标签页面别太空。</li>
<li>代码块复制按钮如果不好用就重写。</li>
<li>移动端看着不顺眼的地方继续修。</li>
</ol>
<p>先跑起来，再慢慢改。</p>
<h2 id="结尾">结尾</h2><p>这个站目前就当自己的技术笔记。</p>
<p>写文章不是为了装得很专业，主要是防止下次又忘了怎么配。能把坑记下来，就不算白折腾。</p>
]]></content:encoded>
    </item>
    <item>
      <title>常用 Linux 命令速查表</title>
      <link>https://blog.kauriss.site/2025/11/28/%E5%B8%B8%E7%94%A8%20Linux%20%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8/</link>
      <guid>https://blog.kauriss.site/2025/11/28/%E5%B8%B8%E7%94%A8%20Linux%20%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8/</guid>
      <pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate>
      <description>一份平时查命令用的 Linux 速查表，主要放常用命令、参数和几个能直接复制的例子。</description>
      <content:encoded><![CDATA[<p>这篇就是给自己查命令用的。</p>
<p>Linux 命令太多，不可能全背。平时能记住常用的，剩下的需要时能快速翻到就行。</p>
<p><img src="/images/shell.png" alt=""></p>
<h2 id="目录">目录</h2><ol>
<li><a href="#常用命令简表">常用命令简表</a></li>
<li><a href="#文件和目录">文件和目录</a></li>
<li><a href="#查看文件">查看文件</a></li>
<li><a href="#文本处理">文本处理</a></li>
<li><a href="#查找文件">查找文件</a></li>
<li><a href="#权限和用户">权限和用户</a></li>
<li><a href="#进程和服务">进程和服务</a></li>
<li><a href="#网络相关">网络相关</a></li>
<li><a href="#软件包管理">软件包管理</a></li>
<li><a href="#磁盘和挂载">磁盘和挂载</a></li>
<li><a href="#压缩和解压">压缩和解压</a></li>
<li><a href="#日志和排错">日志和排错</a></li>
<li><a href="#shell-小东西">Shell 小东西</a></li>
<li><a href="#几个常用一行命令">几个常用一行命令</a></li>
</ol>
<h2 id="常用命令简表">常用命令简表</h2><table>
<thead>
<tr>
<th align="left">要干嘛</th>
<th align="left">常用命令</th>
</tr>
</thead>
<tbody><tr>
<td align="left">看目录</td>
<td align="left"><code>ls</code>, <code>tree</code></td>
</tr>
<tr>
<td align="left">切目录</td>
<td align="left"><code>cd</code>, <code>pwd</code></td>
</tr>
<tr>
<td align="left">复制移动删除</td>
<td align="left"><code>cp</code>, <code>mv</code>, <code>rm</code></td>
</tr>
<tr>
<td align="left">看文件</td>
<td align="left"><code>cat</code>, <code>less</code>, <code>head</code>, <code>tail</code></td>
</tr>
<tr>
<td align="left">搜文本</td>
<td align="left"><code>grep</code>, <code>rg</code></td>
</tr>
<tr>
<td align="left">处理文本</td>
<td align="left"><code>awk</code>, <code>sed</code>, <code>cut</code>, <code>sort</code>, <code>uniq</code></td>
</tr>
<tr>
<td align="left">找文件</td>
<td align="left"><code>find</code>, <code>locate</code>, <code>which</code></td>
</tr>
<tr>
<td align="left">改权限</td>
<td align="left"><code>chmod</code>, <code>chown</code></td>
</tr>
<tr>
<td align="left">看进程</td>
<td align="left"><code>ps</code>, <code>top</code>, <code>htop</code>, <code>kill</code></td>
</tr>
<tr>
<td align="left">看网络</td>
<td align="left"><code>ip</code>, <code>ss</code>, <code>curl</code>, <code>ping</code>, <code>ssh</code></td>
</tr>
<tr>
<td align="left">打包压缩</td>
<td align="left"><code>tar</code>, <code>zip</code>, <code>gzip</code></td>
</tr>
</tbody></table>
<h2 id="文件和目录">文件和目录</h2><h3 id="ls"><code>ls</code></h3><p>看目录：</p>
<pre><code class="language-bash"><span class="hljs-built_in">ls</span>
<span class="hljs-built_in">ls</span> -l
<span class="hljs-built_in">ls</span> -la
<span class="hljs-built_in">ls</span> -lh</code></pre><p>常用参数：</p>
<ul>
<li><code>-l</code>：详细列表</li>
<li><code>-a</code>：显示隐藏文件</li>
<li><code>-h</code>：文件大小更好看，比如 <code>1.2G</code></li>
</ul>
<h3 id="cd-和-pwd"><code>cd</code> 和 <code>pwd</code></h3><pre><code class="language-bash"><span class="hljs-built_in">pwd</span>
<span class="hljs-built_in">cd</span> /var/www
<span class="hljs-built_in">cd</span> ~
<span class="hljs-built_in">cd</span> -</code></pre><p><code>cd -</code> 可以回到上一个目录，挺常用。</p>
<h3 id="cp"><code>cp</code></h3><pre><code class="language-bash"><span class="hljs-built_in">cp</span> a.txt b.txt
<span class="hljs-built_in">cp</span> -r src/ backup/
<span class="hljs-built_in">cp</span> -a src/ backup/</code></pre><p><code>-a</code> 会尽量保留权限、时间等信息，备份目录时比 <code>-r</code> 更稳一点。</p>
<h3 id="mv"><code>mv</code></h3><pre><code class="language-bash"><span class="hljs-built_in">mv</span> old.txt new.txt
<span class="hljs-built_in">mv</span> file.txt /tmp/</code></pre><p>既能移动，也能改名。</p>
<h3 id="rm"><code>rm</code></h3><pre><code class="language-bash"><span class="hljs-built_in">rm</span> file.txt
<span class="hljs-built_in">rm</span> -r folder/
<span class="hljs-built_in">rm</span> -rf folder/</code></pre><p><code>rm -rf</code> 别手滑。尤其是带变量的时候，先 <code>echo</code> 一下路径，不然删错真没得后悔。</p>
<h3 id="mkdir"><code>mkdir</code></h3><pre><code class="language-bash"><span class="hljs-built_in">mkdir</span> logs
<span class="hljs-built_in">mkdir</span> -p app/data/cache</code></pre><p><code>-p</code> 会自动创建中间目录。</p>
<h2 id="查看文件">查看文件</h2><h3 id="cat"><code>cat</code></h3><pre><code class="language-bash"><span class="hljs-built_in">cat</span> file.txt</code></pre><p>小文件直接看。大文件别用它硬刷屏。</p>
<h3 id="less"><code>less</code></h3><pre><code class="language-bash">less app.log</code></pre><p>常用操作：</p>
<ul>
<li><code>/关键词</code>：搜索</li>
<li><code>n</code>：下一个结果</li>
<li><code>q</code>：退出</li>
</ul>
<h3 id="head-和-tail"><code>head</code> 和 <code>tail</code></h3><pre><code class="language-bash"><span class="hljs-built_in">head</span> -n 20 app.log
<span class="hljs-built_in">tail</span> -n 50 app.log
<span class="hljs-built_in">tail</span> -f app.log</code></pre><p>看日志一般用 <code>tail -f</code>。</p>
<h3 id="nl"><code>nl</code></h3><pre><code class="language-bash"><span class="hljs-built_in">nl</span> file.txt</code></pre><p>带行号显示文件。排查配置时有用。</p>
<h2 id="文本处理">文本处理</h2><h3 id="grep"><code>grep</code></h3><pre><code class="language-bash">grep <span class="hljs-string">&quot;ERROR&quot;</span> app.log
grep -n <span class="hljs-string">&quot;ERROR&quot;</span> app.log
grep -R <span class="hljs-string">&quot;listen&quot;</span> /etc/nginx
grep -i <span class="hljs-string">&quot;error&quot;</span> app.log</code></pre><p>常用参数：</p>
<ul>
<li><code>-n</code>：显示行号</li>
<li><code>-R</code>：递归搜索目录</li>
<li><code>-i</code>：忽略大小写</li>
</ul>
<p>如果系统里有 <code>rg</code>，我一般会优先用 <code>rg</code>，快很多：</p>
<pre><code class="language-bash">rg <span class="hljs-string">&quot;ERROR&quot;</span>
rg <span class="hljs-string">&quot;listen&quot;</span> /etc/nginx</code></pre><h3 id="sed"><code>sed</code></h3><pre><code class="language-bash">sed -n <span class="hljs-string">&#x27;1,20p&#x27;</span> file.txt
sed <span class="hljs-string">&#x27;s/old/new/g&#x27;</span> file.txt</code></pre><p>常用来替换文本或者只看某几行。</p>
<h3 id="awk"><code>awk</code></h3><pre><code class="language-bash">awk <span class="hljs-string">&#x27;{print $1}&#x27;</span> access.log
awk <span class="hljs-string">&#x27;{print $1, $9}&#x27;</span> access.log</code></pre><p>按列处理文本。日志分析经常用。</p>
<h3 id="cut"><code>cut</code></h3><pre><code class="language-bash"><span class="hljs-built_in">cut</span> -d<span class="hljs-string">&#x27;:&#x27;</span> -f1 /etc/passwd
<span class="hljs-built_in">cut</span> -d<span class="hljs-string">&#x27;,&#x27;</span> -f1,3 data.csv</code></pre><p>简单分列就用它，不用上来就写一堆脚本。</p>
<h3 id="sort-和-uniq"><code>sort</code> 和 <code>uniq</code></h3><pre><code class="language-bash"><span class="hljs-built_in">sort</span> file.txt
<span class="hljs-built_in">sort</span> -n numbers.txt
<span class="hljs-built_in">sort</span> file.txt | <span class="hljs-built_in">uniq</span>
<span class="hljs-built_in">sort</span> file.txt | <span class="hljs-built_in">uniq</span> -c</code></pre><p>统计重复项时很顺手。</p>
<h3 id="wc"><code>wc</code></h3><pre><code class="language-bash"><span class="hljs-built_in">wc</span> -l file.txt
<span class="hljs-built_in">wc</span> -c file.txt</code></pre><p>数行数、字节数。</p>
<h2 id="查找文件">查找文件</h2><h3 id="find"><code>find</code></h3><pre><code class="language-bash">find . -name <span class="hljs-string">&quot;*.log&quot;</span>
find /var/log -<span class="hljs-built_in">type</span> f -mtime -7
find . -<span class="hljs-built_in">type</span> f -size +100M</code></pre><p>几个常用条件：</p>
<ul>
<li><code>-name</code>：按名字</li>
<li><code>-type f</code>：只找文件</li>
<li><code>-type d</code>：只找目录</li>
<li><code>-mtime -7</code>：7 天内改过</li>
<li><code>-size +100M</code>：大于 100M</li>
</ul>
<h3 id="which"><code>which</code></h3><pre><code class="language-bash"><span class="hljs-built_in">which</span> nginx
<span class="hljs-built_in">which</span> python</code></pre><p>看命令到底从哪来的。</p>
<h3 id="locate"><code>locate</code></h3><pre><code class="language-bash">locate nginx.conf</code></pre><p>快，但是依赖索引。刚创建的文件可能搜不到。</p>
<h2 id="权限和用户">权限和用户</h2><h3 id="chmod"><code>chmod</code></h3><pre><code class="language-bash"><span class="hljs-built_in">chmod</span> 644 file.txt
<span class="hljs-built_in">chmod</span> 755 script.sh
<span class="hljs-built_in">chmod</span> +x script.sh</code></pre><p>常见权限：</p>
<ul>
<li><code>644</code>：普通文件</li>
<li><code>755</code>：可执行脚本或目录</li>
<li><code>600</code>：私钥这类敏感文件</li>
</ul>
<h3 id="chown"><code>chown</code></h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chown</span> user:group file.txt
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chown</span> -R www-data:www-data /var/www/app</code></pre><p>网站目录权限不对时经常要看这个。</p>
<h3 id="用户相关">用户相关</h3><pre><code class="language-bash"><span class="hljs-built_in">whoami</span>
<span class="hljs-built_in">id</span>
passwd
<span class="hljs-built_in">sudo</span> useradd name
<span class="hljs-built_in">sudo</span> usermod -aG <span class="hljs-built_in">sudo</span> name</code></pre><h2 id="进程和服务">进程和服务</h2><h3 id="看进程">看进程</h3><pre><code class="language-bash">ps aux
ps aux | grep nginx
top
htop</code></pre><p>有 <code>htop</code> 就用 <code>htop</code>，看着舒服点。</p>
<h3 id="杀进程">杀进程</h3><pre><code class="language-bash"><span class="hljs-built_in">kill</span> 1234
<span class="hljs-built_in">kill</span> -9 1234
pkill -f nginx</code></pre><p><code>kill -9</code> 是强杀，不是万能修复按钮。先正常 <code>kill</code>，不行再用。</p>
<h3 id="systemd-服务">systemd 服务</h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> systemctl status nginx
<span class="hljs-built_in">sudo</span> systemctl start nginx
<span class="hljs-built_in">sudo</span> systemctl restart nginx
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> nginx</code></pre><p>看服务日志：</p>
<pre><code class="language-bash">journalctl -u nginx -f
journalctl -u nginx --since <span class="hljs-string">&quot;1 hour ago&quot;</span></code></pre><h2 id="网络相关">网络相关</h2><h3 id="ip-和端口">IP 和端口</h3><pre><code class="language-bash">ip addr
ip route
ss -tuln
ss -tulnp</code></pre><p><code>ss -tulnp</code> 能看哪个进程占了哪个端口。</p>
<h3 id="连通性">连通性</h3><pre><code class="language-bash">ping 1.1.1.1
curl -I https://example.com
curl http://127.0.0.1:3000</code></pre><p>测 HTTP 服务别只会 ping。ping 通不代表网站活着。</p>
<h3 id="ssh">SSH</h3><pre><code class="language-bash">ssh root@1.2.3.4
ssh -p 2222 user@1.2.3.4
scp file.txt user@1.2.3.4:/tmp/</code></pre><h3 id="rsync">rsync</h3><pre><code class="language-bash">rsync -avz ./dist/ user@server:/var/www/app/
rsync -avz --delete ./dist/ user@server:/var/www/app/</code></pre><p><code>--delete</code> 会删除目标端多出来的文件，用之前先想清楚。</p>
<h2 id="软件包管理">软件包管理</h2><p>Debian / Ubuntu：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> apt update
<span class="hljs-built_in">sudo</span> apt install nginx
<span class="hljs-built_in">sudo</span> apt upgrade</code></pre><p>CentOS / RHEL：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> yum install nginx
<span class="hljs-built_in">sudo</span> dnf install nginx</code></pre><p>Arch：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> pacman -S nginx</code></pre><p>openSUSE：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> zypper install nginx</code></pre><p>不同发行版命令不一样。别复制错系统了。</p>
<h2 id="磁盘和挂载">磁盘和挂载</h2><h3 id="看磁盘">看磁盘</h3><pre><code class="language-bash"><span class="hljs-built_in">df</span> -h
<span class="hljs-built_in">du</span> -sh *
<span class="hljs-built_in">du</span> -sh /var/log</code></pre><p>找大目录：</p>
<pre><code class="language-bash"><span class="hljs-built_in">du</span> -h --max-depth=1 / | <span class="hljs-built_in">sort</span> -h</code></pre><h3 id="块设备">块设备</h3><pre><code class="language-bash">lsblk
blkid
<span class="hljs-built_in">sudo</span> fdisk -l</code></pre><h3 id="挂载">挂载</h3><pre><code class="language-bash"><span class="hljs-built_in">sudo</span> mount /dev/sdb1 /mnt
<span class="hljs-built_in">sudo</span> umount /mnt</code></pre><h2 id="压缩和解压">压缩和解压</h2><h3 id="tar">tar</h3><pre><code class="language-bash">tar -czvf archive.tar.gz folder/
tar -xzvf archive.tar.gz
tar -tzf archive.tar.gz</code></pre><h3 id="zip">zip</h3><pre><code class="language-bash">zip -r archive.zip folder/
unzip archive.zip</code></pre><h3 id="gzip">gzip</h3><pre><code class="language-bash">gzip file.txt
gunzip file.txt.gz</code></pre><h2 id="日志和排错">日志和排错</h2><pre><code class="language-bash">dmesg
journalctl -xe
journalctl -u service-name -f
<span class="hljs-built_in">tail</span> -f /var/log/syslog
<span class="hljs-built_in">tail</span> -f /var/log/nginx/error.log</code></pre><p>端口被占用：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> lsof -i :80
<span class="hljs-built_in">sudo</span> ss -tulnp | grep :80</code></pre><p>配置改完不生效，先看服务有没有重启，再看日志。很多问题不是配置没写，是服务根本没加载。</p>
<h2 id="shell-小东西">Shell 小东西</h2><h3 id="环境变量">环境变量</h3><pre><code class="language-bash"><span class="hljs-built_in">env</span>
<span class="hljs-built_in">printenv</span>
<span class="hljs-built_in">export</span> NODE_ENV=production
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span></code></pre><h3 id="alias">alias</h3><pre><code class="language-bash"><span class="hljs-built_in">alias</span> ll=<span class="hljs-string">&#x27;ls -lah&#x27;</span>
<span class="hljs-built_in">alias</span> gs=<span class="hljs-string">&#x27;git status&#x27;</span></code></pre><p>写进 <code>~/.bashrc</code> 或 <code>~/.zshrc</code> 才会长期生效。</p>
<h3 id="执行脚本">执行脚本</h3><pre><code class="language-bash"><span class="hljs-built_in">chmod</span> +x script.sh
./script.sh</code></pre><h3 id="定时任务">定时任务</h3><pre><code class="language-bash">crontab -e
crontab -l</code></pre><h2 id="几个常用一行命令">几个常用一行命令</h2><p>找大文件：</p>
<pre><code class="language-bash">find / -<span class="hljs-built_in">type</span> f -size +500M 2&gt;/dev/null</code></pre><p>查日志里的错误：</p>
<pre><code class="language-bash">grep -R --line-number <span class="hljs-string">&quot;ERROR&quot;</span> /var/log 2&gt;/dev/null</code></pre><p>看当前目录每个文件夹大小：</p>
<pre><code class="language-bash"><span class="hljs-built_in">du</span> -h --max-depth=1 . | <span class="hljs-built_in">sort</span> -h</code></pre><p>同步网站构建产物：</p>
<pre><code class="language-bash">rsync -avz --delete ./dist/ user@server:/var/www/site/</code></pre><p>看某个服务最近日志：</p>
<pre><code class="language-bash">journalctl -u nginx --since <span class="hljs-string">&quot;2 hours ago&quot;</span> -f</code></pre><p>找占用端口的进程：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> ss -tulnp | grep :3000</code></pre><p>批量删 <code>.tmp</code> 文件：</p>
<pre><code class="language-bash">find . -<span class="hljs-built_in">type</span> f -name <span class="hljs-string">&quot;*.tmp&quot;</span> -delete</code></pre><p>这个命令执行前最好先把 <code>-delete</code> 去掉看一眼结果：</p>
<pre><code class="language-bash">find . -<span class="hljs-built_in">type</span> f -name <span class="hljs-string">&quot;*.tmp&quot;</span></code></pre><p>别上来就删，删错挺麻烦。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare Tunnel 部署教程</title>
      <link>https://blog.kauriss.site/2025/11/21/Cloudflare-Tunnel-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link>
      <guid>https://blog.kauriss.site/2025/11/21/Cloudflare-Tunnel-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid>
      <pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate>
      <description>用 Cloudflare Tunnel 把内网服务挂到公网，不需要公网 IP，也不用在路由器上开端口。</description>
      <content:encoded><![CDATA[<p>有时候想把家里的电脑、树莓派或者一台内网服务器挂到公网，但没有公网 IP，路由器也不好折腾。</p>
<p>这时候 Cloudflare Tunnel 就挺适合。它的逻辑很简单：本地机器主动连到 Cloudflare，然后外面的人通过你的域名访问这个隧道。你不用暴露端口，也不用管运营商给不给公网 IP。</p>
<p><img src="/images/CF_logo_horizontal_blktype.svg" alt=""></p>
<h2 id="适用场景">适用场景</h2><ul>
<li>家里跑了一个网站，想临时给外网访问。</li>
<li>NAS、面板、测试服务想绑个域名。</li>
<li>不想在路由器上开一堆端口。</li>
<li>没有公网 IP，但又想有 HTTPS。</li>
</ul>
<p>别拿它当万能反代。要是你跑的是高并发、大流量服务，还是老老实实上服务器。Tunnel 更适合个人服务、测试环境和低频访问。</p>
<h2 id="前置条件">前置条件</h2><p>先确认这几件事：</p>
<table>
<thead>
<tr>
<th align="left">项目</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Cloudflare 账号</td>
<td align="left">域名需要已经托管到 Cloudflare</td>
</tr>
<tr>
<td align="left">一台本地机器</td>
<td align="left">Linux 最省事，Windows 也能跑，但这里按 Linux 写</td>
</tr>
<tr>
<td align="left">一个本地服务</td>
<td align="left">比如 <code>http://127.0.0.1:80</code>、<code>http://127.0.0.1:8080</code></td>
</tr>
<tr>
<td align="left">一个域名</td>
<td align="left">比如 <code>app.example.com</code></td>
</tr>
</tbody></table>
<p>先测一下你的本地服务是不是活的：</p>
<pre><code class="language-bash">curl -I http://127.0.0.1:80</code></pre><p>能看到 <code>200</code>、<code>301</code>、<code>302</code> 这类正常响应就行。要是本地都打不开，先别折腾 Tunnel，不然排错会很抽象。</p>
<h2 id="最终效果">最终效果</h2><p>做完以后，外网访问的是你的域名：</p>
<pre><code class="language-text">https://app.example.com</code></pre><p>请求会从 Cloudflare 进入，再通过本机主动建立的 Tunnel 转到内网服务。你不用在路由器上做端口映射，也不用要求家里有公网 IP。</p>
<h2 id="安装-cloudflared">安装 cloudflared</h2><p><code>cloudflared</code> 是 Cloudflare Tunnel 的客户端。</p>
<p>macOS 可以直接用 Homebrew：</p>
<pre><code class="language-bash">brew install cloudflared</code></pre><p>Linux 下载二进制文件就行：</p>
<pre><code class="language-bash">curl -L <span class="hljs-string">&#x27;https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64&#x27;</span> -o ./cloudflared
<span class="hljs-built_in">chmod</span> +x ./cloudflared
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mv</span> ./cloudflared /usr/local/bin/cloudflared</code></pre><p>看一下有没有装好：</p>
<pre><code class="language-bash">cloudflared --version</code></pre><p>有版本号就行。</p>
<h2 id="登录-cloudflare">登录 Cloudflare</h2><p>让本机的 <code>cloudflared</code> 拿到 Cloudflare 账号授权：</p>
<pre><code class="language-bash">cloudflared tunnel login</code></pre><p>命令会给一个链接。复制到浏览器打开，登录 Cloudflare，选择你要用的域名，然后授权。</p>
<p>授权成功后，本机会生成一个证书文件。这个文件别乱删，后面创建隧道要用。</p>
<h2 id="创建隧道">创建隧道</h2><p>给隧道起个名字，比如 <code>home-web</code>：</p>
<pre><code class="language-bash">cloudflared tunnel create home-web</code></pre><p>输出里会有两个关键信息：</p>
<pre><code class="language-text">Created tunnel home-web with id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Tunnel credentials written to /root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json</code></pre><p>记住这两个：</p>
<ul>
<li>隧道 ID</li>
<li>credentials 文件路径</li>
</ul>
<p>后面配置文件要填。</p>
<h2 id="写配置文件">写配置文件</h2><p>创建配置目录：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mkdir</span> -p /etc/cloudflared
<span class="hljs-built_in">sudo</span> nano /etc/cloudflared/config.yml</code></pre><p>示例配置：</p>
<pre><code class="language-yaml"><span class="hljs-attr">tunnel:</span> <span class="hljs-string">xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span>
<span class="hljs-attr">credentials-file:</span> <span class="hljs-string">/root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json</span>

<span class="hljs-attr">ingress:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">hostname:</span> <span class="hljs-string">app.example.com</span>
    <span class="hljs-attr">service:</span> <span class="hljs-string">http://127.0.0.1:80</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">hostname:</span> <span class="hljs-string">admin.example.com</span>
    <span class="hljs-attr">service:</span> <span class="hljs-string">http://127.0.0.1:8080</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">service:</span> <span class="hljs-string">http_status:404</span></code></pre><p>这里别照抄域名。换成你自己的。</p>
<p><code>ingress</code> 是按顺序匹配的，最后那个 <code>404</code> 建议留着。不然没匹配到的请求怎么处理会比较乱。</p>
<p>配置写完先检查：</p>
<pre><code class="language-bash">cloudflared tunnel ingress validate</code></pre><p>能过再继续。</p>
<h2 id="绑定域名">绑定域名</h2><p>把域名指到这个 Tunnel：</p>
<pre><code class="language-bash">cloudflared tunnel route dns home-web app.example.com
cloudflared tunnel route dns home-web admin.example.com</code></pre><p>如果提示 DNS 记录冲突，去 Cloudflare 面板把旧的 <code>A</code>、<code>AAAA</code>、<code>CNAME</code> 记录删掉，再执行一次。</p>
<h2 id="先手动跑一下">先手动跑一下</h2><p>别急着装服务，先跑起来看看：</p>
<pre><code class="language-bash">cloudflared tunnel run home-web</code></pre><p>然后访问你的域名：</p>
<pre><code class="language-text">https://app.example.com</code></pre><p>能打开就说明主流程没问题。</p>
<p>如果打不开，优先看这几个点：</p>
<ul>
<li>本地服务是不是还活着。</li>
<li><code>hostname</code> 有没有写错。</li>
<li>Cloudflare DNS 有没有指到 Tunnel。</li>
<li>服务器时间是不是离谱。</li>
<li>配置文件路径是不是对的。</li>
</ul>
<h2 id="设置开机启动">设置开机启动</h2><p>确认手动运行没问题后，再装成 systemd 服务：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> cloudflared service install
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> --now cloudflared</code></pre><p>看状态：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> systemctl status cloudflared</code></pre><p>看实时日志：</p>
<pre><code class="language-bash">journalctl -u cloudflared -f</code></pre><p>日志里能看到连接成功，域名也能访问，就差不多了。</p>
<h2 id="常用命令">常用命令</h2><table>
<thead>
<tr>
<th align="left">功能</th>
<th align="left">命令</th>
</tr>
</thead>
<tbody><tr>
<td align="left">登录账号</td>
<td align="left"><code>cloudflared tunnel login</code></td>
</tr>
<tr>
<td align="left">创建隧道</td>
<td align="left"><code>cloudflared tunnel create &lt;name&gt;</code></td>
</tr>
<tr>
<td align="left">查看隧道</td>
<td align="left"><code>cloudflared tunnel list</code></td>
</tr>
<tr>
<td align="left">删除隧道</td>
<td align="left"><code>cloudflared tunnel delete &lt;name&gt;</code></td>
</tr>
<tr>
<td align="left">绑定域名</td>
<td align="left"><code>cloudflared tunnel route dns &lt;name&gt; &lt;domain&gt;</code></td>
</tr>
<tr>
<td align="left">校验配置</td>
<td align="left"><code>cloudflared tunnel ingress validate</code></td>
</tr>
<tr>
<td align="left">前台运行</td>
<td align="left"><code>cloudflared tunnel run &lt;name&gt;</code></td>
</tr>
<tr>
<td align="left">查看服务</td>
<td align="left"><code>sudo systemctl status cloudflared</code></td>
</tr>
<tr>
<td align="left">看日志</td>
<td align="left"><code>journalctl -u cloudflared -f</code></td>
</tr>
</tbody></table>
<h2 id="一点安全建议">一点安全建议</h2><p>Tunnel 不等于你可以什么都裸奔。</p>
<p>如果是管理面板，最好再加一层登录，或者用 Cloudflare Access 限制访问。不然只是端口没暴露，服务本身该被扫还是可能被扫。</p>
<p>简单说：公网能访问的东西，就按公网服务来处理。别侥幸。</p>
]]></content:encoded>
    </item>
    <item>
      <title>WireGuard Minecraft 联机教程</title>
      <link>https://blog.kauriss.site/2025/11/21/WireGuard-Minecraft-%E8%81%94%E6%9C%BA%E6%95%99%E7%A8%8B/</link>
      <guid>https://blog.kauriss.site/2025/11/21/WireGuard-Minecraft-%E8%81%94%E6%9C%BA%E6%95%99%E7%A8%8B/</guid>
      <pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate>
      <description>用 WireGuard 和一台 VPS，把家里的 Minecraft 服务器变成朋友能连的服务器。</description>
      <content:encoded><![CDATA[<p>想在自己电脑上开 Minecraft 服务器，最烦的不是开服，是让朋友连进来。</p>
<p>没有公网 IP，端口映射不会配，运营商还可能封端口。折腾半天，最后朋友还是连不上，挺抽象。</p>
<p>我这里用 WireGuard + 一台 VPS 解决。核心思路是：让家里的电脑和 VPS 先进同一个虚拟局域网，再让玩家通过 VPS 或虚拟 IP 连进来。</p>
<p><img src="/images/WireGuard-Logo.svg" alt=""></p>
<h2 id="适用场景">适用场景</h2><p>这篇适合自己在家里或宿舍开 Minecraft 服务端，但朋友从外网连不进来的情况。</p>
<ul>
<li>没有公网 IP，或者公网 IP 不稳定。</li>
<li>不想在路由器上手动做复杂端口映射。</li>
<li>有一台能访问公网的 VPS。</li>
<li>能接受 Minecraft 流量经过 VPS 中转。</li>
</ul>
<p>如果你已经有公网 IP，并且端口映射能稳定工作，那可以不用 WireGuard。</p>
<h2 id="两种方案">两种方案</h2><p>先看需求，不要上来就把所有人都拉去装 WireGuard。</p>
<table>
<thead>
<tr>
<th align="left">方案</th>
<th align="left">谁要装 WireGuard</th>
<th align="left">适合谁</th>
<th align="left">代价</th>
</tr>
</thead>
<tbody><tr>
<td align="left">方案 A：公网转发</td>
<td align="left">只要服主装</td>
<td align="left">想让朋友直接连 VPS IP</td>
<td align="left">流量都经过 VPS，延迟可能高一点</td>
</tr>
<tr>
<td align="left">方案 B：全员组网</td>
<td align="left">服主和玩家都装</td>
<td align="left">小圈子长期玩，想像局域网一样</td>
<td align="left">每个人都要配客户端</td>
</tr>
</tbody></table>
<p>新手建议先用方案 A。能跑起来再说，别一开始就搞复杂。</p>
<h2 id="前置条件">前置条件</h2><p>你需要：</p>
<ol>
<li>一台有公网 IP 的 VPS，Debian/Ubuntu 最省事。</li>
<li>服主电脑上装 WireGuard 客户端。</li>
<li>VPS 防火墙和云厂商安全组放行：<ul>
<li>UDP <code>51820</code></li>
<li>TCP <code>25565</code></li>
</ul>
</li>
<li>服主电脑上能正常启动 Minecraft 服务端。</li>
</ol>
<p>如果 Minecraft 本机都连不上，先修 Minecraft，不要怀疑 WireGuard。</p>
<h2 id="最终效果">最终效果</h2><p>做完以后，朋友可以通过 VPS 入口连接你的 Minecraft 服务端。服主电脑和 VPS 之间用 WireGuard 组成虚拟局域网，VPS 负责把外部玩家的连接转到家里的服务器。</p>
<p>如果用方案 B，玩家也能加入同一个 WireGuard 网络，体验更像局域网联机。</p>
<h2 id="vps-安装-wireguard">VPS 安装 WireGuard</h2><p>在 VPS 上执行：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> apt update
<span class="hljs-built_in">sudo</span> apt install wireguard -y</code></pre><p>生成服务端密钥：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mkdir</span> -p /etc/wireguard
<span class="hljs-built_in">cd</span> /etc/wireguard
wg genkey | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> privatekey | wg pubkey | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> publickey</code></pre><p>看公钥：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">cat</span> /etc/wireguard/publickey</code></pre><p>私钥别发给别人。公钥可以发。</p>
<p>开启转发：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> sysctl -w net.ipv4.ip_forward=1
<span class="hljs-built_in">sudo</span> sed -i <span class="hljs-string">&#x27;/net.ipv4.ip_forward=1/s/^#//&#x27;</span> /etc/sysctl.conf
<span class="hljs-built_in">sudo</span> sysctl -p</code></pre><h2 id="方案-a公网转发">方案 A：公网转发</h2><p>这个方案下，朋友不用装 WireGuard。他们直接连 <code>VPS公网IP:25565</code>。</p>
<h3 id="1.-服主电脑生成密钥">1. 服主电脑生成密钥</h3><p>打开 WireGuard 客户端，添加一个空隧道。客户端会自动生成私钥和公钥。</p>
<p>你只需要复制服主电脑的公钥，等会填到 VPS 配置里。</p>
<h3 id="2.-vps-写配置">2. VPS 写配置</h3><p>编辑配置文件：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> nano /etc/wireguard/wg0.conf</code></pre><p>示例：</p>
<pre><code class="language-ini"><span class="hljs-section">[Interface]</span>
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.1</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">ListenPort</span> = <span class="hljs-number">51820</span>
<span class="hljs-attr">PrivateKey</span> = &lt;VPS私钥&gt;

<span class="hljs-attr">PostUp</span> = iptables -A FORWARD -i wg0 -j ACCEPT<span class="hljs-comment">; iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2</span>
<span class="hljs-attr">PostDown</span> = iptables -D FORWARD -i wg0 -j ACCEPT<span class="hljs-comment">; iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;服主电脑公钥&gt;
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.2</span>/<span class="hljs-number">32</span></code></pre><p><code>10.0.0.2</code> 就是服主电脑在 WireGuard 里的虚拟 IP。</p>
<h3 id="3.-服主电脑写配置">3. 服主电脑写配置</h3><p>在 WireGuard 客户端里填：</p>
<pre><code class="language-ini"><span class="hljs-section">[Interface]</span>
<span class="hljs-attr">PrivateKey</span> = &lt;服主电脑私钥&gt;
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.2</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">DNS</span> = <span class="hljs-number">1.1</span>.<span class="hljs-number">1.1</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;VPS公钥&gt;
<span class="hljs-attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="hljs-number">51820</span>
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">PersistentKeepalive</span> = <span class="hljs-number">25</span></code></pre><p>这里的 <code>PrivateKey</code> 一般客户端已经自动填好了，不要手欠复制错。</p>
<h3 id="4.-启动测试">4. 启动测试</h3><p>VPS 上启动：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> wg-quick up wg0
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> wg-quick@wg0</code></pre><p>服主电脑启动 WireGuard。</p>
<p>然后在服主电脑上测试：</p>
<pre><code class="language-bash">ping 10.0.0.1</code></pre><p>能 ping 通，说明隧道通了。</p>
<p>接着启动 Minecraft 服务端。朋友连接：</p>
<pre><code class="language-text">&lt;VPS公网IP&gt;:25565</code></pre><p>如果连不上，先看 VPS 的 <code>25565</code> 有没有放行，再看本地防火墙有没有挡 Java。</p>
<h2 id="方案-b全员组网">方案 B：全员组网</h2><p>这个方案更像真正的虚拟局域网。每个人都有一个 <code>10.0.0.x</code> 地址。</p>
<p>适合固定几个人长期玩。缺点也很明显：每个人都要装客户端，配置发错一个就会连不上。</p>
<h3 id="1.-收集每个人的公钥">1. 收集每个人的公钥</h3><p>让每个玩家装 WireGuard，添加空隧道，把公钥发给你。</p>
<p>给每个人分一个 IP：</p>
<table>
<thead>
<tr>
<th align="left">人</th>
<th align="left">虚拟 IP</th>
</tr>
</thead>
<tbody><tr>
<td align="left">VPS</td>
<td align="left"><code>10.0.0.1</code></td>
</tr>
<tr>
<td align="left">服主</td>
<td align="left"><code>10.0.0.2</code></td>
</tr>
<tr>
<td align="left">玩家 A</td>
<td align="left"><code>10.0.0.3</code></td>
</tr>
<tr>
<td align="left">玩家 B</td>
<td align="left"><code>10.0.0.4</code></td>
</tr>
</tbody></table>
<p>不要重复。重复就寄。</p>
<h3 id="2.-vps-配置">2. VPS 配置</h3><pre><code class="language-ini"><span class="hljs-section">[Interface]</span>
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.1</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">ListenPort</span> = <span class="hljs-number">51820</span>
<span class="hljs-attr">PrivateKey</span> = &lt;VPS私钥&gt;

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;服主公钥&gt;
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.2</span>/<span class="hljs-number">32</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;玩家A公钥&gt;
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.3</span>/<span class="hljs-number">32</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;玩家B公钥&gt;
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.4</span>/<span class="hljs-number">32</span></code></pre><p>每加一个人，就加一个 <code>[Peer]</code>。</p>
<h3 id="3.-玩家客户端配置">3. 玩家客户端配置</h3><p>每个人的配置长得差不多，只是私钥和地址不同。</p>
<p>服主：</p>
<pre><code class="language-ini"><span class="hljs-section">[Interface]</span>
<span class="hljs-attr">PrivateKey</span> = &lt;服主自己的私钥&gt;
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.2</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">DNS</span> = <span class="hljs-number">1.1</span>.<span class="hljs-number">1.1</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;VPS公钥&gt;
<span class="hljs-attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="hljs-number">51820</span>
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">PersistentKeepalive</span> = <span class="hljs-number">25</span></code></pre><p>玩家 A：</p>
<pre><code class="language-ini"><span class="hljs-section">[Interface]</span>
<span class="hljs-attr">PrivateKey</span> = &lt;玩家A自己的私钥&gt;
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.3</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">DNS</span> = <span class="hljs-number">1.1</span>.<span class="hljs-number">1.1</span>

<span class="hljs-section">[Peer]</span>
<span class="hljs-attr">PublicKey</span> = &lt;VPS公钥&gt;
<span class="hljs-attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="hljs-number">51820</span>
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">24</span>
<span class="hljs-attr">PersistentKeepalive</span> = <span class="hljs-number">25</span></code></pre><p>私钥必须是每个人自己的。别把同一个配置群发，真不行。</p>
<h3 id="4.-连接游戏">4. 连接游戏</h3><p>VPS 启动：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> wg-quick up wg0
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> wg-quick@wg0</code></pre><p>所有人启动 WireGuard 后，互相 ping 一下：</p>
<pre><code class="language-bash">ping 10.0.0.1
ping 10.0.0.2</code></pre><p>能 ping 通，玩家就直接连服主虚拟 IP：</p>
<pre><code class="language-text">10.0.0.2:25565</code></pre><h2 id="排错">排错</h2><p>几个常见问题：</p>
<table>
<thead>
<tr>
<th align="left">问题</th>
<th align="left">先看哪里</th>
</tr>
</thead>
<tbody><tr>
<td align="left">WireGuard 没握手</td>
<td align="left">公钥、Endpoint、UDP 51820、安全组</td>
</tr>
<tr>
<td align="left">握手了但 ping 不通</td>
<td align="left"><code>AllowedIPs</code>、系统转发、防火墙</td>
</tr>
<tr>
<td align="left">ping 通但进不了服</td>
<td align="left">Minecraft 是否启动、TCP 25565、本机防火墙</td>
</tr>
<tr>
<td align="left">方案 A 玩家连不上</td>
<td align="left">VPS 的端口转发规则、云厂商安全组</td>
</tr>
</tbody></table>
<p>看 WireGuard 状态：</p>
<pre><code class="language-bash"><span class="hljs-built_in">sudo</span> wg</code></pre><p>有 <code>latest handshake</code> 才算连上。没有握手就别看 Minecraft，问题还在网络层。</p>
<h2 id="最后">最后</h2><p>我个人建议：</p>
<ul>
<li>临时开服：方案 A。</li>
<li>固定朋友长期玩：方案 B。</li>
<li>不想给每个人讲配置：方案 A。</li>
<li>想延迟低一点、也更私密：方案 B。</li>
</ul>
<p>先跑通，再优化。网络这东西一上来就追求完美，最后大概率卡在一个很蠢的配置上。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>