linux环境下使用netstat命令查看网络信息

前言

netstat 这个命令一直以为是 net status 的缩写,今天一查发现并没有找到官方的这种说法,然后参考了 man 手册,发现这个词更像是 net statistics 的缩写,命令的作用是显示网络连接、路由表、接口连接、无效连接和多播成员关系的,man 手册中描述这个命令如下:

netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships

这个命令很强大,但是我经常使用的参数很简单,通常用来查询端口占用问题,命令为 netstat -anp | grep xxxPORT,因为在我测试自己项目程序的时候,总有一些进程企图占用我使用的端口,比如那个 被我 kill 了 n 次的 TIM 客户端,使用 netstat 可以方便的找到是哪个进程占用了你的端口。

虽然这个命令经常使用,但是其中的这些参数含义却不是很清楚,所以特地总结一下,综合其他常见的用法,记录下来以备后续查找使用。

参数选项

  • -a:显示所有连接,包括 LISTEN 状态的连接
  • -l:仅显示 LISTEN 状态的连接
  • -t:仅显示tcp相关选项
  • -u:仅显示udp相关选项
  • -n:拒绝显示别名,能显示数字的全部转化成数字
  • -o:显示信息中包括与网络计时器相关的信息
  • -e:显示扩展信息,例如uid等
  • -p:显示建立相关链接的程序名
  • -r:显示路由信息,路由表
  • -s:按各个协议进行统计
  • -c:每隔一个固定时间,执行该netstat命令。

无参数执行

该命令无参数执行时显示数据会少一些,便于我们看清命令执行的结果,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@node1 ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.0.201:ssh 178.129.126.124.b:19450 ESTABLISHED
tcp 0 52 192.168.0.201:ssh 178.129.126.124.b:17626 ESTABLISHED
tcp 0 0 192.168.0.201:57784 101.200.35.175:https TIME_WAIT
tcp 0 0 192.168.0.201:42298 100.125.2.72:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 11550 /run/systemd/shutdownd
unix 2 [ ] DGRAM 13355412 /var/run/chrony/chronyd.sock
unix 3 [ ] DGRAM 1228 /run/systemd/notify
unix 2 [ ] DGRAM 1230 /run/systemd/cgroups-agent
unix 5 [ ] DGRAM 1241 /run/systemd/journal/socket
unix 16 [ ] DGRAM 1243 /dev/log
unix 3 [ ] STREAM CONNECTED 15663
unix 3 [ ] STREAM CONNECTED 15662
...

输出结果可以分为 Active Internet connectionsActive UNIX domain sockets 两个部分:

Active Internet connections 指有效的网络连接,默认显示6列内容:

  • Proto:协议名字,包括tcp, udp, udpl, raw等
  • Recv-Q:表示网络接收队列,表示收到的数据已经在本地接收缓冲,还有多少没有被应用程序取走
  • Send-Q:表示网络发送队列,表示存在本地缓冲区,但对方没有收到的数据或者没有 ACK 的
  • Local Address:本地IP地址和端口
  • Foreign Address:外部IP地址和端口
  • State:网络连接状态,包括 ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN 等状态

Active UNIX domain sockets 是指本地套接口,我们知道 socket 也可用于同一台主机的进程间(IPC)通讯,但是 socket 用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程
并且它是是全双工的,API接口语义丰富,相比其它进程间通信机制有明显的优越性。

常用命令组合

查询端口占用

1
2
[root@node1 /]# netstat -anp | grep 8889
tcp 0 0 0.0.0.0:8889 0.0.0.0:* LISTEN 27584/tinyproxy

这是我目前最常用的命令,在windows可以改为 netstat -ano | findstr 8889

显示tcp连接

1
2
3
4
5
6
7
8
9
10
11
12
[root@node1 /]# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ddi-tcp-2 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 52 192.168.0.201:ssh 178.129.126.124.b:19450 ESTABLISHED
tcp 0 0 192.168.0.201:ssh 178.129.126.124.b:17626 ESTABLISHED
tcp 0 0 192.168.0.201:42298 100.125.2.72:https ESTABLISHED
tcp6 0 0 [::]:squid [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN

显示处于 LISTEN 状态的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@node1 /]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ddi-tcp-2 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp6 0 0 [::]:squid [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:ntp 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:56034 0.0.0.0:*
udp6 0 0 [::]:42035 [::]:*
udp6 0 0 localhost:323 [::]:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 11533 /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 6848304 /var/run/rpcbind.sock
unix 2 [ ACC ] STREAM LISTENING 11584 /run/lvm/lvmetad.socket
...

分类统计每种协议的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@node1 /]# netstat -s
Ip:
7902622 total packets received
60675 forwarded
127 with unknown protocol
0 incoming packets discarded
7841813 incoming packets delivered
7270606 requests sent out
8 dropped because of missing route
Icmp:
928210 ICMP messages received
25426 input ICMP message failed.
InCsumErrors: 8
ICMP input histogram:
destination unreachable: 71154
timeout in transit: 484
echo requests: 856165
echo replies: 337
timestamp request: 54
896502 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 40039
echo request: 244
echo replies: 856165
timestamp replies: 54
Tcp:
274517 active connections openings
66347 passive connection openings
187800 failed connection attempts
90950 connection resets received
3 connections established
6359177 segments received
5808198 segments send out
494062 segments retransmited
4 bad segments received.
452720 resets sent
Udp:
539313 packets received
14902 packets to unknown port received.
...

每秒显示一次信息

1
2
3
4
5
6
7
8
9
10
[root@node1 /]# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 192.168.0.201:ssh 178.129.126.124.b:19450 ESTABLISHED
tcp 0 0 192.168.0.201:ssh 178.129.126.124.b:17626 ESTABLISHED
tcp 0 0 192.168.0.201:42298 100.125.2.72:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 11550 /run/systemd/shutdownd
...

显示核心路由信息

1
2
3
4
5
6
7
[root@node1 /]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
169.254.169.254 192.168.0.254 255.255.255.255 UGH 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

显示网络接口列表

1
2
3
4
5
6
[root@node1 /]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1500 36248 0 0 0 33647 0 0 0 BMU
eth0 1500 9119246 0 0 0 8277212 0 0 0 BMRU
lo 65536 27700 0 0 0 27700 0 0 0 LRU

总结

  • netstat -anp | grep 8889 命令可用于查询8889端口被哪个进程占用了,在Windows上翻译为 netstat -ano | findstr 8889
  • netstat 命令查询出的网络连接信息中,Recv-QSend-Q 通常应该为0,如果长时间不为0可能是有问题的,需要尽快排查
  • 如果 Recv-Q 数值一直处于不为0的状态,可能是遭受了拒绝服务 DOS 攻击,导致本地消息处理过慢
  • 如果 Send-Q 数值一直处于不为0的状态,可能是有应用向外发送数据包过快,或者是对方接收处理数据包不够快

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

以史为鉴可以知兴替,以铜为鉴可以正衣冠,以人为鉴可以明得失。人的成长需要对比,总有人比你更加优秀~

2020-11-23 01:17:59

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客