我已经使用 bind9 设置了一个缓存 DNS 服务器,使用了根提示方法(例如这)。它按预期工作——但是,我们的 IPv6 流量通过我所在国家/地区以外的网关,这让 Netflix 认为我们是从其他国家/地区访问的,这会阻止我的孩子观看他们最喜欢的节目。所以我想,如果我可以阻止 bind9 返回 netflix.com 的任何 AAAA 记录,客户端将仅尝试与 Netflix 建立 IPv4 连接。
也就是说:如何配置 bind9 以便抑制对 netflix.com 的 AAAA 记录查找,同时返回 netflix.com 的有效 A 记录结果?
我意识到我可以创建一个仅包含 Netflix 域的区域文件,并让其包含我能找到的 netflix.com 的所有 A 记录,但不包含 AAAA 记录。但我想知道上述方法是否可行,这样我就不必保持区域文件中的 A 记录更新。
答案1
我知道这是一篇旧帖子,但(至少)在我的 bind 版本(Ubuntu 18.04 上的 9.11)中,我发现你可以在视图中将 filter-aaaa-on-v4 与 match-destinations 结合使用。
它仍然要求您在 2 个 IP 地址上进行绑定监听,但至少您不需要多个实例。
192.168.1.1 是普通的 DNS 服务器。192.168.1.2 是 ipv6 阻止服务器。
我的配置看起来有点像这样(部分):
options {
listen-on port 53 { 192.168.1.1; };
listen-on port 5353 { 192.168.1.2; };
};
view "ipv4only" {
match-destinations { 192.168.1.2/24; };
filter-aaaa-on-v4 yes;
};
view "normal" {
match-clients { 192.168.1.1/24; };
zone "netflix.com" {
type forward;
forward only;
forwarders { 192.168.1.2 port 5353; };
};
};
当域名与 netflix.com 匹配时,这会使 bind 在另一个 IP 上对自身进行正向查找。
这样就不需要两个实例了,但遗憾的是需要 2 个内部 IP 地址。如果我们还可以在“match-destinations”中指定端口号就好了。
答案2
正如评论所指出的,bind 可能无法做到这一点。不过,我设法通过一种变通方法解决了这个问题:
首先,我添加了第二个绑定服务,监听端口 5353,配置文件如下:
acl mynetworks {
localhost;
(And a list with my various LAN networks such as 192.168.0.0/24;)
};
acl everyone {
any;
};
options {
directory "/var/cache/bind-ipv4limited";
filter-aaaa-on-v4 yes;
#dnssec-validation auto;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
dnssec-lookaside . trust-anchor dlv.isc.org.;
recursion yes;
allow-query { mynetworks; };
forwarders {
8.8.8.8;
8.8.4.4;
};
forward only;
auth-nxdomain no; # conform to RFC1035
listen-on port 5353 { any; };
};
这里的关键是使用“filter-aaaa-on-v4 yes;”这样它会忽略 AAAA 请求。
然后在原始绑定服务中,我为使用上述 DNS 服务的 netflix.com 添加了一个区域:
zone "netflix.com" {
type forward;
forward only;
forwarders {
127.0.0.1 port 5353;
};
};
这是一个丑陋的黑客攻击,但它似乎有效。