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