Linux缓存RA吗?


0

由于 OpenBSD rtadvd中的一个错误 ,我的路由器有时会发送带有错误前缀的RA

prefix 2001:41d0:fe4b:ecf1::/64
prefix 2001:41d0:fe4b:ec42::/64
prefix 2a01:e35:8aea:ac42::/64

但是,如果我修复它,它只发送正确的前缀( 2001:41d0:fe4b:ec42::/64prefix 2a01:e35:8aea:ac42::/64 ),和 删除地址 从接口开始,我的Linux机箱每次从路由器获得RA时都会从错误的前缀中分配IPv6。

15:46:44.138257 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 136) fe80::8621:df60:6d70:8da > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 136
    hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0s, retrans time 0s
      source link-address option (1), length 8 (1): 00:00:24:d1:42:0d
        0x0000:  0000 24d1 420d
      prefix info option (3), length 32 (4): 2a01:e35:8aea:ac42::/64, Flags [onlink, auto], valid time 2592000s, pref. time 604800s
        0x0000:  40c0 0027 8d00 0009 3a80 0000 0000 2a01
        0x0010:  0e35 8aea ac42 0000 0000 0000 0000
      prefix info option (3), length 32 (4): 2001:41d0:fe4b:ec42::/64, Flags [onlink, auto], valid time 2592000s, pref. time 604800s
        0x0000:  40c0 0027 8d00 0009 3a80 0000 0000 2001
        0x0010:  41d0 fe4b ec42 0000 0000 0000 0000
      rdnss option (25), length 24 (3):  lifetime 900s, addr: 2a01:e35:8aea:ac42::10
        0x0000:  0000 0000 0384 2a01 0e35 8aea ac42 0000
        0x0010:  0000 0000 0010
      dnssl option (31), length 24 (3):  lifetime 900s, domain(s): geekwu.org.
        0x0000:  0000 0000 0384 0667 6565 6b77 7503 6f72
        0x0010:  6700 0000 0000
15:46:44.553069 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) :: > ff02::1:ffd1:28d4: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:41d0:fe4b:ecf1:8581:1b57:b9d1:28d4
      unknown option (14), length 8 (1): 
        0x0000:  1d76 c406 8db8

你可以看到只有2个前缀的RA,然后是 neighbor solicitation 数据包,这是我的盒子检查它的地址是“免费”(DAD)......它是,因为这个前缀在这个以太网链接上没有使用。 由于此地址是最后插入的,因此它是传出连接的默认地址,但路由器无法将其路由回来,因为它未定义。

我只能猜测内核 - 或用户区中的某些东西 - 无论出于何种原因,都将旧的RA保留在缓存中,并使用它代替“实时”RA(或者它可能合并它们?)

如果是这样,有什么办法可以看到它吗?刷新或更改此缓存?我可以为我的盒子重新打击,但是,好吧......看起来很糟糕。

(内核4.16.13-1-ARCH)

编辑:

我发送了一个带scapy的RA用于此前缀,生命周期为0,并且地址停止为每个后续RA添加。

Welcome to Scapy (unknown.version)
>>> a = IPv6()
>>> a.dst = "ff02::1"
>>> b = ICMPv6ND_RA()
>>> b.display()
>>> c = ICMPv6NDOptSrcLLAddr()
>>> c.lladdr = "00:00:24:d1:42:0d"
>>> d = ICMPv6NDOptMTU()
>>> e = ICMPv6NDOptPrefixInfo()
>>> e.prefixlen = 64
>>> e.prefix = "2001:41d0:fe4b:ecf1::"
>>> e.preferredlifetime=0
>>> e.validlifetime=0
>>> send(a/b/c/d/e)

NetworkManager(1.10.8)在此框中运行,具有默认配置


你使用什么SLAAC客户端--dhcpcd,NetworkManager,networkd或内核本身?
grawity

您是否尝试过明确撤销前缀(广告有效0,首选0等)?
grawity

NetworkManager正在运行,但我不知道它是否是SLAAC客户端。发送撤销RA会删除该地址
Bastien Durel

Answers:


0

这听起来像预期的结果。

SLAAC允许多个路由器通告不同的前缀集,因此新的RA 不要 使之前的无效,只能逐步更新它们。

一旦配置了前缀,它将保持其“有效”生命周期的持续时间(由每个新RA刷新),除非RA 明确地 将该前缀的生命周期设置为零。 (看到 RFC 4862 。)


即使您删除指定的地址?
Bastien Durel

RFC说“对于Router Advertisement中的每个Prefix-Information选项:”not“对于我们曾经收到的路由器广告中的每个Prefix-Information选项”
Bastien Durel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.