手动随机生成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命令后过滤得到),注意chmod加可执行权限

vi /jffs/scripts/snmp/jffs.sh


/usr/sbin/ip addr|grep inet6|grep global|grep 1/60|cut -d " " -f 6|cut -d "/" -f 1

至此,就可以通过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://community.home-assistant.io/t/advanced-snmp-monitoring-part-one-asuswrt-routers-merlin-build/68984

https://gist.github.com/qbi/31b72b51b87311d57f53

https://www.cnblogs.com/forfreewill/p/9178162.html

https://blog.51cto.com/wuweijava/4396880

https://www.v2ex.com/t/664819


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。