打造内大最强路由器(四):细节优化: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测试网站来测试效果。
它这里甚至能识别我们用了隧道(穿透)。
- 路由器自身获取IPv6
在网络
->接口
页面添加新接口
,协议选择DHCPv6 客户端
,接口选择没被穿透的外网接口,防火墙设置
里将它分配到wan
,保存&应用
。这样路由器本身就能获取到IPv6地址了,对于需要在路由器上下种子的人来说很有帮助。
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服务器,可以换成其他的,用英文逗号分隔。
注意,使用闭源驱动的固件在修改LAN
口设置的时候会导致无线关闭!
在保存&应用
前,先检查是否是用网线连接了路由器,设置完之后记得去网络
->无线
->重启无线
。
通过WIFI重新连接路由器,查看连接详情。设置正确的话,应该是像我这样能看到DNS服务器的。
断网重连
有时候总会有一些奇怪的断网问题,原因未知。
为了保证使用体验,还是写了一个断网重连模块。
- 这次我们放在 /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
表示每分钟执行一次。请保证末尾至少有一个空白行!
点击提交
即可生效。
如需查看重连记录,可执行cat /root/log
来查看。
End
到这里,你的路由器已经是一台受过高等教育的路由器了,拥有非常优秀的体验。
后续的博文将进行一些无关紧要的研究,敬请期待。