在Linux系统中完成域名配置,核心是修改/etc/hosts文件做本地解析,或者编辑/etc/resolv.conf与网络配置文件指向DNS服务器,具体取决于你需要本地映射还是公网解析。
很多新手第一次接触Linux域名配置时,容易被网上各种碎片化教程绕晕,有人让你改hosts,有人让你动resolv.conf,还有人甩出一大段systemd-resolved的配置,其实它们各自负责的环节完全不同,本文直接剥开讲清楚,让你看完就知道自己该动哪个文件,以及怎么动手。
Linux域名配置到底在配什么
在Linux里谈域名配置,本质上是在处理域名与IP地址的映射关系,这个映射关系存在两个层面:本地静态映射和远程动态查询,理解这一点,你就能看懂所有配置文件的分工。
本地映射:/etc/hosts 的优先级与玩法
/etc/hosts是一个纯文本文件,作用相当于你手机通讯录里手动存的号码,当你访问某个域名时,系统会优先翻这个通讯录,找到就直接连接,根本不去问DNS服务器。
这个文件天生适合做测试环境域名绑定、内网服务器别名或者屏蔽恶意网站,比如你把 0.0.1 ads.example.com 写进去,访问该域名就会指向本地,相当于直接拉黑。
操作方式非常直接:
sudo vim /etc/hosts
在文件末尾追加一行:
168.1.100 mytest.local
保存退出后立刻生效,不需要重启任何服务,这也是排查 linux域名配置不生效 时第一个要检查的地方,因为hosts的优先级高于DNS解析,权威数据表明,几乎所有主流Linux发行版默认都遵循这种查找顺序,先查hosts,再走DNS。
远程查询:/etc/resolv.conf 的真相
resolv.conf记录的是DNS服务器地址,即你家的“查号台”号码,当你访问的域名不在hosts里,系统就会去问这个文件里列出的DNS服务器。
cat /etc/resolv.conf
长这样:
nameserver 223.5.5.5 nameserver 8.8.8.8
这里有个坑:在很多现代Linux发行版中,这个文件是被NetworkManager或systemd-resolved动态生成的,你手动改了,重启网络服务后可能又被覆盖回去,这也是为什么有人明明改了DNS却总是失效的原因,正确的持久化修改路径因发行版而异,Ubuntu需要改netplan配置,CentOS则要改/etc/sysconfig/network-scripts/下的网卡文件。

场景化实操:从本地开发到公网服务器
实际工作中,不同场景对域名配置的需求差异巨大,下面按典型场景拆解。
本机开发环境绑定域名
这是最常用的场景,你在本地跑了个Nginx,想用 dev.myproject.com 来访问,而不是 http://127.0.0.1:8080。
操作分两步走。
第一步,修改hosts:
echo "127.0.0.1 dev.myproject.com" >> /etc/hosts
第二步,配置Nginx的server_name:
server {
listen 80;
server_name dev.myproject.com;
root /var/www/project;
}
这样你在浏览器输入 http://dev.myproject.com 就能直达本地项目,这里要提醒一句:如果改了hosts后浏览器还是跳转到了公网IP,先清浏览器缓存或改用无痕模式,因为浏览器自身也有DNS缓存。
生产服务器域名解析
生产环境遇到 linux系统怎么配置域名解析 的问题,通常指的是让一个公网域名指向服务器IP,这个操作的主战场不在服务器内部,而在域名服务商的控制台。
你在简米云、酷番云或Namecheap买完域名后,需要去添加A记录或CNAME记录,A记录将域名指向IPv4地址,CNAME则指向另一个域名。
服务器端需要做的只是放行端口,确保80/443端口可达:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
一个高频疑问是:为什么我域名解析配置好了,网站还是打不开? 多数情况下是云安全组没放行端口,而不是DNS的问题,国内服务器还有个特殊点:域名必须完成ICP备案才能正常使用80端口,否则服务商直接拦截访问。
自建DNS服务器
当你的服务器要承载几十个内网域名解析,或者需要给局域网设备提供域名服务时,手动维护hosts文件就彻底不现实了,这时候需要上BIND。
BIND是Linux平台最经典的DNS服务软件,安装与基础配置路径如下:
sudo apt install bind9 # Ubuntu/Debian sudo yum install bind # CentOS/RHEL
主配置文件位于 /etc/bind/named.conf(Ubuntu)或 /etc/named.conf(CentOS),需要在里面声明一个zone区域,这种方案可扩展性很强,适合中大型网络环境,但学习曲线也比较陡峭,新手建议从dnsmasq这类轻量替代品入门。

域名解析的核心知识点拆解
掌握以下概念,你就能少走很多弯路。
A记录、AAAA记录与CNAME记录的区别
表格对这三种记录类型的适用场景做了清晰对比:
| 记录类型 | 作用 | 适用场景 |
|---|---|---|
| A记录 | 域名指向IPv4地址 | 绝大多数网站、API服务,最常用 |
| AAAA记录 | 域名指向IPv6地址 | IPv6网络环境 |
| CNAME记录 | 域名指向另一个域名 | 将子域名指向主域名,便于统一管理 |
举个例子:把 blog.example.com 配置为CNAME指向 example.com,然后你只需要修改example.com的A记录,子域名就会自动跟随变更。
关于TTL的设置建议
TTL(Time To Live)是DNS记录在本地缓存的有效期,当你修改了解析记录后,全球生效时间取决于TTL值。
短TTL(60-300秒)适合服务器迁移期间使用,好处是改错能快速回滚,稳定运行阶段建议设为600-3600秒,能减少DNS查询压力,行业共识认为,日常使用10分钟是兼顾稳定与灵活的最佳平衡。
多域名配置与泛解析
Nginx里支持一个server块匹配多个域名:
server_name example.com www.example.com api.example.com;
如果想把所有未匹配的子域名指向同一服务,可以用泛解析:
server_name .example.com;
而DNS端的泛解析记录写法是 .example.com 的A记录,这种技术常用于多租户SaaS系统或蓝色Green部署环境。
域名配置排错指南
把最常出现的故障现象和排查思路整理如下,按这个顺序检查能节省大量时间。
linux域名配置不生效排查顺序
前面提到过,先用 getent hosts 命令看系统实际解析结果:
getent hosts yourdomain.com
如果返回的IP跟你预期不一致,按这个优先级排查:
- 查看/etc/hosts是否写入了不该有的记录,hosts文件的优先级最高,容易被无意中写入测试数据。
- 检查resolv.conf是否被覆盖,如果你改完DNS重启后失效,多半是NetworkManager的锅,在Ubuntu 18.04+上,要么在netplan中配置DNS,要么用
nmcli命令设置。 - 确认DNS服务器是否可达,执行
,不通就要检查网络连通性,而不是解析配置。
ping 223.5.5.5
systemd-resolved与resolv.conf冲突
在较新的Ubuntu系统上,/etc/resolv.conf是个软链接,指向 /run/systemd/resolve/stub-resolv.conf,这时直接编辑resolv.conf往往不生效,或者临时生效但重启后丢失。
正确做法是用systemd-resolve命令:
sudo systemd-resolve --set-dns=223.5.5.5 --interface=eth0
不过这条命令也是临时生效,永久生效需要写netplan配置文件,
network:
version: 2
ethernets:
eth0:
nameservers:
addresses: [223.5.5.5, 8.8.8.8]
改完后执行 sudo netplan apply,这是目前Ubuntu服务器最规范的操作路径。
常见问题与深层解答
为什么修改了/etc/hosts后,ping域名还是走了公网?
这大概率是因为你ping的域名带有后缀点,或者你修改的hosts记录格式有误,检查一下hosts文件里域名前面不能有空格,IP与域名之间至少一个空格或Tab,另外一个隐藏因素是nscd服务缓存。
sudo systemctl restart nscd
如果还没装nscd,可以用 sudo /etc/init.d/nscd restart 或直接忽略,绝大部分情况清空浏览器缓存即可解决。
Linux服务器上不同网站如何绑定同一端口?
利用Nginx的server_name虚拟主机功能,多个域名监听同一个80端口,根据请求头中的Host字段区分路由到不同目录,配好之后务必执行 nginx -t 验证配置语法,再执行 systemctl reload nginx 平滑重载,否则可能把整个Web服务搞挂。
动态IP环境下,怎么保障域名解析正确?
家用宽带公网IP经常变动,手动改DNS记录不现实,方案是需要一个DDNS(动态DNS)客户端,路由级方案是OpenWrt里集成ddns插件,服务器方案可以写个定时脚本,检测到IP变化后调用Cloudflare API自动更新记录,配合API Token鉴权就能实现纯内网环境下对外服务的映射。
Linux域名配置最难的地方在于理解各层之间的优先级与依赖关系,把握住一个核心原则:hosts管本地强制映射,resolv.conf管递归查询上游,DNS服务商控制台管公网权威记录,遇到问题先判断自己处在哪个环节,再去动对应的配置文件,问题基本迎刃而解,解决完配置后,最终验证一句命令就可以收工:dig yourdomain.com +short,输出正确的IP即代表全链路通畅。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/786642.html


评论列表(4条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于记录的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对记录的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
读了这篇文章,我深有感触。作者对记录的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@美熊780:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是记录部分,给了我很多新的思路。感谢分享这么好的内容!