現在的教育網和寬帶基本都提供了IPv6支持。但是,由於網絡性質使然,IPv6並不能像IPv4那樣,直接使用路由器共享,這使得路由器接入IPv6後,所有連接到路由器的設備都不能連接v6。
爲此,必須對路由器進行一番魔改。如果路由器使用的是OpenWrt,或基於OpenWrt的固件,那麼在經過一番設置後,IPv6的共享就不再是傳說了。
設置腳本
爲了方便路由器的配置,我將所有設置過程做成了一個腳本,並在GitHub上開源。
使用腳本的步驟很簡單,只要你準備好用於發送文件的WinSCP,與用於遠程登錄路由器的PuTTY。
-
第一步,使用WinSCP,登錄到路由器上,並將
operation.sh
上傳到/tmp
文件夾中。 -
第二步,使用PuTTY或WinSCP自帶的Shell,運行
/tmp/operation.sh
。稍等片刻,即可配置好。下次重啓路由器,就可以自動將WAN的IPv6共享給路由器局域網內的設備了。
如果使用Linux,或在Windows下使用Cygwin或Git-SCM(一個在Windows下使用Git的套件),那麼使用它們自帶的scp
和ssh
工具,會方便得多:
# 將腳本發送到路由器上。注意路由器地址
scp operation.sh [email protected]:/tmp/
# 在路由器上運行腳本
ssh [email protected] "chmod +x /tmp/install.sh; sh /tmp/operation.sh"
原理
腳本完成的設置過程,包括瞭如下具體操作:
(1)安裝kmod-ipt-nat6
kmod-ipt-nat6
是用於啓用IPv6 NAT的內核模塊。在OpenWrt中,使用包管理工具opkg
進行安裝。
opkg update
opkg install kmod-ipt-nat6
(2)更改IPv6 ULA前綴
ULA,全稱爲“唯一的本地IPv6單播地址”(Unique Local IPv6 Unicast Address)[1]。這一步,我們要把它的前綴由f
改爲d
,以將本地的IPv6地址向外廣播,而不是localhost那樣的閉環。
用於實現這一步的腳本如下:
uci set network.globals.ula_prefix="$(uci get network.globals.ula_prefix | sed 's/^./d/')"
uci commit network
OpenWrt的屬性參數由uci
工具管理,類似於Android的property機制(setprop
/getprop
),使用“域”來組織各類參數。腳本的第一行,在$()
中調用uci
命令,獲取當前的ULA前綴,將執行結果傳遞給sed
命令。這裏sed
命令使用了替換語法——sed 's/<原文本>/<替換文本>/'
,將開頭第一個字符替換爲字符“d
”。Shell的$()
語法可將命令運行結果作爲文本使用,那麼該用法內的命令結果就作爲新的ULA前綴被應用。最後,運行第二行的命令,提交修改。
-
《IPv6地址》. 北海石松 - 博客園. https://www.cnblogs.com/gogly/articles/2558150.html ↩