跳轉到內容

OpenWrt 關閉 IPv6 完全指南:從 Web 配置到 SSH 命令行

IPv6(Internet Protocol version 6)是下一代互聯網協議,旨在解決 IPv4 地址枯竭問題。然而,在實際使用中,由於各種原因(如運營商支持不完善、部分應用兼容性問題、網絡調試需求等),用戶可能需要在 OpenWrt 軟路由系統中徹底關閉 IPv6 功能。

本文將為您提供從圖形界面到命令行的完整 IPv6 關閉方案,確保您的網絡環境完全運行在純 IPv4 模式下。無論您是初學者還是高級用戶,都能通過本文找到適合自己的配置方法。

為什麼要關閉 IPv6?

雖然 IPv6 是未來趨勢,但在以下場景中,關閉 IPv6 可能是更好的選擇:

常見原因

  1. 兼容性問題

    • 某些老舊設備或應用程序不支持 IPv6
    • 部分遊戲服務器對 IPv6 支持不佳
    • 智能家居設備可能存在 IPv6 連接問題
  2. 網絡穩定性

    • 運營商 IPv6 部署不完善導致間歇性斷網
    • DNS 解析混亂(同時返回 IPv4 和 IPv6 地址)
    • 雙重協議棧增加網絡複雜度
  3. 性能優化

    • 減少路由表大小,提升查找效率
    • 降低系統資源佔用(內存、CPU)
    • 簡化防火牆規則,提高安全性
  4. 調試需求

    • 排查網絡問題時排除 IPv6 干擾
    • 測試純 IPv4 環境下的應用表現
    • 學習網絡基礎知識

IPv6 vs 純 IPv4 對比

特性IPv6 啟用IPv6 禁用
地址空間幾乎無限有限(需 NAT)
配置複雜度較高簡單
兼容性部分舊設備不支持廣泛兼容
性能開銷略高較低
安全性需額外配置防火牆相對簡單
適用場景未來主流當前穩定方案

前置準備

在開始配置之前,請做好以下準備:

1. 備份當前配置

bash
# 通過 Web 界面備份
# 系統 → 備份/升級 → 生成備份

# 或通過命令行備份
sysupgrade -b /tmp/config_backup.tar.gz

2. 確保可以訪問路由器

  • 確認可以通過 Web 界面訪問(通常 192.168.1.1
  • 如果需要使用 SSH,確保已啟用 SSH 服務
  • 記錄當前的管理員賬號密碼

3. 瞭解網絡拓撲

  • 確認 WAN 口和 LAN 口的物理連接
  • 瞭解是否有下游設備依賴 IPv6
  • 通知網絡使用者即將進行配置變更

方法一:通過 Web 界面關閉 IPv6(推薦新手)

這是最直觀的配置方式,適合不熟悉命令行的用戶。

步驟一:刪除 WAN6 接口

  1. 登錄 OpenWrt 管理界面
  2. 進入 網絡接口
  3. 找到名為 WAN6 的接口
  4. 點擊右側的 刪除 按鈕
  5. 確認刪除操作

刪除 WAN6 接口

說明:WAN6 是專門用於 IPv6 連接的廣域網接口,刪除它可以阻止路由器通過 PPPoE 或 DHCPv6 獲取 IPv6 地址。

步驟二:配置 WAN 接口的 IPv6 設置

  1. 網絡接口 頁面
  2. 找到 WAN 接口,點擊 修改/編輯
  3. 切換到 DHCP 服務器 標籤頁
  4. 點擊 IPv6 設置 子標籤

禁用關鍵服務

在 IPv6 設置中,將以下三項全部設置為 已禁用

  • RA 服務(Router Advertisement):路由器通告服務
  • DHCPv6 服務:IPv6 地址分配服務
  • NDP 代理(Neighbor Discovery Protocol):鄰居發現協議代理

禁用 IPv6 服務

各項說明:

  • RA 服務:向局域網設備廣播 IPv6 路由信息
  • DHCPv6 服務:為客戶端分配 IPv6 地址
  • NDP 代理:處理 IPv6 鄰居發現請求

步驟三:調整高級設置

繼續在 WAN 接口的編輯頁面中:

  1. 切換到 高級設置 標籤頁

  2. 禁用 IPv6 分配長度

    • 找到 IPv6 分配長度 選項
    • 選擇 已禁用

禁用 IPv6 分配長度

  1. 取消內置 IPv6 管理
    • 找到 使用內置的 IPv6 管理 選項
    • 取消勾選 此選項

取消內置 IPv6 管理

  1. 點擊 保存(暫不應用)

WAN 接口高級設置

步驟四:配置 LAN 接口

LAN 接口的配置步驟與 WAN 接口類似:

  1. 網絡接口 頁面
  2. 找到 LAN 接口,點擊 修改/編輯
  3. 切換到 DHCP 服務器IPv6 設置
  4. 將以下三項設為 已禁用
    • RA 服務
    • DHCPv6 服務
    • NDP 代理
  5. 切換到 高級設置
  6. 禁用 IPv6 分配長度
  7. 取消 使用內置的 IPv6 管理
  8. 點擊 保存

重要提示:LAN 接口的配置直接影響內網設備,務必確保所有 IPv6 相關服務都已禁用。

步驟五:清除全局 IPv6 ULA 前綴

ULA(Unique Local Address)是 IPv6 的唯一本地地址,類似於 IPv4 的私有地址(192.168.x.x)。

  1. 進入 網絡接口
  2. 點擊頂部的 全局網絡選項 按鈕
  3. 找到 IPv6 ULA 前綴 輸入框
  4. 清空 其中的所有內容
  5. 點擊 保存並應用

清除 IPv6 ULA 前綴

注意:這一步非常關鍵,很多用戶遺漏後導致 IPv6 並未完全關閉。

步驟六:配置防火牆規則

  1. 進入 網絡防火牆
  2. 切換到 通信規則(或 流量規則)標籤頁
  3. 查找所有包含 IPv6 的規則,包括:
    • 入站 IPv6
    • 轉發 IPv6
    • 出站 IPv6
  4. 對這些規則執行以下操作:
    • 取消勾選 "啟用" 複選框
    • 或者直接 刪除 這些規則
  5. 滾動到頁面底部
  6. 點擊 保存並應用

禁用 IPv6 防火牆規則

建議操作:

  • 如果不確定哪些規則需要禁用,可以全部禁用 IPv6 相關規則
  • 保留 IPv4 規則不變
  • 應用後觀察網絡是否正常

步驟七:配置 DHCP/DNS

大雕/OpenWrt 衍生版本(如 LEDE)

  1. 進入 網絡DHCP/DNS
  2. 切換到 高級設置 標籤頁
  3. 找到 禁止解析 IPv6 DNS 記錄 選項
  4. 勾選 此選項
  5. 點擊 保存並應用

啟用 IPv6 DNS 過濾

原版 OpenWrt

原版 OpenWrt 可能沒有上述圖形化選項,需要通過 SSH 命令行配置(見下文方法二)。

原版 OpenWrt DHCP/DNS 設置

方法二:通過 SSH 命令行關閉 IPv6(推薦高級用戶)

對於熟悉 Linux 命令的用戶,SSH 方式更加高效和精確。

準備工作

  1. 啟用 SSH 服務

    bash
    # 如果 SSH 未啟用,先在 Web 界面開啟
    # 系統 → 管理權 → SSH 訪問 → 啟用
  2. 連接路由器

    bash
    # macOS/Linux
    ssh root@192.168.1.1
    
    # Windows(使用 PowerShell 或 CMD)
    ssh root@192.168.1.1
    
    # 或使用 PuTTY、Tabby 等 SSH 客戶端
  3. 輸入密碼登錄

    • 默認密碼通常是 password 或為空
    • 如果修改過,使用您設置的密碼

命令詳解

1. 禁用 AAAA 記錄解析(DNS 層面)

bash
# 設置 dnsmasq 過濾 AAAA 記錄(IPv6 DNS 記錄)
uci set dhcp.@dnsmasq[0].filter_aaaa='1'

# 提交更改
uci commit dhcp

# 重啟 DNS 服務使配置生效
/etc/init.d/dnsmasq restart

參數說明:

  • filter_aaaa='1':1 表示禁止解析 AAAA 記錄,0 表示允許
  • AAAA 記錄是 IPv6 的 DNS 記錄類型(對應 IPv4 的 A 記錄)
  • 禁用後,客戶端只會收到 IPv4 地址

2. 禁用 odhcpd 服務

bash
# 禁用 odhcpd(OpenWrt 的 DHCPv6/RA 守護進程)
/etc/init.d/odhcpd disable

# 停止正在運行的服務
/etc/init.d/odhcpd stop

說明:

  • odhcpd 負責提供 DHCPv6 和 RA 服務
  • 禁用後,路由器不再響應 IPv6 地址請求
  • 使用 disable 而非 stop 可確保重啟後依然生效

3. 內核層面禁用 IPv6

bash
# 在所有接口上禁用 IPv6
echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf

# 立即應用配置
sysctl -p /etc/sysctl.conf

說明:

  • /etc/sysctl.conf 是內核參數配置文件
  • net.ipv6.conf.all.disable_ipv6 = 1 禁用所有接口的 IPv6
  • sysctl -p 重新加載配置使其立即生效

4. 禁用特定接口的 IPv6(可選)

如果您只想禁用某個特定接口(如 eth0)的 IPv6:

bash
# 禁用 eth0 接口的 IPv6
echo 'net.ipv6.conf.eth0.disable_ipv6 = 1' >> /etc/sysctl.conf

# 應用配置
sysctl -p /etc/sysctl.conf

# 對其他接口重複上述操作(如 br-lan、pppoe-wan 等)
echo 'net.ipv6.conf.br-lan.disable_ipv6 = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

查看可用接口:

bash
# 列出所有網絡接口
ip link show

# 或
ifconfig -a

5. 完整的一鍵禁用腳本

您可以將以下命令保存為腳本文件,一次性執行:

bash
#!/bin/sh
# disable_ipv6.sh - OpenWrt 完全禁用 IPv6 腳本

echo "開始禁用 IPv6..."

# 1. 禁用 DNS AAAA 記錄解析
uci set dhcp.@dnsmasq[0].filter_aaaa='1'
uci commit dhcp
/etc/init.d/dnsmasq restart
echo "✓ DNS AAAA 過濾已啟用"

# 2. 禁用 odhcpd 服務
/etc/init.d/odhcpd disable
/etc/init.d/odhcpd stop
echo "✓ odhcpd 服務已禁用"

# 3. 內核層面禁用 IPv6
grep -q "net.ipv6.conf.all.disable_ipv6" /etc/sysctl.conf || \
  echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
echo "✓ 內核 IPv6 已禁用"

# 4. 清除 ULA 前綴
uci delete network.globals.ula_prefix 2>/dev/null
uci commit network
echo "✓ ULA 前綴已清除"

echo ""
echo "IPv6 禁用完成!建議重啟路由器以確保所有配置生效。"
echo "重啟命令:reboot"

使用方法:

bash
# 上傳腳本到路由器
scp disable_ipv6.sh root@192.168.1.1:/tmp/

# SSH 登錄後執行
ssh root@192.168.1.1
chmod +x /tmp/disable_ipv6.sh
/tmp/disable_ipv6.sh

驗證 IPv6 是否已完全關閉

配置完成後,請通過以下方法驗證 IPv6 是否已成功禁用。

方法一:檢查網絡接口狀態

bash
# 查看所有接口的 IPv6 地址
ip -6 addr show

# 如果輸出為空或只有 ::1/128(迴環地址),說明 IPv6 已禁用

預期結果:

# 成功禁用的輸出(應該很少或沒有)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

如果看到其他 IPv6 地址(如 fe80:: 開頭的鏈路本地地址),說明未完全禁用。

方法二:測試 DNS 解析

bash
# 測試域名解析,確認只返回 IPv4 地址
nslookup www.baidu.com

# 或使用 dig
dig www.baidu.com AAAA

預期結果:

  • nslookup 只顯示 IPv4 地址(如 14.215.177.39
  • dig AAAA 查詢應返回空結果或 status: NOERROR 但無答案

方法三:在線測試工具

在連接到路由器的設備上,訪問以下網站進行測試:

  1. test-ipv6.com

    • 應顯示"未檢測到 IPv6 地址"
    • 評分應為 0/10
  2. ipv6-test.com

    • IPv6 連接測試應失敗
    • IPv4 連接應正常
  3. whatismyv6.com

    • 不應顯示任何 IPv6 地址

方法四:ping 測試

bash
# ping IPv6 地址應該失敗
ping6 ipv6.google.com
# 或
ping -6 ipv6.google.com

# 預期結果:Network is unreachable 或 超時

方法五:檢查系統日誌

bash
# 查看是否有 IPv6 相關錯誤
logread | grep -i ipv6

# 查看 odhcpd 是否已停止
logread | grep odhcpd

預期結果:

  • 不應有活躍的 IPv6 連接日誌
  • odhcpd 應顯示已停止或禁用

常見問題與故障排查

問題一:配置後仍有 IPv6 地址

現象: 執行 ip -6 addr show 仍看到 fe80:: 開頭的地址

原因:fe80:: 是鏈路本地地址(Link-Local Address),即使禁用 IPv6 也會存在,這是正常的。

解決方案:

  • 鏈路本地地址僅在同一鏈路內有效,不會影響外網連接
  • 如果確實需要完全禁用,可以添加更嚴格的內核參數:
    bash
    echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf
    sysctl -p

問題二:客戶端仍能獲取 IPv6 地址

現象: 電腦或手機仍顯示有 IPv6 地址

原因:

  • 客戶端可能從上級設備(如光貓)獲取 IPv6
  • 路由器緩存未清除

解決方案:

  1. 確認光貓也已禁用 IPv6 或改為橋接模式
  2. 在客戶端設備上釋放並更新 IP:
    bash
    # Windows
    ipconfig /release6
    ipconfig /renew6
    
    # macOS/Linux
    sudo dhclient -6 -r
    sudo dhclient -6
  3. 重啟路由器:reboot

問題三:部分網站無法訪問

現象: 禁用 IPv6 後,某些網站打開緩慢或無法訪問

原因:

  • 某些網站優先使用 IPv6,禁用後需要等待 DNS 超時才回退到 IPv4
  • CDN 節點的 IPv4 地址可能不如 IPv6 優化

解決方案:

  1. 清除 DNS 緩存:
    bash
    /etc/init.d/dnsmasq restart
  2. 在客戶端刷新 DNS:
    bash
    # Windows
    ipconfig /flushdns
    
    # macOS
    sudo dscacheutil -flushcache
  3. 如果問題持續,考慮重新啟用 IPv6 並優化配置

問題四:重啟後配置丟失

現象: 重啟路由器後,IPv6 又恢復了

原因:

  • 某些配置未正確保存到 UCI 系統
  • /etc/sysctl.conf 未被正確加載

解決方案:

  1. 確認所有 uci commit 命令已執行
  2. 檢查 /etc/sysctl.conf 內容:
    bash
    cat /etc/sysctl.conf
  3. 確保開機啟動腳本中包含 sysctl -p
  4. 使用 Web 界面再次檢查所有設置

問題五:無法通過 SSH 連接

現象: 禁用 IPv6 後,SSH 連接失敗

原因:

  • SSH 監聽在 IPv6 地址上
  • 防火牆規則誤刪

解決方案:

  1. 通過 Web 界面或控制檯訪問
  2. 檢查 SSH 配置:
    bash
    cat /etc/config/dropbear
  3. 確保 SSH 監聽 IPv4:
    bash
    uci set dropbear.@dropbear[0].Interface='lan'
    uci commit dropbear
    /etc/init.d/dropbear restart

進階:選擇性啟用 IPv6

如果您只是想在某些場景下使用 IPv6,可以採用以下策略:

1. 僅在 WAN 口啟用 IPv6

bash
# 允許 WAN 口獲取 IPv6,但不在 LAN 廣播
# 在 WAN 接口啟用 DHCPv6 客戶端
# 在 LAN 接口禁用 RA 和 DHCPv6 服務

2. 雙棧模式優化

bash
# 同時啟用 IPv4 和 IPv6,但優先使用 IPv4
# 在 /etc/gai.conf 中配置地址選擇策略
echo 'precedence ::ffff:0:0/96  100' > /etc/gai.conf

3. 按需啟用

創建腳本根據需要動態啟用/禁用 IPv6:

bash
#!/bin/sh
# toggle_ipv6.sh

if [ "$1" = "on" ]; then
    echo "啟用 IPv6..."
    sed -i '/disable_ipv6/d' /etc/sysctl.conf
    sysctl -p
    /etc/init.d/odhcpd enable
    /etc/init.d/odhcpd start
elif [ "$1" = "off" ]; then
    echo "禁用 IPv6..."
    echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
    sysctl -p
    /etc/init.d/odhcpd disable
    /etc/init.d/odhcpd stop
else
    echo "用法: $0 [on|off]"
fi

性能影響分析

關閉 IPv6 後,您可能觀察到以下變化:

正面影響

內存佔用降低

  • 減少路由表條目
  • 節省約 10-50MB 內存(取決於設備)

CPU 負載減輕

  • 無需處理 IPv6 數據包
  • 減少協議棧開銷

啟動速度提升

  • 減少網絡初始化時間
  • 約快 5-15 秒

網絡延遲穩定

  • 避免 IPv6 回退導致的延遲抖動
  • DNS 解析更可預測

潛在影響

⚠️ 未來兼容性

  • 隨著 IPv6 普及,某些新服務可能僅支持 IPv6
  • 建議定期評估是否需要重新啟用

⚠️ 特定應用

  • 某些 P2P 應用在 IPv6 下表現更好
  • IoT 設備可能依賴 IPv6

總結

通過本文的詳細教程,您已經掌握了在 OpenWrt/LEDE 系統中徹底關閉 IPv6 的完整方法:

核心要點回顧

Web 界面配置:刪除 WAN6、禁用 RA/DHCPv6/NDP、清除 ULA 前綴
防火牆設置:禁用所有 IPv6 相關的入站/轉發/出站規則
DNS 過濾:啟用 AAAA 記錄過濾,防止返回 IPv6 地址
SSH 命令行:通過 UCI、sysctl、服務管理實現精確控制
驗證方法:多種手段確認 IPv6 已完全禁用
故障排查:5 類常見問題及詳細解決方案

最佳實踐建議

  1. 配置前備份:始終先備份當前配置
  2. 分步驗證:每完成一步就進行測試
  3. 文檔記錄:記錄所做的更改,便於日後恢復
  4. 監控觀察:配置後觀察幾天,確保網絡穩定
  5. 保持更新:關注 OpenWrt 版本更新,可能需要重新配置

何時重新啟用 IPv6

建議在以下情況考慮重新啟用 IPv6:

  • 運營商 IPv6 服務質量明顯改善
  • 需要使用僅支持 IPv6 的應用或服務
  • 進行網絡技術學習和實驗
  • 未來 IPv4 地址進一步枯竭時

關閉 IPv6 是一個權衡利弊的決定。對於大多數家庭用戶,在當前階段禁用 IPv6 可以獲得更穩定的網絡體驗。但隨著互聯網的發展,建議您定期評估這一決策的合理性。

IPv6 網絡協議概念圖

延伸閱讀:如果您對 OpenWrt 的其他網絡配置感興趣,可以查看我們的 PPPoE 撥號設置DDNS 動態域名配置 以及 實時抓包診斷

最後更新於: