本隨筆針對高校支持ipv6的校園網,ipv6由上游路由器dhcp動態分配(無狀態),電腦直連可以通過dhcp獲取到ipv6的地址(前提)。
路由器CPU :MTK MT7620A/MT7621AT
路由器運行PandoraBox 18.10
IPV6-中繼轉發
實現環境:湖南科技大學校園網家屬區環境
逛Pangubox論壇發現了很好的方法,該方法基於中繼轉發,可以在不添加任何安裝包的情況下,通過修改配置實現。
相關教程網址:https://blog.rabit.pw/2017/lede-ipv6
在校園網環境可能還需要修正默認路由,請參考IPV6-NAT的方法二的第三步進行修正,當此方式無效再嘗試NAT
本人根據自身所處校園網環境的實際情況,在借鑒上述教程的基礎上,對部分無用配置做了刪除精簡,目前並未發生異常。
配置IPV6中繼轉發
SSH或者WinSCP進路由器。修改 /etc/config/dhcp ,修改LAN的DHCP配置區,新增WAN6的DHCP配置區。
按如下配置修改:
config dhcp 'wan6'
option ra 'relay'
option ndp 'relay'
#option dhcpv6 'relay'
option master '1'
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option ra 'relay'
#option dhcpv6 'relay'
option ndp 'relay'
個人解釋(大意猜的):開啟WAN6區域的DHCP路由通告和NDP中繼,並設置為主區域(DHCPv6服務器所在區域),LAN區域同樣開啟DHCP路由通告和NDP中繼,默認為從屬區域(DHCPv6客戶端所在區域)。因為我校校園網家屬區的IPV6地址是SLACC無狀態下發的所以不需要開啟DHCPv6的中繼服務,wan口復制一份wan6的配置似乎沒有必要,二者從屬eth0.2的接口,中繼一份應該可以了,從抓包的結果來分析,br-lan的RA報文從兩條減少到一條,看來配置是正確的。
在學生區上網,則關閉NDP轉發,開啟DHCPv6報文轉發,因為學生區上網是通過DHCPv6服務器動態下發地址的,但是因為服務器不支持中繼應答,無法實現,下圖抓取的報文不見Relay-reply。

使用該方法實現,IPV6流量在開啟硬件加速的情況下改走硬件轉發引擎,不再占用CPU,轉發效率極高。
本方式的不足之處:
使用此種方式,NDP不會轉發同一前綴下的NS鄰居請求到上級網關,故如果有設備不接在本路由器的LAN區域下而是WAN區域下,但是前綴相同,后端設備會因為得不到NA響應而顯示無法連接。解決方式是路由器上ping一次即可,路由器會向WAN口發送NS請求從而得到上級網關的響應,鄰居表就會建立,鏈路將被打通(IPV6-NAT方式不受此影響)。
附:1、該方式對於本人的WIN10 無線網絡(適配器Intel AC 3168)有BUG,當第二次重新連接WIFI時,IPV6不能獲取相關的公網地址,造成鏈路不通。臨時解決方式為重置無線網絡適配器。
2、該方式在一段長的時間(如一晚上)后v6鏈路會失效,具體原因可能與路由器鄰居關系異常有關,在最壞情況下需要重置路由器的network,NAT實現方式無此問題。
IPV6-NAT
實現環境:湖南科技大學校園網學生區+家屬區環境
方法一(個人表示有一定的不穩定):
參考自https://wiki.openwrt.org/doc/howto/ipv6.nat6的教程,
以上同時參考的官方文檔:https://wiki.openwrt.org/doc/howto/ipv6.nat6,已經弄清了里面第四步里的firewall.d script的使用方法,官網的文檔代碼老舊,在最新的機子上面可能出錯,最新的代碼在代碼提供者的github上面有:https://wiki.openwrt.org/doc/howto/ipv6.nat6
一、安裝必須的軟件包
首先在ipv4已聯網的條件下安裝必要的軟件:
opkg update && opkg install kmod-ipt-nat6
二、配置WAN6和LAN接口及全局ULA設置
檢查wan6是否有ipv6地址,如果沒有設置wan6,保證有ipv6地址

然后把IPv6 ULA前綴第一個字母改成d開頭的:
這個luci下面改吧,命令怪怪的

官方文檔對這個操作的解釋是:默認前綴是非全局路由的地址,大多路客戶端在沒有全局IPv6地址的情況下只有IPv4地址,所以需要將前綴改成未使用過的全局地址的樣子。
接下來更改DHCP服務器的設置,默認有狀態分配即可(方便管理),當然你也可以兩者都有:

三、修改系統文件,開啟轉發
修改/etc/sysctl.conf,將以下內容加進去,大意說接收廣播並開啟IPv6轉發
net.ipv6.conf.default.forwarding=2 net.ipv6.conf.all.forwarding=2 net.ipv6.conf.default.accept_ra=2 net.ipv6.conf.all.accept_ra=2

接着在/etc/firewall.user添加防火牆規則:
ip6tables -t nat -I POSTROUTING -s $(uci get network.globals.ula_prefix) -j MASQUERADE
重啟之后就能通過路由器上v6。
方法二(推薦):
參考清華大學的IPv6NAT教程:https://github.com/tuna/ipv6.tsinghua.edu.cn/blob/master/openwrt.md
本方法基於上述教程,但是結合自身和實際遇到的情況做了修改。同時參考了方法一,前提條件與方法一一致。
一、安裝必須的軟件包,配置接口
首先在ipv4已聯網的條件下安裝必要的軟件:
opkg update && opkg install ip6tables kmod-ipv6 kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra luci-proto-ipv6
iputils-traceroute6不進行安裝是該功能已經由BusyBox提供了。
接下來同樣是檢查是否有IPV6地址,和把IPv6 ULA前綴第一個字母改成d開頭的,與方法一第二步驟相同,這樣下端設備會默認用IPV6而不是IPV4(fd開頭的則默認IPV4)。
二、打開IPv6 NAT
因為OpenWRT默認的防火牆配置不會管IPv6的nat表,需要在/etc/firewall.user里面手動配置
WAN6=eth0.2 LAN=br-lan ip6tables -t nat -A POSTROUTING -o $WAN6 -j MASQUERADE ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT ip6tables -A FORWARD -i $LAN -j ACCEPT
接下來在修改/etc/config/firewall里面的設置,在wan區域增加一條
option masq6 '1'
#你的wan區域可能是下面這樣的:
config zone option name 'wan' list network 'wan' list network 'wan6' option input 'REJECT' option output 'ACCEPT' option forward 'REJECT' option masq '1' option mtu_fix '1'
#然后你加入那條語句進去就好,靠在option masq '1'下面就好
三、重新配置默認路由
在路由器上ip -6 route看一下自己的默認路由。如果獲得的是
default from 2001:250:x:xxxx::/128 via fe80::xxxx:xxxx:xxxx:xxxx dev eth0 proto static metric 512
這樣的路由配置在轉發NAT包的時候會有問題,需要把去掉from 2001:250:x:xxxx::/128這一部分的以后的默認路由添加到路由表中,實現所有外網地址均向默認路由進行轉發。新建一個/etc/hotplug.d/iface/99-ipv6,它的內容是
#!/bin/sh [ "$ACTION" = ifup ] || exit 0 [ "$INTERFACE" = wan6 ] || exit 0 #注:在接口重置的時候運行腳本,可能會得到多條默認路由,有些是不可達的,我增加了一條指令來刪除多余的路由,再把修改好的命令進行運行。在實地測試中發現了這個不完善的地方,並進行了修補。 ip -6 route add `ip -6 route show default|sed -e 's/from [^ ]* //'|sed -e '2,$d'` logger -t IPv6 "Add IPv6 default route."
最后,記住給這個腳本加上權限。
chmod a+x /etc/hotplug.d/iface/99-ipv6
最后附成功圖片

后記:本以為路由器會穩定點,然而我還是想錯了,事實證明,自己電腦以前v6經常連上一會就斷線是上游服務器的鍋,沒法,寫個監控腳本來重連v6
最開始寫的時候總是寫不對,看着網上的教程估計是不匹配,最后找到個網站,總算是解決shell的編寫問題了,網站地址:https://www.lifewire.com/ash-linux-command-4095519
再次編輯的補充:使用方法二后鏈路穩定下來了,可以不需要監控腳本,如果想打個保險的話依舊可以使用的。
附自己寫的監控腳本:
#!/bin/sh echo ---校園網IPv6守護進程啟動--- echo ---版本類型:守護進程--- echo ---開始檢測v6網絡連接情況--- while !(/bin/ping -c 1 2001:4860:4860::8888 >/dev/null) do echo ---檢測到v6斷線--- /sbin/ifup wan6 echo ---重置wan6端口--- tries=0 while [[ $tries -lt 3 ]] do if /bin/ping -c 1 2001:4860:4860::8888 >/dev/null then echo --- 重連成功 --- echo ---校園網IPv6已連線--- break fi tries=$((tries+1)) sleep 10 done done #計划任務添加項目 #*/2 * * * * sh /root/IPv6_Monitor.sh
腳本第二版更新,可參考,但不得用於商業用途,整合原校園網認證(portal方式,采用wegt發送portal包實現認證),當然也可以試試curl、easyDrcom。
#!/bin/sh #sleep 100 cd /tmp DATE=`date +%Y-%m-%d-%H:%M:%S` tries=0 ipv4_OK=false ipv6_OK=false echo ---校園網守護進程啟動--- echo ---版本類型:IPv4守護進程--- echo ---開始檢測網絡連接情況--- while [[ $tries -lt 1 ]] do if /bin/ping -c 1 www.baidu.com >/dev/null then echo --- 連接成功 --- # echo $DATE OK >>my_watchdog.log echo ---校園網正常在線--- ipv4_OK=true break fi tries=$((tries+1)) sleep 10 # echo $DATE tries: $tries >>my_watchdog.log done if !($ipv4_OK) then echo ---網絡連接失敗--- cd /tmp echo ---監測到校園網斷線,重新連接--- #這個打開瀏覽器開發者工具,到網絡哪里去看,認證一次就會出現portal包,自己看包內的內容填入即可,下面附一個示例,注:前面的username和password也可能是其他的名稱,具體以瀏覽器開發工具看到的為准 wget --post-data="username=你的用戶名&password=你的密碼" --save-cookies=cookie.txt --keep-session-cookies "認證服務器地址" rm -f "生成的某個文件(文件名不確定),你同樣可以不刪除,這個放在內存中,重啟就會消失的" rm -f cookie.txt #已經確定的一個文件名 echo ---校園網已重連--- #echo $DATE IPv4_CONNECT! >>my_watchdog.log fi #echo $DATE CONNECT! >>my_watchdog.log echo ---版本類型:IPv6守護進程-- echo ---開始檢測v6網絡連接情況--- if /bin/ping6 -c 1 2620:0:ccc::2 >/dev/null then echo ---校園網IPv6已連接-- ipv6_OK=true
fi if !($ipv6_OK) then valuetry=0 while [[ $valuetry -lt 3 ]] do echo ---檢測到v6斷線--- valuetry=$((valuetry+1)) echo ---第$valuetry次嘗試 /sbin/ifup wan6 echo ---重置wan6端口--- tries=0 while [[ $tries -lt 3 ]] do if /bin/ping6 -c 3 2620:0:ccc::2 >/dev/null then echo --- 校園網IPv6重連成功 --- echo --- 校園網IPv6已連接 --- #echo $DATE IPv6_CONNECT! >>my_watchdog.log exit 0 fi tries=$((tries+1)) done done echo ---重連失敗--- fi #計划任務添加項目 #*/3 * * * * sh /root/IPv4&&IPv6_Monitor.sh
