February 21Feb 21 Debian 13 從核心層面徹底停用 IPv6 ------ 前言 ------ 雖然 IPv6 是未來的網路通訊協定趨勢,但在某些特定場景下,我們可能希望完全關閉 IPv6 功能。常見的應用情境包括: 網路故障排查:釐清問題是否與 IPv6 相關 老舊應用程式相容性:部分舊版軟體對 IPv6 支援不佳 安全性考量:減少網路攻擊面,簡化網路堆疊 資源受限環境:降低系統負載,避免不必要的網路流量 對於 Debian 13 用戶而言,單純透過系統設定「關閉」IPv6 並不夠徹底 本文將從核心引導參數著手,讓 IPv6 協定棧在系統啟動初期就完全停用,從根源杜絕任何 IPv6 流量的產生 ----------------------------- 為什麼要從核心層面停用? ----------------------------- 常見的停用方法 (如調整 sysctl 參數) 雖然有效,但存在一個時間窗口:這些設定在系統啟動後的階段才生效 這意味著在參數應用之前,核心的 IPv6 模組已經載入,可能會產生短暫的 IPv6 流量,如鄰居發現 (Neighbor Discovery)、路由器請求 (Router Advertisement) 等流量 透過核心參數 ipv6.disable=1,可以直接命令核心不初始化 IPv6 子系統,這才是真正意義上的完全關閉 ------------------ 安全性提醒 ------------------ 停用 IPv6 可能影響某些雲端服務或 CDN (如 Cloudflare、Google),建議先確認應用場景是否允許 --------------------------- 修改 GRUB 核心啟動參數 --------------------------- 使用 root 權限開啟 GRUB 設定檔 vi /etc/default/grub 修改核心啟動參數 在檔案中找到 GRUB_CMDLINE_LINUX_DEFAULT 這行,通常預設如下: GRUB_CMDLINE_LINUX_DEFAULT="quiet" 在引號內追加參數 ipv6.disable=1,修改後應如下: GRUB_CMDLINE_LINUX_DEFAULT="quiet ipv6.disable=1" 重要提醒: 如果該行中原本有其他參數 (如 splash、net.ifnames=0 等),請務必保留它們,只需在末尾加入 ipv6.disable=1,並用空格與前面的參數隔開 儲存檔案並離開編輯器 按 Esc,輸入 :wq 後按 Enter ----------------- 更新GRUB配置 ----------------- 執行以下指令,使修改生效: update-grub 成功執行後,應看到類似 Found linux image: ... 的輸出,且沒有錯誤訊息 --------- 重開機 --------- 核心參數的變更需要重啟才能生效 reboot -------------- 驗證與排查 -------------- 確認核心參數已套用 重開機後執行 cat /proc/cmdline 應包含:ipv6.disable=1 若沒有出現,表示 GRUB 未成功更新 重開機後,檢查 IPv6 位址是否存在 ip a | grep inet6 沒有任何輸出 或只看到 ::1 (IPv6 的 loopback 位址,在極少數情況下可能仍有顯示) 通常表示已成功停用 測試 IPv6 連線 ping6 google.com 預期結果應顯示:connect: Network is unreachable 檢查核心設定 grep CONFIG_IPV6 /boot/config-$(uname -r) 輸出 CONFIG_IPV6=y 是正常的,這表示 IPv6 是編譯進核心而非模組,我們只能「停用」而非「移除」它 確認核心是否接受停用指令 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 返回 1:完美,IPv6 已停用 返回 0:停用失敗,請檢查 GRUB 設定是否有拼寫錯誤,或是否有其他服務 (如 systemd-networkd) 覆蓋了核心設定 ------------------ 終極驗證方式 ------------------ 指令 sysctl net.ipv6.conf.all.disable_ipv6 若出現以下訊息,代表 IPv6 子系統真的完全不存在了: sysctl: cannot stat /proc/sys/net/ipv6/conf/all/disable_ipv6: No such file or directory 即使核心停用了IPv6,某些應用程式 (如 curl、wget) 或服務在解析DNS時,仍可能會因為 glibc 的位址選擇規則而產生短暫的IPv6連線嘗試 雖然此時網路層會直接拒絕,但為了追求極致純淨,建議額外進行以下操作 編輯 /etc/gai.conf vi /etc/gai.conf 這個檔案控制了位址解析的優先權。找到如下行並取消註釋,告訴系統優先使用IPv4映射位址: 找到下面這一行,去掉前面的 '#' 號 precedence ::ffff:0:0/96 100 儲存檔案並離開編輯器 按 Esc,輸入 :wq 後按 Enter ------- 補充 ------- 後續優化設定 即使核心層面已停用 IPv6,某些應用程式或服務仍可能嘗試使用 IPv6,導致延遲或日誌錯誤。以下提供幾個補充設定,讓系統更純淨 ---------------------------- SSH伺服器的「監聽限制」 ---------------------------- 許多SSH設定預設會監聽 any (包含 v4/v6)。雖然核心關閉了,但建議明確指定IPv4協議 編輯 /etc/ssh/sshd_config vi /etc/ssh/sshd_config 找到 #AddressFamily any 這行,取消註解並修改為 AddressFamily inet 儲存檔案並離開編輯器 按 Esc,輸入 :wq 後按 Enter 重新啟動SSH服務 systemctl restart ssh 驗證SSH服務狀態是否正常 systemctl status ssh ---------------------------- 清理 /etc/hosts 檔案 ---------------------------- /etc/hosts 通常包含 ::1 localhost 的條目,雖然不影響網路流量,但某些應用程式會優先嘗試解析 IPv6 位址而導致延遲 編輯 hosts 檔案 vi /etc/hosts 將含有 ::1 的行刪除或加上註解 # ::1 localhost ip6-localhost ip6-loopback # ff02::1 ip6-allnodes # ff02::2 ip6-allrouters 儲存檔案並離開編輯器 按 Esc,輸入 :wq 後按 Enter --------------------- 強制 APT 使用 IPv4 --------------------- 避免 APT 在更新時嘗試連接 IPv6 鏡像站 echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4 確認設定已寫入 cat /etc/apt/apt.conf.d/99force-ipv4 ---------------------------- 黑名單IPv6模組 (進階保護) ---------------------------- 建立模組黑名單檔案 vi /etc/modprobe.d/blacklist-ipv6.conf 加入以下內容 blacklist ipv6 儲存檔案並離開編輯器 按 Esc,輸入 :wq 後按 Enter 儲存後,更新 initramfs 使黑名單在開機時生效 update-initramfs -u ----------------- 封包監聽驗證 ----------------- 安裝 apt install tcpdump -y 使用 tcpdump 監聽所有介面的 IPv6 封包 tcpdump -i any ip6 正常情況下應沒有任何封包輸出 若在 VPS/雲主機 上仍看到 IPv6 封包,可能是由以下原因造成: Hypervisor 層級注入的封包 Host bridge 發送的封包 主機商網路層送入的封包 這些情況並非主機內部問題,無需擔心 ----------------- 常見問題與排除 ----------------- Q1:為什麼修改 GRUB 後 IPv6 沒有關閉? 可能原因: GRUB 設定檔拼寫錯誤 (如 ipv6.disable=1 誤寫為 ipv6.disable=0) 忘記執行 update-grub 更新設定 有其他服務 (如 NetworkManager、systemd-networkd) 覆蓋了核心設定 Q2:關閉 IPv6 會影響系統正常運作嗎? 一般不會。大多數應用程式在 IPv6 不可用時會優雅地降級使用 IPv4。但如果某些服務強制依賴 IPv6,可能會出現異常,此時建議保留 IPv6
Create an account or sign in to comment