LINUX配置ipv6地址时出现ifconfig: SIOCSIFADDR: Permission denied
问题描述
在做ipv6的开发中,需要在代码中修改桥端口(br0)的ipv6本地链路地址,思路是先将原来的地址删除,再添加新的地址,如下图中,要将地址改成fe80::100/64,则需要先删除原来的地址:
ifconfig br0 del fe80::1/64
ifconfig br0 del ffe80::e267:b3ff:fe00:2/64
再添加地址:
ifconfig br0 del fe80::100/64
但串口提示:fconfig: SIOCSIFADDR: Permission denied
如果不擅长原有地址的情况下添加新的ipv6地址,则不会报错,这是为什么呢?
问题分析
这让人很费解,为什么直接添加不会报错,删掉原来的,再添加就会报错呢,但其实对比之下已经有一些方向了,关键我们敲命令删除的时候系统会做什么操作,重新添加的时候又会做怎么操作
从错误的提示上看是权限不足,但从现象分析这肯定不是因为当前不是root用户导致的,还是得从源码去分析;ipv6内核相关代码可以在linux2.x.x.x/net/ipv6/目录下查找,ifconfig删除ipv6地址时,内核调用如下:
在函数inet6_addr_del中检查该接口是否存在ipv6地址,若不存在则关闭该接口的ipv6功能
而当我们再重新添加ipv6地址时,发生如下调用:
在ipv6_find_idev查到对应的设备文件,若不存在则添加,在ipv6_add_dev中可以初始化相关参数
完了之后在通过函数ipv6_add_addr添加地址,这个时候会报错,查询新增的内核文件:
cat proc/sys/net/ipv6/conf/br0/disable_ipv6
查询结果为 1 ,说明初始化时,默认是把接口的ipv6功能关闭的,导致报错了
在ipv6_add_addr中可以看到有这么一句判断,其中返回值 -EACCES 正是 Permission denied
解决方案
从上面的分析中,问题已经很明朗了,可自行在应用层或内核修改相关参数即可
提供以下参考,也可在应用层通过echo系统调用修改该参数:
总结
第一次写博文,写的有误的地方还请指出,喜欢的朋友欢迎关注,评论,留言!