# netstat
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
# 参数说明
- -a 或 -all 显示所有套接字
- -c 或 -continuous 持续列出网络状态
- -t 或 -tcp 仅显示tcp相关选项
- -u 或 -udp 仅显示udp相关选项
- -n 或 -numeric 拒绝显示别名,能显示数字的全部转化为数字
- -l 或 -listening 仅列出在Listen(监听)的服务状态
- -p 或 -programs 显示对应的可执行程序名字(linux)
- -s 或 -statistice 显示每个协议的统计数据
- -M 或 –masquerade 显示伪装的网络连线
- -h 或 –help 帮助
- -r 显示路由表
- -o(windows) 显示拥有的与每个连接关联的进程ID
- -b(windows) 显示对应的可执行程序名字
# 查询TCP连接数
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
结果输出:
LAST_ACK 63
LISTEN 39
SYN_RECV 75
CLOSE_WAIT 46
ESTABLISHED 96754
FIN_WAIT1 60
FIN_WAIT2 59
CLOSING 11
SYN_SENT 98
TIME_WAIT 70
# TCP连接状态表说明
| 状态 | 说明 |
|---|---|
| CLOSED | 表示TCP连接是“关闭着的”或“未打开的”。 |
| LISTEN | 服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。 |
| SYN_SENT | 表示客户端已发送SYN报文。客户端的SOCKET执行connect()进行连接时,首先发送SYN报文,随后进入到SYN_SENT状态,等待服务端的确认报文。 |
| SYN_RCVD | 表示服务端接收到了客户端请求连接的SYN报文。同时服务端也会回送ACK确认报文给客户端。 |
| ESTABLISHED | 表示TCP连接已经成功建立,正常数据传输状态。 |
| FIN_WAIT1 | SOCKET在ESTABLISHED状态时,调用close()主动关闭连接,向对方发送了FIN报文,然后进入到FIN_WAIT1状态。 |
| FIN_WAIT2 | SOCKET在FIN_WAIT1状态时,收到对方的ACK响应报文后,则进入到FIN_WAIT2状态。注:FIN_WAIT2是没有超时时钟,累积越来越多的FIN_WAIT2状态会导致内核crash。 |
| TIME_WAIT | SOCKET在FIN_WAIT2状态时,收到了对方的FIN报文,并发送出了ACK报文,则进入到TIME_WAIT状态。此状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间) |
| CLOSING | 两边同时尝试关闭。 |
| CLOSE_WAIT | 表示正在等待关闭。服务端收到客户端的FIN报文请求断开后,给客户端响应ACK确认服务,此时服务端TCP进入CLOSE_WAIT状态。等待服务端发送未传完的数据后再关闭服务端与客户端方向的连接。 |
| LAST_ACK | SOCKET在CLOSE_WAIT状态时,发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK状态。当收到对方的ACK报文后,也就可以进入到CLOSED 可用状态了。 |
# 常用用法
查找请求数前20个IP(常用于查找攻来源)
netstat -anlp |grep 80 |grep tcp |awk '{print $5}' |awk -F: '{print $1}' |sort |uniq -c |sort -nr |head -n20查找较多time_wait连接
netstat -n |grep TIME_WAIT |awk '{print $5}' |sort |uniq -c |sort -rn找查较多的SYN连接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr找查较多的FIN_WAIT2连接
netstat -an | grep FIN_WAIT2 | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr