Networking

按需使用隱私擴展的新 IPv6?

  • August 23, 2020

啟用Privacy Extension( net.ipv6.conf.eth0.use_tempaddr=2 in /etc/sysctl.conf) 為IPv6我提供了一個固定時間段的新 IP 地址,有沒有辦法按需獲取新的 IPv6?即在需要時刷新新的 IPv6?

“活動”臨時地址具有臨時動態屬性,但未棄用。當它即將被棄用時(即:它的preferred_lft值下降到0),核心將​​一個新的臨時地址添加到介面。

介面的目前臨時地址,將是此處顯示的結果的一部分:

ip -6 address show temporary dynamic

但不是舊地址的一部分,它們仍然有效但已棄用,如下所示:

ip -6 address show temporary deprecated

您只需將其preferred_lft屬性降低到接近零即可觸發新臨時地址的創建。從反複試驗來看,如果設置低於 3,這將不起作用preferred_lft:在觸發創建之前倒計時達到 0,然後它就不再起作用(但仍然可以preferred_lft稍後再次設置為 >=3 以獲取觸發器)。我不知道是否有任何關於這種特殊性的旋鈕。5 秒看起來是一個安全值,這意味著新地址將在大約 2 或 3 秒後出現。

假設目前在介面eth0上找到的值為 2001:db8::1/64 :

ip address change 2001:db8::1/64 dev eth0 preferred_lft 5

請注意,對此進行篡改會刪除動態屬性,這不會自然發生,並且可能會比預期更快地觸發稍後創建其他臨時地址。


使用ip的 JSON 輸出和jq一些可編寫腳本是可能的,這就是我輸出的命令,準備通過管道傳輸到 shell 以一次更改所有候選臨時地址(通常需要一個多宿主系統來獲取多個但篡改這也可能會在以後創建多個)。它驗證臨時動態地址不被棄用以將其視為候選地址:

ip -6 -p -j address show temporary dynamic | jq -j '.[] |
   . as $i |
       .addr_info[] as $a |
           if $a.local == null // $a.deprecated == true then
               empty
           else
               "ip -6 address change ",
               $a.local, "/", $a.prefixlen,
               " dev ", $i.ifname,
               " preferred_lft 5\n"
           end'

這將再次輸出:

ip -6 address change 2001:db8::1/64 dev eth0 preferred_lft 5

您也可以考慮減少valid_lft讓現在已棄用的地址更快地完全消失。

引用自:https://serverfault.com/questions/1031132