一、前言
原先部署的一台虚拟机,今天在安装应用时发现突然上不了网了。无奈之下使用ping命令测试了一下:
ping baidu.com
结果如下:
ping: baidu.com: Temporary failure in name resolution
第一反应就是:域名解析出问题了?
二、环境说明
- 宿主机的ip:192.168.43.110
- 虚拟机的ip:192.168.43.9
- 宿主机系统:win10
- 虚拟机系统:Ubuntu 18.04
- 虚拟机管理软件:ViurtualBox
- 虚拟机网络连接方式:桥接
三、原因分析
为了进一步定位问题的原因,需要确认如下两个问题:
- 宿主机和虚拟机是否连通
- 宿主机能否访问Internet
3.1 确认宿主机和虚拟机是否连通
虚拟机 ping 宿主机(VM -> Host):
ping 192.168.43.110
结果如下:
宿主机 ping 虚拟机(Host -> VM):
ping 192.168.43.9
结果如下:
从上述两幅图的丢包率都为0%,可以看出 宿主机和虚拟机之间是通的 。
3.2 确认宿主机是否可上网
在宿主机ping下百度:
ping baidu.com
结果如下:
如图所示,宿主机是可以访问Internet的。
因为宿主机可以访问Internet,并且宿主机和虚拟机是连通的,所以有理由相信:问题出在虚拟机一侧。
3.3 查看虚拟机的DNS记录
一开始就怀疑是虚拟机的DNS出现问题导致其无法访问Internet,那么就需要检查一下DNS是否设置正确。
那么如何查看Ubuntu的DNS记录呢?
可以通过如下方法:
- nslookup ${host}
- host ${host}
这里使用nslookup命令:
#shell cmd
nslookup baidu.com
执行结果如下:
报错信息文本:
;; connection timed out; no servers could be reached
错误信息表明:DNS server不可达。
出于好奇,我们可以看一下宿主机的执行结果:
这里可以看到宿主机上的 DNS server 是 192.168.10.1
那是否我们将虚拟机的 DNS server 也改为这个就可以了呢?
答案是不可以的。因为网段不同(DNS的网段的10.*, 而虚拟机的网段是43.*),无法访问。
即使网段相同,也不推荐这么做。原因如下:
因为我们是使用的虚拟机安装的Linux。宿主机的网络环境是不固定的,比如我在公司的时候,宿主机的网段是192.168.1.*,但是当我回到家时,宿主机网段就会变为 192.168.10.*。
这样就会导致:在不同网络环境时,我们需要不断调整 DNS server 的配置。
有的小伙伴可能会说可以把这两个网段的 DNS server 都配置上啊。但是这样的解决方案终究是不优雅的。因为不排除宿主机又会进入新的网络环境(比如出差)
3.4 查看虚拟机的DNS设置
可以使用如下命令查看DNS设置:
systemd-resolve --status
结果如下:
Global
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
# 省略18~30
...
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test
Link 2 (enp0s3)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 192.168.43.1
我们可以看到DNS server是192.168.43.1。
而这个值恰好是网络配置(位于 /etc/netplan/00-installer-config.yaml )中的值:
事实上,通过ping命令可以发现:43.1这个地址是不通的。所以这里需要进行调整。
3.5 是否可以直接访问外网ip
在确定是DNS问题前,还需要检查下虚拟机是否可以直接访问外网ip。
如果能够访问外网ip,但是访问不了域名,才能够确定是 DNS 的问题。否则连外网ip都访问不了,则极有可能是网络设置的问题。
ping外网ip的结果如下:
丢包率是100% => 网络配置是有问题的,因为如果是单纯的DNS问题,外网ip是能ping通的。
四、问题解决
通过前面的分析,已经定位问题的原因如下:
- DNS的设置不正确。
- 网络配置不正确(虚拟机不能访问外网)
4.1 修改虚拟机DNS的设置
/etc/resolv.conf 是 systemd-resolve 的配置文件,通过下面的命令可以查询DNS server 的配置:
cat /etc/resolv.conf
内容如下:
但是如果需要修改DNS server,不能直接在该文件上操作。 因为有许多小伙伴反映:修改后数据会被覆盖为 127.0.0.53
而关于127.0.0.53 是什么,可以看下该网友的文章:
关于DNS服务器127.0.0.53的理解
修改DNS server(编辑**/etc/systemd/resolved.conf**文件):
# 编辑模式(DNS=223.5.5.5 180.76.76.76)
vi /etc/systemd/resolved.conf
# 重启服务
systemctl restart systemd-resolved
# 随机启动
systemctl enable systemd-resolved
# 备份/etc/resolv.conf.bak
mv /etc/resolv.conf /etc/resolv.conf.bak
ln -s /run/systemd/resolve/resolv.conf /etc/
但是配置完成后,还是ping不通baidu.com。
DNS的解析效果如下:
4.2 修改网络配置
网络配置的修改不单单是虚拟机侧,同时宿主机的网络配置也需要进行调整。
4.2.1 调整虚拟机的网络配置
# 编辑模式( nameservers.addresses 改为 223.5.5.5)
# 网关改为 桥接网卡的ip
vi /etc/netplan/00-installer-config.yaml
# 使修改生效
netplan apply
主要调整了两部分:
- 网关:改为桥接网卡的ip
- DNS server: 改为阿里的DNS地址
修改后的网络配置为:
4.2.2 调整宿主机的网络配置
到目前为止,网络情况如下:
- 虚拟机和宿主机之间的网络 -> ok
- 宿主机可访问Internet -> ok
- 虚拟机ping外网ip -> no
- 虚拟机ping外网域名 -> no
下图是宿主机的网卡情况:
- WLAN 是无线网卡,可以访问Internet
- 以太网7 是桥接网卡(环回适配器)
桥接网卡如果想上网,需要无线网卡对其共享 Internet 连接。
操作如下:
- 勾选:允许其他网络用户通过此计算机的 Internet 连接来连接
- 家庭网络连接:选择 桥接网卡
- 保存设置
保存时会提示:
确认后桥接网卡的ip地址被修改为:192.168.137.1
可以通过win+r,输入:ncpa.cpl ,快速打开网络连接。
然后将 桥接网卡 的ip地址改回:192.168.43.110
4.3 验证虚拟机网络
4.3.1 ping外网ip
# 谷歌的DNS
ping 8.8.8.8
# 阿里的DNS
ping 223.5.5.5
结果如下:
4.3.2 ping外网域名
尝试ping一下百度的网址:
root@proxy_server_01:~# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=51 time=30.1 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=51 time=82.7 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=51 time=30.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=51 time=30.0 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=51 time=38.5 ms
^C
--- baidu.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 30.097/42.421/82.727/20.404 ms
从统计信息可知:能够ping通该网站。至此虚拟机无法访问 Internet 的问题已经解决。
4.3.3 解析外网域名的ip
为了验证DNS 是否可以正确解析,可以在终端中执行如下命令:
nslookup baidu.com
首先,不再报连接超时的错误了。并且返回了如下信息:
- 域名服务器的地址:223.5.5.5
- 域名以及对应的ip地址:这里有两个(ping命令时随机返回当中一个)
如果结合前面在宿主机的执行结果,我们可以发现:两者返回的数据有一些差异(主要是 Server 和 Address)
也可以通过host命令看下解析结果:
五、疑问和总结
5.1 遇到的问题
5.1.1 Nameserver和DNS server是一个东西吗?
答:Nameserver是负责实现 DNS 这套系统的服务器, 有时候也叫做 DNS server, 这也是为什么许多人会将 nameserver 同 DNS 搞混起来的原因.
5.1.2 DNS的优先级是什么?
优先级:缓存>hosts>dns
5.1.3 Linux如何查看hosts文件?
终端执行如下命令:
cat /etc/hosts
# or
vi /etc/hosts
5.1.4 如何查看和修改DNS server?
答:
(1)查看DNS server:
# 查看 DNS server
systemd-resolve --status
(2)修改DNS server:
# 修改 DNS server
vi /etc/systemd/resolved.conf
5.1.5 如何修改网络配置?
过去的Ubuntu版本,终端执行命令:
vi /etc/network/interfaces
Ubuntu18中该文件开头有如下信息:
# ifupdown has been replaced by netplan(5) on this system. See
# /etc/netplan for current configuration.
# To re-enable ifupdown on this system, you can run:
# sudo apt install ifupdown
也就是说在Ubuntu18.04中,/etc/network/interfaces 中的配置已经被netplan取代了。其配置目录为:/etc/netplan 。
我的配置文件的名称为:/etc/netplan/00-installer-config.yaml
所以在Ubuntu18.04中若要修改网络配置,则需修改/etc/netplan/00-installer-config.yaml中的内容:
5.1.6 常见DNS server 有哪些?
名称 | DNS server |
---|---|
谷歌DNS | 8.8.8.8 |
阿里DNS | 223.5.5.5、223.6.6.6 |
百度DNS | 180.76.76.76 |
腾讯DNS | 119.29.29.29、182.254.116.116 |
5.2 总结
本文针对虚拟机无法访问 Internet 的问题,进行了虚拟机和宿主机之间的连通性分析,确认了宿主机可以访问Internet,并且虚拟机和宿主机的互通的。唯一异常的现象是:虚拟机无法ping通外网ip。
结合前面的分析结果,怀疑宿主机的网络配置有问题。通过一番检查后发现最主要的原因是宿主机的桥接网卡没有访问外网的能力,而解决方法就是通过无线网卡(或当前上网的网卡)分享其Internet连接。文章介绍了具体的配置步骤,并额外拓展了一些网络知识。文章来源:https://www.toymoban.com/news/detail-782500.html
下图是本篇文章相关的思维导图:
文章来源地址https://www.toymoban.com/news/detail-782500.html
到了这里,关于[Ubuntu] VirtualBox 中的虚拟机突然无法访问Internet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!