本地主机上的双栈 ipv6/ipv4

pal*_*ogt 5 networking ipv6

我有一个 ipv4 服务器,它只接受通过本地主机的连接(使用INADDR_LOOPBACK)。我想将此服务器转换为双栈 ipv6/ipv4。但是,使用in6addr_loopback仅接受到 的连接::1

我发现我可以使用同时接受 ipv4 和 ipv6 连接in6addr_any,但是因为这也允许来自任何地方的连接,所以它对我的特定情况没有用处。

是否可以同时绑定到 ipv6 localhost ( ::1) 和 ipv4 localhost ( 127.0.0.1) ?

R S*_*hko 4

AFAIK,那是不可能的。

您需要做的是创建两个套接字,一个绑定到 INADDR_LOOPBACK,另一个绑定到 in6addr_loopback。然后,您可以使用您选择的多路复用器(poll、select、epoll 等)同时等待它们。

更新

只是想出了一些您可能需要考虑的解决方法。在这两种解决方法中,您都绑定到in6addr_any.

  1. 建立连接后,检查远程地址,如果不是 127.0.0.1 或 ::1,则将其关闭。虽然 IP 地址上的连接行为并不理想(连接被建立/立即关闭而不是被拒绝),但最好的是这可以完全在您的应用程序中完成。
  2. 调整操作系统 IP 堆栈的设置,以拒绝从非环回 IP 到您的端口的连接。这在 Linux 上使用iptables绝对是可行的。虽然行为更理想,但它需要应用程序外部的配置。