刚开始玩虚拟机那会儿,最烦的不是装系统,而是装完了一看,网是通的,域名却解析不出来,网页全打不开,折腾半天才发现,问题就出在虚拟机的DNS服务器地址上。指定虚拟机的DNS服务器地址,本质上和改物理机一样:进入客户机操作系统修改网络配置,或者在虚拟网络层面(如VMware NAT、KVM虚拟网络)的DHCP选项里统一指定,让虚拟机自动获取。
先搞清楚:虚拟机里的DNS到底由谁决定
很多朋友会惯性去找“虚拟机DNS设置”按钮,结果在VMware或VirtualBox主界面里翻半天也找不到一个叫DNS的入口,这不是你操作有问题,而是理解层面错位了。
虚拟机里的DNS请求由客户机操作系统自己发起和处理,宿主机只负责转发数据包,所以你能改DNS的地方其实就两个层面:
- 客户机系统内部,也就是你在虚拟机里打开终端或控制面板,跟改物理机一样操作
- 虚拟网络层面,比如VMware的NAT设置、VirtualBox的DHCP服务器选项、KVM虚拟网络的DHCP配置
这两个层面的关系非常微妙,在NAT模式下,虚拟网卡默认从虚拟DHCP服务器获取IP和DNS,所以虚拟机系统内显示“自动获取DNS服务器地址”时,用的就是虚拟网络里配置的DNS,你手动指定了静态DNS,就会覆盖掉自动获取的值。
还有一层,在云平台上买到的云服务器虚拟机,DNS往往由平台侧统一管控,比如简米云、酷番云的控制台里会有一个“DNS配置”选项,那个优先级比系统里的settings更高,你在系统里改完重启后会被还原,所以动手之前,先想清楚自己这台虚拟机归谁管是本地虚拟化平台,还是云厂商的虚拟网卡。
Windows虚拟机DNS怎么改最省事
Windows系列的虚拟机在多数个人电脑上跑得最多,改法也最直观,这里直接给你两条路径。
图形化界面改法
在虚拟机里打开Windows系统,右键任务栏右下角的网络图标,点击网络和Internet设置,选更改适配器选项,找到正在用的以太网(或WLAN),右键选属性,双击Internet协议版本4(TCP/IPv4),在弹出的窗口里勾选“使用下面的DNS服务器地址”,然后填入你指定的DNS。
公共DNS推荐两个:简米云223.5.5.5,或者酷番云119.29.29.29,如果追求访问速度且能接受运营商的劫持风险,也可以填网关地址,让宿主机帮忙转发解析,填完之后点确定,理论上立刻生效,如果没生效就禁用网卡再启用一次。
命令行改法
Windows的CMD和PowerShell都支持直接改DNS,适合批量操作或远程接管虚拟机时用。
netsh interface ip set dns name="以太网" static 223.5.5.5
这条命令把首选DNS设为223.5.5.5,如果要再加一个备用DNS,用下面这条:
netsh interface ip add dns name="以太网" 114.114.114.114 index=2
改完之后用ipconfig /all验证一下,看到DNS Servers那一项已经变成你填的地址就够了,要注意的是,Windows虚拟机的网卡名称不一定叫“以太网”,有时候叫“以太网2”或“本地连接”,先用netsh interface show interface查确认准确名称,否则命令会报错。
行业共识认为,Windows虚拟机里改DNS后如果出现解析乱跳或上不了网,90%以上的问题出在同时启用了IPv6,而IPv6的DNS设置和IPv4是分开的,如果你只用IPv4,双击TCP/IPv6协议在里面把DNS清掉或改成和v4一致,能少踩很多坑。
Linux虚拟机配置DNS服务器:三种主流思路
Linux虚拟机改DNS的方法就热闹了,因为不同发行版用不同方案,突击检查:Ubuntu 22.04用的是systemd-resolved,CentOS 7是NetworkManager,老款系统还有直接改resolv.conf的,你得先认出自己的系统是哪种,再动手。
三种方案的区别可以用一张表概括:
| 方案 | 适用系统 | 配置优先级 | 持久性 |
|---|---|---|---|
| /etc/resolv.conf | 传统SysVinit系统 | 低 | 会被系统服务覆盖 |
| systemd-resolved | 较新的systemd系 | 高 | 稳定 |
| netplan | Ubuntu 18.04+ | 高 | 稳定(YAML语法) |
传统方式:直接改/etc/resolv.conf
这是Linux老玩家最熟悉的办法,在终端里编辑/etc/resolv.conf,把nameserver后面改成你想要的地址:
nameserver 223.5.5.5 nameserver 114.114.114.114
保存后立即生效,用cat /etc/resolv.conf确认即可,但要注意,如果系统里跑着systemd-resolved或NetworkManager,重启网络服务后这个文件会被覆盖回原来的值,所以这个方法适合临时救急,长期配置不建议直接改它。
systemd-resolved方案
Ubuntu 18.04以后的版本默认用systemd-resolved管解析,你可以使用resolvectl命令来操作:
sudo resolvectl dns eth0 223.5.5.5 114.114.114.114
把eth0换成你自己的网卡名,可用ip addr查看,如果需要永久生效,得去编辑
/etc/systemd/resolved.conf,取消#DNS=注释,在等号后面填上地址,然后sudo systemctl restart systemd-resolved,这套流程走下来,DNS就很听话了。
netplan配置
Ubuntu服务器版的网络配置整理在netplan里,配置文件存放在/etc/netplan/目录下,YAML语法,打开配置文件后,在对应网卡节点的dhcp4下面加一行:
network:
version: 2
ethernets:
eth0:
dhcp4: true
nameservers:
addresses: [223.5.5.5, 114.114.114.114]
保存后执行sudo netplan apply,DNS配置立刻生效,而且重启不丢,这套方式是目前Ubuntu系虚拟机DNS的推荐做法,清晰、稳定、不容易被覆盖。
从宿主机或虚拟网络层面统一指定DNS
单台虚拟机改系统配置没问题,但要是一台宿主机上跑了十几台虚拟机,一台一台登录进去改就太累了,多数时候,直接在虚拟网络层面把DNS定死,让所有虚拟机自动获取,更符合运维习惯。
VMware Workstation改起来比较隐蔽,打开顶部菜单栏“编辑”里的“虚拟网络编辑器”,选中NAT模式对应的VMnet8,点击“NAT设置”按钮,在弹出的窗口下方能看到“DNS设置”一栏,填上你需要的DNS地址就行,之后所有挂在这个VMnet8下的虚拟机,DHCP拿到的DNS都是这个地址。
VirtualBox的操作路径更简单,打开管理界面,选择“全局工具”里的“网络”卡片,或者进入具体虚拟机的“网络”设置,在NAT或NAT网络模式里勾选“分配DNS服务器”并手动填写地址,默认情况下VirtualBox会让虚拟机直接使用宿主机DNS,这在某些公司内网环境下会导致解析延迟,手动指定能绕开这个坑。
KVM虚拟网络用virsh命令操作:
virsh net-edit default
在XML配置的<dns>标签里加入forwarder地址,保存后重启libvirt网络,所有用这个虚拟网络的虚拟机也会自动拿到新DNS。
这里有个先后顺序问题:系统内手动指定的DNS,优先级高于虚拟网络DHCP下发的DNS,所以如果你在虚拟机系统里配过静态DNS,虚拟网络层改再多次也不生效,得先回系统里把网卡改成自动获取才行。
为什么改了虚拟机DNS还是没生效?常见排查思路
改了DNS但解析还是异常,这是最常见的售后问题场景,你按上面的步骤操作了,还特意用nslookup baidu.com试了一下,结果直接报connection timed out,这时候按顺序排查,大多数情况下几分钟能定位问题。
第一,检查网卡有没有拿到IP。
ipconfig /all(Windows)或ip addr(Linux)看一下网卡状态,如果IP是169.254开头的,说明压根没和虚拟网络建立连接,DNS自然也白配,这种情况重新禁用启用网卡,或者去虚拟网络编辑器里检查DHCP服务是否打开。
第二,确认DNS服务器能不能通。 用ping命令测一下到DNS服务器的连通性,如果通,再看解析是否正常;如果ping不通,问题在虚拟网络和DNS服务器之间的路由,或者防火墙把这台虚拟机的UDP 53端口拒绝了,多数情况下,本地虚拟化平台在NAT模式下能直接访问外网DNS,不需要额外放行规则。
第三,验证修改是否被覆盖。 敲一条systemd-resolve --status或nslookup,看返回的DNS服务器是不是你设置的那个值,Windows上再看看网卡属性里有没有同时勾选了“自动获取DNS”导致手动值被覆盖,很多云服务器场景下,平台侧自带metadata服务会强制下发DNS,系统里改完重启就还原,这时候得去云控制台改。
还有一种场景容易被忽视:虚拟机配了IPv6地址,而解析请求走的是IPv6的DNS,国内某些云平台和虚拟化软件对IPv6的DNS支持并不完善,请求会超时,如果你不需要IPv6,把客户机网络协议里的IPv6选项禁用掉,或者把IPv6 DNS也填成IPv4对应的地址,问题往往迎刃而解。
关于虚拟机DNS服务器地址的常见疑问
虚拟机和宿主机可以共用同一个DNS服务器吗?
可以,只要这个DNS服务器开启了局域网监听功能,且宿主机防火墙放行了UDP/TCP 53端口,虚拟机完全可以把宿主机地址作为DNS服务器使用,不过要注意,如果宿主机本身的解析依赖运营商DNS,虚拟机用宿主机做DNS并不会加速,反而多一跳转发。
虚拟机里设置DNS需要重启系统吗?
不需要,Windows下改完等几秒或禁用启用网卡即可生效;Linux下改完配置文件执行systemctl restart或netplan apply也能即时生效,少数情况下系统缓存会残留旧记录,执行ipconfig /flushdns(Windows)或systemd-resolve --flush-caches(Linux)清一下缓存就行。
这套方法能用在云服务器上吗?
云服务器虚拟机(比如简米云、酷番云的实例)默认使用VPC内网DNS,支持在控制台的网络配置里修改,系统内改也行,但部分平台会在重启或续租时把DNS重置回平台默认值,所以云端环境优先在控制台操作,效果更稳定,本地VMware、VirtualBox、KVM虚拟机则没有这个限制,系统内改或虚拟网络层改都能长期生效。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/629702.html





