如何使用本地DNS解析器来重定向所有DNS请求

1,544 阅读8分钟

DNS查询,也被称为DNS请求,是一个从用户计算机到DNS服务器(DNS客户端)的信息请求。这些请求是为了获得与域名相关的IP地址。一个DNS客户端在访问一个环境时请求DNS服务器检索域名的IP地址。

在配置家庭网络时,人们可以选择只让OPNsense上的Unbound DNS服务可以访问,而禁止访问所有其他DNS服务器。

这个简单的解决方案效果很好,因为任何未经授权的对外部DNS服务器的访问都被简单地拒绝了。只有本地网络的DNS解析器是被允许的(除非DNS请求是加密的)。

然而,人们可以采取不同的方法。本地DNS服务器可以被用来将所有的DNS请求路由到备用的external servers 。这样,你可以确保一切工作正常,并限制或过滤DNS请求。

你还可以很容易地监测DNS请求,否则,如果在你的计算机上启用了DNS重定向功能,防火墙规则阻止了这些请求,这些请求就不会被发现了。

前提条件

  • 安装好[OPNsense]软件。

将DNS请求重定向到本地DNS解析器的原因

即使一些设备(如智能电视)应该被自动配置为使用DHCP服务提供的本地DNS服务器。有些设备会试图使用谷歌的DNS服务器或其他公共DNS服务器。

可能是为了规避广告拦截器,并收集你的设备发出的DNS请求的宝贵数据。如果机器拒绝使用预设的DNS服务器,上述方法对只使用替代/硬编码的DNS服务器的设备将不起作用。

创建一个DNS重定向NAT端口转发规则

实施一个基本的NAT端口转发规则来重新路由来自某个网络的DNS请求是可能的。端口转发规则通常用于允许互联网上的外部网络的流量访问安置在你的网络上的各种服务,但它们也可以用于内部网络接口。

OPNsense software事实上,在我们的Firewall: NAT: Port Forward 页面上,你会看到默认的反封锁规则被应用于局域网接口,这样,如果你不小心创建了一个阻止访问的规则,你就不会失去对网络接口的访问。

点击Firewall > NAT > Port Forward 页面上的Add 按钮。

如下面的截图所示,你要改变以下设置。

Data

Data entry

你的本地网络接口/VLANs可能是Interface 。我的物联网网络被用作一个例子。对于这个规则,只能选择一个接口。使用你的接口的系统生成的网络地址作为你的DestinationIOT net 是一个例子。

如果你想匹配DNS流量,使用DNS 作为目标端口范围。它使用OPNsense的内部非绑定DNS服务,因为 "重定向目标IP "是127.0.0.1 (localhost)。如果你正在运行一个Pi-hole DNS服务器,Redirect target IP 盒子将需要你的Pi-hole DNS服务器的IP地址。

如果你正在运行两个Pi-hole服务器作为冗余,你可以为每个IP创建一个别名。这将使你的DNS请求更均匀地分布在两个服务器上,通过选择一个随机的选项,如RandomRound Robin 。我从来没有因为这个原因而使用池的选择,尽管我在帮助一个有两个Pi-holes需要帮助的人时,确实考虑过这个问题。

然而,如果你忘记根据你的Destination port range 决定将其设置为DNS ,我已经把它放在列表中。

如果你选择Destination/Invert ,该规则将匹配任何来自物联网网络的流量,并且不使用本地物联网网关IP地址来解决DNS请求。

换句话说,这条规则将被激活,用于位于互联网上的DNS服务器的任何DNS流量,甚至位于你的网络的其他区域。OPNsense默认将每个网络的接口地址配置为网关/DNS地址。

192.168.30.0 192.168.30.1 - 是物联网网络的网络IP地址范围,其接口IP地址是该网络的网关和DNS服务器地址。因此,到 的DNS流量将被允许,但所有其他流量将被重定向到 。192.168.30.255 192.168.30.1 127.0.0.1

所以没有必要转这个地址,所以重定向规则不会被触发。所有的接口地址,如192.168.30.1,将解析到本地的无边界DNS解析器,即127.0.0.1 的本地主机地址,这就是为什么重定向目标IP地址被设置为本地主机地址。

你可能想在点击Save 后,进入你放置NAT端口转发规则的接口的防火墙规则页面。例如,Firewall > Rules > IoT。如你所见,一条规则被自动插入到列表的最后。根据你所定义的其他规则,这个自动生成的规则可能需要移到列表的顶部。其他规则不应干扰该规则的正确运作。

然而,如果你有许多网络,这个规则必须对每个重定向DNS请求的网络进行重复。持续的重复可能会变得枯燥和烦躁。另外,如果你决定在未来改变该法则,它将需要额外的维护。幸运的是,有一种技术可以为众多接口创建一个单一的规则,很简单。

配置多个接口

你可以构建一个防火墙组,将一条规则应用于众多接口。使用防火墙组,你可以将几个接口安排在一个组中,并编写规则,一次适用于组中的所有接口。

当涉及到统治层次时,组规则优先于一组接口规则。DNS重定向规则可能会在接口规则之前执行。因此,你不应该有任何问题。在为多个接口制定组规则时,必须牢记规则的处理顺序。

转到Firewall > Groups 页面,创建一个规则组。然后从下拉菜单中选择 "添加"。

Add

在选择你希望DNS请求重定向的接口/网络之前,为防火墙组指定一个Name 。在我的例子中,commands 是该组的一个描述性名称。对于某些接口,你可能不需要或不希望重定向;因此,你可以不勾选该框。

例如,你可能有一个与互联网完全断开连接的网络。可能有的网络,你宁愿禁止外部DNS请求,也不愿意重定向它们。对于要创建的组,点击Save

Save

就像以前一样,你可以通过选择防火墙组而不是接口来创建一个重定向。点击 "防火墙>NAT>端口转发 "页面上的Add 按钮。

请输入以下数值。

Value entry

来自NAT端口转发的重定向应该已经被立即添加到Firewall > Rules > CommonDNS 页面的规则列表中。

Page view

测试重定向

你如何检查重定向是否正常工作?毕竟,如果一切配置正确,你可能不会注意到任何差异。一个直接的方法是提供一个DNS覆盖。DNS覆盖可以用来为一个特定的域分配一个不同的IP地址,包括互联网上公开访问的域名。

在企业环境中,如果你希望有一个与公共互联网网站不同的内联网网关,这可能很方便。它可以用来测试DNS重定向,以满足我们的需要。

导航到Services > Unbound DNS > Overrides 部分。

要添加一个新的覆盖。

点击+ 按钮。

输入一个你在网络上不用于其他任何东西的知名域名(以避免任何潜在的服务中断),如yahoo.com。

从你的网络中随机选择一个本地IP地址,比如说。192.168.20.200

IP address entry

当你保存覆盖时,它将出现在列表中。要使变化生效,请点击Apply 按钮。

Applying the changes

在Linux中对一个IP地址的DNS查询可以用host命令来完成。在使用host命令时,没有必要使用你的默认DNS服务器。我正在使用谷歌的DNS服务器做一个外部DNS请求。

不是返回公共IP地址,而是返回本地IP地址。

$ host yahoo.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

yahoo.com has address 192.168.20.200

如果你使用的是Windows或者不喜欢利用命令行程序,请尝试使用你的网络浏览器访问yahoo.com。除非浏览器缓存了该IP地址,否则应该会失败。

一旦你完成了测试,记得要删除DNS覆盖。然后,你就无法访问该网站了。

结论

如果你想把流氓DNS请求重定向到你配置的DNS服务器之一,你只需要一个简单的规则。默认的Unbound DNS服务器或类似Pi-hole的东西都是选择。使用一个别名,可以随机地,或轮流地将DNS请求重定向到几个IP地址。

如果你有许多DNS服务器,这是非常有用的(我建议有两个,以防止一个发生故障或你正在执行更新,你的网络不会发生故障)。使用防火墙组,你也可以同时配置许多接口。

我希望你能发现配置DNS请求的许多方法是有用的!