<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ImmortalWrt on 猫猫鱼的小窝</title>
    <link>https://csdn.fjh1997.top/tags/immortalwrt/</link>
    <description>Recent content from 猫猫鱼的小窝</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    <managingEditor>xxx@example.com (catcatyu)</managingEditor>
    <webMaster>xxx@example.com (catcatyu)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Sun, 21 Jun 2026 04:45:00 +0800</lastBuildDate>
    
    
    <atom:link href="https://csdn.fjh1997.top/tags/immortalwrt/atom.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>光猫拿到/60但不给二级路由委派IPv6前缀的解决方法</title>
      <link>https://csdn.fjh1997.top/posts/2026062101.html</link>
      <pubDate>Sun, 21 Jun 2026 04:45:00 &#43;0800</pubDate>
      <author>xxx@example.com (catcatyu)</author>
      <guid>https://csdn.fjh1997.top/posts/2026062101.html</guid>
      <description>
        <![CDATA[<h1>光猫拿到/60但不给二级路由委派IPv6前缀的解决方法</h1><p>作者：catcatyu（xxx@example.com）</p>
        
          <h2 id="背景">
<a class="header-anchor" href="#%e8%83%8c%e6%99%af"></a>
背景
</h2><p>家里用的是中国移动宽带，光猫是吉比特 GS3101（中国移动定制），下挂一台 ImmortalWrt 路由器（MT7981 芯片）做二级路由。最开始遇到的问题是：ImmortalWrt 的 <code>wan6</code> 经常拿不到 DHCPv6-PD 前缀，日志里反复出现：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">daemon.warn odhcp6c: Server returned IA_PD status &#39;No Prefix Available&#39;
</span></span><span class="line"><span class="cl">daemon.warn odhcp6c: Server returned IA_PD status &#39;No Binding&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>一开始我以为是 ISP 不下发 PD，所以尝试过 NDP Relay。后面拿到光猫超管和 Telnet 后确认，真实原因不是“中国移动完全不给前缀”，而是：</p>
<p><strong>ISP 已经给光猫下发了 <code>/60</code>，但光猫默认没有把可用前缀正确委派给下挂的 ImmortalWrt。</strong></p>
<p>当前已经跑通的链路是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">ISP -&gt; 光猫 ppp1 获取 2409:8a28:6e2:1c20::/60
</span></span><span class="line"><span class="cl">光猫 br0 自用 2409:8a28:6e2:1c20::/64
</span></span><span class="line"><span class="cl">光猫 dhcp6s -&gt; ImmortalWrt 委派 2409:8a28:6e2:1c28::/61
</span></span><span class="line"><span class="cl">ImmortalWrt br-lan -&gt; LAN 设备下发 2409:8a28:6e2:1c28::/64
</span></span></code></pre></td></tr></table>
</div>
</div><p>国内 IPv6 连通性正常；海外 IPv6 的 TCP/443 仍然不稳定或不可达，这是运营商出口策略问题，不是本地 DHCPv6-PD 配置问题。</p>
<h2 id="当前状态核对">
<a class="header-anchor" href="#%e5%bd%93%e5%89%8d%e7%8a%b6%e6%80%81%e6%a0%b8%e5%af%b9"></a>
当前状态核对
</h2><h3 id="光猫侧">
<a class="header-anchor" href="#%e5%85%89%e7%8c%ab%e4%be%a7"></a>
光猫侧
</h3><p>光猫固件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /etc/fwver.conf
</span></span><span class="line"><span class="cl"><span class="c1"># V1B0.C02.01</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>ISP 给光猫的前缀：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /var/run/ppp1/orgpd6
</span></span><span class="line"><span class="cl"><span class="c1"># 2409:8a28:6e2:1c20::/60</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat /var/run/ppp1/pd6
</span></span><span class="line"><span class="cl"><span class="c1"># 2409:8a28:6e2:1c20::/64</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>orgpd6</code> 是 ISP 原始委派给光猫的 <code>/60</code>；<code>pd6</code> 是光猫自己拿来给 <code>br0</code>/LAN 使用的 <code>/64</code>。</p>
<p>光猫 LAN 地址：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">br0 inet6 addr: 2409:8a28:6e2:1c20:b654:59ff:fe2a:59a8/64
</span></span></code></pre></td></tr></table>
</div>
</div><p>光猫当前 DHCPv6 Server 配置：</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf">option domain-name-servers fe80::1;
interface br0 {
        address-pool pool1 172800 259200;
};
pool pool1 {
        range 2409:8a28:6e2:1c20::1 to 2409:8a28:6e2:1c20::1000;
};
host immortalwrt {
        duid 00:03:00:01:70:2a:d7:60:77:20;
        prefix 2409:8a28:6e2:1c28::/61 172800 259200;
};
</code></pre><p>这组配置是合理的：</p>
<ul>
<li><code>2409:8a28:6e2:1c20::/60</code> 覆盖 <code>1c20</code> 到 <code>1c2f</code> 这 16 个 <code>/64</code>。</li>
<li>光猫自己使用 <code>1c20::/64</code>。</li>
<li>委派给 ImmortalWrt 的 <code>1c28::/61</code> 覆盖 <code>1c28</code> 到 <code>1c2f</code>，没有和光猫自用的 <code>1c20::/64</code> 重叠。</li>
<li>光猫路由表中已有到 ImmortalWrt 的路由：</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">2409:8a28:6e2:1c28::/61 via fe80::722a:d7ff:fe60:7720 dev br0
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="immortalwrt-侧">
<a class="header-anchor" href="#immortalwrt-%e4%be%a7"></a>
ImmortalWrt 侧
</h3><p><code>wan6</code> 当前已拿到 IA_NA 和 IA_PD：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;ipv6-address&#34;</span><span class="err">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;address&#34;</span><span class="p">:</span> <span class="s2">&#34;2409:8a28:6e2:1c20:722a:d7ff:fe60:7720&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;mask&#34;</span><span class="p">:</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span><span class="err">,</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;ipv6-prefix&#34;</span><span class="err">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;address&#34;</span><span class="p">:</span> <span class="s2">&#34;2409:8a28:6e2:1c28::&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;mask&#34;</span><span class="p">:</span> <span class="mi">61</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;assigned&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;lan&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;address&#34;</span><span class="p">:</span> <span class="s2">&#34;2409:8a28:6e2:1c28::&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mask&#34;</span><span class="p">:</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>br-lan</code> 当前地址：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">2409:8a28:6e2:1c28::1/64
</span></span></code></pre></td></tr></table>
</div>
</div><p>关键 UCI 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci show network.wan6
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">network.wan6=interface
</span></span><span class="line"><span class="cl">network.wan6.device=&#39;eth1&#39;
</span></span><span class="line"><span class="cl">network.wan6.proto=&#39;dhcpv6&#39;
</span></span><span class="line"><span class="cl">network.wan6.reqaddress=&#39;try&#39;
</span></span><span class="line"><span class="cl">network.wan6.reqprefix=&#39;60&#39;
</span></span><span class="line"><span class="cl">network.wan6.releaseprefix=&#39;1&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci show network.lan
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">network.lan=interface
</span></span><span class="line"><span class="cl">network.lan.device=&#39;br-lan&#39;
</span></span><span class="line"><span class="cl">network.lan.proto=&#39;static&#39;
</span></span><span class="line"><span class="cl">network.lan.ipaddr=&#39;192.168.7.1&#39;
</span></span><span class="line"><span class="cl">network.lan.ip6assign=&#39;64&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci show dhcp.lan
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dhcp.lan.ra=&#39;server&#39;
</span></span><span class="line"><span class="cl">dhcp.lan.dhcpv6=&#39;server&#39;
</span></span><span class="line"><span class="cl">dhcp.lan.ndp=&#39;disabled&#39;
</span></span><span class="line"><span class="cl">dhcp.lan.ra_flags=&#39;managed-config&#39; &#39;other-config&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>这个状态也是合理的：既然已经拿到正规 PD，LAN 侧就应该用 RA/DHCPv6 Server，下游不需要再开 NDP Relay。</p>
<p>实测连通性：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping6 -c <span class="m">3</span> 2400:3200::1
</span></span><span class="line"><span class="cl"><span class="c1"># 0% packet loss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.baidu.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> OK
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.qq.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> OK
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.aliyun.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> OK
</span></span></code></pre></td></tr></table>
</div>
</div><p>国内 IPv6 和 HTTPS 都是通的。</p>
<h2 id="超管密码和-telnet-获取过程">
<a class="header-anchor" href="#%e8%b6%85%e7%ae%a1%e5%af%86%e7%a0%81%e5%92%8c-telnet-%e8%8e%b7%e5%8f%96%e8%bf%87%e7%a8%8b"></a>
超管密码和 Telnet 获取过程
</h2><p>这台 GS3101 的默认超管密码已经失效，原因大概率是运营商通过 TR-069/网管系统把超管密码随机化了。所以网上常见的默认组合不可靠：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CMCCAdmin / 默认密码
</span></span><span class="line"><span class="cl">telecomadmin / 默认密码
</span></span><span class="line"><span class="cl">SN 推算密码
</span></span><span class="line"><span class="cl">MAC 推算密码
</span></span></code></pre></td></tr></table>
</div>
</div><p>实际可行的路径是：把光猫 SN 发给装维师傅，师傅通过移动装维/网管系统查询当前设备绑定的动态超管密码。这个密码不是本地用 SN 简单 hash 算出来的，更像是后台系统按设备 SN、地区、工单或设备注册信息查表/下发的结果。</p>
<p>常见获取路径对比：</p>
<table>
  <thead>
      <tr>
          <th>方法</th>
          <th>是否推荐</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>找装维师傅用 SN 查询</td>
          <td>推荐</td>
          <td>本次就是这条路，最快，也最少折腾设备</td>
      </tr>
      <tr>
          <td>闲鱼/代查超管</td>
          <td>可用但不推荐</td>
          <td>本质也是用 SN 查后台，存在隐私和账号风险</td>
      </tr>
      <tr>
          <td>UPnP <code>X_GetAccess</code></td>
          <td>看固件状态</td>
          <td>部分 GS2101/GS3101 的 5555 端口会暴露厂商自定义 action，可返回超管信息；前提是 UPnP 已开启且 action 未被封</td>
      </tr>
      <tr>
          <td>配置导出后解密/解析</td>
          <td>适合研究</td>
          <td>需要能导出 romfile，且不同固件格式不完全一致</td>
      </tr>
      <tr>
          <td>恢复出厂并阻断 TR-069</td>
          <td>有风险</td>
          <td>需要提前记录 LOID/宽带账号，操作不当会断网</td>
      </tr>
      <tr>
          <td>TTL 串口</td>
          <td>最可靠但要拆机</td>
          <td>适合硬件调试，直接进 shell 查配置</td>
      </tr>
  </tbody>
</table>
<p>UPnP 那条路要特别注意：网上文章常把“开启 UPnP 后 Telnet 自动开放”写成因果关系，但实测过程里往往还混有 <code>X_SetAccess</code>、<code>Reboot</code> 等 action。更准确地说，Telnet 开放可能来自“开启远程/本地管理权限并重启后生效”，不一定只是 UPnP 开关本身导致。</p>
<p>拿到 Web 超管后，可以进入隐藏配置页面：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">http://192.168.1.1/cgi-bin/upgrade.asp
</span></span></code></pre></td></tr></table>
</div>
</div><p>其中：</p>
<ul>
<li><code>romfile</code>：配置导入。</li>
<li><code>tclinux.bin</code>：固件导入。</li>
</ul>
<p>如果要改 romfile，务必先备份原配置。配置导入比直接在 shell 里改 <code>/etc</code> 更有机会持久化，但也更容易因为 XML/校验错误导致配置异常。</p>
<h3 id="telnet-登录踩坑">
<a class="header-anchor" href="#telnet-%e7%99%bb%e5%bd%95%e8%b8%a9%e5%9d%91"></a>
Telnet 登录踩坑
</h3><p>这台设备的 Telnet 和 Web 超管不是同一套账号。Web 用的是超管账号，Telnet 用的是 <code>Account_TelnetEntry</code> 里的账号。</p>
<p>Telnet 登录方式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">telnet -K -8 -E 192.168.1.1 <span class="m">23</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>参数说明：</p>
<ul>
<li><code>-K</code>：不自动登录。</li>
<li><code>-8</code>：8-bit 传输，避免部分字符被处理。</li>
<li><code>-E</code>：禁用 escape 字符，避免特殊字符干扰交互。</li>
</ul>
<p>正确现象：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Trying 192.168.1.1...
</span></span><span class="line"><span class="cl">Connected to 192.168.1.1.
</span></span><span class="line"><span class="cl">tc login:
</span></span><span class="line"><span class="cl">Password:
</span></span><span class="line"><span class="cl">#
</span></span></code></pre></td></tr></table>
</div>
</div><p>常见错误：</p>
<table>
  <thead>
      <tr>
          <th>现象</th>
          <th>原因</th>
          <th>处理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Connection refused</code></td>
          <td>Telnet 服务没开或被防火墙挡住</td>
          <td>先确认 Web 超管里 Telnet 是否开启，或看 <code>utelnetd</code> 是否运行</td>
      </tr>
      <tr>
          <td><code>Login incorrect</code></td>
          <td>把 Web 超管账号拿去登录 Telnet</td>
          <td>Telnet 用户通常是 <code>admin</code>，密码看 <code>Account_TelnetEntry</code></td>
      </tr>
      <tr>
          <td>能连但输入异常</td>
          <td>Telnet 客户端转义/编码影响特殊字符</td>
          <td>使用 <code>telnet -K -8 -E</code></td>
      </tr>
      <tr>
          <td>登录后不是 <code>#</code></td>
          <td>权限或 shell 不对</td>
          <td>确认登录的是 TelnetEntry 账号，不是普通 Web 用户</td>
      </tr>
  </tbody>
</table>
<p>登录后可以核对：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tcapi show Account_TelnetEntry
</span></span><span class="line"><span class="cl">ps <span class="p">|</span> grep utelnetd
</span></span><span class="line"><span class="cl">netstat -lntup <span class="p">|</span> grep <span class="s1">&#39;:23&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>这台设备上 <code>utelnetd</code> 的启动形式是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/usr/bin/utelnetd -p 23 -l /bin/login -d
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>utelnetd</code> 只支持 <code>-p</code>、<code>-l</code>、<code>-d</code>，没有绑定指定监听地址的参数，所以不能直接让它只监听 <code>192.168.1.1</code>。如果要保留 Telnet，又不想暴露到 WAN，只能靠防火墙规则限制 WAN 侧访问。</p>
<p>当前策略是：Telnet/Web 保留 LAN 侧可用，WAN 侧通过 <code>iptables/ip6tables</code> DROP 管理端口。</p>
<h2 id="推荐方案让光猫向-immortalwrt-委派前缀">
<a class="header-anchor" href="#%e6%8e%a8%e8%8d%90%e6%96%b9%e6%a1%88%e8%ae%a9%e5%85%89%e7%8c%ab%e5%90%91-immortalwrt-%e5%a7%94%e6%b4%be%e5%89%8d%e7%bc%80"></a>
推荐方案：让光猫向 ImmortalWrt 委派前缀
</h2><p>如果你的光猫也已经从 ISP 拿到了 <code>/60</code> 或 <code>/56</code>，优先使用 DHCPv6-PD，不要先上 NDP Relay。</p>
<h3 id="1-确认光猫拿到的原始-pd">
<a class="header-anchor" href="#1-%e7%a1%ae%e8%ae%a4%e5%85%89%e7%8c%ab%e6%8b%bf%e5%88%b0%e7%9a%84%e5%8e%9f%e5%a7%8b-pd"></a>
1. 确认光猫拿到的原始 PD
</h3><p>Telnet 登录光猫后查看：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /var/run/ppp1/orgpd6
</span></span><span class="line"><span class="cl">cat /var/run/ppp1/pd6
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果 <code>orgpd6</code> 有 <code>/60</code>、<code>/56</code> 之类的前缀，而二级路由拿不到 PD，问题通常在光猫的 <code>dhcp6s</code> 下发逻辑。</p>
<h3 id="2-找到-immortalwrt-的-duid">
<a class="header-anchor" href="#2-%e6%89%be%e5%88%b0-immortalwrt-%e7%9a%84-duid"></a>
2. 找到 ImmortalWrt 的 DUID
</h3><p>在 ImmortalWrt 上看 <code>wan6</code> 客户端 DUID。常见方式是看 odhcpd lease 或用 WAN 口 MAC 推导：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /tmp/hosts/odhcpd 2&gt;/dev/null
</span></span><span class="line"><span class="cl">ip link show dev eth1
</span></span></code></pre></td></tr></table>
</div>
</div><p>本文这台 ImmortalWrt 的 WAN 口 MAC 是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">70:2a:d7:60:77:20
</span></span></code></pre></td></tr></table>
</div>
</div><p>对应 DUID-LL：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">00:03:00:01:70:2a:d7:60:77:20
</span></span></code></pre></td></tr></table>
</div>
</div><p>格式说明：</p>
<ul>
<li><code>00:03</code>：DUID-LL</li>
<li><code>00:01</code>：以太网</li>
<li>后面 6 字节：WAN 口 MAC</li>
</ul>
<h3 id="3-修改光猫-dhcp6sconf">
<a class="header-anchor" href="#3-%e4%bf%ae%e6%94%b9%e5%85%89%e7%8c%ab-dhcp6sconf"></a>
3. 修改光猫 dhcp6s.conf
</h3><p>光猫运行期配置文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/etc/dhcp6s.conf
</span></span></code></pre></td></tr></table>
</div>
</div><p>示例配置：</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf">option domain-name-servers fe80::1;
interface br0 {
        address-pool pool1 172800 259200;
};
pool pool1 {
        range 2409:8a28:6e2:1c20::1 to 2409:8a28:6e2:1c20::1000;
};
host immortalwrt {
        duid 00:03:00:01:70:2a:d7:60:77:20;
        prefix 2409:8a28:6e2:1c28::/61 172800 259200;
};
</code></pre><p>注意前缀不要和光猫 <code>br0</code> 自用的 <code>/64</code> 重叠。比如光猫自用 <code>1c20::/64</code> 时，不要再把 <code>1c20::/64</code> 委派给二级路由。</p>
<p>重启 DHCPv6 Server：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">killall dhcp6s 2&gt;/dev/null
</span></span><span class="line"><span class="cl">sleep <span class="m">1</span>
</span></span><span class="line"><span class="cl">/userfs/bin/dhcp6s -c /etc/dhcp6s.conf br0 -p /var/run/dhcp6s.pid <span class="p">&amp;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4-配置-immortalwrt-请求-pd">
<a class="header-anchor" href="#4-%e9%85%8d%e7%bd%ae-immortalwrt-%e8%af%b7%e6%b1%82-pd"></a>
4. 配置 ImmortalWrt 请求 PD
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.proto<span class="o">=</span><span class="s1">&#39;dhcpv6&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.device<span class="o">=</span><span class="s1">&#39;eth1&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.reqaddress<span class="o">=</span><span class="s1">&#39;try&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.reqprefix<span class="o">=</span><span class="s1">&#39;60&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> network.lan.ip6assign<span class="o">=</span><span class="s1">&#39;64&#39;</span>
</span></span><span class="line"><span class="cl">uci commit network
</span></span></code></pre></td></tr></table>
</div>
</div><p>LAN 侧用 RA/DHCPv6 Server：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ra<span class="o">=</span><span class="s1">&#39;server&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.dhcpv6<span class="o">=</span><span class="s1">&#39;server&#39;</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ndp<span class="o">=</span><span class="s1">&#39;disabled&#39;</span>
</span></span><span class="line"><span class="cl">uci delete dhcp.lan.ra_flags 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci add_list dhcp.lan.ra_flags<span class="o">=</span><span class="s1">&#39;managed-config&#39;</span>
</span></span><span class="line"><span class="cl">uci add_list dhcp.lan.ra_flags<span class="o">=</span><span class="s1">&#39;other-config&#39;</span>
</span></span><span class="line"><span class="cl">uci commit dhcp
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果之前做过 NDP Relay，建议清理 <code>wan6</code> 上的 relay 残留，避免以后排障混乱：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci delete dhcp.wan6.ra 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci delete dhcp.wan6.dhcpv6 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci delete dhcp.wan6.ndp 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci delete dhcp.wan6.master 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.wan6.ignore<span class="o">=</span><span class="s1">&#39;1&#39;</span>
</span></span><span class="line"><span class="cl">uci commit dhcp
</span></span></code></pre></td></tr></table>
</div>
</div><p>重启服务：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ifdown wan6
</span></span><span class="line"><span class="cl">sleep <span class="m">3</span>
</span></span><span class="line"><span class="cl">ifup wan6
</span></span><span class="line"><span class="cl">/etc/init.d/odhcpd restart
</span></span><span class="line"><span class="cl">/etc/init.d/dnsmasq restart
</span></span></code></pre></td></tr></table>
</div>
</div><p>验证：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ifstatus wan6 <span class="p">|</span> grep -A20 <span class="s1">&#39;&#34;ipv6-prefix&#34;&#39;</span>
</span></span><span class="line"><span class="cl">ip -6 addr show dev br-lan
</span></span><span class="line"><span class="cl">ip -6 route show
</span></span></code></pre></td></tr></table>
</div>
</div><p>正常应该能看到：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">wan6 获得 2409:8a28:6e2:1c28::/61
</span></span><span class="line"><span class="cl">br-lan 获得 2409:8a28:6e2:1c28::1/64
</span></span><span class="line"><span class="cl">LAN 客户端获得 2409:8a28:6e2:1c28::/64 内的地址
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="一个容易踩的坑不要把动态-gua-写死到-ra_dns">
<a class="header-anchor" href="#%e4%b8%80%e4%b8%aa%e5%ae%b9%e6%98%93%e8%b8%a9%e7%9a%84%e5%9d%91%e4%b8%8d%e8%a6%81%e6%8a%8a%e5%8a%a8%e6%80%81-gua-%e5%86%99%e6%ad%bb%e5%88%b0-ra_dns"></a>
一个容易踩的坑：不要把动态 GUA 写死到 ra_dns
</h2><p>当前这台 ImmortalWrt 里有一项：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dhcp.lan.ra_dns=&#39;2409:8a28:6e2:1c28::1&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>这在当前前缀不变时能工作，但它绑定了动态公网前缀。如果以后光猫重新拨号后前缀变化，客户端可能继续收到过期 DNS 地址。</p>
<p>更稳的做法是：</p>
<ul>
<li>不手动写死 <code>ra_dns</code>，让 odhcpd 按当前接口状态发布 DNS；</li>
<li>或者发布稳定的公网 IPv6 DNS；</li>
<li>或者使用稳定 ULA 地址作为路由器 LAN 侧 DNS 地址。</li>
</ul>
<p>如果只是为了快速验证，写死当前 <code>br-lan</code> 地址没问题；要长期运行，建议避免这种配置。</p>
<h2 id="临时方案ndp-relay">
<a class="header-anchor" href="#%e4%b8%b4%e6%97%b6%e6%96%b9%e6%a1%88ndp-relay"></a>
临时方案：NDP Relay
</h2><p>只有在下面这种情况下才考虑 NDP Relay：</p>
<ul>
<li>光猫没有给二级路由委派 PD；</li>
<li>暂时拿不到光猫超管；</li>
<li>只是想临时让 LAN 设备获得 IPv6。</li>
</ul>
<p>NDP Relay 的本质是把上游 <code>/64</code> 共享给下游 LAN，能用但不如 DHCPv6-PD 标准。它依赖运营商没有做严格的 ND/SAVI 检查，也容易在前缀变化时出问题。</p>
<p>如果已经能让光猫给 ImmortalWrt 下发 PD，就不要再把 LAN 配成 NDP Relay。</p>
<h2 id="光猫配置持久化问题">
<a class="header-anchor" href="#%e5%85%89%e7%8c%ab%e9%85%8d%e7%bd%ae%e6%8c%81%e4%b9%85%e5%8c%96%e9%97%ae%e9%a2%98"></a>
光猫配置持久化问题
</h2><p>这类光猫的文件系统比较特殊：</p>
<ul>
<li>根文件系统是 squashfs，只读。</li>
<li><code>/etc</code> 通常是启动后生成到 tmpfs 的运行期目录。</li>
<li><code>/etc/dhcp6s.conf</code> 很可能重启后恢复。</li>
<li>我这台固件上 <code>/userfs</code> 看起来在根文件系统内，不是可靠可写分区；之前尝试写入会报 <code>Read-only file system</code>。</li>
<li><code>/usr/osgi</code> 是 jffs2 可写区，但它属于 OSGi/插件运行区，不建议随便塞启动脚本。</li>
</ul>
<p>所以不要简单照抄“把脚本追加到 <code>/etc/init.d/rcS</code>”这种做法。这个固件的 <code>/etc/init.d/rcS</code> 来自只读系统，直接修改不可持久；如果某些机型上能改，也要先确认重启后是否保留。</p>
<p>更稳的持久化路线：</p>
<ul>
<li>通过配置导出/导入修改 romfile 中的 DHCPv6 配置；</li>
<li>找装维把光猫改桥接，让 ImmortalWrt 直接拨号；</li>
<li>如果确认有可靠可写启动钩子，再做自动替换 <code>dhcp6s.conf</code> 的脚本。</li>
</ul>
<p>Web 超管页面里隐藏的配置导入页面是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">http://192.168.1.1/cgi-bin/upgrade.asp
</span></span></code></pre></td></tr></table>
</div>
</div><p>其中 <code>romfile</code> 是配置导入，<code>tclinux.bin</code> 是固件导入。改配置前务必先备份原配置。</p>
<h2 id="tr-069upnp-和远程管理">
<a class="header-anchor" href="#tr-069upnp-%e5%92%8c%e8%bf%9c%e7%a8%8b%e7%ae%a1%e7%90%86"></a>
TR-069、UPnP 和远程管理
</h2><p>拿到超管和 Telnet 后，我做了这些安全收敛：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tcapi <span class="nb">set</span> Cwmp_Entry Active No
</span></span><span class="line"><span class="cl">tcapi <span class="nb">set</span> Cwmp_Entry Tr069Enable <span class="m">0</span>
</span></span><span class="line"><span class="cl">tcapi <span class="nb">set</span> Cwmp_Entry periodActive No
</span></span><span class="line"><span class="cl">tcapi <span class="nb">set</span> Cwmp_Entry tr069Commit <span class="m">1</span>
</span></span><span class="line"><span class="cl">tcapi commit Cwmp_Entry
</span></span><span class="line"><span class="cl">tcapi save
</span></span><span class="line"><span class="cl">killall tr69_monitor 2&gt;/dev/null
</span></span><span class="line"><span class="cl">killall tr69 2&gt;/dev/null
</span></span></code></pre></td></tr></table>
</div>
</div><p>当前确认：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Cwmp_Entry Active=No
</span></span><span class="line"><span class="cl">Cwmp_Entry Tr069Enable=0
</span></span><span class="line"><span class="cl">Cwmp_Entry periodActive=No
</span></span></code></pre></td></tr></table>
</div>
</div><p>UPnP 保持开启，因为内网仍然需要；但不要把 UPnP、Web、Telnet 暴露到 WAN。当前运行期防火墙已经对 <code>ppp+</code> 和 <code>nas+</code> 的管理端口做了 DROP，Web 80 还有系统自带的 <code>!br+ DROP</code> 规则。Telnet 23 的 WAN DROP 规则目前是运行期规则，重启后仍需复核。</p>
<p>一句话：<strong>Telnet/Web 可以开，但只应该对内网开。TR-069 建议关闭。UPnP 如果要保留，也只保留 LAN 侧可用。</strong></p>
<h2 id="海外-ipv6-不通的问题">
<a class="header-anchor" href="#%e6%b5%b7%e5%a4%96-ipv6-%e4%b8%8d%e9%80%9a%e7%9a%84%e9%97%ae%e9%a2%98"></a>
海外 IPv6 不通的问题
</h2><p>本地前缀和 DHCPv6-PD 配好后，国内 IPv6 站点正常：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping6 -c <span class="m">3</span> 2400:3200::1
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.baidu.com
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.qq.com
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">8</span> https://www.aliyun.com
</span></span></code></pre></td></tr></table>
</div>
</div><p>但海外 IPv6 常见现象是：ICMPv6 能 ping，TCP/443 不通或超时。之前抓包能看到本地 SYN 发出，但收不到 SYN-ACK。</p>
<p>这更像中国移动 IPv6 国际出口策略或链路质量问题，不是本地 RA/DHCPv6 配错。判断方法：</p>
<ul>
<li>国内 IPv6 HTTPS 正常；</li>
<li>本地路由器有默认 IPv6 路由；</li>
<li>LAN 设备拿到正确公网 IPv6；</li>
<li>海外 TCP 单独失败。</li>
</ul>
<p>解决办法通常不是改 DHCPv6，而是走 IPv4 代理，或换 IPv6 国际出口更好的运营商。</p>
<h2 id="总结">
<a class="header-anchor" href="#%e6%80%bb%e7%bb%93"></a>
总结
</h2><table>
  <thead>
      <tr>
          <th>项目</th>
          <th>当前结论</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>ISP 是否给前缀</td>
          <td>给了光猫 <code>/60</code></td>
      </tr>
      <tr>
          <td>光猫自用前缀</td>
          <td><code>2409:8a28:6e2:1c20::/64</code></td>
      </tr>
      <tr>
          <td>委派给 ImmortalWrt</td>
          <td><code>2409:8a28:6e2:1c28::/61</code></td>
      </tr>
      <tr>
          <td>ImmortalWrt LAN</td>
          <td><code>2409:8a28:6e2:1c28::/64</code></td>
      </tr>
      <tr>
          <td>LAN DHCP/RA</td>
          <td>RA Server + DHCPv6 Server，NDP Relay 关闭</td>
      </tr>
      <tr>
          <td>国内 IPv6</td>
          <td>正常</td>
      </tr>
      <tr>
          <td>海外 IPv6 TCP</td>
          <td>运营商出口问题概率高</td>
      </tr>
      <tr>
          <td>TR-069</td>
          <td>已关闭</td>
      </tr>
      <tr>
          <td>UPnP</td>
          <td>保留 LAN 侧使用，不暴露 WAN</td>
      </tr>
  </tbody>
</table>
<p>最关键的修正是：不要把这个问题简单归因成“ISP 不下发前缀”。现场证据表明，ISP 给了光猫 <code>/60</code>；真正要做的是让光猫的 DHCPv6 Server 把合适的子前缀委派给 ImmortalWrt。</p>

        
        <hr><p>本文2026-06-21首发于<a href='https://csdn.fjh1997.top/'>猫猫鱼的小窝</a>，最后修改于2026-06-21</p>]]>
      </description>
      
    </item>
    
    

    <item>
      <title>ISP不下发前缀的情况下让局域网设备获得IPv6的解决方法</title>
      <link>https://csdn.fjh1997.top/posts/62847.html</link>
      <pubDate>Sat, 20 Jun 2026 23:30:00 &#43;0800</pubDate>
      <author>xxx@example.com (catcatyu)</author>
      <guid>https://csdn.fjh1997.top/posts/62847.html</guid>
      <description>
        <![CDATA[<h1>ISP不下发前缀的情况下让局域网设备获得IPv6的解决方法</h1><p>作者：catcatyu（xxx@example.com）</p>
        
          <h2 id="背景">
<a class="header-anchor" href="#%e8%83%8c%e6%99%af"></a>
背景
</h2><p>家里用的是中国移动宽带，光猫是吉比特GS3101（中国移动定制），下挂一台ImmortalWrt路由器（MT7981芯片）做二级路由。遇到的问题是：<strong>IPv6时有时无</strong>，有时候能用有时候就断了。</p>
<p>经过一番折腾，搞清楚了原因并找到了解决方案。虽然海外IPv6因为运营商原因连不通，但<strong>国内IPv6站点是可以正常访问的</strong>。</p>
<h2 id="问题诊断">
<a class="header-anchor" href="#%e9%97%ae%e9%a2%98%e8%af%8a%e6%96%ad"></a>
问题诊断
</h2><h3 id="1-isp不下发dhcpv6-pd前缀">
<a class="header-anchor" href="#1-isp%e4%b8%8d%e4%b8%8b%e5%8f%91dhcpv6-pd%e5%89%8d%e7%bc%80"></a>
1. ISP不下发DHCPv6-PD前缀
</h3><p>登录ImmortalWrt路由器查看日志，发现了关键信息：</p>
<pre tabindex="0"><code>daemon.warn odhcp6c: Server returned IA_PD status &#39;No Prefix Available&#39;
daemon.warn odhcp6c: Server returned IA_PD status &#39;No Binding&#39;
</code></pre><p>几乎每天都会出现。中国移动的DHCPv6服务器在续约前缀时返回&quot;无前缀可用&quot;或&quot;无绑定&quot;。</p>
<p>这里需要区分两个概念：</p>
<table>
  <thead>
      <tr>
          <th>类型</th>
          <th>说明</th>
          <th>ISP是否分配</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>IA_NA</strong>（地址）</td>
          <td>给路由器WAN口一个IPv6地址</td>
          <td>✅ 给了 <code>/64</code></td>
      </tr>
      <tr>
          <td><strong>IA_PD</strong>（前缀）</td>
          <td>给路由器一段地址池分给LAN设备</td>
          <td>❌ 不给</td>
      </tr>
  </tbody>
</table>
<p>ISP给了路由器一个地址（IA_NA），但拒绝给前缀（IA_PD）。正常情况下，路由器需要PD前缀才能给局域网设备分配IPv6地址，所以LAN设备就拿不到IPv6了。</p>
<h3 id="2-光猫固件封堵了超管获取">
<a class="header-anchor" href="#2-%e5%85%89%e7%8c%ab%e5%9b%ba%e4%bb%b6%e5%b0%81%e5%a0%b5%e4%ba%86%e8%b6%85%e7%ae%a1%e8%8e%b7%e5%8f%96"></a>
2. 光猫固件封堵了超管获取
</h3><p>我尝试通过获取光猫超级管理员密码来改桥接模式（让路由器直接拨号，PD前缀分配会更稳定），但是：</p>
<ul>
<li>光猫型号：<strong>GS3101</strong>，固件版本：<strong>V1B0.C02.01</strong>（<a href="https://github.com/fjh1997/hexo-theme-reimu/releases/tag/gs3101-firmware-v1b0c0201" target="_blank" rel="noopener noreferrer">固件完整dump下载</a>
，256MB Flash，含全部11个MTD分区）</li>
<li><code>getGateWay.cgi</code> 接口存在但返回 <strong>400 Bad Request</strong>（已被封堵）</li>
<li>telnet端口23关闭</li>
<li>所有默认超管密码（<code>CMCCAdmin/aDm8H%MdA</code>、<code>telecomadmin/nE7jA%5m</code> 等）全部错误</li>
<li>SN推算密码、MAC推算密码均不对</li>
<li>所有已知CGI漏洞页面返回404</li>
</ul>
<p><strong>结论：这个固件版本是运营商通过TR-069远程升级的新版本，已经封堵了所有已知的软件漏洞获取超管的方法。</strong></p>
<p>想获取超管只能：恢复出厂+秒删TR-069、TTL串口硬件调试、或找装维师傅要密码。</p>
<h2 id="解决方案ndp-relay--ipv6-forwarding">
<a class="header-anchor" href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88ndp-relay--ipv6-forwarding"></a>
解决方案：NDP Relay + IPv6 Forwarding
</h2><p>既然拿不到超管改不了桥接，那就换个思路——<strong>把WAN口的IPv6共享给LAN设备</strong>。</p>
<h3 id="原理">
<a class="header-anchor" href="#%e5%8e%9f%e7%90%86"></a>
原理
</h3><p>ISP虽然不给PD前缀，但WAN口有一个 <code>/64</code> 的公网IPv6地址。通过<strong>NDP Relay</strong>，可以把WAN侧收到的Router Advertisement（RA）原样转发到LAN。LAN设备收到RA后，会通过SLAAC从同一个 <code>/64</code> 前缀自动生成IPv6地址。</p>
<p>然后通过路由器的<strong>IPv6 Forwarding</strong>和<strong>NDP Proxy</strong>，让LAN设备的流量能正确路由到WAN。</p>
<p>本质上就是把WAN的 <code>/64</code> 前缀&quot;共享&quot;给了LAN设备。</p>
<h3 id="具体配置immortalwrtopenwrt">
<a class="header-anchor" href="#%e5%85%b7%e4%bd%93%e9%85%8d%e7%bd%aeimmortalwrtopenwrt"></a>
具体配置（ImmortalWrt/OpenWrt）
</h3><h4 id="1-修改dhcpra配置">
<a class="header-anchor" href="#1-%e4%bf%ae%e6%94%b9dhcpra%e9%85%8d%e7%bd%ae"></a>
1. 修改DHCP/RA配置
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># LAN侧：开启NDP relay和RA server</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ndp<span class="o">=</span>relay
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ra<span class="o">=</span>server
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.dhcpv6<span class="o">=</span>server
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设置RA标志，让客户端同时使用SLAAC和DHCPv6</span>
</span></span><span class="line"><span class="cl">uci delete dhcp.lan.ra_flags 2&gt;/dev/null
</span></span><span class="line"><span class="cl">uci add_list dhcp.lan.ra_flags<span class="o">=</span>managed-config
</span></span><span class="line"><span class="cl">uci add_list dhcp.lan.ra_flags<span class="o">=</span>other-config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设置RA发送间隔</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ra_maxinterval<span class="o">=</span><span class="m">300</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.ra_mininterval<span class="o">=</span><span class="m">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># DHCPv6租约时间</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> dhcp.lan.dhcpv6_leasetime<span class="o">=</span><span class="m">86400</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">uci commit dhcp
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="2-给lan接口添加wan前缀的静态地址">
<a class="header-anchor" href="#2-%e7%bb%99lan%e6%8e%a5%e5%8f%a3%e6%b7%bb%e5%8a%a0wan%e5%89%8d%e7%bc%80%e7%9a%84%e9%9d%99%e6%80%81%e5%9c%b0%e5%9d%80"></a>
2. 给LAN接口添加WAN前缀的静态地址
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 假设WAN前缀是 2409:xxxx:xxxx:xxxx::/64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 给br-lan加一个该前缀的静态地址</span>
</span></span><span class="line"><span class="cl">ip -6 addr add 2409:xxxx:xxxx:xxxx::2/64 dev br-lan
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>把 <code>2409:xxxx:xxxx:xxxx</code> 替换为你WAN口的实际前缀。可以通过 <code>ip -6 addr show dev eth1 scope global</code> 查看。</p>
</blockquote>
<h4 id="3-开启ipv6转发和ndp代理">
<a class="header-anchor" href="#3-%e5%bc%80%e5%90%afipv6%e8%bd%ac%e5%8f%91%e5%92%8cndp%e4%bb%a3%e7%90%86"></a>
3. 开启IPv6转发和NDP代理
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 开启IPv6转发</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv6/conf/all/forwarding
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv6/conf/eth1/forwarding
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv6/conf/br-lan/forwarding
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 开启NDP代理（让ISP能路由到LAN设备）</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv6/conf/all/proxy_ndp
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv6/conf/eth1/proxy_ndp
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="4-持久化配置写入-etcrclocal">
<a class="header-anchor" href="#4-%e6%8c%81%e4%b9%85%e5%8c%96%e9%85%8d%e7%bd%ae%e5%86%99%e5%85%a5-etcrclocal"></a>
4. 持久化配置（写入 /etc/rc.local）
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt; /etc/rc.local <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s"># 静态IPv6地址（替换为你的实际前缀）
</span></span></span><span class="line"><span class="cl"><span class="s">ip -6 addr add 2409:xxxx:xxxx:xxxx::2/64 dev br-lan 2&gt;/dev/null
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"># IPv6转发
</span></span></span><span class="line"><span class="cl"><span class="s">echo 1 &gt; /proc/sys/net/ipv6/conf/all/forwarding
</span></span></span><span class="line"><span class="cl"><span class="s">echo 1 &gt; /proc/sys/net/ipv6/conf/eth1/forwarding
</span></span></span><span class="line"><span class="cl"><span class="s">echo 1 &gt; /proc/sys/net/ipv6/conf/br-lan/forwarding
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"># NDP代理
</span></span></span><span class="line"><span class="cl"><span class="s">echo 1 &gt; /proc/sys/net/ipv6/conf/all/proxy_ndp
</span></span></span><span class="line"><span class="cl"><span class="s">echo 1 &gt; /proc/sys/net/ipv6/conf/eth1/proxy_ndp
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">exit 0
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="5-优化wan6-dhcpv6参数">
<a class="header-anchor" href="#5-%e4%bc%98%e5%8c%96wan6-dhcpv6%e5%8f%82%e6%95%b0"></a>
5. 优化wan6 DHCPv6参数
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.reqprefix<span class="o">=</span><span class="m">56</span>
</span></span><span class="line"><span class="cl">uci <span class="nb">set</span> network.wan6.releaseprefix<span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">uci commit network
</span></span></code></pre></td></tr></table>
</div>
</div><p>虽然ISP目前不给PD，但万一以后给了，这个配置能自动用上。</p>
<h4 id="6-添加ipv6看门狗脚本">
<a class="header-anchor" href="#6-%e6%b7%bb%e5%8a%a0ipv6%e7%9c%8b%e9%97%a8%e7%8b%97%e8%84%9a%e6%9c%ac"></a>
6. 添加IPv6看门狗脚本
</h4><p>ISP的前缀分配不稳定，加个脚本每5分钟检测一次，掉线自动恢复：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt; /usr/bin/ipv6-watchdog.sh <span class="s">&lt;&lt; &#39;SCRIPT&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">#!/bin/sh
</span></span></span><span class="line"><span class="cl"><span class="s">LOG_TAG=&#34;ipv6-watchdog&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">PING_TARGET=&#34;2400:3200::1&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">wan6_has_prefix() {
</span></span></span><span class="line"><span class="cl"><span class="s">    ip -6 addr show dev eth1 2&gt;/dev/null | grep -q &#34;scope global&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">ipv6_ping_ok() {
</span></span></span><span class="line"><span class="cl"><span class="s">    ping6 -c 1 -W 5 &#34;$PING_TARGET&#34; &gt;/dev/null 2&gt;&amp;1
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">if wan6_has_prefix &amp;&amp; ipv6_ping_ok; then
</span></span></span><span class="line"><span class="cl"><span class="s">    exit 0
</span></span></span><span class="line"><span class="cl"><span class="s">fi
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">logger -t &#34;$LOG_TAG&#34; &#34;IPv6 lost, restarting wan6...&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">ifdown wan6
</span></span></span><span class="line"><span class="cl"><span class="s">sleep 5
</span></span></span><span class="line"><span class="cl"><span class="s">ifup wan6
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">for i in $(seq 1 12); do
</span></span></span><span class="line"><span class="cl"><span class="s">    sleep 5
</span></span></span><span class="line"><span class="cl"><span class="s">    if wan6_has_prefix; then
</span></span></span><span class="line"><span class="cl"><span class="s">        logger -t &#34;$LOG_TAG&#34; &#34;IPv6 restored after ${i}x5s&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">        /etc/init.d/odhcpd restart
</span></span></span><span class="line"><span class="cl"><span class="s">        exit 0
</span></span></span><span class="line"><span class="cl"><span class="s">    fi
</span></span></span><span class="line"><span class="cl"><span class="s">done
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">logger -t &#34;$LOG_TAG&#34; &#34;IPv6 NOT restored after 60s&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">exit 1
</span></span></span><span class="line"><span class="cl"><span class="s">SCRIPT</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">chmod +x /usr/bin/ipv6-watchdog.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 添加定时任务（每5分钟检查一次）</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;*/5 * * * * /usr/bin/ipv6-watchdog.sh&#34;</span> &gt;&gt; /etc/crontabs/root
</span></span><span class="line"><span class="cl">/etc/init.d/cron <span class="nb">enable</span>
</span></span><span class="line"><span class="cl">/etc/init.d/cron restart
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="7-重启服务生效">
<a class="header-anchor" href="#7-%e9%87%8d%e5%90%af%e6%9c%8d%e5%8a%a1%e7%94%9f%e6%95%88"></a>
7. 重启服务生效
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/etc/init.d/odhcpd restart
</span></span><span class="line"><span class="cl">/etc/init.d/dnsmasq restart
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="验证">
<a class="header-anchor" href="#%e9%aa%8c%e8%af%81"></a>
验证
</h3><p>配置完成后，直连ImmortalWrt WiFi的设备（如手机）应该能通过SLAAC自动获取公网IPv6地址。</p>
<p>测试方法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 从路由器测试国内IPv6站点</span>
</span></span><span class="line"><span class="cl">ping6 -c <span class="m">3</span> 2400:3200::1          <span class="c1"># 阿里DNS</span>
</span></span><span class="line"><span class="cl">ping6 -c <span class="m">3</span> 2409:8a28:6e2:1c20::1 <span class="c1"># 你的WAN网关</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 测试国内HTTPS站点</span>
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">10</span> https://www.baidu.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;百度 OK&#34;</span>
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">10</span> https://www.qq.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;QQ OK&#34;</span>
</span></span><span class="line"><span class="cl">wget -6 -q -O /dev/null --timeout<span class="o">=</span><span class="m">10</span> https://www.aliyun.com <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;阿里云 OK&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="海外ipv6不通的问题">
<a class="header-anchor" href="#%e6%b5%b7%e5%a4%96ipv6%e4%b8%8d%e9%80%9a%e7%9a%84%e9%97%ae%e9%a2%98"></a>
海外IPv6不通的问题
</h2><p>配置完成后发现一个现象：<strong>国内IPv6站点全部正常，但海外IPv6站点TCP连不上</strong>（ping能通但HTTP/HTTPS超时）。</p>
<p>通过tcpdump抓包确认：</p>
<pre tabindex="0"><code># 路由器发出的TCP SYN包
IP6 router.44178 &gt; remote.443: Flags [S]  # SYN发出
# 没有任何SYN-ACK回来...
</code></pre><p><strong>原因：中国移动的IPv6国际出口过滤了TCP流量</strong>，只放行ICMPv6。这不是路由器防火墙的问题（即使完全放开防火墙也不行），而是运营商层面的策略。</p>
<p>如果你需要访问海外IPv6站点，建议：</p>
<ul>
<li>代理走IPv4出站（大部分代理客户端默认就这样）</li>
<li>换电信/联通宽带（IPv6到海外通常好很多）</li>
</ul>
<h2 id="注意事项">
<a class="header-anchor" href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
注意事项
</h2><h3 id="关于ndp-relay的安全性">
<a class="header-anchor" href="#%e5%85%b3%e4%ba%8endp-relay%e7%9a%84%e5%ae%89%e5%85%a8%e6%80%a7"></a>
关于NDP Relay的安全性
</h3><p>这种方案本质上是把WAN的 <code>/64</code> 前缀共享给LAN。如果ISP做了严格的ND安全检查（如SAVI/ND Snooping），会检测到同一端口冒出了多个IPv6源地址，从而丢弃非绑定地址的包。</p>
<p>目前中国移动大部分场景不管这个，所以能用。如果某天被限制了，表现为：设备有IPv6地址但上不了网（被静默丢弃）。到时候只能：</p>
<ul>
<li>打电话给运营商要PD前缀</li>
<li>光猫改桥接（需要超管密码）</li>
<li>用6in4/HE Tunnel Broker走隧道</li>
</ul>
<h3 id="关于光猫gs3101gs2101超管获取">
<a class="header-anchor" href="#%e5%85%b3%e4%ba%8e%e5%85%89%e7%8c%abgs3101gs2101%e8%b6%85%e7%ae%a1%e8%8e%b7%e5%8f%96"></a>
关于光猫GS3101/GS2101超管获取
</h3><p>如果你也是GS3101或GS2101型号的光猫，固件是V1B0.C02.01或更新版本，传统的<code>getGateWay.cgi</code>等软件漏洞已经被封堵。但还有以下几种方法可以获取超管密码：</p>
<h4 id="方法一upnp漏洞推荐免费">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%b8%80upnp%e6%bc%8f%e6%b4%9e%e6%8e%a8%e8%8d%90%e5%85%8d%e8%b4%b9"></a>
方法一：UPnP漏洞（推荐，免费）
</h4><blockquote>
<p>参考：<a href="https://www.right.com.cn/forum/thread-8472031-1-1.html" target="_blank" rel="noopener noreferrer nofollow">吉比特GS2101光猫-开启telnet-获取超级管理员账号密码 - 恩山无线论坛</a>
</p>
</blockquote>
<p>GS2101/GS3101光猫在端口5555运行了一个UPnP IGD服务，其中<code>DeviceInfo</code>子服务包含一个厂商自定义的SOAP方法<code>X_GetAccess</code>，<strong>不需要任何认证</strong>就能返回超管密码。</p>
<p><strong>前提条件：光猫的UPnP必须开启。</strong> UPnP设置需要超管权限才能看到（在&quot;应用&quot; → &ldquo;UPnP配置&quot;里），所以这是一个鸡生蛋的问题。但如果你能通过其他方式先拿到一次超管密码（比如找师傅），开启UPnP后以后就可以自己随时获取了。</p>
<p>获取密码的PowerShell脚本（Windows下运行）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># GS2101/GS3101 光猫超管密码获取脚本</span>
</span></span><span class="line"><span class="cl"><span class="c"># 前提：光猫UPnP已开启</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$ONT_IP</span> <span class="p">=</span> <span class="s2">&#34;192.168.1.1&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">Write-Host</span> <span class="s2">&#34;[1/2] Checking ONT...&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Yellow</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="o">-not</span> <span class="p">(</span><span class="nb">Test-Connection</span> <span class="nv">$ONT_IP</span> <span class="n">-Count</span> <span class="mf">1</span> <span class="n">-Quiet</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;[FAIL] Cannot reach </span><span class="nv">$ONT_IP</span><span class="s2">&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Red</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span> <span class="mf">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">Write-Host</span> <span class="s2">&#34;      OK&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Green</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">Write-Host</span> <span class="s2">&#34;[2/2] Fetching password via UPnP...&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Yellow</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$soap</span> <span class="p">=</span> <span class="s2">&#34;POST /UD/?2 HTTP/1.1</span><span class="se">`r`n</span><span class="s2">&#34;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Host: </span><span class="nv">${ONT_IP}</span><span class="s2">:5555</span><span class="se">`r`n</span><span class="s2">&#34;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Content-Type: text/xml; charset=utf-8</span><span class="se">`r`n</span><span class="s2">&#34;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;SOAPAction: </span><span class="se">`&#34;</span><span class="s2">urn:dslforum-org:service:DeviceInfo:1#X_GetAccess</span><span class="se">`&#34;`r`n</span><span class="s2">&#34;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Content-Length: {0}</span><span class="se">`r`n</span><span class="s2">&#34;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Connection: close</span><span class="se">`r`n`r`n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$xml</span> <span class="p">=</span> <span class="s1">&#39;&lt;s:Envelope xmlns:s=&#34;http://schemas.xmlsoap.org/soap/envelope/&#34;&gt;&lt;s:Body&gt;&#39;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">       <span class="s1">&#39;&lt;u:X_GetAccess xmlns:u=&#34;urn:dslforum-org:service:DeviceInfo:1&#34;/&gt;&lt;/s:Body&gt;&lt;/s:Envelope&gt;&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$soap</span> <span class="p">=</span> <span class="nv">$soap</span> <span class="o">-f</span> <span class="nv">$xml</span><span class="p">.</span><span class="py">Length</span>
</span></span><span class="line"><span class="cl"><span class="nv">$request</span> <span class="p">=</span> <span class="p">[</span><span class="no">Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetBytes</span><span class="p">(</span><span class="nv">$soap</span> <span class="p">+</span> <span class="nv">$xml</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$client</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="py">Net</span><span class="p">.</span><span class="py">Sockets</span><span class="p">.</span><span class="py">TcpClient</span>
</span></span><span class="line"><span class="cl"><span class="nv">$client</span><span class="p">.</span><span class="py">ReceiveTimeout</span> <span class="p">=</span> <span class="mf">8000</span>
</span></span><span class="line"><span class="cl"><span class="nv">$client</span><span class="p">.</span><span class="py">Connect</span><span class="p">(</span><span class="nv">$ONT_IP</span><span class="p">,</span> <span class="mf">5555</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$stream</span> <span class="p">=</span> <span class="nv">$client</span><span class="p">.</span><span class="py">GetStream</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nv">$stream</span><span class="p">.</span><span class="py">Write</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="mf">0</span><span class="p">,</span> <span class="nv">$request</span><span class="p">.</span><span class="n">Length</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$stream</span><span class="p">.</span><span class="py">Flush</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$reader</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="py">IO</span><span class="p">.</span><span class="py">StreamReader</span><span class="p">(</span><span class="nv">$stream</span><span class="p">,</span> <span class="p">[</span><span class="no">Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$response</span> <span class="p">=</span> <span class="nv">$reader</span><span class="p">.</span><span class="py">ReadToEnd</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nv">$client</span><span class="p">.</span><span class="py">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nv">$response</span> <span class="o">-match</span> <span class="s1">&#39;NewX_RootPassword[^&gt;]*&gt;([^&lt;]+)&#39;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;  Username : CMCCAdmin&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Cyan</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;  Password : </span><span class="p">$(</span><span class="nv">$matches</span><span class="p">[</span><span class="mf">1</span><span class="p">])</span><span class="s2">&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Cyan</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;[FAIL] No password returned - is UPnP enabled?&#34;</span> <span class="n">-ForegroundColor</span> <span class="n">Red</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果UPnP未开启，会返回空的SOAP body（端口5555可达但所有action不返回数据）。</p>
<p><strong>附：UPnP开启后telnet自动激活</strong></p>
<p>实测发现，开启UPnP并重启光猫后，<strong>telnet端口23会自动开放</strong>，使用以下凭据可以登录并获得shell：</p>
<pre tabindex="0"><code>用户名: admin
密码: s2@We3%Dc#
</code></pre><p>登录后可进入BusyBox shell（<code>#</code>提示符），可以执行命令查看配置、修改设置等。这意味着即使TR-069后续重新随机化了超管密码，只要UPnP保持开启，你就可以随时通过telnet获取shell访问权限。</p>
<blockquote>
<p><strong>telnet开放的真正原因分析：</strong> 实测过程中，在UPnP开启后还额外调用了<code>X_SetAccess</code>（设置<code>X_AccessWAN=True</code>，开启WAN侧远程管理）和<code>Reboot</code>（远程重启光猫）两个action。因此telnet的开放可能不是UPnP本身导致的，而是这个组合链：</p>
<ol>
<li>UPnP开启后，<code>X_SetAccess</code> action成功开启了WAN侧管理权限（包括telnet/SSH等）</li>
<li><code>Reboot</code> action重启光猫，使配置生效</li>
<li>重启后telnet端口23开放</li>
</ol>
<p>也就是说，关键的触发条件可能是 <strong><code>X_SetAccess</code> + <code>Reboot</code></strong>，而不仅仅是UPnP处于开启状态。</p>
</blockquote>
<p><strong>附：UPnP漏洞的完整利用能力</strong></p>
<p>除了获取超管密码外，端口5555的UPnP服务（无需认证）还可以：</p>
<table>
  <thead>
      <tr>
          <th>UPnP Action</th>
          <th>服务</th>
          <th>效果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>X_GetAccess</code></td>
          <td>DeviceInfo</td>
          <td>获取超管密码</td>
      </tr>
      <tr>
          <td><code>Reboot</code></td>
          <td>DeviceConfig</td>
          <td>重启光猫</td>
      </tr>
      <tr>
          <td><code>FactoryReset</code></td>
          <td>DeviceConfig</td>
          <td>恢复出厂设置</td>
      </tr>
      <tr>
          <td><code>AddPortMapping</code></td>
          <td>WANIPConnection</td>
          <td>添加端口映射（外网穿透到内网）</td>
      </tr>
      <tr>
          <td><code>GetPreSharedKey</code></td>
          <td>WLANConfiguration</td>
          <td>读取WiFi密码</td>
      </tr>
      <tr>
          <td><code>SetDNSServer</code></td>
          <td>LANHostConfigManagement</td>
          <td>修改DHCP下发的DNS（DNS劫持）</td>
      </tr>
      <tr>
          <td><code>SetManagementServerURL</code></td>
          <td>ManagementServer</td>
          <td>劫持TR-069管理服务器地址</td>
      </tr>
      <tr>
          <td><code>X_SetAccess</code></td>
          <td>DeviceInfo</td>
          <td>开启WAN侧远程管理</td>
      </tr>
  </tbody>
</table>
<p>虽然没有直接的命令执行action，但组合利用效果很强：先用<code>X_GetAccess</code>拿密码 → 开启UPnP → 用<code>Reboot</code>重启激活telnet → 用<code>admin/s2@We3%Dc#</code>登录telnet获得shell。</p>
<h4 id="方法二闲鱼购买5元">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%ba%8c%e9%97%b2%e9%b1%bc%e8%b4%ad%e4%b9%b05%e5%85%83"></a>
方法二：闲鱼购买（5元）
</h4><p>闲鱼搜索&quot;光猫超级密码&quot;或&quot;光猫超管&rdquo;，提供光猫SN码，卖家通过运营商网管系统查询，一般<strong>5元</strong>就能拿到。本质上就是装维师傅用的同一套OLT网管平台，用SN码查到设备绑定的动态密码。</p>
<h4 id="方法三找装维师傅">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%b8%89%e6%89%be%e8%a3%85%e7%bb%b4%e5%b8%88%e5%82%85"></a>
方法三：找装维师傅
</h4><p>直接联系宽带安装师傅，他们手上有工单系统/网管平台，用SN码就能查到动态密码。有些师傅愿意给，有些不愿意。</p>
<h4 id="方法四恢复出厂秒删tr-069">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e5%9b%9b%e6%81%a2%e5%a4%8d%e5%87%ba%e5%8e%82%e7%a7%92%e5%88%a0tr-069"></a>
方法四：恢复出厂+秒删TR-069
</h4><ol>
<li>记下LOID和宽带账号密码</li>
<li><strong>拔光纤</strong></li>
<li>捅Reset孔10秒恢复出厂</li>
<li>密码回到默认值 <code>CMCCAdmin</code> / <code>aDm8H%MdA</code></li>
<li><strong>立刻</strong>登录，删掉TR-069连接（防止密码被重新随机）</li>
<li>插回光纤，用LOID重新注册</li>
</ol>
<h4 id="方法五ttl串口硬件方法100成功">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%ba%94ttl%e4%b8%b2%e5%8f%a3%e7%a1%ac%e4%bb%b6%e6%96%b9%e6%b3%95100%e6%88%90%e5%8a%9f"></a>
方法五：TTL串口（硬件方法，100%成功）
</h4><p>买个CH340/CP2102 USB转TTL模块（淘宝几块钱），拆光猫接TX/RX/GND三条线，波特率115200，开机进root shell，直接读配置文件里的超管密码：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /tmp/ctromfile.cfg <span class="p">|</span> grep -i admin
</span></span><span class="line"><span class="cl">cat /tmp/ctromfile.cfg <span class="p">|</span> grep -i passw
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="进阶从光猫获取正规的60-pd前缀委派">
<a class="header-anchor" href="#%e8%bf%9b%e9%98%b6%e4%bb%8e%e5%85%89%e7%8c%ab%e8%8e%b7%e5%8f%96%e6%ad%a3%e8%a7%84%e7%9a%8460-pd%e5%89%8d%e7%bc%80%e5%a7%94%e6%b4%be"></a>
进阶：从光猫获取正规的/60 PD前缀委派
</h2><p>如果你已经通过上面的方法拿到了光猫超管密码并开启了telnet，还有一个更好的方案——<strong>直接从光猫获取正规的PD前缀委派</strong>，不再需要NDP Relay hack。</p>
<h3 id="发现问题">
<a class="header-anchor" href="#%e5%8f%91%e7%8e%b0%e9%97%ae%e9%a2%98"></a>
发现问题
</h3><p>通过telnet查看光猫的配置，发现ISP实际上<strong>已经给了光猫一个/60前缀</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 通过telnet登录光猫后执行</span>
</span></span><span class="line"><span class="cl">cat /var/run/ppp1/orgpd6
</span></span><span class="line"><span class="cl"><span class="c1"># 输出: 2409:8a28:6e2:1c20::/60   ← ISP给了/60！</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat /var/run/ppp1/pd6
</span></span><span class="line"><span class="cl"><span class="c1"># 输出: 2409:8a28:6e2:1c20::/64    ← 光猫自己只用了/64</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>ISP通过PPPoE给光猫委派了 <code>/60</code> 前缀，但光猫的DHCPv6 Server（<code>dhcp6s</code>）只把这个前缀委派给了一个硬编码的DUID，下挂的OpenWrt/ImmortalWrt路由器根本拿不到。</p>
<h3 id="原因分析">
<a class="header-anchor" href="#%e5%8e%9f%e5%9b%a0%e5%88%86%e6%9e%90"></a>
原因分析
</h3><p>光猫的 <code>/etc/dhcp6s.conf</code>（DHCPv6服务器配置）长这样：</p>
<pre tabindex="0"><code>option domain-name-servers fe80::1;
interface br0 {
         address-pool pool1 172800 259200;
};
pool pool1 {
         range 2409:8a28:6e2:1c20::1 to 2409:8a28:6e2:1c20::1000;
};
host cmcc {
        duid 11:11:11:11:11:11:11:11:11:11:11:11:11:11;
        prefix 2409:8a28:6e2:1c20::/60 172800 259200;
};
</code></pre><p><code>host cmcc</code> 里硬编码了一个假DUID（<code>11:11:11:11...</code>），只有匹配这个DUID的设备才能拿到PD前缀。下挂的OpenWrt路由器DUID不匹配，自然拿不到前缀。</p>
<h3 id="解决方法修改dhcp6sconf">
<a class="header-anchor" href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95%e4%bf%ae%e6%94%b9dhcp6sconf"></a>
解决方法：修改dhcp6s.conf
</h3><p><strong>第一步：找到OpenWrt路由器的DUID</strong></p>
<p>在OpenWrt路由器上执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /tmp/hosts/odhcpd
</span></span><span class="line"><span class="cl"><span class="c1"># 输出类似：</span>
</span></span><span class="line"><span class="cl"><span class="c1"># br-lan 00030001702ad7607720 0 - ...</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>DUID就是第二列的值，如 <code>00030001702ad7607720</code>。格式化为冒号分隔：<code>00:03:00:01:70:2a:d7:60:77:20</code>。</p>
<blockquote>
<p>这个DUID是DUID-LL格式：<code>0003</code>=DUID-LL类型, <code>0001</code>=以太网, 后面是WAN口的MAC地址。</p>
</blockquote>
<p><strong>第二步：通过telnet修改光猫的dhcp6s.conf</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># telnet登录光猫 (admin / s2@We3%Dc#)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat &gt; /etc/dhcp6s.conf <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">option domain-name-servers fe80::1;
</span></span></span><span class="line"><span class="cl"><span class="s">interface br0 {
</span></span></span><span class="line"><span class="cl"><span class="s">        address-pool pool1 172800 259200;
</span></span></span><span class="line"><span class="cl"><span class="s">};
</span></span></span><span class="line"><span class="cl"><span class="s">pool pool1 {
</span></span></span><span class="line"><span class="cl"><span class="s">        range 2409:8a28:6e2:1c20::1 to 2409:8a28:6e2:1c20::1000;
</span></span></span><span class="line"><span class="cl"><span class="s">};
</span></span></span><span class="line"><span class="cl"><span class="s">host openwrt {
</span></span></span><span class="line"><span class="cl"><span class="s">        duid 00:03:00:01:70:2a:d7:60:77:20;
</span></span></span><span class="line"><span class="cl"><span class="s">        prefix 2409:8a28:6e2:1c20::/60 172800 259200;
</span></span></span><span class="line"><span class="cl"><span class="s">};
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>把 <code>00:03:00:01:70:2a:d7:60:77:20</code> 替换为你自己路由器的DUID。</p>
</blockquote>
<p><strong>第三步：重启dhcp6s</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">killall dhcp6s 2&gt;/dev/null
</span></span><span class="line"><span class="cl">sleep <span class="m">1</span>
</span></span><span class="line"><span class="cl">/userfs/bin/dhcp6s -c /etc/dhcp6s.conf br0 -p /var/run/dhcp6s.pid <span class="p">&amp;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>第四步：在OpenWrt上重新请求前缀</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">killall odhcp6c 2&gt;/dev/null
</span></span><span class="line"><span class="cl">ifdown wan6
</span></span><span class="line"><span class="cl">sleep <span class="m">3</span>
</span></span><span class="line"><span class="cl">ifup wan6
</span></span><span class="line"><span class="cl">sleep <span class="m">15</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证是否拿到前缀</span>
</span></span><span class="line"><span class="cl">ifstatus wan6 <span class="p">|</span> grep -A8 ipv6-prefix
</span></span></code></pre></td></tr></table>
</div>
</div><p>成功的话会看到：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;ipv6-prefix&#34;</span><span class="err">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;address&#34;</span><span class="p">:</span> <span class="s2">&#34;2409:8a28:6e2:1c20::&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mask&#34;</span><span class="p">:</span> <span class="mi">60</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;preferred&#34;</span><span class="p">:</span> <span class="mi">172784</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;valid&#34;</span><span class="p">:</span> <span class="mi">259184</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;class&#34;</span><span class="p">:</span> <span class="s2">&#34;wan6&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="完整的pd链路">
<a class="header-anchor" href="#%e5%ae%8c%e6%95%b4%e7%9a%84pd%e9%93%be%e8%b7%af"></a>
完整的PD链路
</h3><p>修改后的IPv6前缀委派链路：</p>
<pre tabindex="0"><code>ISP ──/60──→ 光猫(ppp1) ──/60──→ OpenWrt(eth1) ──/64──→ LAN设备(br-lan)
</code></pre><p>这是正规的DHCPv6-PD链路，比NDP Relay方案更稳定、更标准。</p>
<h3 id="持久化注意事项">
<a class="header-anchor" href="#%e6%8c%81%e4%b9%85%e5%8c%96%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
持久化注意事项
</h3><p>光猫的 <code>/etc/</code> 分区是只读的squashfs，重启后 <code>dhcp6s.conf</code> 会恢复原样。需要持久化的话，可以把自定义配置保存到 <code>/userfs/</code>（可写的jffs2分区），并在 <code>/etc/init.d/rcS</code> 末尾添加监控脚本，在每次dhcp6s启动后自动替换配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 保存到持久分区</span>
</span></span><span class="line"><span class="cl">cp /etc/dhcp6s.conf /userfs/dhcp6s_custom.conf
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 在rcS末尾添加后台监控</span>
</span></span><span class="line"><span class="cl">cat &gt;&gt; /etc/init.d/rcS <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">(while true; do
</span></span></span><span class="line"><span class="cl"><span class="s">  if ps | grep -q &#34;[d]hcp6s&#34;; then
</span></span></span><span class="line"><span class="cl"><span class="s">    if [ -f /userfs/dhcp6s_custom.conf ]; then
</span></span></span><span class="line"><span class="cl"><span class="s">      if ! grep -q &#34;openwrt&#34; /etc/dhcp6s.conf 2&gt;/dev/null; then
</span></span></span><span class="line"><span class="cl"><span class="s">        cp /userfs/dhcp6s_custom.conf /etc/dhcp6s.conf
</span></span></span><span class="line"><span class="cl"><span class="s">        killall dhcp6s 2&gt;/dev/null
</span></span></span><span class="line"><span class="cl"><span class="s">        sleep 1
</span></span></span><span class="line"><span class="cl"><span class="s">        /userfs/bin/dhcp6s -c /etc/dhcp6s.conf br0 -p /var/run/dhcp6s.pid &amp;
</span></span></span><span class="line"><span class="cl"><span class="s">      fi
</span></span></span><span class="line"><span class="cl"><span class="s">    fi
</span></span></span><span class="line"><span class="cl"><span class="s">  fi
</span></span></span><span class="line"><span class="cl"><span class="s">  sleep 30
</span></span></span><span class="line"><span class="cl"><span class="s">done) &amp;
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>注意</strong>：<code>/etc/init.d/rcS</code> 的可写性取决于具体固件版本，部分版本rcS在tmpfs上，重启后可能丢失。如遇此情况，建议联系装维师傅将光猫改为桥接模式，让OpenWrt直接拨号获取PD前缀，这是最彻底的解决方案。</p>
</blockquote>
<h2 id="总结">
<a class="header-anchor" href="#%e6%80%bb%e7%bb%93"></a>
总结
</h2><table>
  <thead>
      <tr>
          <th>问题</th>
          <th>原因</th>
          <th>解决方案</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>LAN设备没有IPv6</td>
          <td>ISP不下发PD前缀</td>
          <td>NDP Relay + IPv6 Forwarding</td>
      </tr>
      <tr>
          <td>光猫有/60但不给下挂路由器</td>
          <td>dhcp6s.conf硬编码DUID</td>
          <td>修改dhcp6s.conf加入路由器DUID</td>
      </tr>
      <tr>
          <td>IPv6时断时续</td>
          <td>ISP前缀续约失败</td>
          <td>watchdog脚本自动恢复</td>
      </tr>
      <tr>
          <td>海外IPv6 TCP不通</td>
          <td>中国移动IPv6国际出口过滤</td>
          <td>走IPv4代理</td>
      </tr>
      <tr>
          <td>光猫无法改桥接</td>
          <td>新固件封堵了超管获取</td>
          <td>UPnP漏洞/闲鱼5元/找装维师傅</td>
      </tr>
  </tbody>
</table>
<p>虽然方案不完美（海外IPv6不通、依赖ISP不做ND检查），但对于日常使用国内IPv6站点来说完全够用。</p>

        
        <hr><p>本文2026-06-20首发于<a href='https://csdn.fjh1997.top/'>猫猫鱼的小窝</a>，最后修改于2026-06-20</p>]]>
      </description>
      
    </item>
    
  </channel>
</rss>
