domain-name-system – 覆盖BIND中用于内部网络的一些DNS条目

我有一个运行BIND的DNS服务器的内部网络,通过单个网关连接到互联网.我的域“example.com”由外部DNS提供商管理.该域中的一些条目,例如“host1.example.com”和“host2.example.com”,以及顶级条目“example.com”,指向网关的公共IP地址.

我希望位于内部网络上的主机将“host1.example.com”,“host2.example.com”和“example.com”解析为内部IP地址而不是网关的IP地址.其他主机如“otherhost.example.com”仍应由外部DNS提供商解析.

通过在BIND中为“host1.example.com”和“host2.example.com”定义两个单一条目区域,我已经成功地为host1和host2条目执行了此操作.但是,如果我为“example.com”添加区域,则该域的所有查询都由我的本地DNS服务器解析,例如查询“otherhost.example.com”会导致错误.

是否可以将BIND配置为仅覆盖域的某些条目,并以递归方式解析其余条目?

解决方法

最好的方法是通过Bind 9.8.1或更高版本中的响应策略区域.它允许您覆盖任意区域中的单个记录(并且不需要为此创建整个子域,只需要创建您想要更改的单个记录),它允许您覆盖CNAME等.其他解决方案(如Unbound)不能覆盖CNAME .

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html

编辑:让我们正确地做到这一点.我将基于上面链接的教程记录我所做的事情.

我的操作系统是RaspBerry Pi的Raspbian 4.4,但该技术应该可以在Debian和Ubuntu上进行任何更改,或者在其他平台上进行最小的更改.

转到绑定配置文件保存在系统中的位置 – 这是在/ etc / bind中.在那里创建一个名为db.rpz的文件,其中包含以下内容

$TTL 60
@            IN    SOA  localhost. root.localhost.  (
                          2015112501   ; serial
                          1h           ; refresh
                          30m          ; retry
                          1w           ; expiry
                          30m)         ; minimum
                   IN     NS    localhost.

localhost       A   127.0.0.1

www.some-website.com    A        127.0.0.1

www.other-website.com   CNAME    fake-hostname.com.

它有什么作用?

>它使用虚假地址127.0.0.1覆盖www.some-website.com的IP地址,有效地将该站点的所有流量发送到环回地址
>它将www.other-website.com的流量发送到另一个名为fake-hostname.com的站点

你可以在这里使用绑定区域文件中的任何内容.

要激活这些更改,还有一些步骤:

编辑named.conf.local并添加此部分:

zone "rpz" {
  type master;
  file "/etc/bind/db.rpz";
};

上面链接的教程告诉您向区域“rpz”{}添加更多内容,但在简单设置中这不是必需的 – 我在这里展示的是使其在本地解析器上运行的最小值.

编辑named.conf.options和options {}部分中的某处添加response-policy选项:

options {
  // bunch
  // of
  // stuff
  // please
  // ignore

  response-policy { zone "rpz"; };
}

现在重启Bind:

service bind9 restart

而已.名称服务器现在应该开始覆盖这些记录.

如果需要进行更改,只需编辑db.rpz,然后重新启动Bind.

Bonus:如果你想将DNS查询记录到syslog中,那么你可以关注程序,编辑named.conf.local并确保有一个包含这些语句的日志记录部分:

logging {
    // stuff
    // already
    // there

    channel my_syslog {
        syslog daemon;
        severity info;
    };
    category queries { my_syslog; };
};

再次重新绑定,就是这样.

在运行Bind的机器上测试:

dig @127.0.0.1 www.other-website.com. any

如果你在另一台机器上运行dig,只需使用@ the-ip-address-of-Bind-server而不是@ 127.0.0.1

我已经非常成功地使用这种技术来覆盖我正在处理的网站的CNAME,并将其发送到我刚刚测试的新AWS负载均衡器. RaspBerry Pi用于运行Bind,RPi也配置为WiFi路由器 – 所以通过将设备连接到RPi上运行的SSID,我将获得测试所需的DNS覆盖.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些