Ipv6

/etc/hosts 中的 IPv6 範圍 ID

  • March 11, 2022

我想為本地網路上的 IPv6 地址設置一個靜態主機名。但是,它似乎/etc/hosts不接受區域 ID - 當我將區域 ID 附加到 IPv6 地址時,它就像未定義主機一樣。如果沒有區域 ID,應用程序將無法連接到主機。

我可以以某種方式解決這個問題嗎?或者是否有一些特殊的區域 ID 語法/etc/hosts

這是GNU C 庫(可能還有其他庫)的限制。它有一個外掛 API,它甚至不會可靠地傳達範圍 ID(或 ifindex/ifname)nss_files然後是AFAIK尚未準備好語法的實際外掛。

我當然可以在這方面提供幫助並相應地修改答案。首先,我正在以開源項目netresolve的形式對 glibc 名稱解析 API 進行或多或少的實驗性替代。如果您知道自己在做什麼,它可以用於實驗,也可以用於日常工作。它似乎也不支持 /etc/hosts 中的 IPv6 範圍 ID,但我將其添加到我的 TODO 列表中。其次,我可以提供更新檔來支持 glibc 本身。您可以在本地應用它們或希望項目會接受它們。

然後有像多播 DNS 這樣的協議,理論上可以提供這一點,但在 nss_mdns 中沒有實現,並且被相同的問題阻止。

使用 netresolve 的解決方法

所以我意識到我已經在netresolve中實現了這個,但我必須修復幾個小錯誤才能讓它真正工作。感謝您通過讓我嘗試來引起他們的注意。

您需要從 git 建構項目。提供了 Gentoo的實時 ebuildArch AUR 包。依賴檢查還不完美。該軟體包為您提供了一個netresolve用於執行名稱解析查詢的wrapresolve命令和一個用於執行程序的命令,其中 libc 解析常式被基於libnetresolve的重新實現所取代。它是使用LD_PRELOAD環境變數實現的,因此您甚至可以通過執行wrapresolve bash或類似的方式執行整個 shell。

配置

/etc/主機:

fe80::2677:3ff:fe40:db38%wlan0 test-link-local-with-scope-id

注意:您可以使用標準方式使用 scope-id 編寫連結本地地址,即附加一個百分號,然後附加一個介面名稱 (ifname) 或一個介面索引 (ifindex),如 eg 報告的那樣ip link

使用 netresolve 進行測試

# netresolve --node testxxx
response netresolve 0.0.1
name testxxx
ip 1:2:3:4:5:6:7:8%eth0 any any 0 0 0 0
secure

使用 wrapresolve 和 getaddrinfo 進行測試

netresolve 包還提供了一個getaddrinfo()名為getaddrinfo.

# wrapresolve getaddrinfo test-link-local-with-scope-id
query:
 nodename = test-link-local-with-scope-id
 servname = (null)
status = 0
#0:
 family = 10
 addrlen = 28
 address:
   family = 10
   port = 0
   flowinfo = 0x00000000
   address = 0xfe80000000000000267703fffe40db38
   scope_id = 3
 nodename = test-link-local-with-scope-id

使用 wrapresolve 和 getent 進行測試

這是第一個使用系統中已經存在的工具的測試。否則它與之前的測試非常接近。

# wrapresolve getent ahosts test-link-local-with-scope-id 
fe80::2677:3ff:fe40:db38 0      test-link-local-with-scope-id

使用 wrapresolve 和 ping6 進行測試

# wrapresolve ping6 test-link-local-with-scope-id

PING test-link-local-with-scope-id(fe80::2677:3ff:fe40:db38) 56 data bytes
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=3 ttl=64 time=0.072 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=4 ttl=64 time=0.078 ms
^C

注意:您需要以rootping身份執行。ping6他們的工作需要額外的特權,因此他們是suid root,這與 wrapresolve 不兼容。

使用 wrapresolve 和 ssh 進行測試

# wrapresolve ssh test-link-local-with-scope-id
# logout

您還可以使用curl. 這也適用於非特權使用者。

組播 DNS

我在 netresolve 的 TODO 列表中有 mDNS,可能通過 Avahi 和 systemd-resolved,它們將同時為 DNS、LLMNR 和 mDNS 提供服務。

GNU C 庫的修復

這是我的長期 TODO 清單,我正在與其他從事部分工作的人聯繫。還有更多選項,稍後我將在此答案中填寫更多資訊。

引用自:https://unix.stackexchange.com/questions/174767