本隨筆針對高校支持ipv6的校園網,ipv6由上游路由器dhcp動態分配(無狀態),電腦直連能夠經過dhcp獲取到ipv6的地址(前提)。linux
路由器CPU :MTK MT7620A/MT7621ATgit
路由器運行PandoraBox 18.10github
IPV6-中繼轉發shell
實現環境:湖南科技大學校園網家眷區環境後端
逛Pangubox論壇發現了很好的方法,該方法基於中繼轉發,能夠在不添加任何安裝包的狀況下,經過修改配置實現。瀏覽器
相關教程網址:https://blog.rabit.pw/2017/lede-ipv6bash
在校園網環境可能還須要修正默認路由,請參考IPV6-NAT的方法二的第三步進行修正,當此方式無效再嘗試NAT服務器
本人根據自身所處校園網環境的實際狀況,在借鑑上述教程的基礎上,對部分無用配置作了刪除精簡,目前並未發生異常。cookie
配置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方式不受此影響)。
附:一、該方式對於本人的WIN10 無線網絡(適配器Intel AC 3168)有BUG,當第二次從新鏈接WIFI時,IPV6不能獲取相關的公網地址,形成鏈路不通。臨時解決方式爲重置無線網絡適配器。
二、該方式在一段長的時間(如一夜)後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
1、安裝必須的軟件包
首先在ipv4已聯網的條件下安裝必要的軟件:
opkg update &&
opkg
install kmod-ipt-nat6
2、配置WAN6和LAN接口及全局ULA設置
檢查wan6是否有ipv6地址,若是沒有設置wan6,保證有ipv6地址
而後把IPv6 ULA前綴第一個字母改爲d
開頭的:
這個luci下面改吧,命令怪怪的
官方文檔對這個操做的解釋是:默認前綴是非全局路由的地址,大多路客戶端在沒有全局IPv6地址的狀況下只有IPv4地址,因此須要將前綴改爲未使用過的全局地址的樣子。
接下來更改DHCP服務器的設置,默認有狀態分配便可(方便管理),固然你也能夠二者都有:
3、修改系統文件,開啓轉發
修改/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
本方法基於上述教程,可是結合自身和實際遇到的狀況作了修改。同時參考了方法一,前提條件與方法一一致。
1、安裝必須的軟件包,配置接口
首先在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)。
2、打開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'下面就好
3、從新配置默認路由
在路由器上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