? ? ? ? 為了管理網絡,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。同樣,