Linux 是否快取 RA?

Linux 是否快取 RA?

由於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) 在此機器上運行,具有預設配置

答案1

這聽起來像是預期的結果。

SLAAC 允許多個路由器通告不同的前綴集,因此新的 RA不要使之前的無效,僅增量更新它們。

一旦配置了前綴,它就會在其「有效」生命週期內保持不變(由每個新的 RA 刷新),除非 RA明確地將該前綴的生命週期設為零。 (看RFC 4862.)

相關內容