我想为本地网络上的 IPv6 地址设置一个静态主机名。但是,这似乎/etc/hosts
不接受区域 ID - 当我将区域 ID 附加到 IPv6 地址时,它的行为就像未定义主机一样。如果没有区域 ID,应用程序将无法连接到主机。
我可以以某种方式解决这个问题吗?或者是否有一些针对区域 ID 的特殊语法/etc/hosts
?
小智 7
将链接本地用于手动操作并不是很方便(正如您所注意到的)。Link-local 非常适用于自动功能,例如发现网络上的本地网关、与本地 DHCPv6 服务器通信、mDNS、OSPFv3 路由器相互通信等。但对于正常工作,您应该使用可路由地址。如果您从 ISP 获得 IPv6 地址,则使用这些地址,否则生成您自己的 ULA 前缀。
简而言之:链接本地地址/etc/hosts
不起作用,请改用可路由地址
这是GNU C 库(也可能是其他库)的限制。它有一个插件 API,它甚至不能可靠地传达范围 ID(或 ifindex/ifname)。然后nss_files
是 AFAIK 还没有准备好语法的实际插件。
我当然可以在这方面提供帮助并相应地修改答案。首先,我正在以开源项目netresolve的形式对 glibc 名称解析 API 进行或多或少的实验性替代。如果您知道自己在做什么,它既可用于实验,也可用于日常工作。它似乎也不支持 /etc/hosts 中的 IPv6 范围 ID,但我将它添加到我的 TODO 列表中。其次,我可以提供补丁来支持 glibc 本身。您可以在本地应用它们,也可以希望项目接受它们。
然后有像多播 DNS 这样的协议,理论上可以提供这一点,但没有在 nss_mdns 中实现,并且被同样的问题阻止。
所以我意识到我已经在netresolve 中实现了这个,但我必须修复几个小错误才能让它真正工作。感谢您让我尝试引起他们的注意。
您需要从 git 构建项目。提供了一个用于 Gentoo的实时 ebuild和一个Arch AUR 包。依赖检查还不完美。该软件包为您提供了一个netresolve
执行名称解析查询的wrapresolve
命令和一个运行程序的命令,其中 libc 解析例程被基于libnetresolve的重新实现所取代。它是使用LD_PRELOAD
环境变量实现的,因此您甚至可以通过运行wrapresolve bash
或类似的方式运行整个 shell 。
/etc/hosts:
fe80::2677:3ff:fe40:db38%wlan0 test-link-local-with-scope-id
Run Code Online (Sandbox Code Playgroud)
注意:您可以按照标准方式编写带有 scope-id 的链接本地地址,即附加一个百分号,然后是接口名称 (ifname) 或接口索引 (ifindex),如 eg 报告的那样ip link
。
# 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这是第一个使用系统中已存在的工具的测试。否则它与之前的测试非常接近。
# wrapresolve getent ahosts test-link-local-with-scope-id
fe80::2677:3ff:fe40:db38 0 test-link-local-with-scope-id
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
注意:您需要运行ping
,并ping6
作为根。他们的工作需要额外的特权,因此他们是suid root,这在 wrapresolve 中表现不佳。
# wrapresolve ssh test-link-local-with-scope-id
# logout
Run Code Online (Sandbox Code Playgroud)
您还可以使用诸如curl
. 这也适用于非特权用户。
我在 netresolve 的 TODO 列表上有 mDNS,可能通过 Avahi 和 systemd-resolved 来同时提供 DNS、LLMNR 和 mDNS。
这是在我的长期待办事项清单上,我正在与其他人联系从事其中的部分工作。还有更多选项,稍后我将在此答案中填写更多信息。
归档时间: |
|
查看次数: |
3235 次 |
最近记录: |