linux网络监控之netstat详解
一、介绍
1.1 简介
netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。如果你想确认系统上的 Web 服务有没有起来,你可以查看80端口有没有打开。以上功能使 netstat 成为网管和系统管理员的必备利器。
如果没有此工具就#yum install net-tools -y
1.2 格式
netstat [-vWeenNcCF] [<Af>] -r
netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]
地址组的选项:
<Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix}--ax25 --ipx --netrom
<AF> =使用'-6 | -4'或'-A <af>'或' - <af>';默认值:inet
可能的地址族列表(支持路由):
inet(DARPA Internet)inet6(IPv6)ax25(AMPR AX.25)netrom(AMPR NET / ROM)ipx(Novell IPX)ddp(Appletalk DDP)x25(CCITT X.25)
[-4|--inet] [-6|--inet6] [--protocol={inet,inet6,unix,ipx,ax25,netrom,ddp, ... } ] [--unix|-x] [--inet|--ip|--tcpip] [--ax25] [--x25] [--rose] [--ash] [--ipx] [--netrom] [--ddp|--appletalk] [--econet|--ec]
虽然man里面说:这个程序已经过时了。 netstat的替换是ss。 netstat -r的替换是ip route。 netstat -i的替换是ip -s link。 netstat -g的替换是ip maddr。但是netstat还是常用的工具之一。
Netstat打印有关Linux网络子系统的信息。 打印的信息类型由第一个参数控制,如下所示:
(none): 默认情况下,netstat显示打开的套接字列表。 如果不指定任何地址族,则会打印所有已配置地址族的活动套接字。
--route , -r:显示内核路由表。 netstat -r和route -e产生相同的输出。
--groups , -g:显示IPv4和IPv6的组播组成员关系信息。
--interfaces=iface , -I=iface , -i:显示所有网络接口或指定的iface的表。
--masquerade , -M:显示伪装连接的列表。
--statistics , -s:显示每个协议的摘要统计信息。
1.3 选项:
--verbose , -v:告诉用户发生的事情是冗长的。 特别打印一些有关未配置地址族的有用信息。
--wide , -W: 不要使用根据需要的宽度来截断IP地址。 这是现在不可破坏现有脚本的可选项。
--numeric , -n: 显示数字地址,而不是尝试确定符号主机,端口或用户名。
--numeric-hosts:显示数字主机地址,但不影响端口或用户名称的解析。
--numeric-ports:显示数字端口号,但不影响主机或用户名称的分辨率。
--numeric-users:显示数字用户ID,但不影响主机或端口名称的解析。
--protocol=family , -A: 指定要显示连接的地址族(可能更好地描述为低级协议)。家庭是一个逗号(',')分隔的地址家族关键字列表,如inet,inet6,unix,ipx,ax25,netrom,econet和ddp。这与使用--inet | -4,--inet6 | -6,--unix | -x,--ipx,--ax25,--netrom和--ddp选项的效果相同。地址族inet(Iv4)包括raw,udp,udplite和tcp协议套接字。
-c, --continuous:这将导致netstat每秒连续打印所选信息。
-e, --extend:显示其他信息。使用此选项两次以获得最大的细节。
-o, - timers: 包括与网络计时器相关的信息。
-p, --program: 显示每个套接字所属程序的PID和名称。
-l, --listening:仅显示侦听套接字。 (默认情况下省略)
-a, --all: 显示监听和非监听(对于TCP这意味着已建立的连接)套接字。使用--interfaces选项,显示未启动的接口。
-F:从FIB打印路由信息。 (这是默认值。)
-C:从路由缓存打印路由信息。
-N,-symbolic : 解析硬件名称
-Z,--context : 显示套接字的SELinux安全上下文
delay: Netstat将每秒钟延迟一次统计数据。
1.4 涉及到的文件:
/etc/services - 服务翻译文件
/proc - proc文件系统的安装点,它通过以下文件访问内核状态信息。
/proc/net/dev - 设备信息
/proc/net/ raw - 原始套接字信息
/proc/net/tcp-TCP套接字信息
/proc/net/udp - UDP套接字信息
/proc/net/udplite - UDPLite套接字信息
/proc/net/igmp - IGMP组播信息
/proc/net/unix - Unix域套接字信息
/proc/net/ipx - IPX套接字信息
/proc/net/ax25 - AX25套接字信息
/proc/net/appletalk - DDP(appletalk)套接字信息
/proc/net/nr - NET / ROM套接字信息
/proc/net/route - IP路由信息
/proc/net/ax25_route - AX25路由信息
/proc/net/ipx_route - IPX路由信息
/proc/net/nr_nodes - NET / ROM nodelist
/proc/net/nr_neigh - NET / ROM邻居
/proc/net/ip_masquerade - 伪装的连接
/proc/net/snmp - 统计
博文来自:www.51niux.com
二、示例
2.1 默认选项
# netstat
Active Internet connections (w/o servers) #这里是TCP和UDP的连接
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 localhost.localdoma:ssh 192.168.1.107:50007 ESTABLISHED
udp 0 0 localhost.localdo:34545 marla.ludost.net:ntp ESTABLISHED
Active UNIX domain sockets (w/o servers) #活动UNIX域套接字
Proto RefCnt Flags Type State I-Node Path #Proto:套接字使用的协议(通常为unix)。
unix 2 [ ] DGRAM 10248 /run/systemd/notify
unix 2 [ ] DGRAM 10250 /run/systemd/cgroups-agent
unix 6 [ ] DGRAM 10271 /run/systemd/journal/socket
#Proto:显示套接字使用的协议(tcp,udp,udpl,raw)。
#Recv-Q:接受队列。
#Send-Q:发送队列。
#Local Address:套接字的本端的地址和端口号。 除非指定了--numeric(-n)选项,否则套接字地址被解析为其规范主机名(FQDN),端口号被翻译进入相应的服务名称。
#Foreign Address:套接字远端的地址和端口号。 类似于“本地地址”。
#State:套接字的状态。 由于在原始模式下没有状态,并且通常在UDP和UDPLite中不使用状态,因此该列可能留空。
#State:显示套接口当前的状态,状态如下:
ESTABLISHED:套接字已经建立。
SYN_SENT:套接字正在尝试建立连接。
SYN_RECV: 已从网络接收到连接请求。
FIN_WAIT1:等待远程TCP连接中断请求,或先前的连接中断请求的确认。
FIN_WAIT2:连接已关闭,并且套接字正在等待从远端关闭。
TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认。
CLOSE:没有任何连接状态。
CLOSE_WAIT:远程端已关闭,等待套接字关闭。
LAST_ACK:等待原来的发向远程TCP的连接中断请求的确认。
LISTEN:侦听来自远方的TCP端口的连接请求。
CLOSING:等待远程TCP对连接中断的确认。
UNKNOWN:套接字的状态是未知的。
#RefCnt:引用计数(即通过此套接字连接的进程)。
#Type : 类型。有几种类型的套接字访问:
SOCK_DGRAM: 套接字用于Datagram(无连接)模式。
SOCK_STREAM:这是一个流(连接)套接字。
SOCK_RAW: 套接字用作原始套接字。
SOCK_RDM:这一个提供可靠地传递的消息。
SOCK_SEQPACKET:这是一个顺序包套接字。
SOCK_PACKET:原始接口访问套接字。
SOCK_PACKET:未知。
#State:状态。此字段将包含以下关键字:
FREE : 套接字未分配.
LISTENING : 套接字正在侦听连接请求。 如果指定--listening(-l)或--all(-a)选项,则这些套接字仅包含在输出中。
CONNECTING: 套接字即将建立连接。
CONNECTED:套接字已连接。
DISCONNECTING:套接字正在断开连接。
空:套接字没有连接。
UNKNOWN:未知状态,这个状态永远不会发送。
#Path:这是连接到套接字的对应进程的路径名。
2.2 显示主机路由表
# netstat -r n #和netstat --route -n 一样。加上-n就是让其是IP的形式协议而不进行解析。
#Destination:指定作为路由目标端点的主机。
#Gateway:指定用于转发包的网关。
#Genmask:网络掩码
#Flags:标志。可能的标志包括:
U(路线上)
H(目标是主机)
G(使用网关)
R(恢复动态路由路由)
D(由守护进程或重定向动态安装)
M(从路由守护进程或重定向修改)
A(由addrconf安装)
C(缓存条目)
! (拒绝路线)
#MSS:此路由上的TCP连接的默认最大段大小。
#Window:此路由上的TCP连接的默认窗口大小。
#irtt:初始RTT(往返时间)。 内核使用它来猜测最佳的TCP协议参数,而无需等待(可能很慢)的答案。
#Iface:将为此路由发送数据包的接口。
博文来自:www.51niux.com
2.3 显示UP状态的网络接口的网络信息
# netstat --interfaces=p5p1 #跟netstat -I=p5p1 效果一样,显示p5p1网卡接口的网络信息。
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
p5p1 1500 1011831 0 0 0 3685700 0 0 0 BMsRU
#Iface:网络接口名称
#MTU:可在网络上发送的最大数据包的大小,称为 最大传输单元(MTU)。同一物理或逻辑(VLAN)网络中的所有设备,应使用同一个 MTU 大小。链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。
#RX-OK:接收时,正确的数据包数。
#RX-ERR:接收时,产生错误的数据包数。
#RX-DRP:接收时,丢弃的数据包数。
#RX-OVR:接收时,由于过速(在数据传输中,由于接收设备不能接收按照发送速率传送来的数据而使数据丢失)而丢失的数据包数。
#TX-OK: 发送时,正确的数据包数。
#TX-ERR:发送时,产生错误的数据包数。
#TX-DRP:发送时,丢弃的数据包数。
#TX-OVR:发送时,由于过速而丢失的数据包数。
#Flg:标志。下面是标志描述符的:
B 已经设置了一个广播地址。
L 该接口是一个回送设备。
M 接收所有数据包(混乱模式)。
N 避免跟踪。
O 在该接口上,禁用ARP。
P 这是一个点到点链接。
R 接口正在运行。
U 接口处于“活动”状态。
# netstat -i #可以查看所有UP状态的的网络接口信息。
2.3 显示每个协议的统计信息
#netstat -s #显示所有端口的统计信息
Ip:
51855492106 total packets received #收到的总数据包是51855492106
0 forwarded #转发包数是0
0 incoming packets discarded #丢失传入数据包是0
51851543262 incoming packets delivered #传入数据包是51851543262
464123804154 requests sent out #发出464123804154个请求
3 outgoing packets dropped #3个传出数据包丢失
238042 fragments dropped after timeout #超时后238042个碎片掉落
296170 reassemblies required #296170个包需要重装
296170 packet reassembles failed #296170包重新组装失败
Icmp:
2706819 ICMP messages received #收到ICMP消息2706819个
0 input ICMP message failed. #ICMP消息失败0次
ICMP input histogram: # ICMP输入直方图:
destination unreachable: 11138 #目的地不可达:11138
echo requests: 2685816 #回应请求:2685816
echo replies: 9865 #回应回复:9865
2882592 ICMP messages sent #发送ICMP消息2882592
0 ICMP messages failed #0 ICMP消息失败
ICMP output histogram: # ICMP输出直方图:
destination unreachable: 168790 #目的地不可达:168790
time exceeded: 16718 #时间超过:16718
echo request: 9865 #回应请求:9865
echo replies: 2685816 #回复回复:2685816
IcmpMsg: #这就相当于上面的报告
InType0: 9865
InType3: 11138
InType8: 2685816
OutType0: 2685816
OutType3: 168790
OutType8: 9865
OutType11: 16718
OutType69: 1403
Tcp:
789371 active connections openings # 789371个有效连接
2030525 passive connection openings #2030525个被动连接
16 failed connection attempts #16次失败的连接尝试
28934 connection resets received #接收到28934个连接重置
2 connections established #建立了2个连接
1691315341 segments received #收到段数1691315341
1320552798 segments send out # 1320552798段发送出去
547382 segments retransmited #547382段重新发送
204 bad segments received. #收到204个不良部分。
869174 resets sent # 869174个重置发送
Udp:
50082276572 packets received #收到50082276572封包
176677 packets to unknown port received. # 收到176677个未知端口的数据包。
73978308 packet receive errors # 73978308个数据包接收错误
462854721865 packets sent #462854721865个包发送
7171424 receive buffer errors #收到缓冲区错误包7171424个
0 send buffer errors #发送缓冲区错误0
InCsumErrors: 72151 #
UdpLite:
TcpExt:
450 SYN cookies sent #发送450个SYN Cookie
568 SYN cookies received # 收到568 SYN Cookie
15057 invalid SYN cookies received #收到15057个无效的SYN Cookie
1106384 TCP sockets finished time wait in fast timer # 1106384个TCP套接字完成时间等待快速定时器
14 packets rejects in established connections because of timestamp #由于时间戳,14个数据包在建立的连接中被拒绝
163066557 delayed acks sent # 163066557个包延迟发送
3819 delayed acks further delayed because of locked socket #3819个包由于锁定socker延迟了进一步延迟
Quick ack mode was activated 476247 times #快速确认模式已激活476247次
1748 times the listen queue of a socket overflowed #1748次套接字的监听队列溢出
2198 SYNs to LISTEN sockets dropped #2198个SYNs 去LISTEN套接字掉线
4251157 packets directly queued to recvmsg prequeue. # 4251157数据包直接排队到recvmsg prequeue。
134974966 bytes directly in process context from backlog # 134974966字节直接在进程上下文中从积压
1126261750 bytes directly received in process context from prequeue #直接从进程上下文中接收到的1126261750个字节
350279770 packet headers predicted #350279770包头预测
1026793 packets header predicted and directly queued to user #1026793数据包报头预测并直接排队给用户
48559022 acknowledgments not containing data payload received # 48559022个包不包含接收到数据有效载荷的确认
755883503 predicted acknowledgments #
7566 times recovered from packet loss by selective acknowledgements #通过选择性确认从包丢失中恢复7566次
Detected reordering 6 times using FACK #使用FACK检测重新排序6次
Detected reordering 5 times using SACK # 使用SACK检测重新排序5次
Detected reordering 9 times using time stamp #使用时间戳检测重新排序9次
66 congestion windows fully recovered without slow start # 66个拥塞窗口完全恢复,没有启动缓慢
14 congestion windows partially recovered using Hoe heuristic # 使用Hoe heuristic启发式部分恢复了14个拥塞窗口
71 congestion windows recovered without slow start by DSACK #71个拥塞窗口恢复,而DSACK没有缓慢启动
1832 congestion windows recovered without slow start after partial ack #1832个拥塞窗口在部分确认后没有缓慢启动
TCPLostRetransmit: 1160 #TCPLostRetransmit:1160
982 timeouts after SACK recovery #SACK恢复后982次超时
1150 timeouts in loss state #1150次超时处于丢失状态
15912 fast retransmits #15912次快速重传
344 forward retransmits # 344次前转重发
3570 retransmits in slow start # 3570次因为缓慢的速度重新发送
1597 other TCP timeouts #1597次其他TCP超时
TCPLossProbes: 542068 #
TCPLossProbeRecovery: 45266
1780 SACK retransmits failed #1780次SACK重传失败
476260 DSACKs sent for old packets # 476260次发送旧数据包的DSACK
519730 DSACKs received
3 DSACKs for out of order packets received # 3个DSACK接收到无序数据包
4355 connections reset due to unexpected data #4355次连接由于意外的数据复位
127 connections reset due to early user close #由于早期用户关闭,127个连接复位
6 connections aborted due to timeout #6个连接由于超时而中止
TCPDSACKIgnoredOld: 1
TCPDSACKIgnoredNoUndo: 518929
TCPSpuriousRTOs: 1751
TCPSackShifted: 5329
TCPSackMerged: 31875
TCPSackShiftFallback: 88373
TCPReqQFullDoCookies: 517
TCPRcvCoalesce: 23173796
TCPOFOQueue: 23740
TCPChallengeACK: 336
TCPSYNChallenge: 204
TCPSpuriousRtxHostQueues: 9
TCPAutoCorking: 4775177
TCPFromZeroWindowAdv: 404852
TCPToZeroWindowAdv: 404852
TCPWantZeroWindowAdv: 302540
TCPSynRetrans: 1074
TCPOrigDataSent: 891646881
TCPHystartTrainDetect: 25
TCPHystartTrainCwnd: 1152
TCPHystartDelayDetect: 3
TCPHystartDelayCwnd: 58
TCPACKSkippedPAWS: 2
TCPACKSkippedSeq: 1
IpExt:
InMcastPkts: 1120606308
OutMcastPkts: 72278428
InBcastPkts: 1117966
InOctets: 11795631112853
OutOctets: 216136828729149
InMcastOctets: 127253180512
OutMcastOctets: 8005557248
InBcastOctets: 643676613
InNoECTPkts: 51850057617
InECT1Pkts: 1353
InECT0Pkts: 5433137
# netstat -st #只显示tcp的信息
# netstat -us #只显示udp的信息
博文来自:www.51niux.com
2.4 指定协议显示
# netstat -ln --inet 4 --u #-l是只显示监听套接字,--inet 4 --u是只显示ipv4协议并且是ucp的监听,不按CTRL+C是一直刷新的。
下面的图是两种形式,第一种就是一种条件,就刷新一次就完事了,第二种就是两种条件会一直刷新,但是你也想刷新一次就完事你就加空格随便加个数字,也就刷新一次了。
2.5 -p和-a的用法
-p是我们常用的一个用法,显示每个套接字所属程序的PID和名称。
-a呢显示监听和非监听套接字,并且可以将未启动的网卡的信息显示出来。(上面我们用netstat不是不显示关闭网卡接口的信息嘛。)
#netstat --interfaces=p1p2 #我光纤网卡p1p2是不插网线down的状态,默认是显示不出来的。
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
#netstat -a --interfaces=p1p2 #用-a指定端口的形式就可以显示出来
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
p1p2 1500 349973 0 0 0 0 0 0 0 BM
# netstat -lntup #这个命令是我们常用的命令,我们用来查看本地启动了哪些监听端口,并且显示他们的PID和服务名称。
# netstat -lntupa #多了一个a,就会将非LISTEN之外的状态也显示出来。
2.6 不断刷新的方法
# netstat -lntup 10 #后面的数字10表示10秒刷新一次。
# netstat -lntp -c 10 #-c的作用就是指定秒数连续打印信息。不加数字默认是每隔1秒。
三、 可能用到的常用用法:
# netstat -lntup #最常用到的就是这个了,查看现在对外开放的监听端口以及运行的服务或者命令及PID。
# netstat -at #列出所有的tcp端口
# netstat -au #列出所有的udp端口
# netstat -lx #列出所有处于监听端口状态的套接字文件。
#netstat -i #如果不是宿主机的话,可以用这个命令查看我们哪些网卡是UP状态
# netstat -ie #-e是显示更详细的额外信息嘛,这个操作跟#ip addr获得的信息是一致的。
# netstat --verbose #显示不支持的地址族,在结果的末尾会有信息。
# netstat -rn #也可以用这个命令查看主机路由信息,比如网络不通啊可以查看是不是路由指向有问题啊。不过我们一般会使用:# route -n。
剩下的就是加管道跟别的命令配合了:
# netstat -lntup|grep ssh #如查看ssh的监听状态信息啊
#netstat -nat|grep TIME_WAIT|wc -l #如查看TIME_WAIT连接的数量啊
#netstat -n |awk '/^tcp/{++state[$NF]}END{for(key in state)print key"\t"state[key]}' #如连接状态统计计数啊