假设我想部署一个作为服务器的软件,并且我想避免更换接口、更改 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,则会引入一个额外的可能故障点(防火墙),但我认为风险可以忽略不计。