<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>StdOut</title>
    <link>https://blog.kauriss.site/</link>
    
    <atom:link href="https://blog.kauriss.site/rss.xml" rel="self" type="application/rss+xml"/>
    
    <description>Writing thoughts to standard output...</description>
    <pubDate>Fri, 01 May 2026 12:01:09 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <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><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">用户 -&gt; 你的域名 -&gt; 优选域名对应的 Cloudflare 节点 -&gt; Workers 路由 -&gt; 你的 Worker</span><br></pre></td></tr></table></figure><p>这不是玄学加速，也不是保证永远最快。只是把入口换成一个更顺手的 Cloudflare 节点。</p><h2 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</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="先说结论"><a href="#先说结论" class="headerlink" title="先说结论"></a>先说结论</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="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</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><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">Worker 名称：my-worker</span><br><span class="line">你的域名：wk.example.com</span><br><span class="line">优选域名：cloudflare.example.net</span><br></pre></td></tr></table></figure><p>实际操作时换成自己的。</p><h2 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></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">https://wk.example.com</span><br></pre></td></tr></table></figure><p>请求会先走你设置的优选域名对应节点，再由 Workers 路由交给目标 Worker 处理。平时访问、API 路径、静态资源路径都应该能被同一个 Worker 接住。</p><h2 id="第一步：先确认-Worker-正常"><a href="#第一步：先确认-Worker-正常" class="headerlink" title="第一步：先确认 Worker 正常"></a>第一步：先确认 Worker 正常</h2><p>先别急着改 DNS。</p><p>打开 Worker 默认地址：</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://my-worker.&lt;你的 workers.dev 子域&gt;.workers.dev</span><br></pre></td></tr></table></figure><p>能正常返回内容再继续。</p><p>如果默认地址都打不开，先修 Worker。否则后面 DNS 和路由加上去，只会把问题搞得更乱。</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">curl -I https://my-worker.&lt;你的 workers.dev 子域&gt;.workers.dev</span><br></pre></td></tr></table></figure><p>有正常 HTTP 状态码就行。</p><h2 id="第二步：添加-DNS-记录"><a href="#第二步：添加-DNS-记录" class="headerlink" title="第二步：添加 DNS 记录"></a>第二步：添加 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><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">wk.example.com</span><br></pre></td></tr></table></figure><h2 id="第三步：添加-Workers-路由"><a href="#第三步：添加-Workers-路由" class="headerlink" title="第三步：添加 Workers 路由"></a>第三步：添加 Workers 路由</h2><p>进入 Cloudflare 控制台：</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">Workers 和 Pages -&gt; 你的 Worker -&gt; 设置 -&gt; 域和路由</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">wk.example.com/*</span><br></pre></td></tr></table></figure><p>然后 Worker 选择你的项目，比如 <code>my-worker</code>。</p><p>这里的 <code>/*</code> 不能漏。</p><p>不加的话，只匹配根路径，很多接口、静态资源、子路径会直接寄。</p><h2 id="第四步：测试访问"><a href="#第四步：测试访问" class="headerlink" title="第四步：测试访问"></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">https://wk.example.com</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">curl -I https://wk.example.com</span><br></pre></td></tr></table></figure><p>如果 Worker 里有 API 路径，也测一下：</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 -I https://wk.example.com/api</span><br></pre></td></tr></table></figure><p>不要只测首页。很多项目首页能开，接口路径没被路由接住，后面才发现。</p><h2 id="怎么判断有没有生效"><a href="#怎么判断有没有生效" class="headerlink" title="怎么判断有没有生效"></a>怎么判断有没有生效</h2><p>先查 DNS：</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">nslookup wk.example.com</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">dig wk.example.com</span><br></pre></td></tr></table></figure><p>正常应该能看到它最终指向你设置的优选域名。</p><p>再测 HTTPS：</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 -I https://wk.example.com</span><br></pre></td></tr></table></figure><p>如果返回的是你 Worker 的响应，就说明路由也生效了。</p><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="1-打开是-404"><a href="#1-打开是-404" class="headerlink" title="1. 打开是 404"></a>1. 打开是 404</h3><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">wk.example.com/*</span><br></pre></td></tr></table></figure><p>域名、星号、斜杠都看一下。</p><h3 id="2-DNS-查得到，但-Worker-没反应"><a href="#2-DNS-查得到，但-Worker-没反应" class="headerlink" title="2. DNS 查得到，但 Worker 没反应"></a>2. DNS 查得到，但 Worker 没反应</h3><p>DNS 只是把请求带到 Cloudflare 节点。</p><p>Worker 是否执行，看的是 Workers 路由。去“域和路由”看路由有没有绑定到正确 Worker。</p><h3 id="3-HTTPS-证书报错"><a href="#3-HTTPS-证书报错" class="headerlink" title="3. HTTPS 证书报错"></a>3. HTTPS 证书报错</h3><p>先等一会。</p><p>如果一直不行，检查这个域名是不是在 Cloudflare 里正常托管，DNS 记录有没有写错。</p><p>另外，别乱用不属于你的域名。证书和路由都不是这么玩的。</p><h3 id="4-优选域名突然变慢"><a href="#4-优选域名突然变慢" class="headerlink" title="4. 优选域名突然变慢"></a>4. 优选域名突然变慢</h3><p>正常。</p><p>所谓优选不是固定真理，只是当前测试下来比较好。网络会变，节点也会变。</p><p>解决方法就两个：</p><ul><li>换一个优选域名。</li><li>自己定期测速。</li></ul><h3 id="5-免费额度够不够"><a href="#5-免费额度够不够" class="headerlink" title="5. 免费额度够不够"></a>5. 免费额度够不够</h3><p>普通个人项目一般够。</p><p>Cloudflare Workers 免费计划有每日请求数和 CPU 时间限制。轻量 API、跳转页、小工具通常没问题。</p><p>但如果你拿它跑大流量下载、反代一堆东西，那就别想着白嫖无限用。迟早碰限制。</p><h2 id="路由和自定义域名怎么选"><a href="#路由和自定义域名怎么选" class="headerlink" title="路由和自定义域名怎么选"></a>路由和自定义域名怎么选</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="一个完整例子"><a href="#一个完整例子" class="headerlink" title="一个完整例子"></a>一个完整例子</h2><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">Worker：my-worker</span><br><span class="line">域名：example.com</span><br><span class="line">入口：wk.example.com</span><br><span class="line">优选域名：cloudflare.example.net</span><br></pre></td></tr></table></figure><p>DNS：</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">CNAME  wk  cloudflare.example.net  仅 DNS 解析</span><br></pre></td></tr></table></figure><p>Workers 路由：</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">wk.example.com/*</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">https://wk.example.com</span><br></pre></td></tr></table></figure><p>如果能返回 Worker 内容，就完成了。</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>这个方案适合已经有 Worker 项目，但默认入口访问不稳定的情况。</p><p>别把它想得太神。优选域名只是换入口，不会把一个烂项目变快，也不会解决 Worker 本身的代码问题。</p><p>先确认 Worker 正常，再改 DNS，再绑路由。按这个顺序来，不容易乱。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a href="https://developers.cloudflare.com/workers/configuration/routing/">Cloudflare Workers 路由和域名</a></li><li><a href="https://developers.cloudflare.com/workers/configuration/routing/custom-domains/">Cloudflare Workers 自定义域名</a></li><li><a href="https://developers.cloudflare.com/workers/platform/limits/">Cloudflare Workers Limits</a></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E7%BD%91%E7%BB%9C/">网络</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Cloudflare/">Cloudflare</category>
      
      <category domain="https://blog.kauriss.site/tags/Network/">Network</category>
      
      <category domain="https://blog.kauriss.site/tags/Workers/">Workers</category>
      
      <category domain="https://blog.kauriss.site/tags/%E4%BC%98%E9%80%89/">优选</category>
      
      <category domain="https://blog.kauriss.site/tags/DNS/">DNS</category>
      
      
      <comments>https://blog.kauriss.site/2026/04/25/Cloudflare-Workers-%E4%BC%98%E9%80%89%E6%95%99%E7%A8%8B/#disqus_thread</comments>
      
    </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"></p><h2 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</h2><p>这个脚本适合个人 VPS 上的 WireGuard 小环境：</p><ul><li>想快速添加、删除客户端。</li><li>想直接在终端里生成二维码给手机扫。</li><li>不想每次都手动改 <code>wg0.conf</code>。</li><li>希望通过菜单看状态、重载配置、导出客户端文件。</li></ul><p>如果你已经有复杂的策略路由、多网卡、多出口环境，这个脚本不一定适合直接接管。</p><h2 id="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</h2><p>默认按 Debian &#x2F; Ubuntu 这类常见服务器环境写。使用前至少需要：</p><ul><li>一台可以使用 root 权限的 Linux 服务器。</li><li>系统能正常安装 WireGuard 相关软件包。</li><li>防火墙或云厂商安全组放行 WireGuard 使用的 UDP 端口。</li><li>你知道自己要给客户端分配的大致网段。</li></ul><h2 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></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"><span class="built_in">sudo</span> ./wg-manager.sh</span><br></pre></td></tr></table></figure><p>然后通过菜单完成客户端增删、二维码查看、服务状态检查和配置重载。常用操作不用再反复翻命令。</p><h2 id="这个脚本是干嘛的"><a href="#这个脚本是干嘛的" class="headerlink" title="这个脚本是干嘛的"></a>这个脚本是干嘛的</h2><p><code>wg-manager</code> 是一个 Bash 脚本，主要用来管理 WireGuard 服务端和客户端。</p><p>它现在能做这些：</p><ul><li>安装 WireGuard 服务端。</li><li>创建第一个客户端。</li><li>添加 &#x2F; 删除客户端。</li><li>自动分配客户端 IP。</li><li>生成客户端配置文件。</li><li>在终端显示二维码，手机直接扫。</li><li>支持全局模式和简单分流模式。</li><li>查看服务状态和 peer 信息。</li><li>重建配置并重载。</li><li>卸载脚本管理的配置。</li></ul><p>适合一台 Debian &#x2F; Ubuntu 云服务器。</p><p>不适合那种已经有复杂 WireGuard 生产环境、策略路由一堆、分流规则特别细的场景。这个脚本不是来接管复杂网络的，主要是把普通人最常用的那套流程弄顺。</p><h2 id="为什么要写菜单模式"><a href="#为什么要写菜单模式" class="headerlink" title="为什么要写菜单模式"></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"><span class="built_in">sudo</span> ./wg-manager.sh add-client iphone</span><br><span class="line"><span class="built_in">sudo</span> ./wg-manager.sh qr iphone</span><br><span class="line"><span class="built_in">sudo</span> ./wg-manager.sh status</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> ./wg-manager.sh</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><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">1) 安装 WireGuard</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></tr></table></figure><p>这样不用每次翻 README。</p><p>还有一个细节：菜单模式启动时会先检查是不是 root。</p><p>如果没用 <code>sudo</code>，直接退出。不要让人填了一堆东西，最后才提示权限不够。那种体验有点抽象。</p><h2 id="获取脚本"><a href="#获取脚本" class="headerlink" title="获取脚本"></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">git <span class="built_in">clone</span> https://github.com/Kaurisss/wg-manager.git</span><br><span class="line"><span class="built_in">cd</span> wg-manager</span><br><span class="line"><span class="built_in">chmod</span> +x wg-manager.sh</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">curl -fsSL -o wg-manager.sh https://raw.githubusercontent.com/Kaurisss/wg-manager/main/wg-manager.sh</span><br><span class="line"><span class="built_in">chmod</span> +x wg-manager.sh</span><br></pre></td></tr></table></figure><p>脚本建议放服务器上用。别在本地 Windows 上硬跑，这玩意本来就是给 Linux 服务器准备的。</p><h2 id="菜单模式使用"><a href="#菜单模式使用" class="headerlink" title="菜单模式使用"></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"><span class="built_in">sudo</span> ./wg-manager.sh</span><br></pre></td></tr></table></figure><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>客户端模式：全局 &#x2F; 分流</li></ul><p>大部分直接回车用默认值就行。</p><p>装完之后会生成服务端配置，也会顺手生成第一个客户端配置。</p><p>如果装了 <code>qrencode</code>，还能直接在终端显示二维码。手机 WireGuard 客户端一扫就能导入，挺省事。</p><h2 id="命令行模式"><a href="#命令行模式" class="headerlink" title="命令行模式"></a>命令行模式</h2><p>菜单适合人手动点。</p><p>但写文档、自动化、复制命令时，子命令还是要保留。</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"><span class="built_in">sudo</span> ./wg-manager.sh install --client-name phone</span><br></pre></td></tr></table></figure><p>启用 IPv6：</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">sudo</span> ./wg-manager.sh install --enable-ipv6 --client-name phone</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><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="built_in">sudo</span> ./wg-manager.sh install \</span><br><span class="line">  --port 51820 \</span><br><span class="line">  --ipv4-net 10.66.66.0/24 \</span><br><span class="line">  --enable-ipv6 \</span><br><span class="line">  --ipv6-net fd66:66:66::/64 \</span><br><span class="line">  --client-name laptop</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">sudo</span> ./wg-manager.sh add-client iphone</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">sudo</span> ./wg-manager.sh qr iphone</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">sudo</span> ./wg-manager.sh status</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">./wg-manager.sh list-clients</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">sudo</span> ./wg-manager.sh 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"><span class="built_in">sudo</span> ./wg-manager.sh uninstall --<span class="built_in">yes</span></span><br></pre></td></tr></table></figure><h2 id="全局模式和分流模式"><a href="#全局模式和分流模式" class="headerlink" title="全局模式和分流模式"></a>全局模式和分流模式</h2><p>脚本里客户端有两种模式。</p><h3 id="全局模式"><a href="#全局模式" class="headerlink" title="全局模式"></a>全局模式</h3><p>全局模式就是客户端所有流量都走 WireGuard：</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">AllowedIPs = 0.0.0.0/0,::/0</span><br></pre></td></tr></table></figure><p>适合：</p><ul><li>手机出门连回服务器。</li><li>想让所有流量都经过这台 VPS。</li><li>不想研究分流规则。</li></ul><h3 id="分流模式"><a href="#分流模式" class="headerlink" title="分流模式"></a>分流模式</h3><p>分流模式就是只让指定网段走 WireGuard。</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"><span class="built_in">sudo</span> ./wg-manager.sh add-client office \</span><br><span class="line">  --mode <span class="built_in">split</span> \</span><br><span class="line">  --allowed-ips 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16</span><br></pre></td></tr></table></figure><p>注意，这只是靠 <code>AllowedIPs</code> 做简单分流。</p><p>它不是智能分流，也不会自动识别游戏、网站、域名。你要是想做特别细的规则，那得上更复杂的方案。</p><h2 id="生成的文件放哪"><a href="#生成的文件放哪" class="headerlink" title="生成的文件放哪"></a>生成的文件放哪</h2><p>默认都在 <code>/etc/wireguard/</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><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">/etc/wireguard/</span><br><span class="line">├── wg0.conf</span><br><span class="line">├── clients/</span><br><span class="line">│   ├── phone.conf</span><br><span class="line">│   └── iphone.conf</span><br><span class="line">├── peers/</span><br><span class="line">│   └── iphone/</span><br><span class="line">│       ├── private.key</span><br><span class="line">│       ├── public.key</span><br><span class="line">│       ├── psk.key</span><br><span class="line">│       └── meta</span><br><span class="line">├── backup/</span><br><span class="line">└── .wg-manager/</span><br><span class="line">    ├── server.env</span><br><span class="line">    ├── server_private.key</span><br><span class="line">    └── server_public.key</span><br></pre></td></tr></table></figure><p>这里面有私钥、PSK、客户端配置。</p><p>不要传 GitHub。</p><p>公开仓库里只放脚本、README、示例配置就行。真实配置文件传上去，基本就是自己给自己挖坑。</p><h2 id="安全组和防火墙"><a href="#安全组和防火墙" class="headerlink" title="安全组和防火墙"></a>安全组和防火墙</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="排错顺序"><a href="#排错顺序" class="headerlink" title="排错顺序"></a>排错顺序</h2><p>我一般按这个顺序看：</p><h3 id="1-服务有没有起来"><a href="#1-服务有没有起来" class="headerlink" title="1. 服务有没有起来"></a>1. 服务有没有起来</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"><span class="built_in">sudo</span> ./wg-manager.sh status</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">sudo</span> systemctl status wg-quick@wg0</span><br></pre></td></tr></table></figure><h3 id="2-客户端配置有没有生成"><a href="#2-客户端配置有没有生成" class="headerlink" title="2. 客户端配置有没有生成"></a>2. 客户端配置有没有生成</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"><span class="built_in">ls</span> -l /etc/wireguard/clients/</span><br></pre></td></tr></table></figure><h3 id="3-二维码能不能扫"><a href="#3-二维码能不能扫" class="headerlink" title="3. 二维码能不能扫"></a>3. 二维码能不能扫</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"><span class="built_in">sudo</span> ./wg-manager.sh qr iphone</span><br></pre></td></tr></table></figure><h3 id="4-peer-有没有握手"><a href="#4-peer-有没有握手" class="headerlink" title="4. peer 有没有握手"></a>4. peer 有没有握手</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"><span class="built_in">sudo</span> wg</span><br></pre></td></tr></table></figure><p>有 <code>latest handshake</code> 才说明客户端真的连上了。</p><p>没有握手就继续看端口、安全组、endpoint、公私钥。</p><h2 id="已知限制"><a href="#已知限制" class="headerlink" title="已知限制"></a>已知限制</h2><p>这个脚本不是万能的。</p><p>目前限制大概是：</p><ul><li>只支持 Debian &#x2F; Ubuntu。</li><li>IPv4 网段只按 <code>/24</code> 处理。</li><li>IPv6 网段只按 <code>/64</code> 处理。</li><li>默认用 <code>iptables</code> &#x2F; <code>ip6tables</code> 做 NAT。</li><li>不接管已有复杂 WireGuard 环境。</li><li>分流只是简单 <code>AllowedIPs</code>，不做智能规则。</li></ul><p>这些限制不是 bug，是故意先控制范围。</p><p>脚本这种东西最怕一开始想包打天下，最后写成一坨没人敢跑的东西。</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p><code>wg-manager</code> 不是为了替代 WireGuard 官方工具。</p><p>它只是把我经常要做的几件事包成一个脚本：安装、加客户端、删客户端、扫二维码、看状态、重载配置。</p><p>能少手改一次 <code>wg0.conf</code>，就少一次写错配置的机会。</p><p>先能稳定跑，再慢慢补功能。这个方向比较像人样。</p>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E7%B3%BB%E7%BB%9F%E8%BF%90%E7%BB%B4/">系统运维</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Linux/">Linux</category>
      
      <category domain="https://blog.kauriss.site/tags/Network/">Network</category>
      
      <category domain="https://blog.kauriss.site/tags/WireGuard/">WireGuard</category>
      
      <category domain="https://blog.kauriss.site/tags/Shell/">Shell</category>
      
      <category domain="https://blog.kauriss.site/tags/%E8%84%9A%E6%9C%AC/">脚本</category>
      
      
      <comments>https://blog.kauriss.site/2026/04/25/wg-manager-WireGuard-%E7%AE%A1%E7%90%86%E8%84%9A%E6%9C%AC/#disqus_thread</comments>
      
    </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>&lt;p&gt;这个博客目前用的是 Hexo + OpenCode 主题。&lt;/p&gt;
&lt;p&gt;一开始只是想找个轻一点的主题，别搞得像那种花里胡哨的模板站。后面看到 OpenCode 这个终端风格还行，黑白、等宽字体、结构也比较干净，就先拿来用了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/opencode_theme.png&quot; alt=&quot;OpenCode 主题预览&quot;&gt;&lt;/p&gt;</description>
      
      
      
      <content:encoded><![CDATA[<p>这个博客目前用的是 Hexo + OpenCode 主题。</p><p>一开始只是想找个轻一点的主题，别搞得像那种花里胡哨的模板站。后面看到 OpenCode 这个终端风格还行，黑白、等宽字体、结构也比较干净，就先拿来用了。</p><p><img src="/images/opencode_theme.png" alt="OpenCode 主题预览"></p><span id="more"></span><h2 id="为什么用这个主题"><a href="#为什么用这个主题" class="headerlink" title="为什么用这个主题"></a>为什么用这个主题</h2><p>主要是几个点：</p><ul><li>页面够干净，不抢文章内容。</li><li>等宽字体看代码舒服。</li><li>黑白风格比较耐看，不容易审美疲劳。</li><li>结构简单，后面想改也不算难。</li></ul><p>有些主题第一眼很炫，真写文章的时候就开始乱：卡片太多、颜色太杂、动画一堆。看着不像博客，像卖课页。</p><p>这个至少没那么抽象。</p><h2 id="现在的样子"><a href="#现在的样子" class="headerlink" title="现在的样子"></a>现在的样子</h2><p>目前博客主要放这些内容：</p><ul><li>网络和服务器相关的折腾记录。</li><li>Linux、脚本、命令速查。</li><li>一些工具部署和踩坑笔记。</li><li>后面可能会放 AI 编码、网站、自动化这些东西。</li></ul><p>不一定写得多正式，能看懂、能复现就行。</p><h2 id="代码块效果"><a href="#代码块效果" class="headerlink" title="代码块效果"></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">npm install</span><br><span class="line">npm run build</span><br></pre></td></tr></table></figure><p>普通代码块：</p><figure class="highlight javascript"><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="keyword">function</span> <span class="title function_">log</span>(<span class="params">message</span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`[stdout] <span class="subst">$&#123;message&#125;</span>`</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">log</span>(<span class="string">&#x27;hello opencode&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="后面可能会改的地方"><a href="#后面可能会改的地方" class="headerlink" title="后面可能会改的地方"></a>后面可能会改的地方</h2><p>这个主题能用，但也不是完全不用动。</p><p>我大概会改这些：</p><ol><li>首页文章列表再紧凑一点。</li><li>中文排版细节调一下。</li><li>分类和标签页面别太空。</li><li>代码块复制按钮如果不好用就重写。</li><li>移动端看着不顺眼的地方继续修。</li></ol><p>先跑起来，再慢慢改。</p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>这个站目前就当自己的技术笔记。</p><p>写文章不是为了装得很专业，主要是防止下次又忘了怎么配。能把坑记下来，就不算白折腾。</p>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E6%8A%80%E6%9C%AF/">技术</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Hexo/">Hexo</category>
      
      <category domain="https://blog.kauriss.site/tags/%E4%B8%BB%E9%A2%98/">主题</category>
      
      <category domain="https://blog.kauriss.site/tags/OpenCode/">OpenCode</category>
      
      
      <comments>https://blog.kauriss.site/2026/01/13/hello-opencode/#disqus_thread</comments>
      
    </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"></p><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ol><li><a href="#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E7%AE%80%E8%A1%A8">常用命令简表</a></li><li><a href="#%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95">文件和目录</a></li><li><a href="#%E6%9F%A5%E7%9C%8B%E6%96%87%E4%BB%B6">查看文件</a></li><li><a href="#%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86">文本处理</a></li><li><a href="#%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6">查找文件</a></li><li><a href="#%E6%9D%83%E9%99%90%E5%92%8C%E7%94%A8%E6%88%B7">权限和用户</a></li><li><a href="#%E8%BF%9B%E7%A8%8B%E5%92%8C%E6%9C%8D%E5%8A%A1">进程和服务</a></li><li><a href="#%E7%BD%91%E7%BB%9C%E7%9B%B8%E5%85%B3">网络相关</a></li><li><a href="#%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86">软件包管理</a></li><li><a href="#%E7%A3%81%E7%9B%98%E5%92%8C%E6%8C%82%E8%BD%BD">磁盘和挂载</a></li><li><a href="#%E5%8E%8B%E7%BC%A9%E5%92%8C%E8%A7%A3%E5%8E%8B">压缩和解压</a></li><li><a href="#%E6%97%A5%E5%BF%97%E5%92%8C%E6%8E%92%E9%94%99">日志和排错</a></li><li><a href="#shell-%E5%B0%8F%E4%B8%9C%E8%A5%BF">Shell 小东西</a></li><li><a href="#%E5%87%A0%E4%B8%AA%E5%B8%B8%E7%94%A8%E4%B8%80%E8%A1%8C%E5%91%BD%E4%BB%A4">几个常用一行命令</a></li></ol><h2 id="常用命令简表"><a href="#常用命令简表" class="headerlink" title="常用命令简表"></a>常用命令简表</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="文件和目录"><a href="#文件和目录" class="headerlink" title="文件和目录"></a>文件和目录</h2><h3 id="ls"><a href="#ls" class="headerlink" title="ls"></a><code>ls</code></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><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">ls</span></span><br><span class="line"><span class="built_in">ls</span> -l</span><br><span class="line"><span class="built_in">ls</span> -la</span><br><span class="line"><span class="built_in">ls</span> -lh</span><br></pre></td></tr></table></figure><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"><a href="#cd-和-pwd" class="headerlink" title="cd 和 pwd"></a><code>cd</code> 和 <code>pwd</code></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"><span class="built_in">pwd</span></span><br><span class="line"><span class="built_in">cd</span> /var/www</span><br><span class="line"><span class="built_in">cd</span> ~</span><br><span class="line"><span class="built_in">cd</span> -</span><br></pre></td></tr></table></figure><p><code>cd -</code> 可以回到上一个目录，挺常用。</p><h3 id="cp"><a href="#cp" class="headerlink" title="cp"></a><code>cp</code></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"><span class="built_in">cp</span> a.txt b.txt</span><br><span class="line"><span class="built_in">cp</span> -r src/ backup/</span><br><span class="line"><span class="built_in">cp</span> -a src/ backup/</span><br></pre></td></tr></table></figure><p><code>-a</code> 会尽量保留权限、时间等信息，备份目录时比 <code>-r</code> 更稳一点。</p><h3 id="mv"><a href="#mv" class="headerlink" title="mv"></a><code>mv</code></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"><span class="built_in">mv</span> old.txt new.txt</span><br><span class="line"><span class="built_in">mv</span> file.txt /tmp/</span><br></pre></td></tr></table></figure><p>既能移动，也能改名。</p><h3 id="rm"><a href="#rm" class="headerlink" title="rm"></a><code>rm</code></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"><span class="built_in">rm</span> file.txt</span><br><span class="line"><span class="built_in">rm</span> -r folder/</span><br><span class="line"><span class="built_in">rm</span> -rf folder/</span><br></pre></td></tr></table></figure><p><code>rm -rf</code> 别手滑。尤其是带变量的时候，先 <code>echo</code> 一下路径，不然删错真没得后悔。</p><h3 id="mkdir"><a href="#mkdir" class="headerlink" title="mkdir"></a><code>mkdir</code></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"><span class="built_in">mkdir</span> logs</span><br><span class="line"><span class="built_in">mkdir</span> -p app/data/cache</span><br></pre></td></tr></table></figure><p><code>-p</code> 会自动创建中间目录。</p><h2 id="查看文件"><a href="#查看文件" class="headerlink" title="查看文件"></a>查看文件</h2><h3 id="cat"><a href="#cat" class="headerlink" title="cat"></a><code>cat</code></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"><span class="built_in">cat</span> file.txt</span><br></pre></td></tr></table></figure><p>小文件直接看。大文件别用它硬刷屏。</p><h3 id="less"><a href="#less" class="headerlink" title="less"></a><code>less</code></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">less app.log</span><br></pre></td></tr></table></figure><p>常用操作：</p><ul><li><code>/关键词</code>：搜索</li><li><code>n</code>：下一个结果</li><li><code>q</code>：退出</li></ul><h3 id="head-和-tail"><a href="#head-和-tail" class="headerlink" title="head 和 tail"></a><code>head</code> 和 <code>tail</code></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"><span class="built_in">head</span> -n 20 app.log</span><br><span class="line"><span class="built_in">tail</span> -n 50 app.log</span><br><span class="line"><span class="built_in">tail</span> -f app.log</span><br></pre></td></tr></table></figure><p>看日志一般用 <code>tail -f</code>。</p><h3 id="nl"><a href="#nl" class="headerlink" title="nl"></a><code>nl</code></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"><span class="built_in">nl</span> file.txt</span><br></pre></td></tr></table></figure><p>带行号显示文件。排查配置时有用。</p><h2 id="文本处理"><a href="#文本处理" class="headerlink" title="文本处理"></a>文本处理</h2><h3 id="grep"><a href="#grep" class="headerlink" title="grep"></a><code>grep</code></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">grep <span class="string">&quot;ERROR&quot;</span> app.log</span><br><span class="line">grep -n <span class="string">&quot;ERROR&quot;</span> app.log</span><br><span class="line">grep -R <span class="string">&quot;listen&quot;</span> /etc/nginx</span><br><span class="line">grep -i <span class="string">&quot;error&quot;</span> app.log</span><br></pre></td></tr></table></figure><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><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">rg <span class="string">&quot;ERROR&quot;</span></span><br><span class="line">rg <span class="string">&quot;listen&quot;</span> /etc/nginx</span><br></pre></td></tr></table></figure><h3 id="sed"><a href="#sed" class="headerlink" title="sed"></a><code>sed</code></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">sed -n <span class="string">&#x27;1,20p&#x27;</span> file.txt</span><br><span class="line">sed <span class="string">&#x27;s/old/new/g&#x27;</span> file.txt</span><br></pre></td></tr></table></figure><p>常用来替换文本或者只看某几行。</p><h3 id="awk"><a href="#awk" class="headerlink" title="awk"></a><code>awk</code></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">awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span> access.log</span><br><span class="line">awk <span class="string">&#x27;&#123;print $1, $9&#125;&#x27;</span> access.log</span><br></pre></td></tr></table></figure><p>按列处理文本。日志分析经常用。</p><h3 id="cut"><a href="#cut" class="headerlink" title="cut"></a><code>cut</code></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"><span class="built_in">cut</span> -d<span class="string">&#x27;:&#x27;</span> -f1 /etc/passwd</span><br><span class="line"><span class="built_in">cut</span> -d<span class="string">&#x27;,&#x27;</span> -f1,3 data.csv</span><br></pre></td></tr></table></figure><p>简单分列就用它，不用上来就写一堆脚本。</p><h3 id="sort-和-uniq"><a href="#sort-和-uniq" class="headerlink" title="sort 和 uniq"></a><code>sort</code> 和 <code>uniq</code></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"><span class="built_in">sort</span> file.txt</span><br><span class="line"><span class="built_in">sort</span> -n numbers.txt</span><br><span class="line"><span class="built_in">sort</span> file.txt | <span class="built_in">uniq</span></span><br><span class="line"><span class="built_in">sort</span> file.txt | <span class="built_in">uniq</span> -c</span><br></pre></td></tr></table></figure><p>统计重复项时很顺手。</p><h3 id="wc"><a href="#wc" class="headerlink" title="wc"></a><code>wc</code></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"><span class="built_in">wc</span> -l file.txt</span><br><span class="line"><span class="built_in">wc</span> -c file.txt</span><br></pre></td></tr></table></figure><p>数行数、字节数。</p><h2 id="查找文件"><a href="#查找文件" class="headerlink" title="查找文件"></a>查找文件</h2><h3 id="find"><a href="#find" class="headerlink" title="find"></a><code>find</code></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">find . -name <span class="string">&quot;*.log&quot;</span></span><br><span class="line">find /var/log -<span class="built_in">type</span> f -mtime -7</span><br><span class="line">find . -<span class="built_in">type</span> f -size +100M</span><br></pre></td></tr></table></figure><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"><a href="#which" class="headerlink" title="which"></a><code>which</code></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"><span class="built_in">which</span> nginx</span><br><span class="line"><span class="built_in">which</span> python</span><br></pre></td></tr></table></figure><p>看命令到底从哪来的。</p><h3 id="locate"><a href="#locate" class="headerlink" title="locate"></a><code>locate</code></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">locate nginx.conf</span><br></pre></td></tr></table></figure><p>快，但是依赖索引。刚创建的文件可能搜不到。</p><h2 id="权限和用户"><a href="#权限和用户" class="headerlink" title="权限和用户"></a>权限和用户</h2><h3 id="chmod"><a href="#chmod" class="headerlink" title="chmod"></a><code>chmod</code></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"><span class="built_in">chmod</span> 644 file.txt</span><br><span class="line"><span class="built_in">chmod</span> 755 script.sh</span><br><span class="line"><span class="built_in">chmod</span> +x script.sh</span><br></pre></td></tr></table></figure><p>常见权限：</p><ul><li><code>644</code>：普通文件</li><li><code>755</code>：可执行脚本或目录</li><li><code>600</code>：私钥这类敏感文件</li></ul><h3 id="chown"><a href="#chown" class="headerlink" title="chown"></a><code>chown</code></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"><span class="built_in">sudo</span> <span class="built_in">chown</span> user:group file.txt</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R www-data:www-data /var/www/app</span><br></pre></td></tr></table></figure><p>网站目录权限不对时经常要看这个。</p><h3 id="用户相关"><a href="#用户相关" class="headerlink" title="用户相关"></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><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">whoami</span></span><br><span class="line"><span class="built_in">id</span></span><br><span class="line">passwd</span><br><span class="line"><span class="built_in">sudo</span> useradd name</span><br><span class="line"><span class="built_in">sudo</span> usermod -aG <span class="built_in">sudo</span> name</span><br></pre></td></tr></table></figure><h2 id="进程和服务"><a href="#进程和服务" class="headerlink" title="进程和服务"></a>进程和服务</h2><h3 id="看进程"><a href="#看进程" class="headerlink" title="看进程"></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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ps aux</span><br><span class="line">ps aux | grep nginx</span><br><span class="line">top</span><br><span class="line">htop</span><br></pre></td></tr></table></figure><p>有 <code>htop</code> 就用 <code>htop</code>，看着舒服点。</p><h3 id="杀进程"><a href="#杀进程" class="headerlink" title="杀进程"></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"><span class="built_in">kill</span> 1234</span><br><span class="line"><span class="built_in">kill</span> -9 1234</span><br><span class="line">pkill -f nginx</span><br></pre></td></tr></table></figure><p><code>kill -9</code> 是强杀，不是万能修复按钮。先正常 <code>kill</code>，不行再用。</p><h3 id="systemd-服务"><a href="#systemd-服务" class="headerlink" title="systemd 服务"></a>systemd 服务</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"><span class="built_in">sudo</span> systemctl status nginx</span><br><span class="line"><span class="built_in">sudo</span> systemctl start nginx</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart nginx</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> nginx</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">journalctl -u nginx -f</span><br><span class="line">journalctl -u nginx --since <span class="string">&quot;1 hour ago&quot;</span></span><br></pre></td></tr></table></figure><h2 id="网络相关"><a href="#网络相关" class="headerlink" title="网络相关"></a>网络相关</h2><h3 id="IP-和端口"><a href="#IP-和端口" class="headerlink" title="IP 和端口"></a>IP 和端口</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">ip addr</span><br><span class="line">ip route</span><br><span class="line">ss -tuln</span><br><span class="line">ss -tulnp</span><br></pre></td></tr></table></figure><p><code>ss -tulnp</code> 能看哪个进程占了哪个端口。</p><h3 id="连通性"><a href="#连通性" class="headerlink" title="连通性"></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">ping 1.1.1.1</span><br><span class="line">curl -I https://example.com</span><br><span class="line">curl http://127.0.0.1:3000</span><br></pre></td></tr></table></figure><p>测 HTTP 服务别只会 ping。ping 通不代表网站活着。</p><h3 id="SSH"><a href="#SSH" class="headerlink" title="SSH"></a>SSH</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">ssh root@1.2.3.4</span><br><span class="line">ssh -p 2222 user@1.2.3.4</span><br><span class="line">scp file.txt user@1.2.3.4:/tmp/</span><br></pre></td></tr></table></figure><h3 id="rsync"><a href="#rsync" class="headerlink" title="rsync"></a>rsync</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">rsync -avz ./dist/ user@server:/var/www/app/</span><br><span class="line">rsync -avz --delete ./dist/ user@server:/var/www/app/</span><br></pre></td></tr></table></figure><p><code>--delete</code> 会删除目标端多出来的文件，用之前先想清楚。</p><h2 id="软件包管理"><a href="#软件包管理" class="headerlink" title="软件包管理"></a>软件包管理</h2><p>Debian &#x2F; Ubuntu：</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">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install nginx</span><br><span class="line"><span class="built_in">sudo</span> apt upgrade</span><br></pre></td></tr></table></figure><p>CentOS &#x2F; RHEL：</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">sudo</span> yum install nginx</span><br><span class="line"><span class="built_in">sudo</span> dnf install nginx</span><br></pre></td></tr></table></figure><p>Arch：</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">sudo</span> pacman -S nginx</span><br></pre></td></tr></table></figure><p>openSUSE：</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">sudo</span> zypper install nginx</span><br></pre></td></tr></table></figure><p>不同发行版命令不一样。别复制错系统了。</p><h2 id="磁盘和挂载"><a href="#磁盘和挂载" class="headerlink" title="磁盘和挂载"></a>磁盘和挂载</h2><h3 id="看磁盘"><a href="#看磁盘" class="headerlink" title="看磁盘"></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"><span class="built_in">df</span> -h</span><br><span class="line"><span class="built_in">du</span> -sh *</span><br><span class="line"><span class="built_in">du</span> -sh /var/log</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">du</span> -h --max-depth=1 / | <span class="built_in">sort</span> -h</span><br></pre></td></tr></table></figure><h3 id="块设备"><a href="#块设备" class="headerlink" title="块设备"></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">lsblk</span><br><span class="line">blkid</span><br><span class="line"><span class="built_in">sudo</span> fdisk -l</span><br></pre></td></tr></table></figure><h3 id="挂载"><a href="#挂载" class="headerlink" title="挂载"></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"><span class="built_in">sudo</span> mount /dev/sdb1 /mnt</span><br><span class="line"><span class="built_in">sudo</span> umount /mnt</span><br></pre></td></tr></table></figure><h2 id="压缩和解压"><a href="#压缩和解压" class="headerlink" title="压缩和解压"></a>压缩和解压</h2><h3 id="tar"><a href="#tar" class="headerlink" title="tar"></a>tar</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">tar -czvf archive.tar.gz folder/</span><br><span class="line">tar -xzvf archive.tar.gz</span><br><span class="line">tar -tzf archive.tar.gz</span><br></pre></td></tr></table></figure><h3 id="zip"><a href="#zip" class="headerlink" title="zip"></a>zip</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">zip -r archive.zip folder/</span><br><span class="line">unzip archive.zip</span><br></pre></td></tr></table></figure><h3 id="gzip"><a href="#gzip" class="headerlink" title="gzip"></a>gzip</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">gzip file.txt</span><br><span class="line">gunzip file.txt.gz</span><br></pre></td></tr></table></figure><h2 id="日志和排错"><a href="#日志和排错" class="headerlink" title="日志和排错"></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></pre></td><td class="code"><pre><span class="line">dmesg</span><br><span class="line">journalctl -xe</span><br><span class="line">journalctl -u service-name -f</span><br><span class="line"><span class="built_in">tail</span> -f /var/log/syslog</span><br><span class="line"><span class="built_in">tail</span> -f /var/log/nginx/error.log</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">sudo</span> lsof -i :80</span><br><span class="line"><span class="built_in">sudo</span> ss -tulnp | grep :80</span><br></pre></td></tr></table></figure><p>配置改完不生效，先看服务有没有重启，再看日志。很多问题不是配置没写，是服务根本没加载。</p><h2 id="Shell-小东西"><a href="#Shell-小东西" class="headerlink" title="Shell 小东西"></a>Shell 小东西</h2><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">env</span></span><br><span class="line"><span class="built_in">printenv</span></span><br><span class="line"><span class="built_in">export</span> NODE_ENV=production</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$PATH</span></span><br></pre></td></tr></table></figure><h3 id="alias"><a href="#alias" class="headerlink" title="alias"></a>alias</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"><span class="built_in">alias</span> ll=<span class="string">&#x27;ls -lah&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> gs=<span class="string">&#x27;git status&#x27;</span></span><br></pre></td></tr></table></figure><p>写进 <code>~/.bashrc</code> 或 <code>~/.zshrc</code> 才会长期生效。</p><h3 id="执行脚本"><a href="#执行脚本" class="headerlink" title="执行脚本"></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"><span class="built_in">chmod</span> +x script.sh</span><br><span class="line">./script.sh</span><br></pre></td></tr></table></figure><h3 id="定时任务"><a href="#定时任务" class="headerlink" title="定时任务"></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">crontab -e</span><br><span class="line">crontab -l</span><br></pre></td></tr></table></figure><h2 id="几个常用一行命令"><a href="#几个常用一行命令" class="headerlink" title="几个常用一行命令"></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">find / -<span class="built_in">type</span> f -size +500M 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 -R --line-number <span class="string">&quot;ERROR&quot;</span> /var/log 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"><span class="built_in">du</span> -h --max-depth=1 . | <span class="built_in">sort</span> -h</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">rsync -avz --delete ./dist/ user@server:/var/www/site/</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">journalctl -u nginx --since <span class="string">&quot;2 hours ago&quot;</span> -f</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">sudo</span> ss -tulnp | grep :3000</span><br></pre></td></tr></table></figure><p>批量删 <code>.tmp</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">find . -<span class="built_in">type</span> f -name <span class="string">&quot;*.tmp&quot;</span> -delete</span><br></pre></td></tr></table></figure><p>这个命令执行前最好先把 <code>-delete</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">find . -<span class="built_in">type</span> f -name <span class="string">&quot;*.tmp&quot;</span></span><br></pre></td></tr></table></figure><p>别上来就删，删错挺麻烦。</p>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E7%B3%BB%E7%BB%9F%E8%BF%90%E7%BB%B4/">系统运维</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Linux/">Linux</category>
      
      <category domain="https://blog.kauriss.site/tags/%E8%84%9A%E6%9C%AC/">脚本</category>
      
      <category domain="https://blog.kauriss.site/tags/%E5%91%BD%E4%BB%A4/">命令</category>
      
      <category domain="https://blog.kauriss.site/tags/%E9%80%9F%E6%9F%A5%E8%A1%A8/">速查表</category>
      
      
      <comments>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/#disqus_thread</comments>
      
    </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"></p><h2 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</h2><ul><li>家里跑了一个网站，想临时给外网访问。</li><li>NAS、面板、测试服务想绑个域名。</li><li>不想在路由器上开一堆端口。</li><li>没有公网 IP，但又想有 HTTPS。</li></ul><p>别拿它当万能反代。要是你跑的是高并发、大流量服务，还是老老实实上服务器。Tunnel 更适合个人服务、测试环境和低频访问。</p><h2 id="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</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><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 -I http://127.0.0.1:80</span><br></pre></td></tr></table></figure><p>能看到 <code>200</code>、<code>301</code>、<code>302</code> 这类正常响应就行。要是本地都打不开，先别折腾 Tunnel，不然排错会很抽象。</p><h2 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></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">https://app.example.com</span><br></pre></td></tr></table></figure><p>请求会从 Cloudflare 进入，再通过本机主动建立的 Tunnel 转到内网服务。你不用在路由器上做端口映射，也不用要求家里有公网 IP。</p><h2 id="安装-cloudflared"><a href="#安装-cloudflared" class="headerlink" title="安装 cloudflared"></a>安装 cloudflared</h2><p><code>cloudflared</code> 是 Cloudflare Tunnel 的客户端。</p><p>macOS 可以直接用 Homebrew：</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">brew install cloudflared</span><br></pre></td></tr></table></figure><p>Linux 下载二进制文件就行：</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">curl -L <span class="string">&#x27;https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64&#x27;</span> -o ./cloudflared</span><br><span class="line"><span class="built_in">chmod</span> +x ./cloudflared</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">mv</span> ./cloudflared /usr/local/bin/cloudflared</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">cloudflared --version</span><br></pre></td></tr></table></figure><p>有版本号就行。</p><h2 id="登录-Cloudflare"><a href="#登录-Cloudflare" class="headerlink" title="登录 Cloudflare"></a>登录 Cloudflare</h2><p>让本机的 <code>cloudflared</code> 拿到 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">cloudflared tunnel login</span><br></pre></td></tr></table></figure><p>命令会给一个链接。复制到浏览器打开，登录 Cloudflare，选择你要用的域名，然后授权。</p><p>授权成功后，本机会生成一个证书文件。这个文件别乱删，后面创建隧道要用。</p><h2 id="创建隧道"><a href="#创建隧道" class="headerlink" title="创建隧道"></a>创建隧道</h2><p>给隧道起个名字，比如 <code>home-web</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">cloudflared tunnel create home-web</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">Created tunnel home-web with id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span><br><span class="line">Tunnel credentials written to /root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json</span><br></pre></td></tr></table></figure><p>记住这两个：</p><ul><li>隧道 ID</li><li>credentials 文件路径</li></ul><p>后面配置文件要填。</p><h2 id="写配置文件"><a href="#写配置文件" class="headerlink" title="写配置文件"></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"><span class="built_in">sudo</span> <span class="built_in">mkdir</span> -p /etc/cloudflared</span><br><span class="line"><span class="built_in">sudo</span> nano /etc/cloudflared/config.yml</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><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"><span class="attr">tunnel:</span> <span class="string">xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span></span><br><span class="line"><span class="attr">credentials-file:</span> <span class="string">/root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json</span></span><br><span class="line"></span><br><span class="line"><span class="attr">ingress:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">hostname:</span> <span class="string">app.example.com</span></span><br><span class="line">    <span class="attr">service:</span> <span class="string">http://127.0.0.1:80</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">hostname:</span> <span class="string">admin.example.com</span></span><br><span class="line">    <span class="attr">service:</span> <span class="string">http://127.0.0.1:8080</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">http_status:404</span></span><br></pre></td></tr></table></figure><p>这里别照抄域名。换成你自己的。</p><p><code>ingress</code> 是按顺序匹配的，最后那个 <code>404</code> 建议留着。不然没匹配到的请求怎么处理会比较乱。</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">cloudflared tunnel ingress validate</span><br></pre></td></tr></table></figure><p>能过再继续。</p><h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><p>把域名指到这个 Tunnel：</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">cloudflared tunnel route dns home-web app.example.com</span><br><span class="line">cloudflared tunnel route dns home-web admin.example.com</span><br></pre></td></tr></table></figure><p>如果提示 DNS 记录冲突，去 Cloudflare 面板把旧的 <code>A</code>、<code>AAAA</code>、<code>CNAME</code> 记录删掉，再执行一次。</p><h2 id="先手动跑一下"><a href="#先手动跑一下" class="headerlink" title="先手动跑一下"></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">cloudflared tunnel run home-web</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">https://app.example.com</span><br></pre></td></tr></table></figure><p>能打开就说明主流程没问题。</p><p>如果打不开，优先看这几个点：</p><ul><li>本地服务是不是还活着。</li><li><code>hostname</code> 有没有写错。</li><li>Cloudflare DNS 有没有指到 Tunnel。</li><li>服务器时间是不是离谱。</li><li>配置文件路径是不是对的。</li></ul><h2 id="设置开机启动"><a href="#设置开机启动" class="headerlink" title="设置开机启动"></a>设置开机启动</h2><p>确认手动运行没问题后，再装成 systemd 服务：</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">sudo</span> cloudflared service install</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> --now cloudflared</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">sudo</span> systemctl status cloudflared</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">journalctl -u cloudflared -f</span><br></pre></td></tr></table></figure><p>日志里能看到连接成功，域名也能访问，就差不多了。</p><h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</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="一点安全建议"><a href="#一点安全建议" class="headerlink" title="一点安全建议"></a>一点安全建议</h2><p>Tunnel 不等于你可以什么都裸奔。</p><p>如果是管理面板，最好再加一层登录，或者用 Cloudflare Access 限制访问。不然只是端口没暴露，服务本身该被扫还是可能被扫。</p><p>简单说：公网能访问的东西，就按公网服务来处理。别侥幸。</p>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E7%BD%91%E7%BB%9C/">网络</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Cloudflare/">Cloudflare</category>
      
      <category domain="https://blog.kauriss.site/tags/Tunnel/">Tunnel</category>
      
      <category domain="https://blog.kauriss.site/tags/Linux/">Linux</category>
      
      <category domain="https://blog.kauriss.site/tags/Network/">Network</category>
      
      
      <comments>https://blog.kauriss.site/2025/11/21/Cloudflare-Tunnel-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/#disqus_thread</comments>
      
    </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"></p><h2 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</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="两种方案"><a href="#两种方案" class="headerlink" title="两种方案"></a>两种方案</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="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</h2><p>你需要：</p><ol><li>一台有公网 IP 的 VPS，Debian&#x2F;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="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h2><p>做完以后，朋友可以通过 VPS 入口连接你的 Minecraft 服务端。服主电脑和 VPS 之间用 WireGuard 组成虚拟局域网，VPS 负责把外部玩家的连接转到家里的服务器。</p><p>如果用方案 B，玩家也能加入同一个 WireGuard 网络，体验更像局域网联机。</p><h2 id="VPS-安装-WireGuard"><a href="#VPS-安装-WireGuard" class="headerlink" title="VPS 安装 WireGuard"></a>VPS 安装 WireGuard</h2><p>在 VPS 上执行：</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">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install wireguard -y</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"><span class="built_in">sudo</span> <span class="built_in">mkdir</span> -p /etc/wireguard</span><br><span class="line"><span class="built_in">cd</span> /etc/wireguard</span><br><span class="line">wg genkey | <span class="built_in">sudo</span> <span class="built_in">tee</span> privatekey | wg pubkey | <span class="built_in">sudo</span> <span class="built_in">tee</span> publickey</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">sudo</span> <span class="built_in">cat</span> /etc/wireguard/publickey</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><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> sysctl -w net.ipv4.ip_forward=1</span><br><span class="line"><span class="built_in">sudo</span> sed -i <span class="string">&#x27;/net.ipv4.ip_forward=1/s/^#//&#x27;</span> /etc/sysctl.conf</span><br><span class="line"><span class="built_in">sudo</span> sysctl -p</span><br></pre></td></tr></table></figure><h2 id="方案-A：公网转发"><a href="#方案-A：公网转发" class="headerlink" title="方案 A：公网转发"></a>方案 A：公网转发</h2><p>这个方案下，朋友不用装 WireGuard。他们直接连 <code>VPS公网IP:25565</code>。</p><h3 id="1-服主电脑生成密钥"><a href="#1-服主电脑生成密钥" class="headerlink" title="1. 服主电脑生成密钥"></a>1. 服主电脑生成密钥</h3><p>打开 WireGuard 客户端，添加一个空隧道。客户端会自动生成私钥和公钥。</p><p>你只需要复制服主电脑的公钥，等会填到 VPS 配置里。</p><h3 id="2-VPS-写配置"><a href="#2-VPS-写配置" class="headerlink" title="2. VPS 写配置"></a>2. VPS 写配置</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"><span class="built_in">sudo</span> nano /etc/wireguard/wg0.conf</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight ini"><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"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">Address</span> = <span class="number">10.0</span>.<span class="number">0.1</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">ListenPort</span> = <span class="number">51820</span></span><br><span class="line"><span class="attr">PrivateKey</span> = &lt;VPS私钥&gt;</span><br><span class="line"></span><br><span class="line"><span class="attr">PostUp</span> = iptables -A FORWARD -i wg0 -j ACCEPT<span class="comment">; iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2</span></span><br><span class="line"><span class="attr">PostDown</span> = iptables -D FORWARD -i wg0 -j ACCEPT<span class="comment">; iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.0.0.2</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;服主电脑公钥&gt;</span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.2</span>/<span class="number">32</span></span><br></pre></td></tr></table></figure><p><code>10.0.0.2</code> 就是服主电脑在 WireGuard 里的虚拟 IP。</p><h3 id="3-服主电脑写配置"><a href="#3-服主电脑写配置" class="headerlink" title="3. 服主电脑写配置"></a>3. 服主电脑写配置</h3><p>在 WireGuard 客户端里填：</p><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">PrivateKey</span> = &lt;服主电脑私钥&gt;</span><br><span class="line"><span class="attr">Address</span> = <span class="number">10.0</span>.<span class="number">0.2</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">DNS</span> = <span class="number">1.1</span>.<span class="number">1.1</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;VPS公钥&gt;</span><br><span class="line"><span class="attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="number">51820</span></span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.0</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">PersistentKeepalive</span> = <span class="number">25</span></span><br></pre></td></tr></table></figure><p>这里的 <code>PrivateKey</code> 一般客户端已经自动填好了，不要手欠复制错。</p><h3 id="4-启动测试"><a href="#4-启动测试" class="headerlink" title="4. 启动测试"></a>4. 启动测试</h3><p>VPS 上启动：</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">sudo</span> wg-quick up wg0</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> wg-quick@wg0</span><br></pre></td></tr></table></figure><p>服主电脑启动 WireGuard。</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">ping 10.0.0.1</span><br></pre></td></tr></table></figure><p>能 ping 通，说明隧道通了。</p><p>接着启动 Minecraft 服务端。朋友连接：</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">&lt;VPS公网IP&gt;:25565</span><br></pre></td></tr></table></figure><p>如果连不上，先看 VPS 的 <code>25565</code> 有没有放行，再看本地防火墙有没有挡 Java。</p><h2 id="方案-B：全员组网"><a href="#方案-B：全员组网" class="headerlink" title="方案 B：全员组网"></a>方案 B：全员组网</h2><p>这个方案更像真正的虚拟局域网。每个人都有一个 <code>10.0.0.x</code> 地址。</p><p>适合固定几个人长期玩。缺点也很明显：每个人都要装客户端，配置发错一个就会连不上。</p><h3 id="1-收集每个人的公钥"><a href="#1-收集每个人的公钥" class="headerlink" title="1. 收集每个人的公钥"></a>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-配置"><a href="#2-VPS-配置" class="headerlink" title="2. VPS 配置"></a>2. VPS 配置</h3><figure class="highlight ini"><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="section">[Interface]</span></span><br><span class="line"><span class="attr">Address</span> = <span class="number">10.0</span>.<span class="number">0.1</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">ListenPort</span> = <span class="number">51820</span></span><br><span class="line"><span class="attr">PrivateKey</span> = &lt;VPS私钥&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;服主公钥&gt;</span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.2</span>/<span class="number">32</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;玩家A公钥&gt;</span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.3</span>/<span class="number">32</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;玩家B公钥&gt;</span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.4</span>/<span class="number">32</span></span><br></pre></td></tr></table></figure><p>每加一个人，就加一个 <code>[Peer]</code>。</p><h3 id="3-玩家客户端配置"><a href="#3-玩家客户端配置" class="headerlink" title="3. 玩家客户端配置"></a>3. 玩家客户端配置</h3><p>每个人的配置长得差不多，只是私钥和地址不同。</p><p>服主：</p><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">PrivateKey</span> = &lt;服主自己的私钥&gt;</span><br><span class="line"><span class="attr">Address</span> = <span class="number">10.0</span>.<span class="number">0.2</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">DNS</span> = <span class="number">1.1</span>.<span class="number">1.1</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;VPS公钥&gt;</span><br><span class="line"><span class="attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="number">51820</span></span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.0</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">PersistentKeepalive</span> = <span class="number">25</span></span><br></pre></td></tr></table></figure><p>玩家 A：</p><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">PrivateKey</span> = &lt;玩家A自己的私钥&gt;</span><br><span class="line"><span class="attr">Address</span> = <span class="number">10.0</span>.<span class="number">0.3</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">DNS</span> = <span class="number">1.1</span>.<span class="number">1.1</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;VPS公钥&gt;</span><br><span class="line"><span class="attr">Endpoint</span> = &lt;VPS公网IP&gt;:<span class="number">51820</span></span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">10.0</span>.<span class="number">0.0</span>/<span class="number">24</span></span><br><span class="line"><span class="attr">PersistentKeepalive</span> = <span class="number">25</span></span><br></pre></td></tr></table></figure><p>私钥必须是每个人自己的。别把同一个配置群发，真不行。</p><h3 id="4-连接游戏"><a href="#4-连接游戏" class="headerlink" title="4. 连接游戏"></a>4. 连接游戏</h3><p>VPS 启动：</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">sudo</span> wg-quick up wg0</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> wg-quick@wg0</span><br></pre></td></tr></table></figure><p>所有人启动 WireGuard 后，互相 ping 一下：</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">ping 10.0.0.1</span><br><span class="line">ping 10.0.0.2</span><br></pre></td></tr></table></figure><p>能 ping 通，玩家就直接连服主虚拟 IP：</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">10.0.0.2:25565</span><br></pre></td></tr></table></figure><h2 id="排错"><a href="#排错" class="headerlink" title="排错"></a>排错</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><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">sudo</span> wg</span><br></pre></td></tr></table></figure><p>有 <code>latest handshake</code> 才算连上。没有握手就别看 Minecraft，问题还在网络层。</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>我个人建议：</p><ul><li>临时开服：方案 A。</li><li>固定朋友长期玩：方案 B。</li><li>不想给每个人讲配置：方案 A。</li><li>想延迟低一点、也更私密：方案 B。</li></ul><p>先跑通，再优化。网络这东西一上来就追求完美，最后大概率卡在一个很蠢的配置上。</p>]]></content:encoded>
      
      
      <category domain="https://blog.kauriss.site/categories/%E7%BD%91%E7%BB%9C/">网络</category>
      
      
      <category domain="https://blog.kauriss.site/tags/Tunnel/">Tunnel</category>
      
      <category domain="https://blog.kauriss.site/tags/Linux/">Linux</category>
      
      <category domain="https://blog.kauriss.site/tags/WireGuard/">WireGuard</category>
      
      <category domain="https://blog.kauriss.site/tags/Minecraft/">Minecraft</category>
      
      <category domain="https://blog.kauriss.site/tags/%E8%81%94%E6%9C%BA/">联机</category>
      
      
      <comments>https://blog.kauriss.site/2025/11/21/WireGuard-Minecraft-%E8%81%94%E6%9C%BA%E6%95%99%E7%A8%8B/#disqus_thread</comments>
      
    </item>
    
  </channel>
</rss>
