Pandorabox等類OpenWrt的路由器 實現后端設備接入IPV6(中繼代理+NAT)


本隨筆針對高校支持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
推薦用WinSCP修改 

接着在/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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM