对某些主机强制实施 IPv4

对某些主机强制实施 IPv4

如何在访问某些主机时强制使用 IPv4?

最好通过域名来指定,这可以完成吗?

我尝试过但不确定是否能够做到这一点,即创建一个新接口并仅通过此接口路由特定主机,然后完全禁用 IPv6。

这听起来不错吗?可以用更好的方法来做到这一点吗?

答案1

路由仅在主机名解析为 IP 地址后发生。要强制仅使用 IPv4,您最好操纵主机名解析以仅返回那些“某些主机”的 IPv4 地址。

如果您可以操作 DNS 服务器,您也许可以将其配置为仅返回这些主机的 IPv4 地址。

如果您只能操作客户端,则可以(仅)为 中的相关主机提供 IPv4 地址/etc/hosts,并确保之前/etc/nsswitch.conf有和/或。filesdnsresolve

如果主机名解析返回多个 IP 地址(并​​且相关应用程序已支持 IPv6,因此它使用getaddrinfo()旧的gethostbyname()),则/etc/gai.conf确定尝试地址的顺序。如果“某些主机”位于特定的 IPv4 网络(或少量单独的 IP 地址)中,那么您可以添加优先级规则gai.conf以优先选择它们的 IPv4。但这只是设置了一个优先顺序:如果 IPv4 连接尝试失败,它将无法阻止应用程序回退到 IPv6。

如果“某些主机”的 IPv6 地址是已知的且是静态的,您可以针对(而不是!)对这些主机的任何 IPv6 连接尝试设置iptables防火墙nftables规则。在客户端,这意味着设置输出防火墙规则,例如REJECTDROP

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。)

相关内容