微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何安全地绑定到多个本地地址尤其是IN_ANY和IN6_ANY?

如何解决如何安全地绑定到多个本地地址尤其是IN_ANY和IN6_ANY?

在使用getaddrinfo(3)来从命令行输入中检索要绑定的IP地址和端口号的服务器应用程序中(主机部分可以为空⇒ node 参数将为{{1} }),我无法安全地绑定到所有返回的地址。

用户提供主机名和端口时,它将轻松绑定到主机名解析的所有本地地址。

用户仅提供端口时,NULL将按照 顺序返回INADDR_ANY(0.0.0.0)和IN6ADDR_ANY(::) 。 >

如果使用getaddrinfo(3),则会失败,仅保留服务器IPv4,这很糟糕。

对于可移植性(尤其是对于没有v4映射的系统,如大多数其他野外操作系统),也不能选择仅绑定到SO_REUSEADDR(将服务器保留为仅IPv6,从而使人生气)。这也适用于关闭了v4映射的Linux,是的。 (当然,可以为每个套接字重新启用,但是……向其他操作系统的可移植性很重要。)

因此,天真的会使用::…,除了

build-automatically

上有a recent LWN article基本上说使用SO_REUSEADDR是邪恶的,并可能导致接管。

实际上,在测试中,当我使用它时,我可以启动第二个服务器应用程序,然后在第一个服务器仍在运行时将其绑定到相同的端口 并接管其所有流量

SO_REUSEADDR中提到的特定于Linux的SO_REUSEPORT(仅在Linux 3.9及更高版本上可用)也独立于其可能的不可用性,不是一种选择:它还允许另一个进程执行在(ip,port)元组上。

因此,程序将如何绑定到返回的任何socket(7)输出上的端口,从而允许在同一服务器或仅

完成了吗?

更新:事实证明getaddrinfo(3)也存在于达尔文之下,实际上是需要SO_REUSEPORT在Mac OSX上将失败...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。