Linux的DNS怎么设置?

HCRM技术_小炮 DNS 2026-05-30 4 1

Linux下DNS设置详解:从入门到实战

liunx的dns怎么设置

如果你用过Linux系统,迟早会遇到一个场景:网络连接正常,ping IP地址也能通,但就是无法访问域名——浏览器里输入网址,迟迟打不开,这时候十有八九是DNS配置出了问题,DNS(域名系统)就像互联网的电话本,把google.com这样的名字翻译成机器能读懂的IP地址,如果你连电话本都拿错了,自然找不到地方。

我自己刚接触Linux那会儿,就被这个给坑过,当时在一台CentOS服务器上部署应用,折腾半天发现curl www.baidu.com一直报错,但curl 36.152.44.95却秒通,后来才意识到是DNS设置没改,系统还在用默认的老旧DNS服务器,今天这篇就系统地讲清楚Linux下怎么设置DNS,以及各种场景下该怎么做。

一、最直接的方法:修改/etc/resolv.conf

这是最古老也最直观的方式,在大多数Linux发行版中,/etc/resolv.conf文件就是DNS解析器的配置文件,你直接用编辑器打开它,像下面这样写:

nameserver 8.8.8.8
nameserver 114.114.114.114
search localdomain

第一行指定了首要DNS服务器(这里是Google的公共DNS),第二行是备用,第三行search指定了域名搜索后缀,比如你只输入server,它会自动补成server.localdomain,正常情况下,两个nameserver就够了。

liunx的dns怎么设置

改完之后,立刻生效,不需要重启任何服务,你可以用dignslookup验证:

dig @8.8.8.8 www.baidu.com

如果返回了A记录,说明你设置的DNS能正常工作。

但这里有个大坑:很多现代Linux发行版(比如Ubuntu 18.04及以上、CentOS 7及以上)的/etc/resolv.conf其实是由其他服务自动管理的,你手动改了,过一会儿或者重启网络服务,它又会被覆盖回原来的样子,你会发现自己白改了,这种情况,就需要用下面说的更“正统”的方法。

二、不同发行版,不同套路

1. CentOS/RHEL(7/8/9)——网卡配置文件

liunx的dns怎么设置

在CentOS这类基于Red Hat的系统上,网络接口的配置在/etc/sysconfig/network-scripts/ifcfg-eth0(接口名可能是ens33、enp0s3等),打开这个文件,在里面添加或修改:

DNS1=8.8.8.8
DNS2=114.114.114.114

注意:有的系统还支持DNS3等,然后重启网络服务:

systemctl restart network   # CentOS 7及之前
或者
nmcli connection reload     # 如果使用NetworkManager

如果NetworkManager管理着这个连接,你最好用nmcli来设置,更干净。

nmcli con mod eth0 ipv4.dns "8.8.8.8 114.114.114.114"
nmcli con up eth0

这样,/etc/resolv.conf就会被自动更新,而且重启后依然保留。

2. Ubuntu/Debian(18.04及之后)——Netplan或systemd-networkd

Ubuntu从18.04开始引入了Netplan作为网络配置管理工具,默认配置文件在/etc/netplan/01-netcfg.yaml(文件名可能有差异),用sudo nano打开,在对应接口下添加nameservers:

network:
  version: 2
  ethernets:
    ens33:
      dhcp4: yes
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]

然后应用:

sudo netplan apply

如果你用的是Ubuntu桌面版或者Server版且NetworkManager接管了网络,那么也可以通过/etc/systemd/resolved.conf配置(下节详谈),Debian依然保留着传统的/etc/network/interfaces文件,可以在里面写:

iface eth0 inet dhcp
    dns-nameservers 8.8.8.8 114.114.114.114

3. 使用systemd-resolved

systemd在很多发行版中掌管了DNS解析服务,它默认会监听127.0.0.53这个本地地址,并且/etc/resolv.conf指向了/run/systemd/resolve/stub-resolv.conf,如果你想全局修改DNS,最好编辑/etc/systemd/resolved.conf

[Resolve]
DNS=8.8.8.8 114.114.114.114
FallbackDNS=1.1.1.1

然后重启服务:

sudo systemctl restart systemd-resolved

之后,用resolvectl status查看当前生效的DNS,注意,如果同时有NetworkManager管理连接,NetworkManager会覆盖systemd-resolved的全局设置,所以你要么让NetworkManager接管,要么禁用NetworkManager对DNS的干预。

三、临时设置 vs 永久设置

很多人分不清这两种场景,临时设置最常见的需求是:你只是想在当前终端会话下让某个域名指向特定IP,或者想测试一个自定义的DNS服务器,这时可以用export或直接在命令里指定。

- 临时修改当前shell的DNS解析(比如你想用某个特定DNS来解析一个域名):

对单个命令指定DNS
dig @8.8.8.8 example.com
或者临时替换resolv.conf的内容(不推荐,但可以快速测试)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

- 如果你希望系统重启后依然使用这个DNS,那你必须用上面说的永久方法(编辑网卡配置文件、Netplan或systemd-resolved.conf)。

还有一个特别实用的技巧:每台主机也可以有自己的hosts文件来覆盖DNS/etc/hosts里写一行192.168.1.100 mylocalserver.com,那么所有对mylocalserver.com的请求都会直接走这个IP,而不会去问DNS服务器,这在开发调试、屏蔽广告、内网映射时特别常用。

四、常见问题与排错

1. “ping不通域名,但ping IP能通”

最典型的情况,先检查/etc/resolv.conf里的nameserver是否能访问:

nslookup google.com 8.8.8.8

如果报错connection timed out; no servers could be reached,说明你的服务器根本连不到8.8.8.8,可能是防火墙阻断了UDP 53端口,或者你的网络环境要求使用内网DNS,这时候用traceroute看看路由:

traceroute -n 8.8.8.8

如果发现中间有丢包或超时,那就要调整DNS地址了。

2. “我改了/etc/resolv.conf,重启又还原了”

这是上面提到的,因为有NetworkManager或systemd-networkd在管,解决方法是:要么按发行版的方式永久配置,要么你可以考虑让系统不自动修改这个文件,对于某些旧版系统,可以给/etc/resolv.conf加个不可变属性:

sudo chattr +i /etc/resolv.conf

但这是“暴力”方法,以后你每次改DNS都得先取消不可变,再设置,再锁定,不推荐长期使用。

“DNS解析变慢”

可能原因:DNS服务器响应慢、有多个nameserver且第一个超时、或系统开启了IPv6而DNS服务器不支持,可以尝试将IPv6的DNS设置为空,或者调整/etc/resolv.conf中的timeoutattempts参数(但注意这些参数在现代系统里被忽略,需要改/etc/nsswitch.conf/etc/resolv.conf配合options),更实际的优化是只保留一两个快的DNS,比如阿里(223.5.5.5)、腾讯(119.29.29.29)、或者用dnscrypt-proxy做缓存。

4. “我想用自定义的DNS做劫持或测试”

比如你想让所有对test.example.com的请求都返回127.0.0.1,可以用本地DNS劫持,除了/etc/hosts外,还可以运行一个本地DNS服务器(如dnsmasq),把特定域名指向自定义IP,dnsmasq配置简单:

sudo apt install dnsmasq

编辑/etc/dnsmasq.conf,添加:

address=/test.example.com/127.0.0.1
server=8.8.8.8

然后重启服务,将系统的DNS指向127.0.0.1,这样所有DNS请求经过dnsmasq,本地解析test.example.com返回127.0.0.1,其余查询上游。

五、实战总结

Linux下的DNS设置,说复杂也复杂,说简单也简单,关键在于理解你用的发行版采用哪套网络管理栈,我个人的建议顺序是:

1、先确认你的系统用了什么管理工具:systemctl status NetworkManagersystemctl status systemd-networkd,如果两者都没在运行,那大概率是传统方式——直接改/etc/resolv.conf

2、如果用了NetworkManager,就用nmcli或图形界面设置,不要手动改resolv.conf。

3、如果用了systemd-networkd,就去配置.network文件,或者用systemd-resolved

4、如果用了Netplan(Ubuntu),就改yaml文件。

现在很多云服务器(AWS、阿里云、腾讯云)默认会通过DHCP下发内网的DNS,有时候内网DNS比公网DNS解析更快,还支持内网域名,你完全可以不改动,直接用,但如果你需要访问某些特殊服务(比如Google、GitHub被墙,需要更换DNS),或者你想用AdGuard DNS拦截广告,那就必须手动设置了。

别忘了测试,写一个简单的脚本,每次改完DNS后自动运行nslookup baidu.comnslookup google.com,确保解析正常——毕竟,谁也不想在开项目演示的时候,才发现域名解析挂了。

希望这篇文章能帮你彻底解决Linux下的DNS设置问题,如果你在配置过程中遇到具体的报错,记得把错误信息贴出来,通常是“Temporary failure in name resolution”、“connection timed out”或者“No address associated with hostname”,根据这些线索,你很快就能定位问题根源。

文章摘自:https://idc.huochengrm.cn/dns/26119.html

评论

精彩评论
  • 2026-05-30 13:15:07

    Linux下DNS设置方法多样,可修改/etc/resolv.conf、通过网卡配置文件或使用systemd-resolved等,根据不同发行版选择合适的方法,确保网络连接稳定。