大約從 J2SE 1.4/1.6 開始,Sun 所釋出的 Java runtime 開始支援 IPv6 連線功能。一般的 Linux 的套件系統 也開始支援 IPv6,許多系統預設是同時開啟 IPv4/IPv6 或稱為 Dual Stack 網路功能。
基本上,鼓勵各種軟體開始移植到 IPv6 網路上是一件好事。Java runtime 若在 dual-stack 的機器上,預設走 IPv6 位址,因為 IPv6 位址可同時走 IPv4/IPv6 網路。不過問題在於,若一般的 GNU/Linux Debian, Ubuntu 系統,預設會啟動 IPv6 介面,無論你所在網路是否有 IPv6 路由。
於是,你若在 Linux 上使用一些 Java 寫成的網路軟體,如 JDownloader 等,很有可能發生軟體運作後,卻什麽地方都連不上的症狀。解決辦法一是關閉 IPv6 網路功能,一則是利用 JRE 的參數,改為預設使用 IPv4 網路。
檢查 IPv6 是否驅動
首先,你若想確認是否開啟了 IPv6 網路,可於終端機下使用此指令判斷
$ ip addr|grep inet6
若出現了 inet6 之位址,即為開啟了 IPv6 網路。
你若想快速的關閉 IPv6 功能,可以利用 root 執行 ip 指令,直接刪除 inet6 位址
/sbin/ip addr del <ipv6address>/<prefixlength> dev ethX
舊版核心
在舊版核心,IPv6 功能是以模組方式存在,妳可以透過更改 modprobe (module-init-tools) 的設定,讓系統不載入對應驅動程式。關閉的方式很簡單,請修改 /etc/modprobe.d/ 之設定,如以 root 執行以下指令
# cat > /etc/modprobe.d/00local.conf <<EOF alias net-pf-10 off alias ipv6 off EOF
更改之後,重新開機即可關閉 IPv6 功能。
新版核心
在新版的 Debian/Ubuntu 中使用 2.6 核心,因為內建 IPv6 驅動程式, 你得利用開機參數 (cmdline) 關閉之。作法是修改 /etc/default/grub 檔案,更改 GRUB_CMDLINE_LINUX_DEFAULT 一行,加入 ipv6.disable=1,如
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet"
修改完畢後,請用 root 執行 update-grub 後,重新開機。
JRE 參數
另外一項作法是更改 JRE 參數,你若知道啟動該軟體的 shell script 位於何處,可新增一參數如下
$ java -Djava.net.preferIPv4Stack=true Main
這樣就可以要求 JVM 預設使用 IPv4 stack.
這是一篇 Tips.
修訂紀錄 (20100207): 補充利用 iproute 關閉 ipv6 方法,說明新舊版核心處理方式。
Pingback: resin 与 ipv6 的小问题 « Hello, SA()