手动随机生成ipv6地址实现只给特定设备分配ipv6
缘起
虽然现在运营商基本都给到了ipv6地址,但是目前各个网站、应用之类的适配并不完全,且有些安全问题。
但是诸如p2p下载之类的应用,ipv6目前还是能够起到加速下载作用的,因此就有了局域网默认不开ipv6,但是下载机器能够手动获取到ip地址。
折腾过程
路由器设置ipv6
路由器可以开启ipv6,但是关闭掉ipv6路由广播
(各类路由器名称可能有差异),这样的话就会默认拨号获取到ipv6地址,但是不会广播导致局域网客户端都获取到ipv6了。
路由器通过snmap发布ipv6网段信息
这块需要路由器支持snmp服务,一般的华硕或者openwrt都是支持的。
1、开启路由器脚本功能
在华硕路由器上开jffs自定义脚本即可,openwrt上安装snmp软件包即可
2、增加snmp相关脚本
在华硕路由器上,可以在如下文件增加配置
# 打开文件 vi /jffs/configs/snmpd.conf.add # 增加相关脚本配置,比如 extend .1.3.6.1.2.1.25.1.16 jffs /bin/sh /jffs/scripts/snmp/jffs.sh # 写相关脚本文件,直接echo ipv6地址即可(地址获取可以用ip adr命令后过滤得到) vi /jffs/scripts/snmp/jffs.sh
至此,就可以通过snmp发布ipv6的网段了。
下载客户端手动生成ipv6
由于关闭了广播,客户端需要手动生成ipv6了,这块有个问题,就是需要知道当前ipv6地址的网段,然后在剩余的部分进行随机生成。
客户端可以通过snmp获取到路由器发布的ipv6网段,命令如下:
/usr/bin/snmpwalk -v 2c -c xxx 192.168.0.1 .1.3.6.1.2.1.25.1.16
其中.1.3.6.1.2.1.25.1.16
需要和配置的一致。
ipv6地址随机生成
可以使用类似如下简单脚本生成:
array=( 1 2 3 4 5 6 7 8 9 0 a b c d e f ) network=20d1:4d0:2d:3d7 # your ipv6 network prefix rnd_ip_block () { a=${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]} b=${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]} c=${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]} d=${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]} echo $network:$a:$b:$c:$d }
增加定时任务
可以通过ping6命令,ping一些公共的ipv6地址(比如阿里云的ipv6 dns地址),判断当前的ipv6是否失效了,如果失效了可以重新生成。
通过crontab,就可以定时(比如一分钟一次)检测情况,失效重新生成即可。
总结
总体上如果ipv6有更丰富的设置,比如某个客户端才分配ipv6地址,但是我找了下发现路由器没有相关配置,因此有了这次纯手动的ipv6获取了。
理论上修改openwrt或者通过某些配置是可以的,等以后有时间再折腾吧
参考文档
https://gist.github.com/qbi/31b72b51b87311d57f53
https://www.cnblogs.com/forfreewill/p/9178162.html
https://blog.51cto.com/wuweijava/4396880
发表评论