/etc/hosts 中的 IPv6 範圍 ID
我想為本地網路上的 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的實時 ebuild和Arch 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
注意:您需要以root
ping
身份執行。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 清單,我正在與其他從事部分工作的人聯繫。還有更多選項,稍後我將在此答案中填寫更多資訊。