本随笔针对高校支持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。

路由器 中继 vlan_服务器

使用该方法实现,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地址

路由器 中继 vlan_IPV6_02

 

然后把IPv6 ULA前缀第一个字母改成d开头的:

这个luci下面改吧,命令怪怪的

路由器 中继 vlan_服务器_03

官方文档对这个操作的解释是:默认前缀是非全局路由的地址,大多路客户端在没有全局IPv6地址的情况下只有IPv4地址,所以需要将前缀改成未使用过的全局地址的样子。

接下来更改DHCP服务器的设置,默认有状态分配即可(方便管理),当然你也可以两者都有:

路由器 中继 vlan_服务器_04

 

三、修改系统文件,开启转发

修改/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修改 

路由器 中继 vlan_路由器 中继 vlan_05

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

 

最后附成功图片 

路由器 中继 vlan_路由器 中继 vlan_06

后记:本以为路由器会稳定点,然而我还是想错了,事实证明,自己电脑以前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