pfSense 中的 DNS 解析
pfSense 中的 DNS 解析利用 unbound,这是一款验证、递归、缓存 DNS 解析器,支持 DNSSEC 和各种选项。当前版本的 pfSense 默认启用 DNS 解析。
默认情况下,DNS 解析器不使用在“系统”>“常规设置”下配置的 DNS 服务器,也不使用从动态 WAN 自动获取的 DNS 服务器,而是直接查询根 DNS 服务器。除非使用 DNS 查询转发选项,否则不会更改此行为。通过默认直接联系根服务器,可以消除使用本地 DNS 时因配置不当而给用户造成的许多问题,并利用 DNSSEC 使 DNS 结果更加可靠和可验证。
DNS 解析器和 IPv6
DNS 解析器完全兼容 IPv6。它接受和查询 IPv6,支持 AAAA 记录,在处理 DNS 的 IPv6 方面没有任何已知问题。
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 静态映射地址。
- 自定义选项:用于放置不受 GUI 直接支持的 unbound 高级指令的文本区域。如果在输入自定义选项后 unbound 无法正确启动,请在自定义选项之前的一行中添加
server:。
主机覆盖
可在页面的主机覆盖部分创建自定义 DNS 条目。主机覆盖可以定义新记录或覆盖现有记录,以便本地客户端接收配置的响应,而非来自上游 DNS 服务器的响应。这对于拆分 DNS 配置以及作为部分阻止访问某些特定网站的手段也很有用。
注意:我们不建议仅使用 DNS 覆盖功能作为阻止访问某些网站的手段。绕过的方法数不胜数。它能阻止非专业用户,但对于那些专业技术能力更强的人来说很容易规避。
- 主机:此字段仅定义 DNS 记录的主机名部分(无域),例如
www。若要对域本身创建覆盖记录,可留空(类似于 BIND 中的“@”记录)。 - 域:此字段为必填项,为覆盖条目定义域名,例如
example.com。 - IP 地址:作为此条目 DNS 查找结果返回的 IP 地址(IPv4 或 IPv6)。
- 描述:用于识别或提供有关此条目更多信息的文本说明。
- 此主机的其他名称:为同一 IP 地址定义其他主机名(类似于 CNAME 记录),以便将它们合并到单个覆盖条目中。
域覆盖
在 DNS 解析器页面的底部可以找到域覆盖。这些条目指定用于解析特定域的备用 DNS 服务器。
一个典型的部署例子是在小型企业网络中使用带有 Active Directory 的单个内部服务器,通常是 Microsoft Small Business Server。Active Directory 域名的 DNS 请求必须由 Active Directory 的内部 Windows Server 来解析才能正常运行。为指向内部 Windows 服务器 IP 地址的 Active Directory 域添加覆盖,可确保无论客户端是直接使用此防火墙还是 Windows Server 作为 DNS 服务器,这些记录都能被正确解析。
在 Active Directory 环境中,最佳做法是让客户端始终使用 Windows DNS 服务器作为主 DNS 服务器,以便动态名称注册和其他与域相关的 DNS 任务正常工作。在只有一个 Windows DNS 服务器的环境中,启用 DNS 解析器,并使用 Active Directory 域的覆盖,将此防火墙作为内部计算机的辅助 DNS 服务器。这确保了除 Active Directory 以外的 DNS 解析没有单点故障,单个服务器的丢失并不意味着完全的互联网中断。在这样的环境下,单个服务器的丢失通常会带来重大后果,但若用户在此期间还能查看 lolcats、Facebook、Twitter 等,就能更从容地单独解决问题。
DNS 覆盖的另一个常见用途是利用可通过 * 访问的主站点上的 DNS 服务器,来解析远程站点上的内部 DNS 域。在这样的环境中,所有 DNS 查询通常都在中央站点解决以便集中控制,但有些组织更愿意让 Internet DNS 在每个站点使用 pfSense 进行解析,并仅将内部域的查询转发给中央 DNS 服务器。请注意,需要为 IPsec 配置静态路由。
- 域:设置将使用此条目解析的域名。这不一定是有效的顶级域名,可以是任何内容(例如
local、test、lab),也可以是实际的域名(如example.com)。 - IP 地址:指定发送域中主机名查询的 DNS 服务器的 IP 地址。如果目标 DNS 服务器在 53 以外的端口上运行,请在 IP 地址后添加 @ 分隔符和端口号,例如
192.0.2.3@5353。 - 描述:用于识别或提供有关此条目更多信息的文本说明。
DNS 解析和多 WAN
使用默认设置时,DNS 解析器在多 WAN 环境中会出现问题。主要问题是 DNS 解析器想要直接查询根 DNS 服务器。这些查询只会使用默认网关发送出去。如果包含默认网关的广域网失败,DNS 查询也可能失败。有方法可以解决此限制:
- 转发模式:启用 DNS 查询转发,并在“系统”>“常规设置”下为每个 WAN 网关至少配置一个 DNS 服务器。根据上游 DNS 服务器的支持情况,可能也需要禁用 DNSSEC。
- 默认网关切换:在“系统”>“高级设置”的“其他”选项卡下启用默认网关切换。如果首选的默认网关失败,此功能会将默认网关切换到下一个可用的网关。不过,此选项仍被视为实验性功能,在某些情况下可能会有问题。
DNS 解析器和 DNS 重新绑定保护
默认情况下,DNS 重新绑定保护处于启用状态,会拒绝私有 IP 地址响应。要允许来自已知域的专用 IP 地址响应,请在 DNS 解析器设置中的“自定义选项”框内配置允许的域,示例如下:
server:
private-domain: "example.com"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 万的值。
日志层级:选择日志详细程度。默认值为 Level 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:允许来自配置网络中客户端的递归和非递归查询,用于缓存监听,通常仅在管理主机上配置。
- 描述:有关此条目的参考说明。
- 网络:要由此访问列表条目管理的网络列表。
觉得内容不错?我要