选择IPv6服务器的侦听地址(双堆栈)

Select a listening addresses for IPv6 server (Dual stack)

本文关键字:堆栈 地址 IPv6 服务器 选择      更新时间:2023-10-16

对一些人来说,这似乎是一个奇怪的问题。但我搜索了一下,没有找到任何答案。

当我想要一个双堆栈服务器时,我需要侦听IPv4的INADDR_ANY和IPv6的in6addr_any

如果我有多个网卡,那么我需要选择是要监听所有网卡,还是指定要监听的网卡。

对于这个确切的提议,我使用具有可配置host_name的getaddrinfo方法。如果host_name没有配置,那么我用NULL调用getaddrinfo,并获得两个"ANY"地址。如果我用IP(v6或v4)配置它,我只得到一个地址,这也没关系。

但是,当我使用hostname作为配置的主机名时,在Windows机器上,我从getaddrinfo3地址获得:一个IPv4地址和两个IPv6地址。ipconfig将第一个视为"Link local IPv6 Address",第二个视为在"Tunnel adapter 6TO4 adapter:"部分下的"IPv6 Address"。地址排序如下:

  1. IPv6链路本地
  2. IPv6地址
  3. IPv4

所以,如果我在听所有的地址,双堆栈实际上是三堆栈。如果我使用第一个IPv6地址,(这是配置了host_name的IPv4服务器中的惯例)我只监听"链接本地IPv6地址",它的访问性不如"IPv6地址"高,许多客户端无法连接到它,而它们可以连接到IPv4地址。

现在我正试图把它进一步复杂化。我已将手机连接到USB并激活USB Tethering。当我通过getaddrinfo解析地址时,我得到5个地址:按此订单:

  1. USB IPv6链路本地
  2. 以太网IPv6链路本地
  3. IPv6地址
  4. USB IPv4
  5. 以太网IPv4

所以我的问题是:

  1. 如果它只是IPv4,我会说我只接受第一个IPv4。并且不关心其余的。但是当使用IPv6时,看起来最后一个IPv6是最合适的。有什么惯例吗?

  2. 如果我有多网络机器,我需要选择第一个网络,并在IPv4和IPv6上侦听,但这里的结果喜忧参半。再说一遍,有什么惯例吗?

  3. 我需要监听所有IPv6地址吗?在这种情况下,我将监听一个IPv6地址,而我不监听相应的IPv4。我希望能避免。

感谢您的帮助或评论。但请不要建议我只听"任何",因为我不能。

链接本地地址仅在网段内有效,通常仅适用于您的机器到通信链路另一端的机器。例如,你的USB链接本地地址只适用于你的手机和电脑之间的通信,但不能超出此范围;您的链路本地以太网IPv6地址可以在同一集线器/交换机上的所有机器上使用,但不能超出路由器(有点类似于专用IPv4地址)。如果这不是您预期的用例,我建议您忽略链接本地地址。

自动分配的链接本地地址是用非常特定的模式和掩码创建的,因此您可以通过编程检测它们。链路本地IPv6地址在fe80::/64范围内(意味着地址的第一个字节是fe80:0000:0000:0000,其余8个字节可以是任何字节),链路本地IPv4地址的范围从169.254.1.0到169.254.255.255。

还要注意的是,所有主机都为所有支持IPv6的接口配置了一个链接本地地址,即使分配了另一个地址,也会保留它,因此无法摆脱它。

老帖子,我知道,你最终是如何解决的?我真的很想知道。

为此,我建议您选择避免的选项,绑定到ANY、通配符"::"bind(.., "::", ..),并使用一些防火墙或包过滤规则来排除您不想要的连接。