问题描述:
在WIN10宿主机上安装了一个ubuntu 虚拟机,ubuntu_64_server_01 4.15.0-46-generic版本。虚拟机的网卡配置如下,
win10宿主机连接WIFI,
IP:169.144.148.104
netmask 255.255.0.0
gateway :169.144.148.1
dns:193.181.14.10.
Ubuntu运行起来后网卡是没有IP的,配置IP与路由表后:
这个时候是可以连通外网的。
但是当你通过域名访问或需要通过apt的依赖去安装一个包时,会出现 “Temporary failure in name
resolution”的提示,
到达这一步,都知道域名解析失败导致。于是按网上很多方去添加dns地址
1、 在/etc/resolv.conf 中添加
ls - /etc/resolv.conf时可以看到该文件是个链接文件,所以直接改源文件就可以了。CSDN上各位大神都强调该文件是临时文件,重启后会被覆盖,也就是不能永久生效。但为了临时解决问题,先修改了验证下,在添加完nameserver后,需要通过/etc/init.d/networking restart 指令重启网卡,才发现我的ubuntu该路径下没有这个networking的脚本路径。
利用apt工具找下networking 的依赖关系,得到的结果是这样的
至此终于发现该虚拟机的与众不同。然后去网上搜如何安装Networking服务,systemd-networkd包含了Networking的功能
由于不能确认虚拟机的/etc/resolv.conf的 nameserver是否真会生效,此方法先搁置。
2、永久生效的DNS服务器配置方法
修改/etc/network/interfaces,在网卡配置的后面添加 dns-nameservers ,如下
该方法试了,重启虚拟机后dns-nameservers并没有更新到/etc/resolv.conf中,另外ns33网卡没按interfaces配置成功,还是空的,可能脚本格式有错,后面再排查。
3、 尝试另一种永久生效的方法
需要在/etc/resolvconf/resolv.conf.d目录下新建个base文件,然后在文件中写入nameserver +dns 地址。然后发现我的虚拟机在/etc/目录下没有resolvconf这个文件夹。但如果输入resolvconf指令的话ubuntu提示使用apt install。既然apt install时 dns解析失败拿不到包,那就手动安装。
从下面的url拿到deb安装包
所幸该虚拟机安装了vsftpd服务器,以binary格式传进去后 dpkg -i xxx.deb就可以安装成功了。结果呢,还是没解析成功。
从方法1中的systemd-networkd就是networking的关系,大概知道systemd-resolvd就是resolvconf(实际上安装完resolvconf后,resolvconf也是链接到/run/system/systemd-resolvd),于是在/etc/systemd目录下一顿乱找,找到了一个resolved.conf文件,喜出望外,打开是这样的
当时脑袋被门夹了,把DNS 改为196.144.148.1(宿主机的网关),Domains =lan前去掉注释。当然结果还是没有意外,失败。
于是决定用回方法3,在/etc/resolvconf/resolv.conf.d目录下新建个tail文件,前提是我得有个/etc/resolvconf目录,前面也查到了resolvconf的安装包地址,那就到这个地址中取出deb安装包,手动安装
由于到这一步我直觉告诉我不是设置dns服务器的方法问题了,而是要确认dns解析服务有没在工作,由于对Linux进程管理,判断工作状态的指令不熟悉,那要确认dns解析器有没工作最好的方法是看有没发出解析包。
在网口处抓包,发现ubuntu出去的dns包是这样的
发现宿主机DNS的包是这样的,
这个现象结果整合分析:
1、ubuntu是启动了解析服务的,而且目的IP是196.144.148.1,虽然结解析失败,但也说明某处dns服务器IP配置成功了;而宿主机目的IP是 193.181.14.10,解析成功,是 不是把ubuntu的dns服务器IP改为 193.181.14.10就可以成功?
2、ubuntu的dns包域名后面加了“.lan”,宿主机出没有;
由上面的两点联想到在/etc/system/resolve.conf中正好配置了dns server = 196.144.148.1;Domain =lan。
于是修改了/etc/system/resolve.conf文件后成功了。
问题反刍,这个问题应该是我的虚拟机缺少了某个组件或者配置,安装resolvconf的时候已经修正了,这个时候按方法1也是可以的解析出来的。/etc/resolv.conf中的DNS是优先级最高的,如果/etc/resolv.conf中没有可用DNS,则检测/etc/system/resolve.conf。