pdnsd
pdnsd 是一个 DNS 服务器,设计用于本地缓存 DNS 信息。正确配置后,它可以显著提高宽带连接的浏览速度。与 BIND 或 dnsmasq 相比,它可以记住重启后的缓存;“p”代表持久性。有关与其他 DNS 服务器的比较,请参阅 域名解析#DNS 服务器。
安装
配置
该软件包附带一个示例配置文件,位于 /usr/share/doc/pdnsd/pdnsd.conf
。自定义配置文件应在 /etc/pdnsd.conf
中创建。
格式
pdnsd.conf
文件使用相当简单的格式,但它与您可能遇到的大多数其他配置文件有一些不同。它包含各种类型的节集合。节以节类型名称和左花括号 ({) 开始,以右花括号 (}) 结束。节不能嵌套。
每个块内是一系列以下格式的选项
option_name=option_value;
请注意末尾的分号;与某些格式不同,它不是可选的。
注释以 # 或 /* 开头。前者到行尾,后者持续到遇到 */。
DNS 服务器
pdnsd 需要知道至少一个 DNS 服务器的地址才能从中收集 DNS 信息。此部分设置取决于您是宽带连接还是拨号连接。宽带用户应使用第一个服务器节作为起点,拨号用户使用第二个服务器节,并将其他服务器节注释掉。
- label
label
选项用于唯一标识服务器节。它是完全任意的,但一个好的选择是您的 ISP 的名称。- ip
- 此选项在默认宽带配置中使用,告诉 pdnsd 要使用的 DNS 服务器地址。多个地址应以单个逗号分隔,逗号前后可以有可选的空格。您可以直接从
/etc/resolv.conf
复制地址。 - file
file
选项可以代替ip
使用,以指定一组 DNS 服务器 IP。它的值是文件的路径,其中列出了resolv.conf
格式的服务器。默认拨号配置使用它,因为 PPP 客户端写入/etc/ppp/resolv.conf
,其中包含从 PPP 服务器获取的地址。除非您想使用与 ISP 默认提供的 DNS 服务器不同的 DNS 服务器,否则您无需更改它。- interface
- uptest=if 选项的网络接口。默认值为 eth0,这很可能是不正确的。如果 pdnsd 服务已启动但不返回任何 DNS 记录,则可能是此设置错误。
服务器节的其余部分无需任何更多更改即可工作。有关所有可用选项的详细信息,请参阅 pdnsd 手册。
使用 DHCP 连接的 DNS 服务器
当安装 netctl 时,pdnsd 可以通过 openresolv 收到名称服务器的 IP 地址通知,并且当您使用 配置文件的自动切换时,通知将变为动态的。
要配置此功能,请删除宽带服务器节,并使用以下更改更新拨号服务器节
label = resolvconf; file = /etc/pdnsd-resolv.conf;
编辑 /etc/resolvconf.conf
以将 openresolv 配置为 pdnsd 的订阅者之一
name_servers=127.0.0.1 pdnsd_resolv=/etc/pdnsd-resolv.conf
并运行 resolvconf -u
以使用名称服务器的地址更新 /etc/pdnsd-resolv.conf
(忽略指示无法访问 pdnsd 套接字的错误消息)。此更新仅在手动启动 pdnsd 之前需要一次。
OpenDNS
pdnsd.conf
文件内置了 OpenDNS 设置;您可以简单地删除(或注释掉)其上方的拨号和宽带节(注意不要删除文件顶部的必要全局设置),然后取消注释以使用 OpenDNS 解析。
但是,OpenDNS 对 Google 做了一些奇怪的事情。如果您想避免此行为(对许多人来说,这可以将 Google 请求从 15 毫秒增加到 75 毫秒以上),您需要拒绝来自 OpenDNS 的返回 OpenDNS 的 Google 代理机器之一的结果。确切的服务器 IP 会更改,但您可以运行 drill www.google.com @208.67.222.222
(由 ldns 提供)来查找当前的 IP。如果查询正在被代理,您将会知道,因为服务器的名称将解析为类似 google.navigation.opendns.com
的内容。在一次尝试中,这些地址是 208.67.216.230
和 208.67.216.231
。
一旦您知道 IP,您就可以替换 pdnsd.conf
中 OpenDNS server { …
} 声明中已存在的 rejected
IP。确保您保留前缀。
OpenNIC 是 OpenDNS 的可靠替代方案。
测试
您现在应该有一个正在工作的 pdnsd
守护进程。启动它。
测试 它现在是否正常工作。
对于您第二次使用 127.0.0.1
查找任何地址,查询时间应低于 1 毫秒。
系统设置
确保 启用 pdnsd.service
。
它在 network.target
之后立即启动,因为使用网络的服务依赖于正常工作的 DNS,即 network-online.target
(请参阅 上游说明)。
对于任何具有两个或多个 NIC 的 PC,要使 pdnsd 在任何有线和无线连接上都可操作,请通过指定正确的 interface
在 pdnsd.conf
中为每个 NIC 配置单独的配置文件。
技巧和提示
家庭宽带用户的性能设置
许多用户的宽带连接的 DNS 服务器速度慢或不可靠,并且希望使用 pdnsd
作为缓存服务器,以最大限度地减少需要进行的 DNS 查询数量。完成上面详述的设置后,/etc/pdnsd.conf
中的以下设置将有助于提高此角色中的性能
在全局设置下
neg_rrs_pol=on; par_queries=1;
在服务器设置下
proxy_only=on; purge_cache=off;
neg_rrs_pol=on;
策略意味着当查询返回否定响应时,即使响应不是“权威的”,pdnsd 服务器仍将缓存结果。这很重要,因为观看 DNS 查询会发现,有许多对 AAAA 记录(IPv6 的 DNS 查询)的请求永远不会返回结果,因为许多域没有使用 IPv6,以及 MX 记录,因为并非每个域都有 MX 记录。如果没有负缓存,即使在域名已被缓存之后,也会发送这些请求,并且在此角色中,您不希望发出额外的 DNS 请求。将此选项与 proxy_only=on;
选项结合使用以最大限度地减少系统发出的查询数量非常重要。
如果您在下面的“server”节中指定了多个 DNS 服务器,则 par_queries=1;
选项很有用。它指定一次将并行发出多少个查询的增量。例如,如果在“server”节中列出了四个 DNS 服务器,并且 par_queries=2;
(默认值),则将同时查询前 2 个服务器,如果前两个服务器都失败,则 pdnsd
将移动到接下来的两个并同时查询它们。上面使用的设置意味着一次查询一个 DNS 服务器,因此您可以在“server”节中列出两个或多个 DNS 服务器,并且仅当第一个服务器失败时才会查询第二个服务器。这有助于最大限度地减少流量,但如果第一个服务器失败,您将必须等待超时,然后才能查询第二个服务器。根据您的个人喜好调整此设置,如果您在“server”节中仅指定一个服务器,则无需担心它。
FAQ 中提到了 proxy_only=on;
设置,对于家庭宽带用户来说很重要,因为您通常只使用一个或两个 DNS 服务器,而不是尝试进行完整的层次结构名称解析,而完整的 DNS 服务器会这样做。此设置将阻止 pdnsd
一直解析回“权威”名称服务器,而是接受已在“server”节中指定的 DNS 服务器的结果。再次强调,这减少了您需要进行的 DNS 查询数量,从而提高了性能。
purge_cache=off;
设置告诉 pdnsd
不要删除缓存条目,即使它们已超过 DNS 记录的生存时间指标。当您的 ISP 的 DNS 服务器宕机并且您希望能够访问您经常使用的域的名称查找时,即使在中断期间,这可能非常有用。一旦缓存已满,记录仍将根据年龄从缓存中清除(有关如何设置缓存大小,请参阅 pdnsd.conf(5))。
额外的性能设置
TTL(生存时间)
从服务器返回的每个 DNS 资源记录都包含最大生存时间或 TTL。这告诉接收者存储记录的时间以及何时对其进行新的查找。许多 DNS 记录的 TTL 相对较短,例如 3600(一小时)。这意味着一小时后,pdnsd 将尝试对此条目进行新的查找,无论它是否具有可用的缓存记录。通过设置全局最小 TTL 来覆盖此默认 TTL 将提高性能,从而减少执行的查找次数。使用过长的最小 TTL 的缺点是缓存的记录可能已过时(主机的 IP 地址可能已更改,但您的客户端不会知道这一点,因为它将收到缓存的地址)。但是,大多数 IP 地址不会每小时甚至每天更改。
时间默认以秒为单位指定,或者您可以将“m”、“h”、“d”或“w”附加到时间以分别指定分钟、小时、天或周。
全局设置中的 min_ttl
设置缓存记录的最小 TTL,导致 pdnsd 忽略从服务器接收的记录中的默认 TTL。在慢速连接或慢速 DNS 服务器上,您可能希望将其设置为几个小时以减少查找次数(例如 min_ttl=6h;
)。
全局设置中的 neg_ttl
设置不存在域的最小 TTL。如果服务器告诉 pdnsd 某个域不存在,它将不会再次尝试查找该域,直到经过这段时间。
超时
设置较短的超时意味着 pdnsd 将更快地放弃整个查询或给定的服务器查询,从而提高性能。将超时设置得太短的缺点是 pdnsd 可能会在查找时返回错误,仅仅是因为服务器没有足够的时间做出响应。
全局设置中的 timeout
确定 pdnsd 何时放弃整个查询并向您的浏览器或其他客户端返回错误。设置全局超时选项可以使您在服务器节中指定相当短的超时间隔(请参见下文)。这将产生以下效果:如果第一个服务器响应缓慢,pdnsd 将相当快地开始查询其他服务器(但仍将继续侦听来自第一个服务器的响应)。(如果您使用 query_method=tcp_udp,建议您使全局超时至少是最大服务器超时的两倍,否则如果 TCP 连接超时,pdnsd 可能没有时间尝试 UDP 查询。)
全局设置中的 tcp_qtimeout
确定 TCP 查询连接可以保持打开状态的时间。
服务器设置中的 timeout
确定 pdnsd 将等待每个服务器响应的时间。将此时间设置为较短的时间意味着 pdnsd 将更快地放弃无响应服务器,并将移动到下一个可用服务器,有时会导致更快的总体响应时间。在快速连接上,将其设置为 4 或 5 秒并非不合理。
调试
要查看 pdnsd 正在使用哪些服务器进行特定查找、超时如何工作以及域正在使用哪些默认 TTL,请在全局设置中打开调试
debug=on;
重新启动 pdnsd 并使用 systemd 日志 监视 pdnsd.service 的更改
# journalctl -f -u pdnsd.service
请务必在常规使用时关闭调试,因为保持开启状态可能会降低性能。
缓存大小
默认情况下,pdnsd 将自动为 /etc/hosts
中的所有条目创建权威记录。如果您有很多条目,例如,如果您将其用于广告拦截,则 /etc/pdnsd.conf
提供的默认最大缓存大小可能不够大,从而导致 DNS 请求未在预期的时间内缓存。
要增加缓存大小,请编辑配置文件“全局设置”部分中的 perm_cache
行(大小以 kB 为单位)。
或者,您可以通过将选项 authrec=off
添加到“source”节来阻止 pdnsd 抢先获取您的 hosts 文件。如果由于任何原因,将 authrec 设置为 off 不起作用,一个简单的解决方法是创建一个单独的 hosts 文件(例如 /etc/hosts-pdnsd
),其中仅包含您的系统信息,并将您的“source”节指向该文件,同时保持原始 hosts 文件不变。这样,pdnsd 将仅在执行查找时引用 /etc/hosts
。因此,例如
/etc/hosts-pdnsd
#<ip-address> <hostname.domain.org> <hostname> 127.0.0.1 localhost.localdomain my_hostname ::1 localhost.localdomain localhost
如果您的网络上有几台计算机,您可能希望将 pdnsd 设置为所有计算机的 DNS 服务器。这允许您的整个网络共享单个 DNS 缓存,从而使重复查找速度更快。要允许这样做,只需在 global
部分中将 server_ip
设置为您的网络接口的名称(通常为 eth0
)。如果您已设置防火墙,请告知它允许来自网络上任何地址的端口 53 的连接。
现在,您可以将网络上的其他计算机配置为使用运行 pdns 的计算机作为其主 DNS 服务器。
名称屏蔽
pdnsd 允许您指定它永远不应返回结果的主机或域。这允许您将其用作原始的广告或内容拦截器等。在 pdnsd.conf
中创建一个新的 neg
节。 neg
节有两个主要选项。 name
是您要阻止的主机或域名。 types
可以设置为 domain
以阻止给定域中的所有主机。默认的 pdnsd.conf
提供了一个阻止来自 doubleclick.net 的所有广告的示例。
由于每个块只能设置一个域,因此这对于直接在 pdnsd.conf
中阻止广告、跟踪器或恶意内容的效果不佳。您可能希望为这些列表创建单独的配置文件,例如 /etc/pdnsd.d/spam_domains
,并在 pdnsd.conf
中添加一个 include
节,例如
include {file="/etc/pdnsd.d/spam_domains";}
或者,可以添加一个 source
节(添加到加载 /etc/hosts
的现有节之外),该节加载 /etc/hosts
格式的文件,该文件将域绑定到特殊 IP 地址 0.0.0.0 – 但这不会阻止子域,因为 /etc/hosts
不允许通配符。这样做等同于将规则添加到 /etc/hosts
,但它可以避免使用可能破坏某些应用程序的巨大 /etc/hosts
。
pdnsd-ctl
- pdnsd-ctl 控制 pdnsd,一个具有永久缓存的代理 dns 服务器。请注意,必须启用状态控制套接字(通过在 pdnsd 命令行或配置文件中指定选项),然后才能使用 pdnsd-ctl。
要做到这一点,请包含选项
status_ctl = on;
在 /etc/pdnsd.conf
的全局节中。
如果您在 /etc/pdnsd.conf
中更改了缓存目录,则必须使用 -c
选项运行 pdnsd-ctl
# pdnsd-ctl -c path/to/cache
一些有用的命令,可帮助您入门...
查看缓存
# pdnsd-ctl dump
刷新缓存
# pdnsd-ctl empty-cache
DNSCrypt
pdnsd 可以与 DNSCrypt 一起使用。DNSCrypt 加密域名查找。pdnsd 然后在必要时查询 DNSCrypt。示例配置可以在 DNSCrypt#pdnsd 中找到。
故障排除
192.168.x.x 的 uptest 结果:失败
您可以成功 ping 您的 ISP 的 动态 DNS 服务器,即使日志显示以下内容
# journalctl -f -u pdnsd.service
result of uptest for 192.168.x.x: failed
检查 /etc/pdnsd.conf
全局节中配置的接口是否存在
interface = any;
或服务器节中的接口
interface=enp2s0;
可以通过运行以下命令找到正确的名称:ifconfig
。
常见问题解答
- 问)对我来说似乎没有快多少。为什么?
- 答) 运行本地 DNS 缓存所获得的额外速度完全取决于连接到服务器所需的时间。吞吐量,人们通常认为的速度,不会受到影响。当浏览网页时,差异最明显,因为这通常涉及从多个服务器进行少量下载。对于较慢的连接,尤其是拨号连接,吞吐量是主要的瓶颈,因此百分比差异不会那么大。
- 问)为什么现在比以前慢得多?
- 答) 您几乎可以肯定在
pdnsd.conf
的服务器节之一中关闭了proxy_only
选项。默认情况下,pdnsd 经常询问多个 DNS 服务器关于域的信息,以获得尽可能准确的响应。proxy_only
选项禁用此功能。如果您使用 ISP 提供的 DNS 服务器,则应将其打开。