Jump to content
View in the app

A better way to browse. Learn more.

PHP论坛人

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Debian 13 從核心層面徹底停用 IPv6

Featured Replies

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

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.