Linux 网络命令
网络设置
虽然现在网络设置可以通过 nmcli
来完成,但旧的命令仍然可用。
ifconfig
ifconfig
命令可以手动启动、查看和修改网络接口的参数,语法如下:ifconfig interface [选项]
其中,interface
为网卡接口名称,例如 eth0
、ens34
等。选项可以使用以下参数:
参数 | 说明 |
---|---|
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
命令综合了 ifconfig
与 route
命令的功能,命令语法: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