【运维案例】获取不到IPv6地址问题

产品:openEuler

版本:20.03-LTS-SP3

分类:内核 / 网络

来源:现网

[背景及现象描述]

服务器以bond1(业务口)的本地链路地址发送DHCP的请求IPv6地址报文,DHCP服务器收到DHCP客户端的请求报文后,发送NS报文请求服务器的bond1(业务口)的MAC地址。观察日志发现客户端没有进行回应NA报文,导致后续的DHCP报文交互无法进行,从到服务器获取不到ipv6的地址。
ipv6

[原因分析]

ns报文函数ndisc_recv_ns(),用function_graph trace抓到处理流程如下:
image
ndisc_send_skb 代码:


icmp6_dst_alloc 失败场景:

因此icmp6_dst_alloc失败的原因是内存回收后dst entries还是超过了rt_max_sizee配置,调高net.ipv6.route.max_size即可解决,如果内存回收太过频繁也可适当调整net.ipv6.route.gc_thresh。
这两个参数通常需要在高负载的访问服务器上增加。比如繁忙的网络(或网关/防火墙 Linux 服务器),再比如集群规模大,node 和 pod 数量超多,往往需要增加内核的内部 ARP 缓存大小。

[解决方法]

执行以下两条命令增大net.ipv6.route.max_size和net.ipv6.route.gc_thresh的值
sysctl -w net.ipv6.route.max_size=24456
sysctl -w net.ipv6.route.gc_thresh=12228

1 个赞