记一次设置静态 DNS IP Address 的问题

问题缘起

我在使用谷歌的时,浏览器不时会出现 “服务器长时间未响应” 的页面,同时在打开诸如 youtube,instagram 及 Twitter 时均可正常访问,当然我已经使用了代理。猜想是因为被 DNS 解析到了不可用的地址。然后使用 dig www.google.com 发现解析的 dns server 是内部地址。


其实大多时候还是可以访问谷歌,但是最近就越来越不给力了。不是要人机验证,就是浏览器页面提示 www.google.com 好久没响应。

继而采取之前了解到的修改 resolve.conf 的方式来修改为自定义的 DNS 服务器 8.8.8.8 和 8.8.4.4 等。但是写入后,每次在重新打开和关闭飞行模式后,resolve.conf 的 nameserver 重新被写成 DHCP 分配的 DNS Server 地址。

两个配置文件

这两个配置文件指的是 /etc/resolv.conf/etc/sysconfig/network/config
resolv.conf 中,有提到修改

#     NETCONFIG_DNS_STATIC_SEARCHLIST
#     NETCONFIG_DNS_STATIC_SERVERS
#     NETCONFIG_DNS_FORWARDER

或者

#   NETCONFIG_DNS_POLICY=''

但并没说明要如何修改。于是继续打开/etc/sysconfig/network/config 修改一行:

NETCONFIG_DNS_STATIC_SERVERS="8.8.8.8 8.8.4.4 1.1.1.1"

其中我发现 NETCONFIG_DNS_STATIC_SEARCHLIST 只是代理域名的列表,由于我并没有计划修改这个也其实没有自己的域名(可能可以设置为 localhost ?),所以保持不变:

NETCONFIG_DNS_STATIC_SEARCHLIST=""

最后就是 NETCONFIG_DNS_FORWARDER 了,我的理解是可能也是类似两个 list 一样的,将 DNS 查询请求转发到这个 forwarder 上。
然后也保持默认值不变

NETCONFIG_DNS_FORWARDER="resolver"

并没结束

然而这样经过 “飞行模式 – 取消飞行模式” 的过程后, nameserver 还没有如我所愿成为

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1

然后我发现我还有个值没有设定 NETCONFIG_DNS_POLICY ,之前我有设置但是并未和前面三个值同时设置,是因为在 resolv.conf 中有这么一个词:

# Before you change this file manually, consider to define the
# static DNS configuration using the following variables in the
# /etc/sysconfig/network/config file:
#     NETCONFIG_DNS_STATIC_SEARCHLIST
#     NETCONFIG_DNS_STATIC_SERVERS
#     NETCONFIG_DNS_FORWARDER
# or disable DNS configuration updates via netconfig by setting:
#     NETCONFIG_DNS_POLICY=''

就是 or
同时在 config 文件中并没有对于 NETCONFIG_DNS_POLICY 的取值的讲解,只是说可以取到两个值:

## Type:        string
## Default:     "auto"
#
# Defines the DNS merge policy as documented in netconfig(8) manual page.
# Set to "" to disable DNS configuration.
#
NETCONFIG_DNS_POLICY="STATIC NetworkManager"
# NETCONFIG_DNS_POLICY=""

NETCONFIG_DNS_POLICY

于是抱着试试看的心态谷歌了一下,打开 第一条 点进去,先看了一下发布的时间 2009 年,当时心里小声嘀咕可能有点不妙。但来都来了。。。

下面就大概翻译一下意思:
博主大概也是因为某种原因(懒)想要设置静态 DNS Server,然后,也找到了在文件 /net/sysconfig/network/config 里的 NETCONFIG_DNS_POLICY,但是确实对于这个设置来说,仅提到了两个无关痛痒的取值,而且对于这个变量的作用,配置文件并没有给出简要说明(此处我认为可以说明一下),但是注释说可以去看看 netconfig(8) 。好吧,其实到现在我也没有去看 netconfig(8)。 然后找到了对应的脚本(/etc/netconfig.d/dns-resolver)分析一通(不得不说,11 年过去了,这个脚本的功能还真是传家宝)。
我就不分析了,大概就是 NETCONFIG_DNS_POLICY 将前面三个变量和 网卡 DHCP 得来的 DNS Server 值以某种 POLICY(策略) 合并在一起。这个策略就是 NETCONFIG_DNS_POLICY 了。然后博主就将 resolve.conf 的一项改为:

NETCONFIG_DNS_POLICY="STATIC NetworkManager"

而这个策略,也就是将 STATIC 的 DNS Server List 和 NetworkManager 的 DNS Server List 遇到第一个非空的值就将这个 DNS Server List 作为 resolv.conf 的 nameserver 值。

最后

不知道是我打开 SUSE 的方式不对,还是 SUSE 对于这方面的资料还是太少,毕竟还是选择 SUSE 作为我的伙伴,也是 “大姑娘上轿——头一回” 吧。不过解决了困扰我好几个月的问题,心里还是有点小开心吧哈哈。

1赞

谢谢楼主分享 :grinning:我补充一下我的经验:

如果使用 NetworkManager 管理网络(应该是楼主的用例),那么最好使用 NetworkManager 配置静态 DNS,这样也方便以后切换。参见 这里。(其实 SUSE 的文档非常细致,主要文档还很良心有中文翻译,就是但是有点难找。openSUSE Leap 基本可以直接参考。)

如果不使用 NetworkManager,可以使用 YaST 的网络配置模块,也方便管理。参见 这里

关于 NETCONFIG_DNS_POLICY,在使用 NetworkManager 的时候的默认策略是先使用 NetworkManager,当 NetworkManager 没有提供 DNS 时再回落到静态配置的 DNS,所以才会出现楼主提到的一开始的现象。