- A+
netstat是一个控制台命令,可用于监控本机的TCP/IP网络,获得路由表、网络连接以及所有网络接口设备的状态信息。一般情况下,我们主要使用netstat命令显示与IP、TCP、UDP和ICMP协议相关的统计数据,检验本机各端口的网络连接情况。
比如说,在日常使用电脑时,如果连接到了网络,或多或少的会因接收到的数据包导致出错数据或故障,在正常量的情况下,TCP/IP可以容许这些类型的错误,并且能够自动重新发送数据包。但是如果累计的出错情况数占所接收IP数据报的百分比过大,而且数目还在不断增加,那么我们就要进入控制台,使用netstat命令查看一下出现问题的连接端口。
netstat结果详解
[root@honey-master ~] netstat ------------------------------------------------------------------------------------| Active Internet connections (w/o servers) | Proto Recv-Q Send-Q Local Address Foreign Address State | tcp 0 0 honey-ma:xmltec-xmlmail honey-master:44714 ESTABLISHED | tcp 0 0 honey-master:postgres honey-master:46680 ESTABLISHED | tcp 0 0 honey-master:41756 honey-master:redis ESTABLISHED | tcp 0 0 honey-master:42726 honey-master:redis ESTABLISHED | tcp 0 0 localhost:39230 localhost:redis ESTABLISHED | .. | tcp6 0 0 honey-master:mysql honey-master:58232 ESTABLISHED | tcp6 0 0 localhost:mysql localhost:53266 ESTABLISHED | tcp6 0 0 honey-master:mysql honey-master:58446 ESTABLISHED | udp 0 0 honey-master:bootpc _gateway:bootps ESTABLISHED | udp 0 0 localhost:55920 localhost:55920 ESTABLISHED | ------------------------------------------------------------------------------------|---------------| Active UNIX domain sockets (w/o servers) | Proto RefCnt Flags Type State I-Node Path | unix 3 [ ] DGRAM 1703 /run/systemd/notify | unix 2 [ ] DGRAM 1705 /run/systemd/cgroups-agent | ... | unix 3 [ ] STREAM CONNECTED 29975 /run/systemd/journal/stdout | unix 3 [ ] STREAM CONNECTED 1543565 /var/run/docker.sock | unix 3 [ ] STREAM CONNECTED 323733 | unix 3 [ ] STREAM CONNECTED 189654 | ----------------------------------------------------------------------------------------------------| Active Bluetooth connections (w/o servers) Proto Destination Source State PSM DCID SCID IMTU OMTU Security Proto Destination Source State Channel
从整体上看,netstat的输出结果可以分为两个部分:
一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
列出所有的tcp和udp端口:
字段 | 含义 |
---|---|
proto |
协议名称:tcp/udp |
Recv-Q |
网络接收队列:表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。 |
Send-Q |
网络发送队列:对方没有收到的数据或者说没有Ack的,还是本地缓冲区,如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。从步骤一的结果可以看到22端口对应的链路的send-Q中堆积了大量的数据包,可以判定是发送数据给目的地址的时候出现了阻塞的问题,导致了包堆积在本地缓存中,不能成功发出去。 |
Local-address |
表格下分析 |
Foreign Address |
与本机端口通信的外部socket。显示规则与Local Address相同 |
State |
表格下分析 |
PID/program |
PID即进程id,Program即使用该socket的应用程序。其中0.0.0.0:1234——本地IP/Port信息。 1、0.0.0.0代表本机上可用的任意地址。比如0.0.0.0:1234表示本机上所有地址的1234端口,这样ip计算机就不用重复显示了。 2、0.0.0.0为默认路由,即要达到不在路由表里面的网段的包都走0.0.0.0这条规则。气死,我们可以"通用"理解为代表"本机地址",1234在程序中体现为绑定的1234端口号 0.0.0.0: *——目的地址IP/Port信息。 |
Local Address
部分0.0.0.0:22表示监听服务器上所有的ip地址上的22端口
:::22 这个也表示监听本地所有ip的22端口,跟上面的区别是这里表示的是IPv6地址,上面的0.0.0.0表示的是本地所有IPv4地址NOTE “:::”这三个:的前两个"::",是"0:0:0:0:0:0:0"的缩写,相当于IPv6的"0.0.0.0",就是本机的所有IPv6地址,第三个:是IP和端口的分隔符
127.0.0.1:3310 这个表示监听本机的loopback地址的3310端口(如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问)
::1:323 这个表示监听IPv6的回环地址的323端口,::1表示IPv6的loopback地址
State 列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。
符号 状态解释 LISTEN 首先服务器要打开一个socket进行监听,状态为LISTEN
the socket is listening for incoming connectionsSYN_SENT 客户端通过应用程序调用connect进行active open,于是客户端tcp发送一个SYN以请求建立一个链接,之后状态设置为SYN_SENT
socket is actively attempting to establish a connectionSYN_RECV 服务端发出ACk确认包给客户端,状态变为SYN_RECV
a connection request has been received from the networkESTABLISHED 代表打开一个连接,双方可以进行或者已经在数据交互了
the socket has an established connectionFIN_WAIT1 主动关闭服务端应用程序,tcp发送FIN请求关闭连接,之后进入FIN_WAIT1状态
the socket is closed, and the connection is shutting down.CLOSE_WAIT 被动关闭,服务端接收到FIN请求后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT状态
the remote end has shut down, waiting for the socket to closeFIN_WAIT2 主动关闭接收到ACK后,就进入了FIN_WAIT2状态
connection is closed, and the socket is waitng for a shut down from the remote end.LAST_ACK 服务端关闭一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接,这导致发送一个等待原来向服务端发送连接中断请求的确认FIN,死后进入LAST_ACK
the remote end has shut down, and the socket is closed. Waiting for anknowledgement.TIME_WAIT 在主动关闭端接收到FIN后,就会向对方发送ACk确认包,并进入TIME_WAIT状态。
the socket is waiting after close to handle packets still in the networks.CLOSING both sockets are shutting down but we still don't have all our data sent CLOSED 连接结束 UNKNOWN 未知的状态
参数
-a或--all:显示所有连线中的Socket; -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; -c或--continuous:持续列出网络状态; -C或--cache:显示路由器配置的快取信息; -e或--extend:显示网络其他相关信息; -F或--fib:显示FIB; -g或--groups:显示多重广播功能群组组员名单; -h或--help:在线帮助; -i或--interfaces:显示网络界面信息表单; -l或--listening:显示监控中的服务器的Socket; -M或--masquerade:显示伪装的网络连线; -n或--numeric:直接使用ip地址,而不通过域名服务器; -N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称; -o或--timers:显示计时器; -p或--programs:显示正在使用Socket的程序识别码和程序名称; -r或--route:显示Routing Table; -s或--statistice:显示网络工作信息统计表; -t或--tcp:显示TCP传输协议的连线状况; -u或--udp:显示UDP传输协议的连线状况; -v或--verbose:显示指令执行过程; -V或--version:显示版本信息; -w或--raw:显示RAW传输协议的连线状况; -x或--unix:此参数的效果和指定"-A unix"参数相同; --ip或--inet:此参数的效果和指定"-A inet"参数相同。
-
列出所有端口情况
[root@xiesshavip002 ~] netstat -a # 列出所有端口 [root@xiesshavip002 ~] netstat -at # 列出所有TCP端口 [root@xiesshavip002 ~] netstat -au # 列出所有UDP端口
-
列出所有处于监听状态的 Sockets
[root@xiesshavip002 ~] netstat -l # 只显示监听端口 [root@xiesshavip002 ~] netstat -lt # 显示监听TCP端口 [root@xiesshavip002 ~] netstat -lu # 显示监听UDP端口 [root@xiesshavip002 ~] netstat -lx # 显示监听UNIX端口
-
显示每个协议的统计信息 -s
[root@xiesshavip002 ~] netstat -s # 显示所有端口的统计信息 [root@xiesshavip002 ~] netstat -st # 显示所有TCP的统计信息 [root@xiesshavip002 ~] netstat -su # 显示所有UDP的统计信息 IcmpMsg: InType3: 8623 OutType3: 791533 Udp: 2478625 packets received 1946 packets to unknown port received 0 packet receive errors 2482843 packets sent 0 receive buffer errors 0 send buffer errors IgnoredMulti: 21772 UdpLite: IpExt: InBcastPkts: 48838 InOctets: 36060130596 OutOctets: 17220772176 InBcastOctets: 6912337 InNoECTPkts: 99499687 InECT0Pkts: 14447
-
显示 PID 和进程名称 -p
[root@honey-master ~]# netstat -p Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 honey-ma:xmltec-xmlmail honey-master:44714 ESTABLISHED 173272/java tcp 0 0 honey-master:postgres honey-master:46680 ESTABLISHED 211809/postgres: po tcp 0 0 honey-master:41756 honey-master:redis ESTABLISHED 207937/python3 tcp 0 0 honey-master:42726 honey-master:redis ESTABLISHED 357854/python3
-
显示核心路由信息 -r
[root@honey-master ~]# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default _gateway 0.0.0.0 UG 0 0 0 ens33 10.0.0.0 0.0.0.0 255.255.255.248 U 0 0 0 br-9dff81edda62 10.0.106.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 [root@honey-master ~]# netstat -rn #显示数字格式,不查询主机域名 Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.0.106.1 0.0.0.0 UG 0 0 0 ens33 10.0.0.0 0.0.0.0 255.255.255.248 U 0 0 0 br-9dff81edda62 10.0.106.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-b570432f3378
-
查看端口和服务 -antp
[root@honey-master ~] netstat -antp | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 141882/sshd tcp 0 156 10.0.106.19:22 10.0.91.13:65533 ESTABLISHED 447311/sshd: root [ tcp6 0 0 :::22 :::* LISTEN 141882/sshd [root@honey-master ~]# netstat -antp | grep 5432 tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 132952/postmaster tcp 0 0 10.0.106.19:5432 10.0.106.19:46680 ESTABLISHED 211809/postgres: po tcp 0 0 10.0.106.19:5432 172.17.0.2:53512 ESTABLISHED 342190/postgres: po
-
打印网络接口 -i
[root@honey-master ~] netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg br-9dff81edda62 1500 14994174 0 0 0 11310667 0 0 0 BMU br-b570432f3378 1500 52444002 0 0 0 52444002 0 0 0 BMRU docker0 1500 14994174 0 0 0 11310667 0 0 0 BMRU ens33 1500 32370072 0 0 0 18948958 0 0 0 BMRU
上面输出的信息比较原始。我们将 -e 选项和 -i 选项搭配使用,可以输出用户友好的信息。输出效果等同于ifconfig。
-
显示多播组信息 -g
[root@honey-master ~]# netstat -g IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 all-systems.mcast.net ens33 1 all-systems.mcast.net docker0 1 all-systems.mcast.net lo 1 ff01::1 ens33 1 ff02::1 ens33 1 ff01::1 docker0 1 ff02::1
-
打印active状态的连接:active 状态的套接字连接用 "ESTABLISHED" 字段表示,所以我们可以使用 grep 命令获得 active 状态的连接:
配合 watch 命令监视 active 状态的连接:`watch -d -n0 ""
-
查看服务是否在运行
[root@honeypot ~]# netstat -aple | grep nginx tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN root 42158 3359/nginx: master tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN root 42160 3359/nginx: master tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN root 42159 3359/nginx: master tcp 0 0 honeypot:https 10.0.80.6:46770 ESTABLISHED nginx 1406865 3360/nginx: worker
说明nginx正在运行,但如果关闭掉redis服务,状态都变成了关闭或者等待关闭
[root@honeypot ~] netstat -aple | grep redis tcp 1 0 honeypot:41338 honeypot:redis CLOSE_WAIT root 73035 8683/python3 tcp 1 0 honeypot:32926 honeypot:redis CLOSE_WAIT root 1467648 159493/python3 tcp 0 0 honeypot:redis honeypot:41332 FIN_WAIT2 root 0 - tcp 1 0 honeypot:41376 honeypot:redis CLOSE_WAIT root 73107 8822/python3 tcp 0 0 localhost:redis localhost:47240 TIME_WAIT root 0 -
组合命令
-
查看TCP连接状态
[root@honeypot ~]# netstat -nat |awk '{print $6}' |sort|uniq -c|sort -rn 174 ESTABLISHED 35 TIME_WAIT 31 LISTEN 26 CLOSE_WAIT 1 established) 1 Foreign
-
查找请求数请20个IP
[root@honeypot ~]# netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。 15 127.0.0.1 4 10.0.81.29 3 10.0.81.35 3 10.0.80.6 2 0.0.0.0 1
-
查看连接某服务端口最多的的IP地址
[root@honeypot ~]# netstat -nat | grep "10.0.81.29:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20 1 10.0.91.13