Skip to content

高频 DNS 缓存设置教程

引言

NY 节点端并不自带 DNS 缓存功能,如果您使用了域名作为目标地址,每当有新的用户连接发起时,出口服务器就会向上游 DNS 服务器请求解析一次域名。

这种高频率的查询会让很多公共 DNS 服务将你的请求视为滥用行为,从而拒绝响应或限速处理,导致你的转发服务出现不稳定、延迟增大甚至中断的情况。

为了解决这一问题,你可以搭建一个带有缓存功能的 DNS 服务器,让所有的域名解析请求先经过它进行缓存,再转发到上游 DNS。这样不仅能大幅降低上游查询负载,也能显著提升响应速度和服务稳定性。

什么情况会出现这种问题

  • [+] 使用公共 DNS (例如 1.1.1.1 8.8.8.8 以及某些运营商 DNS) 的机器。
  • [+] 使用了域名作为目标地址。
  • [-] AWS 默认模板使用了自己的内网 DNS 服务器,一般不会有这种问题。
  • [-] 隧道入口到出口之间的通信,默认不依赖 DNS,一般不会有这种问题。

免责声明

本教程并非对所有环境都适用。由于各用户系统配置和网络环境的差异,按照本文步骤进行操作可能无法达到预期效果,甚至可能导致系统 DNS 服务异常。如果在实践过程中遇到任何问题,请不要联系作者寻求帮助,而应自行排查并解决。

步骤

以 Debian 12 系统为例,使用 dnsmasq 作为本地 DNS 服务器。

安装

  • systemd-resolved 冲突,请确保您没有安装 systemd-resolved
  • 下方脚本会直接覆盖已有的 dnsmasq 和 resolv.conf 配置,请确保当前系统没有对它们进行特殊配置
  • 下方脚本中的 server 可以自行修改
apt-get update
apt-get install -y dnsmasq dnsutils

rm -f /etc/dnsmasq.d/*

echo "
listen-address=127.0.53.53
bind-interfaces

no-resolv

strict-order
cache-size=1000

server=1.1.1.1
server=8.8.8.8
server=2606:4700:4700::1111
server=2001:4860:4860::8888
" > /etc/dnsmasq.d/my.conf

systemctl restart dnsmasq

chattr -i /etc/resolv.conf
rm -f /etc/resolv.conf
echo "nameserver 127.0.53.53" > /etc/resolv.conf
chattr +i /etc/resolv.conf

验证

nslookup www.google.com

如果显示类似下方的查询结果,并且查询的服务器为 127.0.53.53 即安装成功。

Server:         127.0.53.53
Address:        127.0.53.53#53

Non-authoritative answer:
Name:   www.google.com
Address: 142.250.199.68
Name:   www.google.com
Address: 2404:6800:4005:815::2004

卸载

  • 不再使用 dnsmasq,卸载该软件和配置
  • 下方脚本中的 nameserver 可以自行修改
  • 重启系统或者网卡后,resolv.conf 可能会被某些系统组件自动修改,如果您不希望这种情况发生,可以取消注释下方命令的最后一行。
rm -f /etc/dnsmasq.d/*

apt-get purge -y dnsmasq
apt-get autoremove -y

chattr -i /etc/resolv.conf
rm -f /etc/resolv.conf
echo "nameserver 1.1.1.1" > /etc/resolv.conf
# chattr +i /etc/resolv.conf