pfSense中的DNS解析利用unbound,这是一个验证、递归、缓存DNS解析器,支持DNSSEC和各种选项。当前版本的pfSense默认启用DNS解析。
默认情况下,DNS解析程序不使用在“系统”>“常规设置”下配置的DNS服务器或从动态WAN自动获取的DNS服务器,而是直接查询根DNS服务器。 除非使用DNS查询转发选项,才可能会更改此行为。 通过默认直接联系根服务器,它可以消除使用本地DNS因配置不正确给用户造成的许多问题,并且使用域名系统安全扩展(DNSSEC),DNS结果更加可靠和可验证。
DNS解析器和IPv6
DNS解析器完全兼容IPv6。它接受和查询IPv6,支持AAAA记录,并没有任何与IPv6的任何方面和处理DNS的已知问题。
DNS 解析器配置
要配置DNS解析器,请导航到系统服务> DNS 解析
常规设置
启用: 选中此框将打开DNS解析器,或取消选中以禁用此功能。 DNS转发器和DNS解析器不能同时在同一个端口上处于活动状态,因此在尝试启用DNS解析器之前,请禁用DNS转发器或将一个服务或另一个服务移动到其他端口。
监听端口: 默认情况下,DNS解析程序侦听TCP和UDP端口53。这对于任何DNS服务器都是正常的,因为它是客户端将尝试使用的端口。 在某些情况下,将DNS解析器移动到另一个监听端口(例如5353或54)是可取的,然后通过端口转发可能会转发特定的源。
接口: 默认情况下,DNS解析器监听每个可用的接口以及IPv4和IPv6地址。 接口控制限制了DNS转发器接受和回答查询的接口。 除防火墙规则外,还可以用来增加安全性。 如果选择了特定的接口,则该接口上的IPv4和IPv6地址将用于回答查询。 unbound的守护进程将只绑定到选定的接口。 发送到防火墙上的其他IP地址的查询将被静静地丢弃。
出站网络接口: 默认情况下,DNS解析器利用所有接口进行出站查询,因此它将从任何接口获取查询,从路由角度来看,IP地址距离目标服务器最近。 选择特定的接口将限制选择仅限于可能被用作查询源的特定接口。
系统域本区域类型: 该选项确定为系统域配置的unbound本地区域的类型。 如果本地数据(例如主机覆盖,DHCP主机等)不匹配,则区域类型将管理为客户端提供的响应类型。在每种情况下,如果存在本地匹配,则查询将得到正常响应。 管理不匹配的响应的可用类型是:
Deny:丢弃查询并且不回答客户端。
Refuse:通知客户端查询被拒绝(使用rcode REFUSED)。
Static:向客户端返回NODATA
或 NXDOMAIN
响应。
Transparent:这是默认行为。如果查询是针对本地不存在的名称,则会照常解析。如果名称具有本地匹配,但类型不同,则向客户端发送“NOERROR
, NODATA
”响应。
Type Transparent:与Transparent类似,它也通过查询名称匹配,但类型不匹配。例如,如果客户端查询AAAA记录,但仅存在A记录,则传递AAAA查询而不是接收否定响应。
Redirect:处理来自本地数据的查询,并重定向本地区域下方区域的查询(例如子域)。这可以用来控制给定域下的所有子域的查询。
Inform:正常回应,但记录客户端查询。
Inform Deny:拒绝并记录查询。
No default:禁用区域的任何默认内容,而不影响查询行为。
DNSSEC: 启用域名系统安全扩展(DNSSEC),允许客户端信任DNS响应的来源和内容。 这是默认启用的。 DNSSEC可防止对DNS响应的操纵,如DNS缓存中毒或其他查询拦截,但不会使响应的内容变得秘密。 除非转发服务器支持DNSSEC,否则DNSSEC在直接使用根服务器时效果最佳。 如果上游DNS服务器不支持DNSSEC转发模式或域覆盖,已知DNS查询被上行拦截,或者客户端遇到超大DNS响应问题,则可能需要禁用DNSSEC。
DNS查询转发: 默认情况下禁用。 启用时,unbound将使用系统>常规设置中的系统DNS服务器或从动态WAN接收的系统DNS服务器,而不是直接使用根服务器。 这对于需要精确控制DNS查询路由的多WAN场景来说更好,但是由于缺少上游DNS服务器的支持或转发查询的其他问题,通常也需要禁用DNSSEC。
DHCP注册: 处于活动状态时,可以使用DNS解析DHCP客户端的内部机器名称。 这只适用于在DHCP请求中指定主机名的客户端。 在系统>常规设置中的域名用作主机上的域名。
静态DHCP: 这与DNS转发器中的注册DHCP租约的作用相同,只不过它注册了DHCP静态映射地址。
自定义选项: 用于放置unbound高级指令的文本区域,不受GUI的直接支持。 如果在输入自定义选项后unbound无法正确启动,请在自定义选项之前的一行中添加server:。
自定义DNS条目可以在页面的主机覆盖部分创建。 主机覆盖可以定义新记录或覆盖现有记录,以便本地客户端接收配置的响应,而不是来自上游DNS服务器的响应。 这对于拆分DNS配置也是有用的,并且作为阻止访问某些特定网站的部分有效手段。
注意:我们不建议仅使用DNS覆盖功能作为阻止访问某些网站的手段。 有无数的方法来解决这个问题。 它会阻止非专业用户,但是对于那些专业技术能力更强的人来说很容易规避。
主机: 该字段只定义了DNS记录的主机名部分(没有域),例如www。对域本身做一个覆盖记录可能会留空(类似于绑定中的“@”记录)。
域: 该字段是必需的,并且为覆盖条目定义域名,例如example.com。
IP地址: IP地址(IPv4或IPv6)作为此条目的DNS查找的结果返回。
描述: 用于识别或提供有关此条目的更多信息的文本说明。
此主机的其他名称: 为同一IP地址定义其他主机名(与CNAME记录非常相似),以将其保留在单个覆盖条目中。
在DNS解析器页面的底部找到域覆盖。这些条目指定用于解析特定域的备用DNS服务器。
通常部署的例子是在小型企业网络中使用带有Active Directory的单个内部服务器,通常是Microsoft Small Business Server。 Active Directory域名的DNS请求必须由Active Directory的内部Windows Server来解决才能正常运行。 为指向内部Windows服务器IP地址的Active Directory域添加覆盖,可确保无论客户端是直接使用此防火墙作为DNS服务器还是Windows Server,都能正确解析这些记录。
在Active Directory环境中,最佳做法是让客户端始终使用Windows DNS服务器作为主DNS服务器,以便动态名称注册和其他与域相关的DNS任务正常工作。在只有一个Windows DNS服务器的环境中,使用Active Directory域的覆盖启用DNS解析器,并使用此防火墙作为内部计算机的辅助DNS服务器。这确保了DNS解析(Active Directory除外)没有单点故障,而单个服务器的丢失并不意味着完全的互联网中断。在这样的环境下,单个服务器的丢失通常会带来重大的后果,但是如果用户还可以在此期间检查他们的lolcats,Facebook,Twitter等等,用户将更容易单独解决问题。
DNS覆盖的另一个常见用途是使用可通过VPN访问的主站点上的DNS服务器来解析远程站点上的内部DNS域。在这样的环境中,所有DNS查询通常都在中央站点解决,以便对DNS进行集中控制,但有些组织更愿意让Internet DNS在每个站点上使用pfSense进行解析,并且只将内部域的查询转发给中央DNS服务器。请注意,静态路由对于IPsec来说是必要的。
域: 域字段设置将使用此条目解析的域名。这不一定是有效的TLD,它可以是任何东西(例如local, test, lab),也可以是实际的域名(example.com)。
IP地址:指定发送域中主机名查询的DNS服务器的IP地址。如果目标DNS服务器在53以外的端口上运行,则将IP地址后面的端口号添加@分隔值,例如:192.0.2.3@5353
描述: 用于识别或提供有关此条目的更多信息的文本说明。
使用默认设置,DNS解析器将在多WAN环境中出现问题。 主要问题是DNS解析器想要直接查询根DNS服务器。 这些查询只会使用默认网关发送出去。 如果包含默认网关的广域网失败,则DNS查询也可能失败。 有办法解决这个限制:
启用DNS查询转发并在系统>常规设置下为每个WAN网关至少配置一个DNS服务器。根据上游DNS服务器的支持,也可能需要禁用DNSSEC。
在系统>高级设置,其他选项卡下启用默认网关切换。 如果首选的默认网关失败,这将把默认网关移动到下一个可用的网关。 但是,这个选项仍然被认为是实验性的,在某些情况下可能会有问题。
默认情况下,启用DNS重新绑定保护,并拒绝私有IP地址响应。 要允许来自已知域的专用IP地址响应,请使用DNS解析器设置中的“自定义选项”框配置允许的域,如下所示:
server: private-domain: ""
DNS解析高级设置
pfSense提供了一个GUI,用于配置unbound一些更为常用的高级选项。下面的选项记录在unbound.conf手册页中。
隐藏身份: 设置时,尝试查询服务器标识(id.server和hostname.bind)将被拒绝。
隐藏版本: 设置时,尝试查询服务器版本(version.server和version.bind)将被拒绝。
预取支持: 启用时,消息缓存元素将在预先保存到期之前保持缓存保持最新。 此选项可能导致服务器上的DNS流量和负载增加10%左右,但频繁请求的项目不会从缓存中过期。
预取DNS密钥支持: 当启用时,遇到代表签名者记录时,在验证过程中提前获取DNSKEY。这有助于降低请求的延迟,但又利用了更多的CPU,并要求将缓存设置为零以上。
Harden DNSSEC数据: 如果禁用此选项并且未收到DNSSEC数据,则该区域将变得不安全。信任锚定区域需要DNSSEC数据。如果这样的数据不存在,则该区域变成假的。
消息缓存大小: 消息缓存存储DNS响应代码和验证状态。资源记录集(RRSet)缓存将自动设置为这个数量的两倍。 RRSet缓存包含实际的资源记录数据。默认值是4 MB。
出站TCP缓冲区: 每个线程分配的传出TCP缓冲区的数量。默认值是10,如果设置为0,TCP查询将不会被发送到授权服务器。
入站TCP缓冲区: 每个线程分配的传入TCP缓冲区的数量。默认值是10,如果设置为0,则不会从客户端接受TCP查询。
EDNS 缓冲区: 作为EDNS重组缓冲区大小通告的字节数量。 该值被放置在发送给对等体的UDP数据报中。 RFC建议是4096(默认)。 如果碎片重新组装发生问题,通常被视为超时,则1480的值可能有帮助。 512值绕过了大多数MTU路径问题,过大可能会产生过多的TCP回退。
每个线程的查询数量: 每个线程将同时服务的查询数量。如果到达需要服务的附加查询,并且没有查询可以被推出,则新的查询被丢弃。
拥挤超时: 服务器非常繁忙时使用超时。 这可以防止缓慢查询或高查询率的拒绝服务。 默认值是200毫秒。 设置为接近授权服务器的往返时间的值。 当新的查询到达时,如果超过规定的超时,则允许50%运行,并且50%由新的查询替换。
RRsets和消息最大TTL: RRset和缓存中消息的最长生存时间(TTL),以秒为单位指定。 默认值是86400秒(1天)。 内部TTL到期时,缓存项目已过期。 这可以配置为强制解析器更频繁地查询数据,不信任(非常大)的TTL值。
RRsets和消息最小TTL: 缓存中RRset和消息的最短生存时间(以秒为单位)。 默认值是0秒。 如果记录的TTL低于配置的最小值,那么可以将数据缓存的时间超过域所有者的预期时间,从而减少查询来查找数据。 0值确保缓存中的数据不会比域所有者预期的更长。 高值可能会导致麻烦,因为如果高速缓存中的数据发生更改,则可能与实际数据不匹配。
主机缓存条目的TTL: 生存时间(以秒为单位),用于基础结构主机高速缓存中的条目。基础设施主机缓存包含往返时间,跛行和DNS服务器的EDNS支持信息。默认值是15分钟。
要缓存的主机数量:为其缓存信息的基础架构主机数量。默认值是10,000。
不需要的回复阈值: 如果启用,则在每个线程中跟踪总数不受限的答复。 达到阈值时,将采取防御措施,并向日志文件输出警告。 防御行动是清除RRSet和信息缓存,希望冲走任何毒药。 默认是禁用的,但是如果启用,建议使用1000万的值。
日志层级:选择日志详细程度。默认是1级.
Level 0: 只记录错误。
Level 1: 记录操作信息。
Level 2: 记录详细的操作信息。
Level 3: 记录每个查询输出
Level 4: 算法级别信息。
Level 5: 记录缓存未命中的客户端标识。
禁用自动添加访问控制: 禁用自动添加的访问控制条目。缺省情况下,允许该防火墙内部接口的IPv4和IPv6网络。如果选中,则必须在“访问列表”选项卡上手动配置允许的网络。
实验位0x20支持: 在DNS查询中使用0x20编码的随机位来阻止欺骗尝试。 更多信息,请参阅dns-0x20实施草案。
DNS解析访问列表
Unbound需要访问列表(ACL)来控制允许哪些客户端提交查询。缺省情况下,允许该防火墙内部接口的IPv4和IPv6网络。必须手动允许其他网络。
注意:可以使用“高级设置”选项卡上的“禁用自动添加访问控制”选项来禁用自动ACL。
要管理DNS解析器的访问列表,请导航至系统服务> DNS解析器,访问列表选项卡。从这个列表中,可以添加新的条目并且可以编辑或删除现有的条目。
访问列表名称: 访问列表的名称,在访问列表配置文件中显示为注释。
动作: 处理此访问列表中包含的网络的方法,包含以下几种:
Deny: 停止已配置网络中客户端的查询
Refuse: 停止来自配置网络中客户端的查询,并发回拒绝响应代码
Allow: 允许来自配置网络中客户端的查询
Allow Snoop: 允许来自配置网络中客户端的递归和非递归查询,用于缓存监听,并且通常只在管理主机上配置。
描述: 有关此条目的参考说明。
网络: 要由此访问列表条目管理的网络列表。