/etc/hosts 中的 IPv6 区域 ID

kra*_*lyk 6 ipv6

我想为本地网络上的 IPv6 地址设置一个静态主机名。但是,这似乎/etc/hosts不接受区域 ID - 当我将区域 ID 附加到 IPv6 地址时,它的行为就像未定义主机一样。如果没有区域 ID,应用程序将无法连接到主机。

我可以以某种方式解决这个问题吗?或者是否有一些针对区域 ID 的特殊语法/etc/hosts

小智 7

将链接本地用于手动操作并不是很方便(正如您所注意到的)。Link-local 非常适用于自动功能,例如发现网络上的本地网关、与本地 DHCPv6 服务器通信、mDNS、OSPFv3 路由器相互通信等。但对于正常工作,您应该使用可路由地址。如果您从 ISP 获得 IPv6 地址,则使用这些地址,否则生成您自己的 ULA 前缀。

简而言之:链接本地地址/etc/hosts不起作用,请改用可路由地址

  • 从运营商的角度来看,文本当然是正确的,赞成。我的回答提供了一个不同的视角,因为理论上你可以通过 mDNS、其他协议或根据要求通过`/etc/hosts` 以方便的方式使用它们。 (2认同)

Pav*_*rda 7

这是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/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 进行测试

# 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)

使用 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
Run Code Online (Sandbox Code Playgroud)

使用 wrapresolve 和 getent 进行测试

这是第一个使用系统中已存在的工具的测试。否则它与之前的测试非常接近。

# 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 进行测试

# 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 进行测试

# wrapresolve ssh test-link-local-with-scope-id
# logout
Run Code Online (Sandbox Code Playgroud)

您还可以使用诸如curl. 这也适用于非特权用户。

多播DNS

我在 netresolve 的 TODO 列表上有 mDNS,可能通过 Avahi 和 systemd-resolved 来同时提供 DNS、LLMNR 和 mDNS。

GNU C 库的修复

这是在我的长期待办事项清单上,我正在与其他人联系从事其中的部分工作。还有更多选项,稍后我将在此答案中填写更多信息。