我在 AWS 机器上运行 CentOS 7。我最近启用了 IPv6,一切都工作正常 - 除了 PHP 连接请求(也来自命令行的curl)总是更喜欢使用 IPv6 而不是 IPv4。这会导致一些并不真正支持它的网站出现问题,例如向 Apple、Android 发送通知,并且一切都可以正常使用 IPv4。
如何使所有传出请求都使用 IPv4 而不是 IPv6?我也不想禁用传入的 IPv6,因为我的一些客户仅使用 IPv6。
答案1
大多数能够使用 IPv6 的程序将使用系统 DNS 解析器库报告为主机最喜欢的地址(IPv4 或 IPv6)。
可以使用该/etc/gai.conf
文件调整解析器库的首选项。
优先规则在文件的这一部分中指定:
# precedence <mask> <value>
# Add another rule to the RFC 3484 precedence table. See section 2.1
# and 10.3 in RFC 3484. The default is:
#
#precedence ::1/128 50
#precedence ::/0 40
#precedence 2002::/16 30
#precedence ::/96 20
#precedence ::ffff:0:0/96 10
#
# For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96 100
内置默认值作为注释值列出,但如果您指定自己的设置,则根本不会使用默认值。因此,将其添加到文件末尾:
# To prefer IPv4 over everything else
precedence ::ffff:0:0/96 100
precedence ::1/128 50
precedence ::/0 40
precedence 2002::/16 30
precedence ::/96 20
请注意,不可能在 IPv4 中应答使用 IPv6 到达的传入连接,反之亦然:根据 IP 和 TCP 协议的规则,任何连接尝试都必须使用发出请求的协议进行应答。