Linux

使用PowerDNS Recursor自建支持EDNS的递归解析器

以Debian12系统安装最新版本为例,首先创建”/etc/apt/sources.list.d/pdns.list”文件,文件内容如下:

deb [signed-by=/etc/apt/keyrings/rec-52-pub.asc] http://repo.powerdns.com/debian bookworm-rec-52 main

再创建”/etc/apt/preferences.d/rec-52″文件,填写如下内容:

Package: rec*
Pin: origin repo.powerdns.com
Pin-Priority: 600

执行下面的命令来安装PowerDNS Recursor

install -d /etc/apt/keyrings; curl https://repo.powerdns.com/FD380FBB-pub.asc | tee /etc/apt/keyrings/rec-52-pub.asc

apt update && apt install pdns-recursor

编辑配置文件”/etc/powerdns/recursor.conf”,配置文件使用YAML语法

dnssec:
  validation: process
ecs:
  cache_limit_ttl: 60
  ipv4_bits: 24
  ipv4_cache_bits: 24
  ipv4_never_cache: false
  ipv6_bits: 56
  ipv6_cache_bits: 56
  ipv6_never_cache: false
  minimum_ttl_override: 90
incoming:
  listen:
  - 0.0.0.0
  udp_truncation_threshold: 1232
  use_incoming_edns_subnet: true
  edns_padding_mode: always
logging:
  loglevel: 3
  quiet: true
outgoing:
  edns_bufsize: 1232
  edns_subnet_allow_list:
  - 0.0.0.0/0
  - ::/0
  network_timeout: 300
  source_address:
  - 0.0.0.0
recordcache:
  max_entries: 1000000
  max_negative_ttl: 3600
  max_ttl: 86400
  refresh_on_ttl_perc: 50
  serve_stale_extensions: 5
recursor:
  config_dir: /etc/powerdns
  hint_file: /usr/share/dns/root.hints
  include_dir: /etc/powerdns/recursor.d
  public_suffix_list_file: /usr/share/publicsuffix/public_suffix_list.dat
  

配置文件保存以后重启PowerDNS Recursor使配置生效

systemctl restart pdns-recursor.service

到这里基本可以正常使用了,如果重启服务失败了,先检查一下53端口是否被其它程序占用,还有因为IPv6的问题可能会导致无法访问部分权威服务器,查询超时会回退IPv4,造成查询时间过长,不管是否有能够访问公网的IPv6地址,都可能遇见这种情况,即使本机器网卡只显示拥有fe80::开头的本地链路地址,也会导致PowerDNS Recursor尝试使用IPv6查询,建议禁用IPv6。

编辑”/etc/sysctl.conf”文件,修改或添加以下内容:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

然后执行sysctl -p使修改生效,到这里就可以使用了,不过需要注意一点,有些权威服务器会根据递归解析器本身的IP来响应请求,会忽略请求中携带的ECS信息。