<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Theme Redefine</title>
  
  <subtitle>Redefine Theme Demo Site</subtitle>
  <link href="http://redefine.ohevan.com/atom.xml" rel="self"/>
  
  <link href="http://redefine.ohevan.com/"/>
  <updated>2026-09-30T08:41:49.220Z</updated>
  <id>http://redefine.ohevan.com/</id>
  
  <author>
    <name>EvanNotFound</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>我和校园网 146 错误斗了两个月</title>
    <link href="http://redefine.ohevan.com/2026/09/30/campus-146-story/"/>
    <id>http://redefine.ohevan.com/2026/09/30/campus-146-story/</id>
    <published>2026-09-30T09:00:00.000Z</published>
    <updated>2026-09-30T08:41:49.220Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一切从频繁掉线开始"><a href="#一切从频繁掉线开始" class="headerlink" title="一切从频繁掉线开始"></a>一切从频繁掉线开始</h2><p>九月初，宿舍的网络开始毫无规律地掉线。</p><p>正打着游戏、正看着视频，网络突然就断了。打开认证页面重新登录，页面上跳出来一个数字：<strong>146</strong>。</p><p>没有解释，没有说明。能查到的只有「请稍后再试」。</p><p>更要命的是，这不是偶发——最严重的时候，一天能被踢下来 <strong>5 次以上</strong>。时间也不固定，有时是深夜，有时是下午，完全摸不着规律。</p><p>我决定搞清楚它到底是什么。</p><span id="more"></span><h2 id="第一个误区：以为是「设备太多」"><a href="#第一个误区：以为是「设备太多」" class="headerlink" title="第一个误区：以为是「设备太多」"></a>第一个误区：以为是「设备太多」</h2><p>最初的猜测很朴素：是不是我连的设备太多了？</p><p>手机、电脑、平板都走同一个账号，直觉上像是被「多端登录」挤下来的。于是开始减设备、关后台、甚至怀疑是某个硬件坏了。</p><p>没用。该掉还是掉。</p><p>后来我翻了大量校园网认证系统（dr.com &#x2F; eportal）的资料才意识到，<strong>错误码 146 在任何公开文档里都查不到定义</strong>。厂商的错误码表里有电信侧的 <code>221xxxxx</code>、移动侧的 <code>RDxxx</code>，唯独没有 146。</p><p>这意味着靠猜是没用的，只能靠自己取证。</p><h2 id="开始搭取证系统"><a href="#开始搭取证系统" class="headerlink" title="开始搭取证系统"></a>开始搭取证系统</h2><p>既然没有现成答案，那就把每次踢线的现场都记录下来。</p><p>我在宿舍的迷你主机（GK41）上做了这么几件事：</p><p><strong>1. 踢线抓拍（kickcap）</strong></p><p>写了一套监控，一旦检测到 146，就立刻把当时的网络状态、连接表、日志全部打包存档。每一次踢线都留下一对证据：检测瞬间 + 重新登录的完整回合。</p><p><strong>2. 统一日志归集</strong></p><p>把所有网络日志集中写到 <code>/var/log/146/</code>，按时间切片，方便事后回溯。</p><p><strong>3. 长期频率统计</strong></p><p>用 journald 里的 kickcap 记录做配对去重，得出踢线的<strong>真实频率</strong>，而不是凭感觉。</p><p>这一步最关键的收获是：<strong>人的感觉会骗人，但数据不会。</strong> 攒了几十份快照之后，规律才慢慢浮现。</p><h2 id="推翻自己的结论"><a href="#推翻自己的结论" class="headerlink" title="推翻自己的结论"></a>推翻自己的结论</h2><p>排查过程中，我不止一次得出错误结论，然后被新的数据推翻。</p><p>有一段时间统计下来「54 小时零踢线」，我以为问题解决了，在报告里写了进去。结果<strong>报告定稿 56 分钟后，又被踢了</strong>。</p><p>类似的事发生了好几次。我逐渐学会了一件事：</p><blockquote><p>样本太少时，任何「规律」都可能只是巧合。两次踢线都落在 <code>:16</code> 分，不代表有什么周期机制——那可能纯粹是偶然。</p></blockquote><h2 id="146-到底是什么"><a href="#146-到底是什么" class="headerlink" title="146 到底是什么"></a>146 到底是什么</h2><p>综合几十份取证数据，我对 146 的理解是这样的：</p><p>它更像是<strong>会话被服务端主动拆除后，重新认证时给出的一个阻塞应答</strong>，而不是某个具体的「错误」。</p><p>换句话说，<strong>146 是「结果」，不是「原因」。</strong> 真正的问题是：服务端为什么要拆掉我的会话？</p><p>结合公开的防共享检测资料，服务端会基于一段时间内的<strong>流量画像</strong>来估算 NAT 后面有多少台设备，用的指标包括：</p><ul><li>DNS 查询数量、TCP SYN 新建连接的速率</li><li>同一出口 IP 下的 TTL、IPID、TCP 指纹是否「跳变」</li><li>明文 HTTP 里的 User-Agent 是否出现多种系统</li><li>TCP timestamp 的时钟偏移能否聚类出多台主机</li></ul><p>当这些特征让它判断「这一个账号后面藏着多台设备」时，就会触发踢线。</p><h2 id="我做的防御"><a href="#我做的防御" class="headerlink" title="我做的防御"></a>我做的防御</h2><p>针对这些检测维度，我一层层地补上了防御：</p><div class="table-scroll"><table><thead><tr><th>检测维度</th><th>应对手段</th></tr></thead><tbody><tr><td>TTL 不统一</td><td>nftables 统一改写为固定值</td></tr><tr><td>User-Agent 暴露多系统</td><td>部署 UA3F 做 UA 终结改写</td></tr><tr><td>明文 DNS 噪声大</td><td>切换到加密 DNS（dnscrypt），大幅降低查询离散度</td></tr><tr><td>踢线后无法恢复</td><td>watchdog 自动检测 + 冷却 + 自动重登</td></tr><tr><td>规则意外丢失</td><td>nft 自愈脚本每 5 分钟检查重建</td></tr></tbody></table></div><p>其中有个意外发现：我之前挂着的几个公共 DNS 兜底上游（<code>114.114.114.114</code>、<code>119.29.29.29</code>）质量极差，**重试率高达 80%~95%**。dnsmasq 的多上游并发重试机制，反而抬高了 DNS 查询离散度和新建速率——这恰好就是 146 的两个风控指标。</p><p>砍掉这些劣质上游后，踢线率明显下降。</p><h2 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h2><p>经过两个月、上百次取证，踢线频率从最严重时的 <strong>5.2 次&#x2F;天</strong>，降到了 **0.9 次&#x2F;天左右，降幅约 82%**。</p><p>更重要的是，剩下的踢线 <strong>100% 由 watchdog 自动恢复</strong>——冷却 5 分钟、重新登录，全程不需要人工干预。很多时候我甚至感觉不到自己被踢过。</p><h2 id="最后的话"><a href="#最后的话" class="headerlink" title="最后的话"></a>最后的话</h2><p>我必须诚实地说：<strong>146 无法被「根治」。</strong></p><p>公开资料里没有任何能彻底绕过校园网共享检测的通用方案。只要还是一个账号带多台设备，「同一出口存在多种系统特征」这个事实就抹不掉。我能做到的上限，是<strong>把触发频率压到足够低，并让每一次踢线都自动愈合</strong>。</p><p>但这个过程本身，比「解决问题」更有价值。</p><p>我学会了用数据而不是直觉下判断，学会了在样本不足时保持怀疑，也亲手搭起了一套从检测、取证到自愈的完整系统。</p><p>那串冷冰冰的 146，最后成了我最好的网络课老师。</p>]]></content>
    
    
    <summary type="html">从一脸懵到搭起一整套取证与自愈系统，记录校园网 146 踢线问题的完整排查过程。</summary>
    
    
    
    <category term="网络" scheme="http://redefine.ohevan.com/categories/%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="校园网" scheme="http://redefine.ohevan.com/tags/%E6%A0%A1%E5%9B%AD%E7%BD%91/"/>
    
    <category term="146" scheme="http://redefine.ohevan.com/tags/146/"/>
    
    <category term="网络" scheme="http://redefine.ohevan.com/tags/%E7%BD%91%E7%BB%9C/"/>
    
    <category term="折腾记录" scheme="http://redefine.ohevan.com/tags/%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/"/>
    
  </entry>
  
</feed>
