打造内大最强路由器(四):细节优化:IPv6穿透、DNS设置、断网重连

IPv6

大部分的校园网中,IPv6地址只分配一次,下级设备则不再进行分配。

所以要手动处理一下,可以有以下几种方法:

  • 给IPv6部分也进行多拨、负载均衡
    这应该是最符合多拨理念的处理方式,但也是最难的方式,而且IPv6只能在路由器本身使用,客户端想用的话也许还得进行NAT。
    为lean大源码的多播插件添加ipv6负载均衡

  • 对IPv6进行NAT
    极力不推荐这种方式,因为IPv6的出现就是为了解决IPv4地址不够、运营商对其进行NAT的问题。而对IPv6进行NAT,反而会导致IPv6最重要的特性丢失,那我要这IPv6有啥用?

  • IPv6中继
    此方法虽然能让路由器和客户端都能使用原生IPv6地址,但是此方法不稳定,会导致IPv6部分偶尔断网,不推荐使用。

  • IPv6穿透
    引用一位博主的一段话,我觉得他说得很好。

‘穿透’说白了就是把路由器的内网暴露在网线那头的公网上(希望你听得懂),只不过这里是只把IPv6网络暴露在公网上。这样当我的电脑或手机连上路由器的时候,对于IPv6网络而言,我的电脑或手机是直接连上公网的(理解成没有经过路由器);也可以理解成对于IPv6而言,路由器是工作在交换机模式,对于公网而言路由器是透明的,DHCPv6服务器能直接看到我的电脑或手机,没有路由器挡着。这样电脑或手机就相当于是直接连着网线的,显然能获取到IPv6地址了。

这种方式就是把路由器的上游和路由器的下游连接起来,组成一条“链”,下游设备通过这条“链”直接连接校园网,所以能获取到IPv6地址。

但因为路由器本身并不在这条“链”上,所以路由器自身就无法使用IPv6了。不过也不是没有解决办法,后面详谈。

此方法适用于能免费使用IPv6的校园网。

IPv6穿透的实现

操作很简单,但需要固件有ebtables软件包。

  • 关闭odhcpd并禁止自启,防止它分配IPv6
/etc/init.d/odhcpd stop
/etc/init.d/odhcpd disable
  • 在自动认证脚本的后面加上两行代码

执行vi /etc/init.d/autologin,然后通过方向键将光标移动到最后一行,按o键在当前行的下方添加内容。

ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth0.2
brctl addif br-lan eth0.2

保存退出。

其中这里的eth0.2大有讲究,这个接口所连接的网线必须插在墙上的网口,而不是无线AP上的网口。

无线AP就是广播校园WIFI的白色盒子,这个盒子加了一些额外的规则,如果识别到你获取了IPv6地址却没有获取IPv4内网地址的话,会关闭这条线路上的IPv6连接。

如果你这里是eth0.3的网口连接着墙上的网口的话,那就改成eth0.3

  • 允许IPv6 DNS解析

网络->DHCP/DNS->高级设置里,把禁止解析 IPv6 DNS 记录的勾去掉,保存&应用

重启路由器,访问IPv6测试网站来测试效果。

img1

它这里甚至能识别我们用了隧道(穿透)。

  • 路由器自身获取IPv6

网络->接口页面添加新接口,协议选择DHCPv6 客户端,接口选择没被穿透的外网接口,防火墙设置里将它分配到wan保存&应用。这样路由器本身就能获取到IPv6地址了,对于需要在路由器上下种子的人来说很有帮助。

img2

img3

DNS设置

内大自己的DNS服务器实在是太烂了!

OpenWrt上能设置DNS的地方实在是太多了!

  • 每一个外网接口能设置DNS
  • 内网接口上能设置DNS
  • 网络->DHCP/DNS里能设置DNS
  • 各种各样的第三方软件包里能设置DNS

这其中有的是功能不相同的,有的是功能相同的,所以就很容易造成各种混乱与冲突。

所以我建议像我这样,让路由器要求客户端自己解析,并指定解析服务器。

进入网络->接口页面,修改LAN口设置。

划到下方,在DHCP 服务器->高级设置里,勾选强制,并在DHCP 选项里填上6,114.114.114.114,119.29.29.29

其中这里的6是参数,不可删除;114.114.114.114,119.29.29.29是DNS服务器,可以换成其他的,用英文逗号分隔。

img4

注意,使用闭源驱动的固件在修改LAN口设置的时候会导致无线关闭!

保存&应用前,先检查是否是用网线连接了路由器,设置完之后记得去网络->无线->重启无线

通过WIFI重新连接路由器,查看连接详情。设置正确的话,应该是像我这样能看到DNS服务器的。

img5

断网重连

有时候总会有一些奇怪的断网问题,原因未知。

为了保证使用体验,还是写了一个断网重连模块。

  • 这次我们放在 /root 下
cd root
vi reconnect
  • 复制以下代码,并把28、29行的接口、接口名、关键参数改为自己的,然后粘贴到刚刚创建的文件里去

请注意,接口名务必和创建接口时填入的接口名大小写一致

#!/bin/sh

reconnect(){
	for n in 1 2 3
	do
		ping -c 1 -I $1 119.29.29.29
		if [ $? == 0 ];then
			flag=false
			break
		else
			flag=true
		fi
	done

	if [ "$flag" == true ];then
		ping -I $1 -c 1 202.207.0.6
		if [ $? != 0 ];then
			echo $(date) "端口$1断线,并且无法ping通校内DNS服务器" >> /root/log
			ifup $2
			sleep 10
		else
			echo $(date) "端口$1断线" >> /root/log
		fi
		curl --interface $1 -d "$3" http://172.31.99.50:802/include/auth_action.php
	fi
}

VLAN_ID_1="eth0.2"   interface_name_1=wan0   user_1="账号1的关键参数"
VLAN_ID_2="eth0.3"   interface_name_2=wan1   user_2="账号2的关键参数"

reconnect $VLAN_ID_1 $interface_name_1 $user_1
reconnect $VLAN_ID_2 $interface_name_2 $user_2

逻辑也比较简单,多次ping腾讯DNS,只要有一次通过即视为正常;

当无法ping通DNS但可以ping通校内DNS服务器时,进行认证操作;

当无法ping通DNS也无法ping通校内DNS服务器时,对接口进行重新连接并认证。

  • 给文件添加执行权限
chmod +x reconnect
  • 启用计划任务

系统->计划任务里,添加以下行:

*/1 * * * * /root/reconnect

这里的*/1表示每分钟执行一次。请保证末尾至少有一个空白行!

img6

点击提交即可生效。

如需查看重连记录,可执行cat /root/log来查看。

End

到这里,你的路由器已经是一台受过高等教育的路由器了,拥有非常优秀的体验。

后续的博文将进行一些无关紧要的研究,敬请期待。

部分参考资料

信息黄埔校园网ipv6路由处理