问题与目标
我们没有从 ISP 获取 IPv6,因此我有一个 IPv6 隧道,它工作正常,但当然速度不是很快。而且不是很可靠。我喜欢“以防万一”使用 IPv6,但我希望某些主机(域)仅与 IPv4 连接。
默认协议
在我看来,所有应用程序都首先尝试 IPv6;这可能是 glibc 的设置。如果这个默认设置被逆转(对于所有应用程序),我会没事的。
网络过滤器
使用 Netfilter 可以阻止 IPv6 地址/网络,但存在两个问题:
- 这是否会导致延迟,因为应用程序在尝试 IPv4 之前会等待 IPv6 超时?
- 有些域名似乎混在一起,看起来很混乱。如果可以避免的话,将 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 连接改善时将其删除。