gongdear

gongdear的技术博客

欢迎大家参观我的博客
  menu
97 文章
89355 浏览
2 当前访客
ღゝ◡╹)ノ❤️

Ubuntu 18.04设置dns

最近使用了最新版的ubuntu 18.04运行一些服务,然后发现服务器经常出现网络不通的情况,主要是一些域名无法解析。

检查/etc/resolv.conf,发现之前修改的nameserver总是会被修改为127.0.0.53,无论是改成啥,过段时间,总会变回来。

查看/etc/resolv.conf这个文件的注释,发现开头就写着这么一行:

# This file is managed by man:systemd-resolved(8). Do not edit.

这说明这个文件是被systemd-resolved这个服务托管的。

通过netstat -tnpl| grep systemd-resolved查看到这个服务是监听在53号端口上。

查了下,这个服务的配置文件为/etc/systemd/resolved.conf,大致内容如下:

[Resolve]
DNS=1.1.1.1 1.0.0.1
#FallbackDNS=
#Domains=
LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

如果我们要想让/etc/resolve.conf文件里的配置生效,需要添加到systemd-resolved的这个配置文件里DNS配置项(如上面的示例,已经完成修改),然后重启systemd-resolved服务即可。

另一种更简单的办法是,我们直接停掉systemd-resolved服务,这样再修改/etc/resolve.conf就可以一直生效了。

配置 dnsmasq

看dnsmasq帮助

man dnsmasq

其中有这么一段描述: In order to configure dnsmasq to act as cache for the host on which it is running, put "nameserver 127.0.0.1" in /etc/resolv.conf to force local processes to send queries to dnsmasq. Then either specify the upstream servers directly to dnsmasq using --server options or put their addresses real in another file, say /etc/resolv.dnsmasq and run dnsmasq with the -r /etc/resolv.dnsmasq option.

大意是如果想让dnsmasq作为dns缓存,需要将“nameserver 127.0.0.1”放到/etc/resolv.conf文件中,通常是第一条非注释语句,然后将真正的dns服务器信息放到另外一个文件中,如“/etc/resolv.dnsmasq”,最后执行命令:

dnsmasq -r /etc/resolv.dnsmasq

  • 第一步

按照帮助文档的提示,需要修改/etc/resolv.conf文件。 可以手动修改,如使用vi,可以将原有的内容全部注释,然后在第一行写上

nameserver 127.0.0.1;

也可以使用ubuntu的网络管理小程序“Network Manager”在桌面右上角有一个它的图标,右键点击该图标,选择“编辑连接”,选择你所使用的连接,点击编辑,在“IPv4设置”标签的“DNS服务器”输入框中,把原有的DNS服务器删除,输入

127.0.0.1。

  • 第二步

在/etc目录下新建resolv.dnsmasq文件。文件的内容为DNS服务器的地址,是真正的DNS服务器,如我的文件内容是:

nameserver 210.47.0.1
nameserver 202.98.5.68

  • 第三步

可以不按帮助文档所说的执行“dnsmasq -r /etc/resolv.dnsmasq”命令,如果这样,岂不是每次都得在命令行里输入,非常麻烦,当然,可以考虑把这个命令写入“/etc/rc.local”文件中,让系统每次启动时帮你运行。 我所使用的方法是编辑“/etc/dnsmasq.conf”文件。找到下面这一项

#resolv-file=

用下面的一条语句替换

resolv-file=/etc/resolv.dnsmasq

其实也就是执行dnsmasq命令中-r参数后面的内容。

  • 编辑 /etc/dhcp3/dhclient.conf

找到下面这一项

#prepend domain-name-servers 127.0.0.1;

将前面的“#”删除。这么做的目的是为了在使用自动连接时,能在/etc/resolv.conf文件的第一行添加上“nameserver 127.0.0.1”,这样,dns缓存依然有效

  • 编辑 /etc/ppp/peers/dsl-provider

可能有的系统没有“/etc/ppp/peers/dsl-provider”文件,而是“/etc/ppp/peers/provider”文件,找到下面这一项

usepeerdns

在前面增加“#”,也就是把这条语句注释掉。以防resolv.conf的设置被pppoe复盖。

对于12.04版本 由于该版本已经安装dnsmasq-base,则必须先修改/etc/NetworkManager/NetworkManager.conf文件,注释dns=dnsmasq 修改/etc/default/dnsmasq文件,取消IGNORE_RESOLVCONF=yes注释

测试

重启服务:

sudo /etc/init.d/dnsmasq restart
或者 sudo service dnsmasq restart

测试,执行两次就能看出查询时间的差异了:

systemctl status dnsmasq
systemctl status systemd-resolved
使用系统自带的systemd-resolved时 需要
systemctl start systemd-resolved
systemctl enable systemd-resolved
同时
systemctl stop dnsmasq
systemctl disable dnsmasq

宝剑锋从磨砺出,梅花香自苦寒来.