Linux 网络命令

网络设置

虽然现在网络设置可以通过 nmcli 来完成,但旧的命令仍然可用。

ifconfig

ifconfig 命令可以手动启动、查看和修改网络接口的参数,语法如下:ifconfig interface [选项]

其中,interface 为网卡接口名称,例如 eth0ens34 等。选项可以使用以下参数:

参数 说明
up, down 启用或禁用接口
mtu 设置 MTU 数值,单位为字节
netmask 设置子网掩码
broadcast 设置广播地址

例如,要查询 ens33 网卡的信息,可以运行以下命令:

[root@server201 ~]$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.201  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fe80::df56:57bc:63b:6ccd  prefixlen 64  scopeid 0x20<link>
        inet6 240e:383:406:ac00:3d71:87ed:5f5:fde  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::6216:718c:bab2:a10d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:da:7d:5c  txqueuelen 1000  (Ethernet)
        RX packets 444049  bytes 506386469 (482.9 MiB)
        RX errors 0  dropped 64242  overruns 0  frame 0
        TX packets 42962  bytes 7774934 (7.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在输出中,RX 表示接收的数据包情况,TX 表示发送的数据包情况。注意,其中的 collisions 数值表示冲突次数。

还可以设置虚拟接口。例如,将 ens33 设置为 192.168.3.201,可以运行以下命令:

[root@server201 ~]$ ifconfig ens33:0 192.168.3.201
[root@server201 ~]$ ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.201  netmask 255.255.255.0  broadcast 192.168.3.255
        ether 00:0c:29:da:7d:5c  txqueuelen 1000  (Ethernet)

需要注意的是,使用 ifconfig 设置的临时网络参数在重新启动网络服务后会重置并消失。为了永久保留设置,可以修改网络配置文件。

route

route 命令用来修改本机的路由表,命令用法如下:

route [-nee]
route add [-net|-host] [网络或主机] netmask [mask] [gw|dev]
route del [-net|-host] [网络或主机] netmask [mask] [gw|dev]

参数说明:

参数 说明
-n 直接显示 IP 和端口,而不是通信协议或主机名。
-ee 显示更详细的信息。
-net 表示后面接的路由指向一个网络。
-host 表示后面接的路由指向单个主机。
netmask 可以设置 netmask 决定网络的大小。
gw gateway 的缩写,后面接网关 IP。
dev 指定工作网卡,后面接 ens33 等。

查询下本机路由表:

[root@server201 ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    102    0        0 ens33
192.168.0.0     0.0.0.0         255.255.0.0     U     102    0        0 ens33
[root@server201 ~]$ route -nee
Kernel IP routing table
Destination   Gateway       Genmask     Flags Metric Ref    Use Iface   MSS   Window irtt
0.0.0.0       192.168.2.1   0.0.0.0     UG    102    0        0 ens33   0     0      0
192.168.0.0   0.0.0.0       255.255.0.0 U     102    0        0 ens33   0     0      0

第一行表达去往任何地址(0.0.0.0)都要通过网口 ens33 转向网关 192.168.2.1。

第二行表示去往 192.168.0.0/16 网段地址不需要经过网关(0.0.0.0),直接通过网口 ens33 出去。

其中 Flags 标志有多种值:

  • U(route is up):表示该路由已启用。
  • H(target is a host):表示该路由的目标是一个主机。
  • G(use gateway):表示数据包需要经过网关进行处理和传递。
  • R(reinstate route for dynamic routing):表示在使用动态路由时,恢复路由信息的标志。
  • D(dynamically installed by daemon or redirect):表示动态路由。
  • M(modified from routing daemon or redirect):表示路由已被修改。
  • !(reject route):表示此路由被阻止。

路由按照路由表的顺序进行匹配和执行。例如,在上述路由表中,原本发送到 192.168.2.100 的局域网数据包也会通过 192.168.2.1 进行处理,因为后面的路由设置不起作用。

因此,可以尝试调整顺序,首先删除默认路由,然后重新添加默认路由:

[root@server201 ~]$ route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.2.1
[root@server201 ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.0.0     U     102    0        0 ens33
[root@server201 ~]$ route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.2.1
[root@server201 ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 ens33
192.168.0.0     0.0.0.0         255.255.0.0     U     102    0        0 ens33

结果并没有变化,因为路由的优先级是由 Metric 定义的。

一般情况下,修改路由用于指定不同的端口以访问不同的网络段。在重新启动网络服务后,路由表将被还原。

ip

ip 命令综合了 ifconfigroute 命令的功能,命令语法:ip [选项] [动作] [命令]

例如,查看网卡 ens33 的信息:

[root@server201 ~]$ ip -s link show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:da:7d:5c brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    506917745  449906   0       66383   0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    7955626    44475    0       0       0       0  

如果不加 -s 参数,可以得到简略的结果。如果要修改网卡信息,可以使用 set 命令。例如,修改 ens33 的 MAC 地址:

[root@server201 ~]$ ip link set ens33 address 00:0c:29:da:7d:5c

要修改与网卡 IP 地址相关的参数,可以使用 address 动作。例如,给 ens33 增加一个虚拟接口,并配置 IP:

[root@server201 ~]$ ip address add 192.168.3.101/24 broadcast 192.168.3.255 dev ens33 label ens33:new3
[root@server201 ~]$ ip address show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:da:7d:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.201/16 brd 192.168.255.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.3.101/24 brd 192.168.3.255 scope global ens33:new3
       valid_lft forever preferred_lft forever
    inet6 240e:383:406:ac00:3d71:87ed:5f5:fde/64 scope global noprefixroute dynamic 
       valid_lft 3600sec preferred_lft 3600sec
    inet6 fe80::df56:57bc:63b:6ccd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@server201 ~]$ ip address del 192.168.3.101/24 dev ens33

要修改路由相关的设定,可以使用 route 动作,用法和 route 命令类似。首先使用 ip route show 查看当前的路由表:

[root@server201 ~]$ ip route show
default via 192.168.2.1 dev ens33 
192.168.0.0/16 dev ens33 proto kernel scope link src 192.168.2.201 metric 102 

结果中多了两个字段:proto 指示路由的路由协议,scope 指示路由的范围。

下面是添加一条路由到 192.168.3.0/24 网段,通过 ens37 端口进出:

[root@server201 ~]$ ip route add 192.168.3.0/24 dev ens37
[root@server201 ~]$ ip route show
default via 192.168.2.1 dev ens33 
192.168.0.0/16 dev ens33 proto kernel scope link src 192.168.2.201 metric 102 
192.168.3.0/24 dev ens37 scope link 

添加默认路由和删除路由的示例:

[root@server201 ~]$ ip route add default via 192.168.2.1 dev ens33
RTNETLINK answers: File exists
[root@server201 ~]$ ip route del 192.168.3.0/24

网络诊断

用于在网络出现故障时跟踪可能的错误原因。

ping

ping 命令通过 ICMP 数据包来进行整个网络的状态报告。常用参数有:

参数 说明
-c 数值 可以定义 ping 的次数。
-n 不进行 IP 与主机名的解析,只用 IP 显示。
-s 数值 发送出去的 ICMP 数据包大小,默认为 56 Bytes。
-t 数值 TTL 的数值,默认是 255。如果在同一网络内,TTL 默认 64。
-W 数值 等待相应超时秒数。
-M [do|dont] 主要用来检测网络 MTU 数值大小,do 表示不拆分数据包,dont 表示可以拆分。

直接 ping baidu.com 看看:

[root@server201 ~]$ ping baidu.com -c 3
PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from baidu.com (220.181.38.251): icmp_seq=1 ttl=52 time=39.0 ms
64 bytes from baidu.com (220.181.38.251): icmp_seq=1 ttl=51 time=39.1 ms (DUP!)
64 bytes from baidu.com (220.181.38.251): icmp_seq=1 ttl=52 time=39.6 ms (DUP!)
64 bytes from baidu.com (220.181.38.251): icmp_seq=1 ttl=51 time=39.6 ms (DUP!)
From 192.168.2.102 (192.168.2.102) icmp_seq=2 Redirect Network(New nexthop: gateway (192.168.2.1))
From 192.168.2.102 (192.168.2.102): icmp_seq=2 Redirect Network(New nexthop: gateway (192.168.2.1))
64 bytes from baidu.com (220.181.38.251): icmp_seq=2 ttl=52 time=39.5 ms

--- baidu.com ping statistics ---
2 packets transmitted, 2 received, +3 duplicates, +1 errors, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 39.099/39.392/39.611/0.257 ms

结果可得下面这些信息:

  • 64 bytes:表示发送 ICMP 数据包大小,最大可以设置 -s 65507
  • icmp_seq=1:ICMP 的检测次数,第一次为 1。
  • ttl=52:TTL 与 IP 数据包内的 TTL 相同,每经过一个带有 MAC 的节点时 TTL 减 1,默认 TTL 为 255。
  • time=39.1ms:响应时间,越短越好。

下面这样可以检测 MTU:

[root@server201 ~]$ ping -s 9000 -M do 192.168.2.101 
PING 192.168.2.101 (192.168.2.101) 9000(9028) bytes of data.
ping: local error: Message too long, mtu=1500

注意,本地网卡和设备的 MTU 值也会影响到检测。

traceroute

traceroute 命令用于跟踪两台主机之间通过的各个节点的通信状态。常用参数如下:

参数 说明
-n 不解析域名,只使用 IP。
-U 使用 UDP 的端口 33434 来检测,默认选项。
-I 使用 ICMP 的方式来检测。
-T 使用 TCP 来检测,一般测试 80 端口。
-w 设置超时时间。
-p 端口号 可以自定义检测端口号。
-i 设备 指定检测时使用的网卡。
-g 路由 与 -i 作用相似,指定网关 IP。

查看连接到 baidu.com 的各个节点状态:

[root@server201 ~]$ traceroute -n baidu.com
traceroute to baidu.com (220.181.38.148), 30 hops max, 60 byte packets
 1  192.168.2.1  0.739 ms  0.547 ms  0.519 ms
 2  192.168.2.1  0.536 ms  1.052 ms  1.181 ms
 3  100.84.64.1  8.648 ms  8.486 ms  8.444 ms
 4  61.137.11.165  8.412 ms  8.325 ms  8.214 ms
 5  61.137.11.165  8.128 ms  8.016 ms  7.998 ms
 6  202.97.18.73  18.533 ms 202.97.18.105  18.318 ms 202.97.18.101  18.384 ms
 7  202.97.122.237  35.134 ms 202.97.79.225  49.466 ms 202.97.40.49  30.696 ms
 8  36.110.245.174  49.776 ms 36.110.247.54  27.887 ms 36.110.246.134  27.632 ms
 9  218.30.104.177  27.365 ms 106.38.244.130  41.744 ms *
10  106.38.244.130  41.509 ms 106.38.244.150  41.990 ms 220.181.17.146  41.979 ms
11  106.38.244.166  41.818 ms * *
12  * * *
13  * * *
14  * * *

上面显示的三个时间是每个节点检测的三次数据,而显示 * * * 的行表示该节点可能有某些防护措施,导致发送的 UDP 数据包被丢弃。可以尝试使用 -I-T 参数来更换检测方式。

netstat

netstat 命令一般用于检测网络端口的状态。固定用法 netstat -nutlp 表示列出监听中的 TCP 和 UDP 数据包连接:

[root@server201 ~]$ netstat -nutlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address  State       PID/Program name 
tcp        0      0 0.0.0.0:22              0.0.0.0:*        LISTEN      8173/sshd     
tcp        0      0 127.0.0.1:25            0.0.0.0:*        LISTEN      8359/master   
tcp6       0      0 :::22                   :::*             LISTEN      8173/sshd     
tcp6       0      0 ::1:25                  :::*             LISTEN      8359/master   
udp        0      0 127.0.0.1:323           0.0.0.0:*                    15767/chronyd 
udp        0      0 0.0.0.0:68              0.0.0.0:*                    58762/dhclient 
udp6       0      0 ::1:323                 :::*                         15767/chronyd 
udp6       0      0 fe80::df56:57bc:63b:546 :::*                         59548/dhclient 

结果显示表头部分说明如下:

  • Proto:该连接的数据包协议,主要是 TCP 和 UDP。
  • Recv-Q:由非用户程序连接所复制而来的总字节数。
  • Send-Q:由远程主机发送而来,但没有 ACK 标志的总字节数。
  • Local Address:本地端的地址和端口。其中,端口 25 固定为 lo 口。
  • Foreign Address:远程主机的 IP 和端口。
  • State:状态栏,主要包含以下状态:
    • ESTABLISHED:已建立连接状态。
    • SYN_SENT:发出主动连接(带有 SYN 标志)的连接数据包。
    • SYN_RECV:接收到一个请求连接的主动连接数据包。
    • FIN_WAIT1:该套接字服务已中断,连接正在断开。
    • FIN_WAIT2:该连接已挂断,但等待对方主机响应断线确认的数据包。
    • TIME_WAIT:该连接已挂断,但 socket 还在网络上等待结束。
    • LISTEN:通常用于服务的监听端口。
  • PID/Program name:由 -p 参数指定显示的端口对应程序。

如果要查询已经建立的连接端口,使用 -nutp 参数即可:

[root@server201 ~]$ netstat -nutp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.2.201:22        192.168.2.101:64456     ESTABLISHED 61123/sshd: root@pt 

nmap

nmap 软件全称为 Network exploration tool and security/port scanner,顾名思义是用于管理系统安全性检查的工具。基本用法:nmap [扫描类型] [扫描参数] [hosts 地址与范围]

其中,扫描类型有下面几种:

  • -sT:扫描已建立的 TCP 连接的数据包(connect)。
  • -sS:扫描带有 SYN 标志的 TCP 数据包。
  • -sP:以 ping 的方式进行扫描。
  • -sU:以 UDP 数据包格式进行扫描。
  • -sO:以 IP 协议进行主机扫描。

扫描参数有下面几种:

  • -PT:使用 TCP 的 ping 方式进行扫描,可以获知当前存在的计算机数目。
  • -PI:使用实际的 ping(带有 ICMP 数据包)进行扫描。
  • -P:端口范围,例如 1024-、3000-40000 等方式。

hosts 地址与范围的指定方式有:

  • 192.168.1.101:直接指定主机的 IP,只检查一台主机。
  • 192.168.1.0/24:扫描整个网段。
  • 192.168..:扫描更大范围。
  • 192.168.1.0-50,60-100,103,204:指定间隔的范围。

首先进行本机扫描的测试结果:

[root@server201 ~]$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-23 22:49 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000017s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp

Nmap done: 1 IP address (1 host up) scanned in 1.64 seconds

可以看到扫描速度非常快。默认情况下,只会扫描 TCP 协议。如果想同时扫描 UDP 协议,可以使用 -sTU 参数:

[root@server201 ~]$ nmap -sTU localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-23 22:51 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0021s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 1997 closed ports
PORT   STATE         SERVICE
22/tcp open          ssh
25/tcp open          smtp
68/udp open|filtered dhcpc

Nmap done: 1 IP address (1 host up) scanned in 2.84 seconds

通过 ICMP 扫描局域网中有多少台主机:

[root@server201 ~]$ nmap -sP 192.168.2.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-23 22:53 CST
Nmap scan report for 192.168.2.101
Host is up (-0.10s latency).
MAC Address: 0C:9D:92:83:DB:35 (Unknown
Nmap scan report for 192.168.2.201
Host is up.
Nmap done: 256 IP addresses (2 hosts up) scanned in 2.08 seconds

结果会列出目标 IP 地址和 MAC 地址。

远程连接

远程连接主要指的是远程工具与即时通信软件。

telnet

telnet 是早期用得很广泛的远程连接工具,但使用 telnet 传输的数据是明文的,因此现在已被支持加密的 ssh 取代。命令格式:telnet [主机|IP [端口]]

例如,使用 telnet 连接 192.168.2.101 的 2201 端口:

[root@server201 ~]$ telnet 192.168.2.101 2201
Trying 192.168.2.101...
telnet: connect to address 192.168.2.101: Connection refused

现在经常被用来检测目标 IP 地址特定端口是否打开。

ftp

文字接口的 ftp 软件主要有 ftp、lftp、gftp。

例如,使用 ftp 连接 ftp.vim.org

[root@server201 ~]$ ftp ftp.vim.org
Trying 2001:67c:6ec:221:145:220:21:40...
Connected to ftp.vim.org (2001:67c:6ec:221:145:220:21:40).
220-Welcome to the FTP archive of 
220-The Netherlands Unix Users Group (NLUUG).
220-You may login as "ftp" or "anonymous".
Name (ftp.vim.org:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> help
ftp> ? recv
recv            receive file

输入 help 可以查看说明,输入 bye 退出 ftp。

lftp

lftp 默认使用匿名登录 FTP 服务器,也可以在命令行输入账号密码,可以在脚本中使用。

例如,使用 ftp 用户登录 ftp.vim.org,用法和功能与 ftp 类似,可以使用 help 查询:

[root@server201 ~]$ lftp -u ftp,  ftp.vim.org
lftp ftp@ftp.vim.org:~>     

使用 -f 参数来载入脚本,脚本内容为在 ftp 中实际操作的命令:

[root@server201 ~]$ vi ftp.sh
open ftp.vim.org
cd pub
get WhereToFindWhat.txt
bye
"ftp.sh" 4L, 52C written  
[root@server201 ~]$ lftp -f ftp.sh 
[root@server201 ~]$ ll WhereToFindWhat.txt                 
-rw-r--r--. 1 root root 2023 May  4  2005 WhereToFindWhat.txt

网络抓包

命令模式下可用的抓包工具为 tcpdump,图形界面可以使用 Wireshark

tcpdump

tcpdump 命令用法:

tcpdump [-AennqX] [-i 接口] [-w 储存文件名] [-c 次数] [-r 文件] [要抓取的数据包数据格式]

参数如下:

参数 说明
-A 数据包的内容以 ASCII 显示,通常用来抓取 WWW 的网页数据包数据
-e 使用数据链路层的 MAC 数据包数据来显示
-nn 直接以 IP 和端口显示
-q 仅列出较为简短的数据包信息,每一行的内容比较精简
-X 可以列出十六进制(hex)以及 ASCII 的数据包内容,对于监听数据包内容很有用
-i 后面接要监听的网络接口,例如 eth0、lo、ppp0 等的界面
-w 将监听的数据包数据保存到文件
-r 从已存在的文件中读取数据
-c 监听的数据包数,如果不指定,tcpdump 会一直监听下去

其中最后一个要抓取的数据包数据格式可以用以下方法表示:

  • ‘host server201’,‘host 192.168.2.101’:针对单台主机进行数据包抓取;
  • ‘net 192.168’:针对某个网络来进行数据包捕获;
  • ‘src host 127.0.0.1’,‘dst net 192.168’:同时加上来源与目标地址限制;
  • ‘tcp port 21’:针对通信协议检测,如 TCP、UDP、ARP 等;
  • 还可以利用 and 与 or 来进行数据包整合显示。

例如抓取 ens33 网口上的数据包:

[root@server201 ~]$ tcpdump -i ens33 -nn
19:45:37.349993 IP 192.168.2.101.64456 > 192.168.2.201.22: Flags [.], ack 682480, win 8212, options [nop,nop,sack 1 {681424:682480}], length 0
19:45:37.350036 IP 192.168.2.101.64456 > 192.168.2.201.22: Flags [.], ack 682480, win 8212, options [nop,nop,sack 1 {681424:682480}], length 0
4472 packets captured
4480 packets received by filter
0 packets dropped by kernel

短短 1 秒钟就抓取到了 4472 个数据包。以第一条数据来说明:

  • 19:45:37.349993:数据包被捕获的时间。
  • IP:通过的通信协议是 IP。
  • 192.168.2.101.64456 >:传送端的 IP 和端口。
  • 192.168.2.201.22:接收端的 IP 和端口。
  • Flags [.], ack 682480…:传输内容。

nc

nc 命令可以用于作为某些服务的检测,因为它可以连接到某个端口进行通信。此外,还可以自行启动一个端口来监听其他用户的连接。

例如,检测本机的 22 号端口:

[root@server201 ~]$ nc localhost 22
SSH-2.0-OpenSSH_7.4

测试 192.168.2.113 上的 10002 端口的联通性,超时时间为 2 秒:

[root@localhost ~]$ nc -vz -w 2 192.168.2.113 10002
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.2.113:10002.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

还可以使用 nc 来启动监听端口号,例如启动 19999 号作为监听端口:

[root@server201 ~]$ nc -l localhost 19999

然后,在另一个终端中查询端口和连接:

[root@server201 ~]$ netstat -ntulp | grep 19999
tcp6       0      0 ::1:19999               :::*                    LISTEN      61792/nc
[root@server201 ~]$ nc localhost 19999
a
f