每个玩过dns的都会碰到这个问题,当修改了/etc/resolv.conf后马上就生效了,然后重启后就都丢失了。其实在这个文件的开头就有明确的提示,此文件为链接文件,每次都会重新生成。并且你修改了原文件后也还是会被覆盖,不知道提出这个建议的人为什么没有被还原。
正确的做法应该是修改systemd的配置文件/etc/systemd/resolved.conf
,修改其中dns配置项,不知道是不是生效特别慢还是怎么的,我的还是ping不通,所有linux手册都是推荐这个,实在不行再用后面的终极大法。
终极大法
systemctl stop systemd-resolved.service
systemctl disable systemd-resolved.service
其实systemd之所以接管dns,好像是到目前为止没有人做过一个像样的管理器,所以他才勉为其难接管,然后做的也太难用。既然就是/etc/resolv.conf他的问题,那么让systemd放弃dns接管,改为手动设置即可,毕竟dns服务器万年不变的。
这里需要注意的是linux只支持三个namserver哦,多了也没用。
对了,我是docker中没有生效,如果也是docker的问题可以用这个办法,同时docker支持手动在damon配置中配置dns:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
常用命令
dig @xxx.xxx.xxx.xxx www.domain.com
指定ip地址解析域名,我最喜欢用了
nslookup www.domain.com
最常用的,信息量丰富
resolvectl query domain | ip address
用於 DNS 的正向或反向查詢,取決於輸入資料。
裡面也會寫查詢的協議、回應時間等等資料。
resolvectl status
查詢目前 systemd-resolved 的設定。
resolvectl statistics
查詢 systemd-resolved 的統計資料,像是快取數量及命中率。
resolvectl flush-caches
清除本機 DNS 快取,一般來說應該用不到,除非 DNS 被污染而快取錯誤的資料吧。
云服务器注意点
在配置腾讯云服务器时发现他居然单独给网卡设置了dns,所以实际解析都是靠这个地址,比如内网系统更新源镜像、docker镜像等。所以linux的三个nameserver依次就是
- 我们的dnsmasq
- 云厂商nameserver
- 公网nameserver比如114.114.114.114
阿里云内网地址
nameserver 100.100.2.136
nameserver 100.100.2.138
nameserver 223.5.5.5
nameserver 223.6.6.6
options timeout:2 attempts:3 rotate single-request-reopen