可以肯定地说,如果没有Linux,今天的互联网可能不会这么发达,Linux天生与网络有着密不可分的关系。据统计,Linux和UNIX在互联网服务器操作系统中已经占据了60%以上的市场份额。网络管理对于Ubuntu系统维护来说是一项非常重要的技能。本章将介绍在Ubuntu网络管理中经常用到的配置文件,以及常用的网络管理命令。
本章主要涉及的知识点有:
- Ubuntu 网络配置文件:主要介绍 Ubuntu 基本网络配置文件/etc/network/interfaces 以及其他与网络有关的配置文件。
- 常用的网络管理命令:介绍ifconfig、nslookup、ping、ip、netstat以及route等常用的与网络配置有关的命令的使用方法。
- 防火墙:介绍Ubuntu防火墙(ufw)的配置方法。
11.1 网络接口
在Linux中,所有的网络通信都是通过网络接口完成的,网络接口是Linux操作系统以及运行在Linux操作系统中的各种应用与网络上其他的主机或者设备进行数据交换的交通枢纽。网络接口不仅包括物理硬件,即网卡,还包括Linux中与网络有关的底层服务。
本节首先介绍Ubuntu中的网络接口的查看方法、命名规则以及常用的配置文件。
11.1.1 查看网络接口
作为系统管理员,经常需要了解当前Linux中的网络接口以及状态,尤其是在出现网络故障时。Linux 系统提供了一个非常有用的命令来帮助用户完成这个任务,该命令的名称为ifconfig。顺名思义,该命令由接口interface的前两个字母和配置config这个单词拼接而成。在终端窗口中输入该命令,就会列出当前系统中的网络接口及其状态,Ubuntu 默认不会安装ifconfig,先要执行安装sudo apt install net-tools,如下所示:
root@node1:~# ifconfig
找不到命令 “ifconfig”,但可以通过以下软件包安装它:
apt install net-tools
root@node1:~# apt install net-tools
root@node1:~# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 7e:8c:e7:bd:16:df txqueuelen 0 (以太网)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 29 overruns 0 carrier 0 collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.6.101 netmask 255.255.255.0 broadcast 192.168.6.255inet6 fe80::fc0:15fc:cb36:c90a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:da:76:27 txqueuelen 1000 (以太网)RX packets 606 bytes 409096 (409.0 KB)RX errors 0 dropped 15 overruns 0 frame 0TX packets 581 bytes 87143 (87.1 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (本地环回)RX packets 190 bytes 19170 (19.1 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 190 bytes 19170 (19.1 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
通过以上输出,用户可以非常清楚地了解到当前系统中有三个活动的(UP)网络接口,其名称
分别为docker0、ens33和lo。其中,docker0为容器使用的桥接网卡,ens33为以太网(Ethernet)接口,其物理地址为00:0c:29:da:76:27,IPv4地址为192.168.6.101,广播地址为192.168.6.255,子网掩码为默认的255.255.255.255.0,IPv6地址为fe80::fc0:15fc:cb36:c90a/64,当前状态为UP,即启用状态。而lo为内部环路(Loopback)。
与其他的Linux命令一样,ifconfig命令也提供了许多选项和参数,用户可以通过man命令来
查看,在此不再赞述。但是,有一个选项非常值得重点介绍一下,即-a。
在前面的例子中,我们没有为ifconfig命令提供任何选项和参数,这种情况下,ifconfig会把当前系统中所有的处于活动状态(UP)的网络接口罗列出来,而处于非活动状态(DOWN)的网络接口则会被忽略掉。而对于一个系统管理员来说,通常需要掌握所有网络接口的情况,即使该接口处于非活动状态。此时,我们只要使用-a选项就可以了,其中字母a表示所有(all)。命令如下所示:
root@node1:~# ifconfig -a
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 7e:8c:e7:bd:16:df txqueuelen 0 (以太网)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 32 overruns 0 carrier 0 collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.6.101 netmask 255.255.255.0 broadcast 192.168.6.255inet6 fe80::fc0:15fc:cb36:c90a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:da:76:27 txqueuelen 1000 (以太网)RX packets 1101 bytes 450228 (450.2 KB)RX errors 0 dropped 120 overruns 0 frame 0TX packets 634 bytes 92927 (92.9 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (本地环回)RX packets 193 bytes 19389 (19.3 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 193 bytes 19389 (19.3 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果用户只关注某个特定的网络接口,而不是系统中所有的网络接口,可以直接将接口名称作为参数传递给ifconfig命令,如下所示:
root@node1:~# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.6.101 netmask 255.255.255.0 broadcast 192.168.6.255inet6 fe80::fc0:15fc:cb36:c90a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:da:76:27 txqueuelen 1000 (以太网)RX packets 1447 bytes 478870 (478.8 KB)RX errors 0 dropped 178 overruns 0 frame 0TX packets 690 bytes 99216 (99.2 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2000
可以发现,加入参数之后,ifconfig命令就只显示指定网络接口的状态信息了。
除ifconfg命令之外,用户还可以通过Ishw命令来查看当前系统中的网络接口。该命令的主要
功能是列出当前系统的硬件系统,这里面就包含网络接口。
root@node1:~# lshw -class network*-network description: Ethernet interfaceproduct: 79C97x [PCnet32 LANCE]vendor: Advanced Micro Devices, Inc. [AMD]physical id: 1bus info: pci@0000:02:01.0logical name: ens33version: 10serial: 00:0c:29:da:76:27size: 10Mbit/swidth: 32 bitsclock: 33MHzcapabilities: bus_master rom ethernet physical logical tp auiconfiguration: autonegotiation=off broadcast=yes driver=pcnet32 driverversion=6.11.0-8-generic duplex=half ip=192.168.6.101 latency=64 link=yes maxlatency=255 mingnt=6 multicast=yes port=twisted pair speed=10Mbit/sresources: irq:19 ioport:2000(size=128) memory:fd500000-fd50ffff
在上面的命令中,-class network 选项表示只显示与网络有关的硬件信息。可以发现,Ishw命令侧重于显示硬件信息,其中包含网络接口的逻辑名称、状态以及物理地址等信息,而没有包含与TCP/IP 协议有关的信息。
11.1.2 网络接口命名
在前面的11.1.1节中,我们介绍了查看网络接口的各种信息,其中提到了网络接口的名称。实际上,在Linux中,为了便于用户记忆和使用,系统为每个网络接口指定了一个逻辑名称,这个逻辑名称遵循一定的规则,逻辑名称的各个部分都有具体的含义。在各种命名中,最常见的,也是大家最熟悉的就是ethn。在这个命名中,前3个字母ct表示网络接口类型为以太网,后面一个n是一个从0开始的数字,表示网络接口的顺序。其中,第一个网络接口为etho,以此类推。当然,在现实中,除以太网之外,还会有其他类型的网络,其网络接口也有相应的命名规则,例如fc表示光纤网络,ge表示千兆以太网,xe表示万兆以太网等。用户可以通过这些规则来了解网络接口的类型。
从16.04版本开始,Ubuntu的网络接口命名规则发生了变化,例如在11。1。1节中,我们看到的网络接口名称分别为enp0s8、enp0s9等。其中,en表示以太网,p表示网卡的位置,s表示网卡所处的槽位,其中的数字表示序号。这种命名规则是基于固件和网卡的位置信息的,与传统的ethn相比有一定的优势。当然,用户也可以通过修改配置文件,使得网络接口的命名规则变为传统的ethn规则。
11.1.3 配置网络接口IP地址
Linux支持临时IP地址配置和静态IP地址配置。前者是通过ifconfig命令完成的,而后者则是通过修改配置文件完成的。下面分别对这两种配置方式进行介绍。
1. 临时IP地址配置
在某些情况下,管理员可能只是想临时为某个网络接口配置一个IP地址,使得Linux系统能够通过该接口访问网络。当Linux系统重新启动后,该配置信息则无须保留。这个任务可以通过ifconfig命令来完成。在11.1.1节中,我们已经介绍了使用该命令来查看网络接口,实际上该命令的功能远不止这些,它还可以用来配置网络接口,包括更改网络接口的状态。ifconfig配置网络接口的基本语法如下:
ifconfig interface ip netmask netmask
在上面的语法中,参数interface表示网络接口的返辑名称,例如eth0或者ens37等;ip表示要为该接口配置的IP地址;netmask表示子网掩码。例如,使用下面的命令将网络接口ens37的IP地址配置为192.168.8.132,子网掩码为255.255.0.0:
root@node1:~# ifconfig ens37 192.168.8.132 netmask 255.255.255.0
注意:由于配置网络接口需要root用户权限,因此在上面的命令中,通过sudo命令来使得该命令以root用户的身份执行。
执行完以上命令之后,网络接口ens37的IP地址就变成了192.168.8.132。可以通过ifconfig命令来查看,如下所示:
root@node1:~# ifconfig ens37
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.8.132 netmask 255.255.255.0 broadcast 192.168.8.255inet6 fe80::5c9e:756e:9bcb:3f1f prefixlen 64 scopeid 0x20<link>ether 00:0c:29:da:76:31 txqueuelen 1000 (以太网)RX packets 93 bytes 35905 (35.9 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 122 bytes 16226 (16.2 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2080
为了使得该网络接口能够通信,除配置IP地址之外,还需要为该网络接口指定默认网关。配置网关需亜使用route命令,例如,使用下面的命令为网络接口ens37指定默认网关为192.168.8.2:
root@node1:~# route add default gw 192.168.8.2 ens37root@node1:~# route -n
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 192.168.8.2 0.0.0.0 UG 0 0 0 ens37
0.0.0.0 192.168.6.1 0.0.0.0 UG 100 0 0 ens33
0.0.0.0 192.168.8.2 0.0.0.0 UG 101 0 0 ens37
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.6.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.8.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37
指定默认网关之后,经由ethl接口发送出去的数据包都会经由默认网关发送出去。
配置完网关之后,实际上该网络接口已经能够正常收发数据包了。但是在互联网上面,绝大部分网站和主机都是通过域名来标识和访问的,所以还需要配置DNS服务器的地址。在Ubuntu中,DNS 服务器的配置信息保存在/etc/resolv.conf 文件中,如下所示:
root@node1:~# cat /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6
在上面的配置中,每1行配置一个DNS服务器,可以为该系统指定多个DNS服务器。每1行包含两列,第1列nameserver关键字,表示该行配置一个DNS服务器:第2列为DNS服务器的IP地址。用户可以在该配置文件的末尾追加自己所需的DNS服务器。
如果用户不再需要为该接口保留IP地址,则可以通过ip命令来清除IP地址配置信息,如下所
示:
root@node1:~# ip addr flush ens37
注意:通过ifconfig命令配置的临时IP地址会立即生效,无须重新启动该接口。
2. 静态地址配置
为了给网络接口指定一个静态IP地址,用户需要修改/etc/netplan/01-network-manager-all.yaml配置文件。下面首先看一个样本文件,内容如下:
root@node1:~# cat /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:version: 2renderer: NetworkManager
通过查看以上代码,我们可以发现ens33是从DHCP服务器获取IP地址的,下面我们为该网络接口提供一个静态IP地址,使用以下命令修改/etc/netplan/01-network-manager-all.yaml文件:
root@node1:~# vim /etc/netplan/01-network-manager-all.yaml
将该文件的内容修改如下:
# Let NetworkManager manage all devices on this system
network:version: 2renderer: NetworkManagerethernets:# ip addr 默认 ens37ens37:dhcp4: false# IP 地址addresses: [192.168.8.150/24]routes:- to: default# 网关,对应宿主机提供的IPvia: 192.168.8.2dhcp6: false
addresses 关键字表示指定的IP地址,斜杠后的24表示子网掩码,routes下面的via关键字表示网关。
修改完配置文件之后,所进行的修改还不能马上生效。为了能够使得该网络接口按照配置文件中的参数进行配置,需要重启连网络接口。
通过ifconfig命令可以查看该接口的网络参数:
root@node1:~# ifconfig ens37
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.8.150 netmask 255.255.255.0 broadcast 192.168.8.255inet6 fe80::20c:29ff:feda:7631 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:da:76:31 txqueuelen 1000 (以太网)RX packets 223 bytes 93609 (93.6 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 298 bytes 34448 (34.4 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2080
3. 动态分配IP地址(dhcp)
如果用户的网络中有DHCP服务器,并且Linux主机的IP地址允许动态获取,则用户可以为Linux主机的网络接口配置DHCP客户端。配置的方法同样也在/etc/netplan/01-network-manager-all.yaml文件中,只是将多余的静态配置删除,如下所示:
# Let NetworkManager manage all devices on this system
network:version: 2renderer: NetworkManager
配置完成之后,重新应用一下,如下所示:
root@node1:~# netplan apply
上面的输出信息实际上显示了整个DHCP客户端从DHCP服务器申请IP地址的整个过程。
11.1.4 域名解析
所谓域名解析,是将域名转换为IP地址的过程。Linux主机想要通过域名访问某项网络服务,需要指定域名服务器为其解析域名。下面介绍如何在Ubuntu系统中配置DNS玄白
传统的做法是将域名解析服务器的配置信息保存在/ete/resolv.conf 文件中。但是在新版本的Ubuntu中,这个文件的功能发生了变化。它的主要作用已经转换为跟踪用户网络的变化。用户已经不需要人工修改该文件,该文件会被系统自动更新。即使用户手动修改了该文件,在系统重新启动之后,所有的改动都会丢失。目前该文件已经变成了一个符号链接,如下所示:
root@node1:~# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 39 10月 9 2024 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
那么用户应该在哪里配置DNS服务器信息呢?与前面配置网络接口一样,DNS服务器的信息也在/etc/netplan/01-network-manager-all.yaml 文件中指定,如下所示:
# Let NetworkManager manage all devices on this system
network:version: 2renderer: NetworkManagerethernets:# ip addr 默认 ens37ens37:dhcp4: false# IP 地址addresses: [192.168.8.150/24]routes:- to: default# 网关,对应宿主机提供的IPvia: 192.168.8.2nameservers:addresses: [8.8.8.8,114.114.114.114]#dhcp6: false
与前面的内容相比,可以发现上面的代码多了3行。nameservers表示后面配置的是DNS服务器。用户可以同时指定多个域名服务器,中间用空格或者制表符隔开。例如,在上面的代码中,同名服务器。时指定8.8.8.8和114.114.114.114两个域名服务器。Linux在解析城名时会按照顺序依次使用这个域名服务器。