![](https://www.byte-edu.com/wp-content/uploads/2019/04/linux-logo.png)
### Linux 云计算基础入门之Linux 基础网络配置
Linux 网络能力是非常强大的,现在我们使用的所有路由器底层系统几乎都是 linux,后面我们会学习到 Linux 网络配置,学完之后你就会发现几乎所有的路由器你都会配置了。但是现在我们先学习最基础的网络配置,也就是网卡配置。上一节我们通过修改网卡中的 ONBOOT 选项完成了 IP 地址获取(要到了女神电话号码),但是这个地址是经常会变的,本节我们就来学习如何指定IP地址,这也是企业中经常遇到的问题。想不到这么快就接触到生产案例了吧,没错,我们就是要帮你快速掌握企业级技能。
我们不会长篇大论的去讲网络理论知识,最简单有效的学习方法是用到时立刻去学。比如现在我们的问题是如何固定IP地址,那么就需要涉及到下面的几个网卡配置参数,当前我们先掌握这些即可,至于后面遇到更深层次的网络问题,再去学习就是了。
#### 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文档](https://developer.gnome.org/NetworkManager/stable/nm-settings-ifcfg-rh.html#id-1.2.9.7.17)上查看更多网卡配置参数。
#### 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: 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: 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 了,基于此我们可以得出下面的结论:
1. 网卡配置文件中写入 DNS 配置信息,会在网络重启时覆盖 /etc/resolv.conf 配置
2. /etc/resolv.conf 配置是实时生效的,不需要重启网络
3. Linux 主机之所以能够解析域名,是因为 /etc/resolv.conf (也仅与这个文件有关) 配有 nameserver,跟网卡中是否配置 DNS 无关,而我们上面的示例中之所以配置了网卡文件中的 DNS 条目,重启后主机就可以解析baidu.com,其实是因为 NetworkManager 服务将这个 DNS1 信息写入到 /etc/resolv.conf 中了。
4. 如果网卡配置文件中和 /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 状态时**
上面的操作都做上就可以了。