1. 程式人生 > 其它 >REHL7/CentOS7 中/etc/resolv.conf 詳解

REHL7/CentOS7 中/etc/resolv.conf 詳解

這幾天在調整Openshift Node域名解析的過程中,發現了與DNS相關的一些配置,花了2天時間,終於理出了一個頭緒。

首先我們知道,在Linux中,DNS的配置檔案位於/etc/resolv.conf,裡面主要有三個欄位,分別是nameserver, domain, search

我們簡單看一下以下例子:

# Generated by NetworkManager

domain example.com

search example.com

nameserver 192.168.1.100

這裡domain和search是一個作用,在倆這同時存在時,前者失效。

當訪問的域名不能被DNS解析時,resolver會將該域名加上search指定的引數,重新請求DNS,直到被正確解析或試完search指定的列表為止。

這裡需要注意一點,在NetworkManager開啟的時候,/etc/resolv.conf檔案在每次NetworkManager服務重啟的過程中會被重寫。並且當ifcfg-eth0中proto為dhcp是,peerdns預設為yes,所以每次NetworkManager進行重寫時,都會獲取dhcp client抓到的dns資訊對nameserver和search欄位進行重寫。

peerdns欄位的作用域分兩種情況:

以下是RedHat官方文件中的說明:

PEERDNS=answer

where answer is one of the following:

yes — Modify /etc/resolv.conf if the DNS directive is set, if using DHCP, or if using Microsoft's RFC 1877 IPCP extensions with PPP. In all cases yes is the default.

no — Do not modify /etc/resolv.conf.

簡單解釋一下:

為yes時:1 如果在網絡卡(ifcfg-eth0)中設定了DNS地址,或者開啟了dhcp client,此項預設為yes

為no時: 不會對/etc/resolv.conf進行重寫

下面我們來做兩個實驗:

實驗一:

我建立了一個RHEL7.7的虛擬機器和一臺WINDOWS2019 DNS server,以下時兩臺server的基本資訊:

RHEL7.7:

hostname: redhat.eubrmb.com

ip address: 192.168.199.130

WIN2019 server:

ip address: 192.168.199.100

當我把RHEL7的網絡卡設定為如下時,我們先把resolv.conf檔案清空,然後再重啟NetworkManager,然後再次觀察resolv.conf檔案的資訊:

TYPE=Ethernet

PROXY_METHOD=none

BOOTPROTO=dhcp

DNS1=192.168.199.2

DNS2=192.168.199.100

DEFROUTE=yes

NAME=eth0

DEVICE=eth0

ONBOOT=yes

PEERNDS=yes

# echo > /etc/resolv.conf

# systemctl restart NetworkManager

# cat /etc/resolv.conf

# Generated by NetworkManager

search localdomain eubrmb.com

nameserver 192.168.199.2

nameserver 192.168.199.100

現在我們修改一下網絡卡配置,然後再次清空resolv.conf,並重啟NetworkManager後重新檢視:

TYPE=Ethernet

PROXY_METHOD=none

BOOTPROTO=dhcp

DEFROUTE=yes

NAME=eth0

DEVICE=eth0

ONBOOT=yes

PEERNDS=no

# echo > /etc/resolv.conf

# systemctl restart NetworkManager

# cat /etc/resolv.conf

# Generated by NetworkManager

search localdomain eubrmb.com

nameserver 192.168.199.2

由此可見,再開啟了dhcp之後,無論我們加不加DNS欄位,或者加不加PEERNDS=yes,resolv.conf都會被重寫

實驗二:

首先我們把網絡卡重新設定為如下配置:
TYPE=Ethernet

BOOTPROTO=static

IPADDR=192.168.199.130

NETMASK=255.255.255.0

GATEWAY=192.168.199.2

DNS1=192.168.199.2

DNS2=192.168.199.100

DEFROUTE=yes

NAME=eth0

DEVICE=eth0

ONBOOT=yes

PEERNDS=no

# echo > /etc/resolv.conf

# systemctl restart NetworkManager

# cat /etc/resolv.conf

# Generated by NetworkManager

search eubrmb.com

nameserver 192.168.199.2

nameserver 192.168.199.100

這裡我們看到,在網絡卡協議為static,DNS欄位存在時,就算PEERNDS=no,resolv.conf也會被重寫

當我們去掉DNS欄位後,重新測試,發現resolv.conf這回未被重寫

細心的人會發現,這裡search裡面和上面用dhcp測試時不太一樣,這裡少了一個localdomain。之前被這個問題糾結了一天,最後發現,當為dhcp時,search中的欄位會帶入dhcp client中拿到的一些資訊,因為我用的是VMware workstation,所以這裡帶入了一個localdoamin。在阿里雲ECS上併為發現這個問題,這個search domain會擷取主機名第一個點之後的名字當作FQDN的suffix。

總結:

當我們需要手動新增DNS server記錄,並不希望重啟網路後被重寫,我們需要把我們的網絡卡設定調整為static,並設定PEERNDS=no,最後在/etc/resolv.conf中新增nameserver,這樣才能達到我們想要的效果



作者:WayneGan
連結:https://www.jianshu.com/p/21fd987c088c
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。