如何在访问某些主机时强制使用 IPv4?
最好通过域名来指定,这可以完成吗?
我尝试过但不确定是否能够做到这一点,即创建一个新接口并仅通过此接口路由特定主机,然后完全禁用 IPv6。
这听起来不错吗?可以用更好的方法来做到这一点吗?
答案1
路由仅在主机名解析为 IP 地址后发生。要强制仅使用 IPv4,您最好操纵主机名解析以仅返回那些“某些主机”的 IPv4 地址。
如果您可以操作 DNS 服务器,您也许可以将其配置为仅返回这些主机的 IPv4 地址。
如果您只能操作客户端,则可以(仅)为 中的相关主机提供 IPv4 地址/etc/hosts
,并确保之前/etc/nsswitch.conf
有和/或。files
dns
resolve
如果主机名解析返回多个 IP 地址(并且相关应用程序已支持 IPv6,因此它使用getaddrinfo()
旧的gethostbyname()
),则/etc/gai.conf
确定尝试地址的顺序。如果“某些主机”位于特定的 IPv4 网络(或少量单独的 IP 地址)中,那么您可以添加优先级规则gai.conf
以优先选择它们的 IPv4。但这只是设置了一个优先顺序:如果 IPv4 连接尝试失败,它将无法阻止应用程序回退到 IPv6。
如果“某些主机”的 IPv6 地址是已知的且是静态的,您可以针对(而不是!)对这些主机的任何 IPv6 连接尝试设置iptables
防火墙nftables
规则。在客户端,这意味着设置输出防火墙规则,例如REJECT
DROP
ip6tables -A OUTPUT -p tcp -d <ipv6-address-of-certain-host> -j REJECT --reject-with tcp-reset
ip6tables -A OUTPUT -d <ipv6-address-of-certain-host> -j REJECT
请注意,默认情况下,REJECT
目标会创建 ICMP(v6)“端口无法访问”响应。在 TCP 连接上使用--reject-with tcp-reset
可能有助于确保尝试与该端口建立 IPv6 连接的任何应用程序将快速回退到它们可能已解析的任何替代地址,即 IPv4。
(如果您在服务器端强制执行此限制,则使用--reject-with tcp-reset
拒绝 IPv6 TCP 连接可能更为重要,因为客户端和服务器之间过于偏执的防火墙可能会丢弃 ICMP。)