在 0.0.0.0 上监听是不是不好的做法?为什么?

在 0.0.0.0 上监听是不是不好的做法?为什么?

假设我想部署一个作为服务器的软件,并且我想避免更换接口、更改 IP 地址等情况。

部署该软件的环境性质有点动态,计算机可能会被带到不同的网络中。

然后我决定部署它并配置地址 0.0.0.0 来绑定到服务配置的端口并完成工作。

网络管理员会对此不以为然吗?(我的印象是他们会的)。如果是,为什么?

希望这不是一个基于观点的问题,并且有事实来支持答案。

答案1

然后我决定部署它并配置地址 0.0.0.0 来绑定到服务配置的端口并完成工作。

网络管理员会不会对此不以为然?

如果没有必要的话,这将是不好的做法。

对于某些网络来说,这可能是必要的。而你不会知道。这不是你能决定的。

让网络管理员选择绑定哪个 IP。

添加注释以澄清

您无权决定绑定到哪个 IP,也不让网络管理员更改 IP(您说的就是这个)。您可以提供默认值。

答案2

我们已经提到了 (1) 对动态网络配置的良好支持、(2) 安全性和防火墙规则稳定性以及 (3) 代码复杂性(例如,当需要处理网络配置事件时)之间的权衡。不过,我想指出一个完全不同的问题:

是的,正在监听地址0.0.0.0 不好的做法。因为它毫无理由地明确地将监听守护进程限制到 IPv4。

根据0.0.0.0“博物馆地址”出现的位置(代码中硬连线或配置中设置),它会导致软件损坏或至少服务器设置损坏,无法在仅支持 IPv6 的网络上使用,并导致双栈网络上的连接延迟和其他故障(由于需要 IPv4 回退)。

要监听“所有可用的 IP 地址”(在需要且适当的时候),只需监听::,这实际上涵盖全部IP 地址、通用 IPv6 以及用于支持旧版 IPv4 的 IPv4 映射 IPv6(如果需要)。

在大多数情况下,系统库会使双栈支持成为最简单、默认的开箱即用选项,除非明确阻止某个 IP 版本运行(例如监听0.0.0.0)。

至于getaddrinfo()AI_V4MAPPED | AI_ALL将以统一 (IPv6) 格式返回两种地址类型,并且两种地址类型都可以使用同一个 (IPv6) 套接字类型。这对于客户端尤其重要。

至于socket()和相关调用,单个 IPv6 套接字将同时服务于 IPv6 和 IPv4(除非IPV6_V6ONLY设置了,并且它是不是默认设置)。这对于服务器端尤其重要。

默认(即双栈)IPv6 套接字的一个已知限制是 IPv6 和 IPv4 之间的端口空间共享。需要单独的套接字来监听 IPv6 和 IPv4 的不同端口。但是,在大多数情况下,监听的 IPv6 套接字的::行为是可预测的、向后兼容的。

答案3

这取决于机器上有哪些接口可用。如果你一次只有一个可从外部访问的活动接口,那就没有区别了。

如果您有更多活动接口(例如在子网 10.0.0.0/24 和 10.0.1.0/24 中),并且您只希望来自 10.0.0.0/24 子网的人员能够连接,则您必须在每次获取新 IP 时重新启动服务或绑定到 0.0.0.0 并使用防火墙阻止流量。

有人可能会说,在第二种情况下,如果绑定到 0.0.0.0,则会引入一个额外的可能故障点(防火墙),但我认为风险可以忽略不计。

相关内容