目录
1. 网卡配置文件解析
这里我们以最小化安装的 CentOS7.6 默认网卡配置文件为例,也就是咱们视频中的”/etc/sysconfig/network-scripts/ifcfg-enp0s3″。
TYPE=Ethernet # 网卡类型:为以太网
PROXY_METHOD=none # 代理方式:关闭状态
BROWSER_ONLY=no # 只是浏览器:否
BOOTPROTO=dhcp # 网卡的引导协议:DHCP[中文名称: 动态主机配置协议]
DEFROUTE=yes # 默认路由
IPV4_FAILURE_FATAL=no # 是不开启IPV4致命错误检测:否
IPV6INIT=yes # IPV6是否自动初始化: 是[不会有任何影响, 现在还没用到IPV6]
IPV6_AUTOCONF=yes # IPV6是否自动配置:是[不会有任何影响, 现在还没用到IPV6]
IPV6_DEFROUTE=yes # IPV6是否可以为默认路由:是[不会有任何影响, 现在还没用到IPV6]
IPV6_FAILURE_FATAL=no # 是不开启IPV6致命错误检测:否
IPV6_ADDR_GEN_MODE=stable-privacy # IPV6地址生成模型:stable-privacy [这只一种生成IPV6的策略]
NAME=ens33 # 网卡物理设备名称
UUID=f47bde51-fa78-4f79-b68f-d5dd90cfc698 # 通用唯一识别码, 每一个网卡都会有, 不能重复, 否两台linux只有一台网卡可用
DEVICE=ens33 # 网卡设备名称, 必须和 'NAME' 值一样
ONBOOT=no # 是否开机启动, 要想网卡开机就启动或通过 'systemctl restart network' 以及 ip 命令启动网卡,必须设置为 'yes'
可以在这个NetworkManager文档 上查看更多网卡配置参数。
2. 设置固定IP地址
前面几节课的内容,我们一直使用 DHCP (Dynamic Host Configuration Protocol 即动态主机配置协议)来获取 IP 地址,这样的好处是配置非常简单,我们只需要修改网卡配置文件中的 ONBOOT 参数为 yes 即可,但是缺点就是每次我们重启网络之后地址可能就变了,必须重新登录上虚拟机查看 IP 地址之后,才能通过咱们的 ssh 工具进行远程连接,而如果是在生产环境中,一般服务器都在机房里,甚至在异地,每次去机房查看服务器 IP 地址这就显得非常不合时宜了,所以,我们必须给主机设置一个静态 IP 地址。
设置静态(固定)IP地址其实也很简单,我们只需要修改以及添加几个参数就可以了。
2.1 需要修改的参数
- 将 BOOTPROTO=dhcp 修改为 BOOTPROTO=static,即指定地址分配协议,是通过动态获取还是静态指定。
需要修改的参数就这一个,但是这里需要说明的一点是,有些情况下,我们可能会看到 BOOTPROTO=no 或者配置文件中没有这个参数,也是相当于 BOOTPROTO=static ,所以我们其实也可以将这个参数删除或者修改为 BOOTPROTO=no ,只是“显得”不够标准而已。
2.2 需要添加的参数
我们只需要添加三个参数即可,分别是 IPADDR、GATEWAY、PREFIX 用于指定 IP 地址、网关、掩码位数,当然我们有时候可能需要添加 DNS1(注意不是 DNS) 参数,但是官方并不建议这么使用,下面我们会给出标准的解决方案。
字节教育-竹笋老师温馨提示:
可能有些学员现在还不太明白什么是 IP 地址、网关、掩码位数,这个等我们后面学习到 Linux 网络技术时再跟大家去深入讲解,因为 Linux 网络功能非常强大,也比较难以理解,现在就去接触这块内容,很可能会影响到零基础童鞋们的自信心,所以我们先带着大家再熟悉下 Linux 的感觉,再积累一些“能量值”。下面老师就告诉大家如何去查看 IP地址、网关以及网络掩码。
IP 地址 ,如果我们不知道哪些IP地址是可用的,那么最简单的方法就是先通过 DHCP 获得可以使用的地址,然后把这个地址记下来。还记得怎么看吗,利用 ip 命令,如下:
[root@byte-edu-lab2 ~]# ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:88:01:70 brd ff:ff:ff:ff:ff:ff
inet 192.168.48.48/24 brd 192.168.48.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::5f4d:62cd:a789:64e6/64 scope link noprefixroute
valid_lft forever preferred_lft forever
我们可以看到“inet 192.168.48.48/24” ,其中 192.168.48.48 就是 IP 地址,而后面的 24 就是 掩码位数(或者说掩码长度,都是一个意思),也就是 PREFIX 参数需要制定的。
通过上面的一条吗命令,我们就知道了网络IP地址和掩码长度,那么现在还差一个网关参数,网关可以通过下面这个命令获取:
[root@byte-edu-lab2 ~]# ip route show
default via 192.168.48.1 dev enp0s3 proto static metric 100
192.168.48.0/24 dev enp0s3 proto kernel scope link src 192.168.48.48 metric 100
看到 “default via 192.168.48.1” 这段信息了吗(找到 default 字段),这个地址就是默认的 网关地址,当然我们上面的这些操作都是在 DHCP 的方式下获取的,那么现在我们就可以通过这些参数和数值将咱们的 IP 地址固定起来,也就是配置静态IP地址。
注意:一台服务器上可以有多个网卡,但是只能有一个默认网关,也就是说当你在某个网卡中指定 DEFROUTE 时,其他网卡都不可用再设置这个参数,切记!切记!切记!
字节教育-竹笋老师 温馨提示:
上面的做法其实并不是很严谨,因为在一些复杂的网络模型下,很可能默认路由并不是咱们当前IP地址首先使用的路由,比如下面这种:
# ip route show
default via 192.168.48.1 dev enp0s3 proto static metric 100
172.20.0.0/16 via 172.20.32.5 dev enp0s3 scope link
172.20.0.0/16 dev enp0s3 proto kernel scope link src 172.20.32.5
192.168.48.0/24 dev enp0s3 proto kernel scope link src 192.168.48.48 metric 100
那么当我请求的地址是 172.20.0.0/16 网段内的,就会使用 172.20.32.5 地址请求,而不再走默认路由。但是前期我们不考虑这么复杂的情况,大家知道下就可以了,我们的认知是随着知识的积累而逐渐提升的。
2.3 静态配置参数
那么现在咱们来看下完整的静态地址配置配置参数:
[root@byte-edu-lab2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# 注意 BOOTPROTO 的值修改为 static
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=06713c0b-b0d9-469e-92c8-e4411656ec1b
DEVICE=enp0s3
ONBOOT=yes
# 下面是新增的三个参数
IPADDR=192.168.48.48
PREFIX=24
GATEWAY=192.168.48.1
重启网络,再来看看咱们的地址信息:
# 查看 enp0s3 地址信息
[root@byte-edu-lab2 ~]# ip addr show enp0s3
- 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:88:01:70 brd ff:ff:ff:ff:ff:ff
inet 192.168.48.48/24 brd 192.168.48.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::5f4d:62cd:a789:64e6/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 检查到网关 192.168.48.1 之间网络是否通畅
[root@byte-edu-lab2 ~]# ping 192.168.48.1
PING 192.168.48.1 (192.168.48.1) 56(84) bytes of data.
64 bytes from 192.168.48.1: icmp_seq=1 ttl=64 time=3.08 ms
64 bytes from 192.168.48.1: icmp_seq=2 ttl=64 time=6.64 ms
现在已经是我们指定的 192.168.48.48 地址,而且到网关之间网络畅通,至此我们的静态IP地址配置就算结束了吧?可能还没有,我们现在去检查下到外网是否通畅,如下:
# 就去 ping 下百度的域名吧
[root@byte-edu-lab2 ~]# ping baidu.com
ping: baidu.com: 未知的名称或服务
这里有个错误提示 “baidu.com: 未知的名称或服务” ,这是什么意思呢?就是咱们的主机不知道 baidu.com 是谁,也就是不知道他的 IP 是什么,我们之前说过,域名或者主机名其实是为了咱们好记,但是在互联网中真正通信的时候使用的还是 IP地址,那如何才能知道 baidu.com 的地址是谁呢?需要通过 DNS 进行域名解析来获取域名的 IP地址,这里就涉及到 Linux 的域名解析文件 “/etc/resolv.conf”,我们只需在这个文件中指定使用哪个 DNS 地址进行域名解析就可以了。 “/etc/resolv.conf”文件中使用 nameserver 指定 DNS 地址,我们就使用非常有名的谷歌免费 DNS 地址– 8.8.8.8,配置如下:
[root@byte-edu-lab2 ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
此时再来检查下到 baidu.com 网络情况,
[root@byte-edu-lab2 ~]# ping -c 4 baidu.com # 注意这里加了 -c 参数,是限定 ping 发送四个数据包就结束,而不会一直发下去
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=50 time=10.7 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=50 time=12.3 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=50 time=12.0 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=4 ttl=50 time=17.1 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 10.773/13.068/17.132/2.421 ms
此时到外网(baidu.com就是外网)地址已经通了,证明咱们的配置已经没有问题了。
3. 知识技能引申
还记得咱们上面说过,静态网络配置参数有个可加可不加 DNS1(DNS1 是指首选 DNS,所以你还可以配置 DNS2、DNS3 参数) 参数吗,这个参数的作用是什么呢?其实也是用来指定主机的 DNS 解析地址的,比如现在我们加上这个参数,部分配置如下:
IPADDR=192.168.48.48
PREFIX=24
GATEWAY=192.168.48.1
DNS1=114.114.114.114
注意:114.114.114.114 是国内非常有名的免费 DNS ,国内用户用的还是非常多的。
现在我们重启下网络,再来看看到百度是否通畅。
# 修改完网卡信息重启网络服务以使配置生效
[root@byte-edu-lab2 ~]# systemctl restart network
# 检查到 百度 的网络连通性
[root@byte-edu-lab2 ~]# ping -c 4 baidu.com
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=1 ttl=50 time=8.59 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=2 ttl=50 time=8.12 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=3 ttl=50 time=10.5 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=4 ttl=50 time=8.26 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3022ms
rtt min/avg/max/mdev = 8.126/8.885/10.558/0.984 ms
# 再次看下服务器上的域名解析文件,发现已经被修改为网卡中配置的 114.114.114.114
[root@byte-edu-lab2 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
我们看到之前配置的 DNS 已经被网卡配置文件中的 DNS1条目给覆盖重写了,为什么会重写呢?这个问题咱们稍后回答,我们现在先把 /etc/resolv.conf 中的 DNS 删除掉,再看看能否解析域名。
[root@byte-edu-lab2 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
[root@byte-edu-lab2 ~]# ping baidu.com
ping: baidu.com: 未知的名称或服务
发现删除之后,我不用重启网络,也已经不能 ping 通 baidu.com 了,基于此我们可以得出下面的结论:
- 网卡配置文件中写入 DNS 配置信息,会在网络重启时覆盖 /etc/resolv.conf 配置
- /etc/resolv.conf 配置是实时生效的,不需要重启网络
- Linux 主机之所以能够解析域名,是因为 /etc/resolv.conf (也仅与这个文件有关) 配有 nameserver,跟网卡中是否配置 DNS 无关,而我们上面的示例中之所以配置了网卡文件中的 DNS 条目,重启后主机就可以解析baidu.com,其实是因为 NetworkManager 服务将这个 DNS1 信息写入到 /etc/resolv.conf 中了。
- 如果网卡配置文件中和 /etc/resolv.conf 文件中都配置了 DNS 信息,毫无疑问,以 /etc/resolv.conf 配置文件中指定的 DNS 为准。
那下面我们来回答另外一个问题,网卡配置文件中的 DNS(实例中是 DNS1,我这里统称 DNS 条目) 条目,为什么会覆盖 /etc/resolv.conf 文件,如果覆盖会有什么缺点,该如何取消这种“覆盖操作”呢?
4. 关于 Linux 上的 DNS 配置问题
4.1 为什么会覆盖 /etc/resolv.conf 文件
从 RHEL7 系列开始,网络管理默认使用 NetworkManager,但是系统上允许 network 和 NetworkManager 两个网络管理服务同时存在,前置是 RHEL6 及之前的默认网络管理服务,7系列使用了这么一个比较操蛋的管理工具。我们在 /etc/resolv.conf 中看到有这么一句信息 “# Generated by NetworkManager” ,也就是这个服务负责网络管理和 DNS 管理,就是他把网卡中的 DNS 信息同步到这个配置文件中,这就回答了为什么会覆盖 /etc/resolv.conf 文件,因为他自认为自己特别机智的帮你配置好 DNS 了。
4.2 使用网卡中的 DNS 覆盖 /etc/resolv.conf 配置文件的缺点
我们确实可以通过在网卡配置文件中指定 DNS 信息来覆盖 /etc/resolv.conf 的方式完成 DNS 配置,但是这在生产环境上存在极大的隐患。比如你在北京的服务器上配置了北京的某个 DNS 地址,重启网络之后写入到 /etc/resolv.conf 配置文件中,进行域名解析。但是,突然有一天这个 DNS 不能使用了(地区性的DNS确实经常性的故障,所以还是使用比较有知名度的 DNS),那么你的服务器就不能再解析域名,造成业务中断,这中故障属于情理之中。于是你们进行了修复,直接修改 /etc/resolv.conf 中 nameserver 的值,改成可用的 DNS 地址,不需要进行网络重启,就可以立即生效,这是正常的故障解除操作。但是你们的网卡配置文件中仍然使用的是不能使用的 DNS 地址,什么时候重启网络,故障就会在什么时候产生,这就属于人为故障了。那可能有的同学就会说,我直接修改网卡中的配置文件不就行了?首先这样配置需要重启网络,耽误了修复时间不说,还可能会造成网卡上的配置信息丢失;其次,这样配置那么下次 DNS 失效时依然存在同样的安全隐患。所以,最好的方式,就是“做好分内的事”,网卡配置文件就是用来设定网卡信息的,/etc/resolv.conf 文件就是用来配置Linux 域名解析相关的。
4.3 如何取消这种覆盖操作呢?
首先需要知道这种覆盖操作的罪魁祸首是谁,我们知道网络管理服务可以是 network 也可以是 NetworkManager ,怎么看呢?可以使用 systemctl status netwok 或者 systemctl status NetwokManager ,谁的状态是 active ,就是谁在管理网络,当然了在 CentOS7 上,可以两个同时都是 active ,下面我就告诉大家怎么去取消这种覆盖操作。
很多网络上的文章说 CentOS6 或者 CentOS7 如何取消对 /etc/resolv.conf 的覆盖操作,其实是非常不严谨的,如何取消是针对使用哪种网络服务,而不是系统版本。
- 当是 network 进行网络管理时
在网卡配置文件中添加一行 “PEERDNS=no” 即可。
- 当是 NetworkManager 进行网络管理时
修改 /etc/NetworkManager/NetworkManager.conf 配置文件,将 [main]字段下加上 “dns=none” 或者 “dns=no” ,然后重启网络即可: systemctl restart NetworkManager 。
- 如何两个都是 active 状态时
上面的操作都做上就可以了。