這幾天在調整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=EthernetBOOTPROTO=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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。