Ubuntu 第11章 网络管理_常用的网络配置命令
为了管理网络,Linux提供了许多非常有用的网络管理命令。利用这些命令,一方面可以有效地管理网络,另一方面出现网络故障时,可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。
11.2.1 ifconfig命令
关于ifconfig命令,在11.1节中已经提到过了。通过该命令可以查看和配置网络接口。ifconfig是一个比较古老的命令,在Ubuntu22以及其他的许多发行版中,已经不太推荐使用该命令了。默认情况下,Ubuntu 22.04已经不提供该命令,用户可以通过安装net-tools软件包来获得该命令,如下所示:
root@node1:~# apt install net-tools
ifconfig 命令的基本语法如下:
ifconfig [-v] interface [aftype] options | address ...
在上面的语法中,参数interface表示要配置的网络接口。aftype表示地址类型,例如inet、inet6或者ddp等。options表示ifconfig命令的选项,常用的选项有:
- -a:列出当前系统所有的可用网络接口,包括禁用状态的。
- up:启用指定的网络接口。
- down: 禁用指定的网络接口。
- netmask:指定当前IP网络的子网掩码。
- add:为指定网络接口增加一个IPv6地址。
- del:从指定网络接口删除一个IPv6地址。
- -broadcast:指定网络接口的广播地址。
address参数为指派给网络接口的IP地址。
例如,使用下面的命令查看当前系统所有的网络接口:
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 06:6c:3a:20:1c:30 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 24 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 1383 bytes 611544 (611.5 KB)RX errors 0 dropped 85 overruns 0 frame 0TX packets 791 bytes 118578 (118.5 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2000 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 80 bytes 29877 (29.8 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 129 bytes 15218 (15.2 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2080 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 238 bytes 25070 (25.0 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 238 bytes 25070 (25.0 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在上面的输出中,一共有四个网络接口,其名称分别为docker0、ens33、ens37和lo。关于各个网络接口的详细信息,在前面已经介绍过了,不再重复。
如果想要禁用某个网络接口,可以使用down选项。例如,使用下面的命令禁用名称为ens37的网络接口:
root@node1:~# ifconfig ens37 down
网络接口被禁用之后,其状态信息中就不再包含RUNNING属性了,如下所示:
root@node1:~# ifconfig ens37
ens37: flags=4098<BROADCAST,MULTICAST> mtu 1500ether 00:0c:29:da:76:31 txqueuelen 1000 (以太网)RX packets 88 bytes 30757 (30.7 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 129 bytes 15218 (15.2 KB)TX errors 0 dropped 2 overruns 0 carrier 0 collisions 0device interrupt 19 base 0x2080
被禁用的网络可以使用以下命令重新启动:
root@node1:~# ifconfig ens37 up
11.2.2 ip命令
与前面介绍的ifconfig命令不同,ip命令是一个Linux系统中比较新的、功能强大的网络管理工具。ip命令是iproute2软件包中的核心命令。通过ip命令可以显示或操纵Linux主机的路由、网络设备、策略路由、多播地址和隐道。ip命令的基本语法如下:
ip [ OPTIONS ] OBJECT { COMMAND | help }
在上面的语法中,options表示命令选项,常用的选项有:
- -h:输出可读的信息。
- -f:指定协议族,该选项可以取inet。inet6、bridge、ipx以及dnet五个值、如果没有指定协议族,则ip命令会从其他的参数判断,如果无法判断,则默认为inet。
- -4:指定协议族为inet,即IPv4。
- -6:指定协议族为inet6,即IPv6。
- -B:指定协议族为bridge,即桥接。
- -D:指定协议族为decnet。
- -l:指定协议族为ipx,即IPX协议。
- -s:显示详细信息。
object为命令操作的对象。常见的对象有:
- Address:IPv4或者IPv6地址。
- 12tp:L2TP隙道协议。
- link:网络设备。
- maddress:多播地址。
- route:路由表。
- rule:路由策略。
- tunnel:隧道
command 为命令,常用的命令有add、delete、show、set或者list等。根据不同的对象,会有不同的命令。下面分别介绍ip命令的使用方法。
1. 管理网络设备
网络设备包括交换机、路由器以及网络接口等。ip命令最常管理的网络设备就是网络接口。
例如,使用下面的命令显示网络设备的运行状态:
root@node1:~# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:27 brd ff:ff:ff:ff:ff:ffaltname enp2s1
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:31 brd ff:ff:ff:ff:ff:ffaltname enp2s5
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 06:6c:3a:20:1c:30 brd ff:ff:ff:ff:ff:ff
在上面的命令中,link为对象,即网络设备,list为命令,所以整个命令的含义为列出所有的网络设备。如果想要显示更详细的信息,可以使用-s选项,如下所示:
root@node1:~# ip -s link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00RX: bytes packets errors dropped missed mcast 25216 240 0 0 0 0 TX: bytes packets errors dropped carrier collsns 25216 240 0 0 0 0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:27 brd ff:ff:ff:ff:ff:ffRX: bytes packets errors dropped missed mcast 2409588 4048 0 316 0 0 TX: bytes packets errors dropped carrier collsns 232332 2109 0 0 0 0 altname enp2s1
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:31 brd ff:ff:ff:ff:ff:ffRX: bytes packets errors dropped missed mcast 56836 142 0 0 0 0 TX: bytes packets errors dropped carrier collsns 23342 210 0 2 0 0 altname enp2s5
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 06:6c:3a:20:1c:30 brd ff:ff:ff:ff:ff:ffRX: bytes packets errors dropped missed mcast 0 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 0 0 0 26 0 0
使用下面的命令禁用网络接口ens37:
root@node1:~# ip link set ens37 down
在上面的命令中,由于操作的对象为网络接口,因此使用link。set命令用来设置属性。down为禁用状态,up为启用状态。
注意:以上命令等同于ifconfig ens37 down。
设置完成之后,使用ip命令查看其状态,如下所示:
root@node1:~# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:27 brd ff:ff:ff:ff:ff:ffaltname enp2s1
3: ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000link/ether 00:0c:29:da:76:31 brd ff:ff:ff:ff:ff:ffaltname enp2s5
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 06:6c:3a:20:1c:30 brd ff:ff:ff:ff:ff:ff
从上面的输出可以得知,网络接口ens37的状态中不再含有UP标识。
若想把ens37重新启用,则可以使用以下命令:
root@node1:~# ip link set ens37 up
使用下面的命令改变网络设备的最大传输单元,即MTU的值为1400:
root@node1:~# ip link set ens37 mtu 1400
其中,dev表示网络接口。因此,上面的命令把网络接口enp0s3的MTU值设置为1400。
使用下面的命令修改网络设备的MAC地址,把网络接口enp0s3的MAC地址修改为
00:0c:29:da:76:31:
root@node1:~# ip link set ens37 address 00:0c:29:da:76:31
2. 管理 IP 地址
利用ip命令可以管理网络接口的IP地址,包括添加、删除、显示以及清除等。其中需要使用address 对象。通常情况下,address可以缩写为a、add或者addr。
使用下面的命令为网络接口ens37添加一个新的IP地址:
root@node1:~# ip address add 192.168.8.151/24 dev ens37
在上面的命令中,IP地址采用CIDR地址表示法,斜线前面为IP地址,斜线后面为二进制子网掩码中1的个数。
如果想要删除指定网络接口的IP地址,可以使用以下命令;
root@node1:~# ip addr del 192.168.8.151/24 dev ens37
在上面的命令中,采用缩写addr,delete表示要执行的命令。
ip命令中的show可以显示指定网络接口的IP地址信息,如下所示:
root@node1:~# ip a show dev ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000link/ether 00:0c:29:da:76:31 brd ff:ff:ff:ff:ff:ffaltname enp2s5inet 192.168.8.150/24 brd 192.168.8.255 scope global noprefixroute ens37valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feda:7631/64 scope link proto kernel_ll valid_lft forever preferred_lft forever
同样,以下两个命令也可以显示同样的结果:
root@node1:~# ip addr ls ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000link/ether 00:0c:29:da:76:31 brd ff:ff:ff:ff:ff:ffaltname enp2s5inet 192.168.8.150/24 brd 192.168.8.255 scope global noprefixroute ens37valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feda:7631/64 scope link proto kernel_ll valid_lft forever preferred_lft forever
在上面的例子中,使用list命令代替show,list可以缩写为ls。从上面的例子可以得知,ip命令的语法是非常灵活的。
如果想要清除某个网络接口的IP地址,则可以使用flush,如下所示:
root@node1:~# ip -4 addr flush ens37
上面的命令使用-4选项来表示清除IPv4类型的IP地址,同时指定网络接口为ens37。
注意:通过ip命令修改的IP地址重启后会消失。如果想永久保存,请修改网络配置文件。
3. 管理路由表
在ip命令中,路由表使用route对象表示。route可以缩写为r或者ro。从Linux内核2.2版本开始,内核把路由归纳到许多路由表中,并对这些表都进行编号,编号的范围是1~255。另外,为了方便,还可以在/etc/iproute2/rt_tables中为路由表命名。例如,下面的代码为一个默认的rt_tables文件的内容:
itadmin@lenovo-07:~$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
在上面的文件中,每行定义一个路由表,前面的数字为路由表编号,后面为路由表名称,例如local、main以及default等。上面的几个路由表为默认路由表,用户不可以修改。用户可以修改该文件,增加新的路由表,但是前面的编号不可以重复。
默认情况下,所有的路由都会被插入编号为254的main表中。在进行路由查询时,内核只使用路由表 main。
默认情况下,ip命令会显示出main路由表的路由信息,如下所示:
root@node1:~# ip route show
default via 192.168.6.1 dev ens33 proto dhcp src 192.168.6.101 metric 100
default via 192.168.8.2 dev ens37 proto static metric 101
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.6.0/24 dev ens33 proto kernel scope link src 192.168.6.101 metric 100
192.168.8.0/24 dev ens37 proto kernel scope link src 192.168.8.150 metric 101
从上面的输出可以得知,当前系统的main路由表中一共有5条路由信息。其中第1~2行都为默认路由,使用关键字default表示。第1行为网络接口ens33指定默认网关为192.168.6.1,其跳数为100。第2行为网络接口ens37指默认网关为192.168.8.2,其跳数为101。默认网关是必须要有的路由信息,当系统在发送数据包的时候,查不到相应的路由信息,便直接从默认路由发送。
如果想要显示其他路由表的路由记录,则可以通过table关键字来指定路由表,如下所示:
root@node1:~# ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 172.17.0.1 dev docker0 proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
local 192.168.6.101 dev ens33 proto kernel scope host src 192.168.6.101
broadcast 192.168.6.255 dev ens33 proto kernel scope link src 192.168.6.101
local 192.168.8.150 dev ens37 proto kernel scope host src 192.168.8.150
broadcast 192.168.8.255 dev ens37 proto kernel scope link src 192.168.8.150
上面的命令显示了local路由表的路由信息。
注意:如果没有指定table关键字,则默认为main路由表。
下面的例子删除一条默认路由:
root@node1:~# ip route del default
执行完以上命令之后,再次显示路由表信息,结果如下:
root@node1:~# ip route list
default via 192.168.8.2 dev ens37 proto static metric 101
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.6.0/24 dev ens33 proto kernel scope link src 192.168.6.101 metric 100
192.168.8.0/24 dev ens37 proto kernel scope link src 192.168.8.150 metric 101
可以得知,网络接口 ens37的默认路由已经被删除了。由于当前系统还有一条通过网络接口ens37的默认路由,因此该系统仍然可以访问其他所有的网络。如果再执行一次上面的命令,把网络接口ens37的默认路由也删除,则该系统便不能访问其他的网络了,如下所示:
root@node1:~# ip route del default
root@node1:~# ping 8.8.8.8
ping: connect: 网络不可达
但是由于通向网络192.168.6.0/24和192.168.8.0/24的路由还存在,因此这两个网络仍然可以访问,如下所示:
root@node1:~# ping 192.168.8.2
PING 192.168.8.2 (192.168.8.2) 56(84) bytes of data.
64 bytes from 192.168.8.2: icmp_seq=1 ttl=128 time=0.232 ms
64 bytes from 192.168.8.2: icmp_seq=2 ttl=128 time=0.085 ms
为了使得系统能够访问其他的网络,使用以下命令添加一条默认路由:
root@node1:~# ip route add default via 192.168.6.1 dev ens33
root@node1:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=10.3 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=114 time=10.6 ms
ip route get命令可以获取通向某个IP地址的路由信息,如下所示:
root@node1:~# ip route get 8.8.8.8
8.8.8.8 via 192.168.6.1 dev ens33 src 192.168.6.101 uid 0 cache
上面的命令告诉我们,发送到8.8.8.8的数据包经过网络接口ens37,并且通过网关192.168.6.1。
4. 管理策略路由
在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些信息,例如源地址、IP协议、传输层端口甚至数据包的负载。这叫作策略路由。策略路由是Linux提供的一种比较高级的路由功能。策略路由由路由规则来表示,在IP命令中,其对象为rule。同样,