1. 查看当前系统的连接
1.1 netstat
使用netstat 结合awk进行统计,统计每一种状态的tcp连接数量
[root@jenkins ~]# netstat -antp |awk '{a[$6]++}END{for (x in a) print x,a[x]}'
LISTEN 28
SYN_RECV 12
ESTABLISHED 40
established) 1
Foreign 1
TIME_WAIT 181
若服务器过多可使用ss
[root@jenkins ~]# ss -s
Total: 880 (kernel 1031)
TCP: 412 (estab 50, closed 334, orphaned 0, synrecv 0, timewait 221/0), ports 0
Transport Total IP IPv6
* 1031 - -
RAW 0 0 0
UDP 3 2 1
TCP 78 72 6
INET 81 74 7
FRAG 0 0 0
netstat属于net-tools工具集,而ss属于iprote
1.2 ss
查看系统正在监听的TCP连接
ss -atr
ss -atn #仅ip
查看系统中所有连接
ss -alt
查看监听444端口的进程pid
ss -ltp|grep 444
查看进程555占用了那些端口
ss -ltp|grep 555
显示所有UDP连接
ss -u -a
-
查看TCP sockets,使用-ta选项
-
查看UDP sockets,使用-ua选项
-
查看RAW sockets,使用-wa选项
-
查看UNIX sockets,使用-xa选项
和某个ip的所有连接
ss dst 1.2.3.4
ss dst 1.2.3.4:http
ss dst 1.2.3.4:smtp
ss dst 1.2.3.4:443
查看所有的HTTP连接
ss dport = :http
查看连接本机最多的前10个ip地址
netstat -antp | awk '{print $4}' |cut -d ':' -f1 |sort|uniq -c|sort -n -k1 -r|head -n 10
Recv -Q和Send -Q
查看ss的执行结果,
ss -t -o state established
这两个值,在LISTEN和ESTAB状态分别代表不同意义。一般,正常的应用程序这两个值都应该为0(backlog除外)。数值越大,说明问题越严重。
Listen状态
Recv-Q:代表建立的连接还有多少没有被accept,比如Nginx接受新连接变的很慢
Send-Q:代表listen backlog值
ESTAB状态
Recv-Q:内核中的数据还有多少(bytes)没有被应用程序读取,发生了一定程度的阻塞
Send-Q:代表内核中发送队列里还有多少(bytes)数据没有收到ack,对端的接收处理能力不强
查看网络流量
查看流量
sar是linux上功能最全的监控软件。如图,使用sar -n DEV 1
即可每秒刷新一次网络流量。
watch cat /proc/net/dev
查看占流量最大的IP
若带宽占用非常高,无法判断流量来自哪里,可以使用iftop
当你不确定内网的流量来源,比如有人在压测,api调用不合理等,都可以通过这种方法找到他
抓包
tcpdump
当需要判断是否有流量,或者调试一个难缠的 netty 应用问题,则可以通过抓包的方式去进行进一步的判断。在 Linux 上,可以通过 tcpdump 命令抓取数据,然后使用Wireshark 进行分析。
tcpdump -i eth0 -nn -s0 -v port 80
-
-i
指定网卡进行抓包 -
-n
和ss一样,表示不解析域名 -
-nn
两个n表示端口也是数字,否则解析成服务名 -
-s
设置抓包长度,0表示不限制 -
-v
抓包时显示详细输出,-vv、-vvv依次更加详细
1. 加-A 选择打印ascii ,-X打印hex码
tcpdump -A -s0 port 80
2. 抓取特定ip的相关包
tcpdump -i eth0 host 172.17.10.24
tcpdump -i eth0 dst 172.17.10.24
3. -w 参数将抓取的包写入到某个文件中
tcpdump -i eth0 -s0 -w test.pcap
4. tcpdump 支持表达式,可抓取系统中的get,post请求
tcpdump -s 0 -v -n -l |egrep -i "POST /|GET /|HOST:"
HTTP抓包
抓包工具将自身当作代理,能够抓取你的浏览器到服务器之间的通讯,并提供修改、重放、批量执行的功能。是发现问题,分析协议,攻击站点的利器。常用的有以下三款:
-
Burpsuite (跨平台)
-
Fiddle2 (Win)
-
Charles (Mac)
TIME_WAIT
TIME_WAIT 是主动关闭连接的一方保持的状态,像 nginx、爬虫服务器,经常发生大量处于time_wait状态的连接。TCP 一般在主动关闭连接后,会等待 2MS,然后彻底关闭连接。由于 HTTP 使用了 TCP 协议,所以在这些频繁开关连接的服务器上,就积压了非常多的 TIME_WAIT 状态连接。
某些系统通过 dmesg 可以看到以下信息。
通过ss -s命令查看,可以看到timewai
[root@web_02 ~]# ss -s
Total: 286 (kernel 618)
TCP: 202 (estab 9, closed 180, orphaned 0, synrecv 0, timewait 178/0), ports 0
sysctl 命令可以设置这些参数,如果想要重启生效的话,加入/etc/sysctl.conf文件中。
# 修改阈值
net.ipv4.tcp_max_tw_buckets = 50000
# 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_tw_reuse = 1
#启用timewait 快速回收。这个一定要开启,默认是关闭的。net.ipv4.tcp_tw_recycle= 1
# 修改系統默认的TIMEOUT时间,默认是60s
net.ipv4.tcp_fin_timeout = 10
测试参数的话,可以使用 sysctl -w net.ipv4.tcp_tw_reuse = 1 这样的命令。如果是写入进文件的,则使用sysctl -p生效
CLOSE_WAIT
CLOSE_WAIT一般是由于对端主动关闭,而我方没有正确处理的原因引起的。说白了,就是程序写的有问题,属于危害比较大的一种。
应用软件
# 断点续传下载文件
wget -c $url
# 下载整站
wget -r -p -np -k $url
# 发送网络连接(常用)
curl -XGET $url
# 传输文件
scp
sftp
# 数据镜像备份
rsync
检测工具
# 连通性检测
ping google.com
# 到对端路由检测
tracepath google.com
# 域名检测
dig google.com
nslookup google.com
# 网络扫描工具
nmap
# 压力测试
iperf
# 全方位监控工具(好东西)
nmon
配置工具
# 停止某个网卡
ifdown
# 开启某个网卡
ifup
# 多功能管理工具
ethtool
压力测试
wrk
ab
webbench
http_load
多功能工具
# 远程登录
telnet
ssh
nc
# 防火墙
iptables -L