你想通过执行ping google.com来判断网络连通性么?我想你这是在侮辱方教授。本篇是《荒岛余生》系列第五篇,网络篇,但不会教你fq。其余参见:
看着kali linux上百个网络命令,我陷入了沉思。专业的网络命令实在是太多了,如果要罗列,上千个也是有的。个人不是渗透测试工作者,大部分功能只知皮毛。所以本文是非常浅显的技术总结,仅聚焦工作中常用到的一些Linux命令。
由于
nio
的普及,
ck10k
的问题已经成为过去式。现在随便一台服务器,就可以支持数十万级别的连接了。那么我们来算一下,100万的连接需要多少资源。
首先,每一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个socket内存占用15k-20k之间,这样,仅维护相应socket,就需要
20G
内存;而广播一个1KB的消息需要占用的带宽为
1000M
!
查看当前系统的连接
如何看当前系统有多少连接呢?可以使用
netstat
结合
awk
进行统计。如下脚本,统计了每一种状态的tcp连接数量
# netstat -antp | awk '{a[$6]++}END{ for(x in a)print x,a[x]}'
LISTEN 41
CLOSE_WAIT 24
ESTABLISHED 150
Foreign 1
TIME_WAIT 92
复制代码
但如果你在一台有上万连接的服务器上执行这个命令,你可能会等上很长时间。所以,我们有了第二代网络状态统计工具:
netstat
=>
ss
(可别和那个越狱工具搞混了)。
# ss -s
Total: 191 (kernel 220)
TCP: 5056 (estab 42, closed 5000, orphaned 3, synrecv 0, timewait 5000/0), ports 3469
...
复制代码
netstat
属于
net-tools
工具集,而
ss
属于
iproute
。其命令对应如下,是时候和net-tools说Bye了。
用途 | net-tools | iproute |
---|---|---|
统计 | ifconfig | ss |
地址 | netstat | ip addr |
路由 | route | ip route |
邻居 | arp | ip neigh |
VPN | iptunnel | ip tunnel |
VLAN | vconfig | ip link |
组播 | ipmaddr | ip maddr |
ss命令
基本使用
我们按照使用场景来看下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 10.66.224.130
ss dst 10.66.224.130:http
ss dst 10.66.224.130:smtp
ss dst 10.66.224.130: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的执行结果,我们说明一下Recv-Q和Send-Q。
LISTEN
和
ESTAB
状态分别代表不同意义。一般,正常的应用程序这两个值都应该为0(backlog除外)。数值越大,说明问题越严重。
LISTEN状态
-
Recv-Q:代表建立的连接还有多少没有被accept,比如Nginx接受新连接变的很慢
-
Send-Q:代表listen backlog值
ESTAB状态
-
Recv-Q:内核中的数据还有多少(bytes)没有被应用程序读取,发生了一定程度的阻塞
-
Send-Q:代表内核中发送队列里还有多少(bytes)数据没有收到ack,对端的接收处理能力不强
查看网络流量
查看流量
有很多工具可以看网络流量,但我最喜欢sar。sar是linux上功能最全的监控软件。如图,使用
sar -n DEV 1
即可每秒刷新一次网络流量。
当然,你也可以使用ifstat、nload、iptraf等命令查看。然而数据来源,还是来自我们的/proc目录
watch cat /proc/net/dev
复制代码
查看占流量最大的IP
有时候我们发现网络带宽占用非常高,但我们无法判断到底流量来自哪里。这时候,iftop就可以帮上忙了。如图,可以很容易的找出流量来自哪台主机。
抓包
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 10.10.1.1
tcpdump -i eth0 dst 10.10.1.20
复制代码
3)
-w
参数将抓取的包写入到某个文件中
tcpdump -i eth0 -s0 -w test.pcap
复制代码
4)tcpdump支持表达式,还有更加复杂的例子,比如抓取系统中的get,post请求(非https)
tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
复制代码
更多参见 hackertarget.com/tcpdump-exa…
抓取的数据,使用wireshark查看即可。
http抓包
抓包工具将自身当作代理,能够抓取你的浏览器到服务器之间的通讯,并提供修改、重放、批量执行的功能。是发现问题,分析协议,攻击站点的利器。常用的有以下三款:
- Burpsuite (跨平台)
- Fiddle2 (Win)
- Charles (Mac)
坏事要偷偷的干哦。
流量复制
你可能需要使你的生产环境HTTP真实流量在开发环境或者预演环境重现,这样就用到了流量复制功能。 有三个工具可供选择,个人倾向于Gor。
- Gor
- TCPReplay
- TCPCopy
连接数过多问题
根据TCP/IP介绍,socket大概包含10个连接状态。我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题。 TIME_WAIT一般通过优化内核参数能够解决;CLOSE_WAIT一般是由于程序编写不合理造成的,更应该引起开发者注意。
TIME_WAIT
TIME_WAIT是主动关闭连接的一方保持的状态,像nginx、爬虫服务器,经常发生大量处于time_wait状态的连接。TCP一般在主动关闭连接后,会等待
2MS
,然后彻底关闭连接。由于HTTP使用了TCP协议,所以在这些频繁开关连接的服务器上,就积压了非常多的TIME_WAIT状态连接。
某些系统通过dmesg可以看到以下信息。
__ratelimit: 2170 callbacks suppressed
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
复制代码
通过ss -s命令查看,可以看到timewait已经有2w个了。
ss -s
Total: 174 (kernel 199)
TCP: 20047 (estab 32, closed 20000, orphaned 4, synrecv 0, timewait 20000/0), ports 10785
复制代码