linux中配置dns转发有四种方法:一、用systemd-resolved修改/etc/systemd/resolved.conf的forwarders并重启服务;二、用dnsmasq配置server=ip并指向127.0.0.1;三、用bind9在named.conf.options设forwarders并支持条件转发;四、临时改/etc/resolv.conf指定nameserver。

如果您在Linux系统中需要将DNS查询请求转发到外部DNS服务器,例如上游ISP的DNS或公共DNS(如8.8.8.8),则需配置DNS转发器(DNS forwarder)。以下是实现该功能的多种方法:
一、使用systemd-resolved配置DNS转发
systemd-resolved是现代Linux发行版(如Ubuntu 20.04+、Fedora、Debian 12+)默认集成的本地DNS解析服务,支持将未缓存的查询转发至指定上游服务器。
1、编辑resolved配置文件:sudo nano /etc/systemd/resolved.conf
2、取消注释并修改Forwarders行,添加目标DNS服务器IP:Forwarders=8.8.8.8 1.1.1.1
3、确保DNSStubListener设置为yes以启用本地监听:DNSStubListener=yes
4、重启服务使配置生效:sudo systemctl restart systemd-resolved
5、验证转发是否启用:resolvectl status | grep "DNS Servers"
二、使用dnsmasq作为轻量级DNS转发器
dnsmasq是一个小型、易配置的DNS转发与缓存工具,适用于无systemd环境或需精细控制转发行为的场景。
1、安装dnsmasq:sudo apt install dnsmasq(Debian/Ubuntu)或sudo dnf install dnsmasq(Fedora/RHEL)
2、备份原始配置:sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
3、编辑主配置文件,启用上游转发:sudo nano /etc/dnsmasq.conf
4、添加或取消注释以下两行:server=8.8.8.8 和 server=1.1.1.1
5、可选:限制监听地址以增强安全性,例如仅监听本地:listen-address=127.0.0.1
6、重启服务:sudo systemctl restart dnsmasq
7、将系统DNS指向dnsmasq:echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
三、使用BIND9配置权威+转发混合模式
BIND9是功能最完整的DNS服务器软件,支持条件转发(conditional forwarding),即对特定域名的查询转发至指定服务器,其余查询按全局转发策略处理。
1、安装BIND9:sudo apt install bind9(Debian/Ubuntu)或sudo dnf install bind(Fedora/RHEL)
2、编辑主配置文件:sudo nano /etc/bind/named.conf.options
3、在options块内添加forwarders定义:forwarders { 8.8.8.8; 1.1.1.1; };
4、可选:添加条件转发规则,例如将example.com子域转发至内部DNS:zone "example.com" { type forward; forwarders { 192.168.1.10; }; };
5、检查配置语法是否正确:sudo named-checkconf
6、重启BIND服务:sudo systemctl restart bind9(Debian/Ubuntu)或sudo systemctl restart named(RHEL/Fedora)
7、验证转发行为:dig google.com @127.0.0.1 +short
四、临时修改resolv.conf实现单次转发
此方法不持久,适用于调试或容器化环境中快速验证转发路径,绕过本地DNS服务直接指定上游服务器。
1、确认当前resolv.conf是否被动态管理:ls -l /etc/resolv.conf(若为符号链接,需先停用对应服务如systemd-resolved)
2、临时覆盖DNS配置:echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
3、禁用NetworkManager自动写入(如启用):sudo nmcli dev set eth0 ipv4.ignore-auto-dns yes
4、刷新连接:sudo systemctl restart networking(Debian)或sudo nmcli con reload(NetworkManager环境)
5、测试解析:nslookup example.com











