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

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

本方法基於上述教程,可是結合自身和實際遇到的狀況作了修改。同時參考了方法一,前提條件與方法一一致。

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
相關文章
相關標籤/搜索