高频 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
可能会被某些系统组件自动修改,如果您不希望这种情况发生,可以取消注释下方命令的最后一行。