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