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

Hau*_*ing 8 domain-name-system linux iptables ipv6 glibc

问题与目标

我们没有从我们的 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 日志更优雅的事情吗?

要走的路?

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

Mic*_*ton 17

您可以使用 控制地址选择/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
Run Code Online (Sandbox Code Playgroud)

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

如果您想对所有 IPv4 给予更高的优先级,您可以将其更改为:

precedence ::ffff:0:0/96  100
Run Code Online (Sandbox Code Playgroud)

If you only wanted to give higher preference to specific IPv4 addresses or blocks, you can specify them as well. Remember that you have to use an IPv4-mapped IPv6 in hex.

So, to give preference to 203.0.113.0/24 over all IPv6, you would add:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100
Run Code Online (Sandbox Code Playgroud)

Restart running applications to have them pick up changes you make.


On Debian derived systems, /etc/gai.conf is already present. On Red Hat derived systems, it is absent, but a sample file is located at /usr/share/doc/glibc-common-*/gai.conf; just copy it to /etc.


Mic*_*ton 5

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

将具有糟糕 IPv6 连接的违规主机/etc/hosts与其对应的 IPv4 地址放在一起。

例如:

199.7.53.74 whois.verisign-grs.com
Run Code Online (Sandbox Code Playgroud)

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