Linux:阻止某些应用程序/主机名的 IPv6

Linux:阻止某些应用程序/主机名的 IPv6

问题与目标

我们没有从 ISP 获取 IPv6,因此我有一个 IPv6 隧道,它工作正常,但当然速度不是很快。而且不是很可靠。我喜欢“以防万一”使用 IPv6,但我希望某些主机(域)仅与 IPv4 连接。

默认协议

在我看来,所有应用程序都首先尝试 IPv6;这可能是 glibc 的设置。如果这个默认设置被逆转(对于所有应用程序),我会没事的。

网络过滤器

使用 Netfilter 可以阻止 IPv6 地址/网络,但存在两个问题:

  1. 这是否会导致延迟,因为应用程序在尝试 IPv4 之前会等待 IPv6 超时?
  2. 有些域名似乎混在一起,看起来很混乱。如果可以避免的话,将 google.com 和 youtube.com 分开似乎是你不想做的事情。

我只是注意到手册页中ip route关于路由类型的说明unreachable

本地发送者收到 EHOSTUNREACH 错误。

Netfilter DROP 或 REJECT 是否也会出现同样的情况?这样的错误不应该导致相关的延迟。

DNS 过滤

另一个解决方案(如果可能的话,相当简单)是过滤某些域的 AAAA 记录。如果这不(容易)实现:是否可以连接 DNS 服务器和 Netfilter,以便我知道“IP 地址 X 属于域 Y”,以便我可以将其添加到 Netfilter?还有什么比记录所有内容并 grep 日志更优雅的方法吗?

怎么办?

还有哪些(其他)可能性以及什么是最简单的?

答案1

您可以使用以下方式控制地址选择/etc/gai.conf。配置文件有据可查,并且已包含默认设置,因此您可以开始进行调整。

这里有趣的默认值是:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

最后一行赋予所有 IPv4 地址最低的优先级。

如果您希望赋予所有 IPv4 更高的优先级,您可以将其更改为:

precedence ::ffff:0:0/96  100

如果您只想为特定 IPv4 地址或块赋予更高的优先级,您也可以指定它们。请记住,您必须使用十六进制的 IPv4 映射 IPv6。

因此,为了使 203.0.113.0/24 优先于所有 IPv6,您需要添加:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

重新启动正在运行的应用程序,让它们获取您所做的更改。


在 Debian 派生系统上,/etc/gai.conf已经存在。在 Red Hat 派生系统上, 它不存在,但示例文件位于/usr/share/doc/glibc-common-*/gai.conf;只需将其复制到 即可/etc

答案2

好的,这是一个完全不同的答案。

将有问题的主机与糟糕的 IPv6 连接放在/etc/hosts它们对应的 IPv4 地址中。

例如:

199.7.53.74 whois.verisign-grs.com

请记住,当他们(在这种情况下)或您的 IPv6 连接改善时将其删除。

相关内容