专栏名称: 小姐姐味道
夹狗屎
目录
相关文章推荐
瞭望东方周刊  ·  高考时间,定了! ·  昨天  
连州点点网  ·  事关清远中考,最新通知 ·  昨天  
教育之江  ·  《哪吒2》带给我们哪些教育启示? ·  2 天前  
教育之江  ·  《哪吒2》带给我们哪些教育启示? ·  2 天前  
天天向上学习平台  ·  刚刚,宜昌又一新学校,正式开学! ·  2 天前  
天天向上学习平台  ·  刚刚,宜昌又一新学校,正式开学! ·  2 天前  
51好读  ›  专栏  ›  小姐姐味道

Linux之《荒岛余生》(五)网络篇

小姐姐味道  · 掘金  ·  · 2018-12-29 08:26

正文

阅读 147

Linux之《荒岛余生》(五)网络篇

你想通过执行ping google.com来判断网络连通性么?我想你这是在侮辱方教授。本篇是《荒岛余生》系列第五篇,网络篇,但不会教你fq。其余参见:

Linux之《荒岛余生》(一)准备篇

Linux之《荒岛余生》(二)CPU篇

Linux之《荒岛余生》(三)内存篇

Linux之《荒岛余生》(四)I/O篇

看着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就可以帮上忙了。如图,可以很容易的找出流量来自哪台主机。

当你不确定内网的流量来源,比如有人在压测,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 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
复制代码






请到「今天看啥」查看全文