双栈 Linux 主机上仅可从 IPv4 访问 IPv6 绑定服务:它如何工作?

双栈 Linux 主机上仅可从 IPv4 访问 IPv6 绑定服务:它如何工作?

我遇到这种情况,Apache 仅在启用了 IPv6 和 IPv4 的 Linux 主机上监听 :::443。

我可以从仅启用 IPV4 的计算机访问该 Apache 提供的内容。

有人能帮助我了解发生了什么,以及如何在 Linux 主机上验证此配置(在我的情况下是 CentOS)

我在某处读到

[...] 服务器绑定到 IPv6 地址(在所有接口上,或者在需要时在特定接口上),并将 IPv4 视为映射地址,因为 IPv6 和 IPv4 在同一台机器上共享相同的端口空间。这得益于 glibc 的透明工作,是编写网络应用程序的推荐方式。有关详细信息,请参阅 man ipv6(7)。

我猜这意味着唯一可能发生这种情况的方式是使用 Ipv4 映射地址。但是我无法使用ping6 ::ffff:127.0.0.1或使用我的公共 IPv4 地址来实现这一点。此外,我没有看到任何支持这一点的配置ip a

答案1

ss当输出显示具有映射地址的套接字时,您可以知道这些套接字正在使用中。

IPv6(7)

通过使用 v4-mapped-on-v6 地址类型,可以使用 v6 API 处理 IPv4 连接;因此程序只需支持此 API 类型即可支持这两种协议。这由 C 库中的地址处理函数透明地处理。

注意“透明”。您不需要为程序提供 v4 映射的 v6 地址,而是为其提供 v4 地址。

套接字选项 IPV6_V6ONLY 默认为 v6 监听 v4 映射的 v6,按照 的默认值/proc/sys/net/ipv6/bindv6only

此行为特定于平台。值得注意的是,这是 Linux 的一个特性。

相关内容