当前位置: 首页 > 科技观察

Linux《荒岛余生》网络

时间:2023-03-13 07:38:57 科技观察

看着kalilinux的几百条网络命令,陷入了沉思。专业的网络命令太多了。如果要列出它们,则有数千种。我个人不是渗透测试人员,大部分功能都只是表面的。所以本文是一个非常简单的技术总结,只关注工作中常用的一些Linux命令。由于nio的流行,ck10k的问题已经成为历史。现在任何服务器都可以支持数十万个连接。那么我们来计算一下100万个连接需要多少资源。首先,每个连接都是一个文件句柄,所以需要文件描述符个数的支持。每个socket内存占用在15k-20k之间。这样只维护对应的socket就需要20G内存;而广播一条1KB的消息需要占用带宽1000M!如何查看当前系统的连接数,查看当前系统有多少连接数?您可以使用netstat结合awk进行统计。下面的脚本统计每个状态下的tcp连接数#netstat-antp|awk'{a[$6]++}END{for(xina)printx,a[x]}'LISTEN41CLOSE_WAIT24ESTABLISHED150Foreign1TIME_WAIT92但是如果你有服务器上万个连接,可能会等很久。于是,我们有了第二代网络状态统计工具:netstat=>ss(不要和那个越狱工具搞混了)。#ss-sTotal:191(kernel220)TCP:5056(estab42,closed5000,orphaned3,synrecv0,timewait5000/0),ports3469...netstat属于net-tools工具集,ss属于iproute。对应命令如下,是时候和net-tools说Bye了。目的net-toolsiproutestatisticsifconfigssaddressnetstatipaddrrouterouteiprouteneighborarpipneighVPNiptunneliptunnelVLANvconfigiplinkmulticastipmaddripmaddrss命令基本都用到了下面我们根据使用场景来看一下ss的用法。查看系统监听的tcp连接ss-atrss-atn#仅ip查看系统所有连接ss-alt查看监听444端口的进程pidss-ltp|grep444查看555进程占用了哪些端口ss-u-a查看TCP套接字,使用-ta选项查看UDP套接字,使用-ua选项查看RAW套接字,使用-wa选项查看UNIX套接字,使用-xa选项和某个ipssdst10.66.224的所有连接。130ssdst10.66.224。130:httpssdst10.66.224.130:smtpssdst10.66.224.130:443显示所有http连接ssdport=:http查看本机连接最多的前10个ip地址netstat-antp|awk'{print$4}'|cut-d':'-f1|sort|uniq-c|sort-n-k1-r|head-n10Recv-Q和Send-Q注意ss的执行结果,下面对Recv-Q和Send-Q进行说明。这两个值在LISTEN和ESTAB状态下代表不同的含义。一般来说,对于正常的应用程序(积压除外),这两个值都应该为0。值越大,问题越严重。LISTENstatusRecv-Q:表示已建立的连接数,还没有被接受,比如Nginx接受新连接很慢send-Q:表示listenbacklog值ESTABstatusRecv-Q:内核中还有多少数据(bytes)未被应用程序读取,发生一定程度的阻塞send-Q:表示内核中发送队列中有多少(bytes)数据没有收到ack,对端的接收处理能力为不强查看网络流量查看流量的工具有很多可以看网络流量,不过我最喜欢sar。sar是linux上最完善的监控软件。如图,使用sar-nDEV1每秒刷新一次网络流量。当然你也可以使用ifstat、nload、iptraf等命令查看。但是数据的来源还是从我们的/proc目录watchcat/proc/net/dev来查看流量占最多的IP。有时我们发现网络带宽使用率很高,但我们无法确定流量来自哪里。这时候iftop就可以帮上忙了。如图所示,很容易找出流量来自哪个主机。当你不确定内网的流量来源时,比如有人在做压力测试,或者API调用不合理等,你可以用这个方法找到他。抓包tcpdump当我们需要判断是否有流量,或者调试一个困难的netty应用问题时,我们可以使用抓包来做进一步的判断。在Linux上,可以通过tcpdump命令抓取数据,然后使用Wireshark进行分析。tcpdump-ieth0-nn-s0-vport80-i指定抓包的网卡-n和ss一样,表示不解析域名-nn两个n表示端口也是数字,否则为解析成服务名-s设置抓包的长度,0表示无限制-v抓包时显示详细输出,-vv,-vvv依次更详细1)加-A选项会打印ascii,-X将打印十六进制代码。tcpdump-A-s0port802)抓取特定ip的相关包tcpdump-ieth0host10.10.1.1tcpdump-ieth0dst10.10.1.203)-w参数将抓取的包写入文件tcpdump-ieth0-s0-wtest。pcap4)tcpdump支持表达式,还有更复杂的例子,比如爬虫系统中的get和post请求(非https)tcpdump-s0-v-n-l|egrep-i"POST/|GET/|Host:"查看更多通过https://hackertarget.com/tcpdump-examples/捕获的数据可以使用wireshark查看。http抓包工具将自己视为一个代理,可以抓取你的浏览器与服务器的通信,并提供修改、回放、批量执行等功能。它是发现问题、分析协议和攻击站点的利器。常用的有3个:Burpsuite(跨平台)Fiddle2(Win)Charles(Mac)偷偷做坏事。流量复制您可能需要在开发环境或暂存环境中重现您的生产环境的真实HTTP流量,因此需要使用流量复制功能。一共有三个工具可以选择,个人偏向于Gor。GorTCPReplayToomanyTCPCopyconnections根据TCP/IP的介绍,一个socket大概包含10个连接状态。除了针对SYN的拒绝服务攻击,如果出现异常,极有可能是TIME_WAIT和CLOSE_WAIT的问题。TIME_WAIT一般可以通过优化内核参数来解决;CLOSE_WAIT一般是编程不合理造成的,应该引起开发者的注意。TIME_WAITTIME_WAIT是主动关闭连接的一方维护的状态。像nginx和爬虫服务器,经常会出现大量time_wait状态的连接。TCP一般在主动关闭连接后等待2MS,然后彻底关闭连接。由于HTTP使用的是TCP协议,在这些频繁切换连接的服务器上积压了很多TIME_WAIT状态的连接。有些系统可以通过dmesg看到如下信息。__ratelimit:2170callbackssuppressedTCP:timewaitbuckettableoverflowTCP:timewaitbuckettableoverflowTCP:timewaitbuckettableoverflowTCP:timewaitbuckettableoverflow通过ss-s命令查看,可以看到已经有2w个timewait了。ss-sTotal:174(kernel199)TCP:20047(estab32,closed20000,orphaned4,synrecv0,timewait20000/0),ports10785sysctl命令可以设置这些参数,如果要重启生效,添加到/etc/sysctl.conf文件。#修改阈值net.ipv4.tcp_max_tw_buckets=50000#表示开启TCP连接中TIME-WAITsockets的快速回收net.ipv4.tcp_tw_reuse=1#开启timewait快速回收。这必须启用,默认情况下禁用。net.ipv4.tcp_tw_recycle=1#修改系统默认TIMEOUT时间,默认60s。net.ipv4.tcp_fin_timeout=10测试参数,可以使用命令sysctl-wnet.ipv4.tcp_tw_reuse=1,如果写入文件,使用sysctl-p生效。CLOSE_WAITCLOSE_WAIT一般是对端主动关闭导致的,但我们没有正确处理。说白了就是程序写的有问题,属于比较害人的类型。下面以“csdn谐音太郎”遇到的一个典型案例来说明。该代码是使用HttpClient的使用片段。在这段代码中,通过调用in.close()来清理连接资源。但可惜代码中有一个判断:非200状态的连接直接返回null。这样的话,in连赋值的机会都没有,当然也不能关闭,然后就发生了连接泄漏。因此,关闭HttpClient的正确方式是使用它的api:abort()。其他常用命令应用软件#断点续传下载文件wget-c$url#下载全站wget-r-p-np-k$url#发送网络连接(常用)curl-XGET$url#传输文件scpsftp#数据镜像备份rsync检测工具#连接检测pinggoogle.com#对端路由检测tracepathgoogle.com#域名检测diggoogle.comnslookupgoogle.com#网络扫描工具nmap#压力测试iperf#全方位监控工具(好东西)nmon配置工具#停止某网卡ifdown#打开某网卡ifup#多功能管理工具ethtool压力测试wrkabwebbenchhttp_load多功能工具#远程登录telnetsshnc#防火墙iptables-LEnd除了基本工具,本文提到的很多网络命令都没有预装,需要自己用yum安装。对于网络编程的学习,我想,就看这本书《TCP/IP详解 卷1:协议》,然后写几个Netty应用。我们在I/O章节中已经提到了NIO,这里不再详细介绍。当你遇到所谓的解包卡顿问题,心跳限流问题,甚至是流量整形问题时,就证明你离专业的网络编程程序员越来越近了。