请收好 Linux 网络命令集锦
看着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 41CLOSE_WAIT 24ESTABLISHED 150Foreign 1TIME_WAIT 92
但如果你在一台有上万连接的服务器上执行这个命令,你可能会等上很长时间。所以,我们有了第二代网络状态统计工具:netstat => ss(可别和那个越狱工具搞混了)。
# ss -sTotal: 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.130ss dst 10.66.224.130:httpss dst 10.66.224.130:smtpss 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.1tcpdump -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:"
更多参见
https://hackertarget.com/tcpdump-examples/
抓取的数据,使用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 suppressedTCP: time wait bucket table overflowTCP: time wait bucket table overflowTCP: time wait bucket table overflowTCP: time wait bucket table overflow
通过ss -s命令查看,可以看到timewait已经有2w个了。
ss -sTotal: 174 (kernel 199)TCP: 20047 (estab 32, closed 20000, orphaned 4, synrecv 0, timewait 20000/0), ports 10785
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时间,默认是60snet.ipv4.tcp_fin_timeout = 10
测试参数的话,可以使用 sysctl -w net.ipv4.tcp_tw_reuse = 1 这样的命令。如果是写入进文件的,则使用sysctl -p生效。
CLOSE_WAIT
CLOSE_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
检测工具
# 连通性检测ping google.com# 到对端路由检测tracepath google.com# 域名检测dig google.comnslookup google.com# 网络扫描工具nmap# 压力测试iperf# 全方位监控工具(好东西)nmon
配置工具
# 停止某个网卡ifdown# 开启某个网卡ifup# 多功能管理工具 ethtool
压力测试
wrkabwebbenchhttp_load
多功能工具
# 远程登录telnetsshnc# 防火墙iptables -L
结尾
除了基本的工具,本文提到的很多网络命令,都不是预装的,需要使用yum自行安装。网络编程方面的学习,我觉得,读一下《TCP/IP详解 卷1:协议》这本书,然后写几个Netty应用就可以了。
NIO我们已经在I/O篇提起了,在此不再做详细介绍。等你碰到所谓的拆包粘包问题,遇到心跳和限流问题,甚至遇到了流量整形问题,那么证明你离一个专业的网络编程程序员越来越近了。
请收好 Linux 网络命令集锦的更多相关文章
- 你必须了解的基础的 Linux 网络命令
Linux 基础网络命令列表 我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作. 连通性 ping <host>:发送 ICMP ech ...
- 基础的 Linux 网络命令,你值得拥有
导读 有抱负的 Linux 系统管理员和 Linux 狂热者必须知道的.最重要的.而且基础的 Linux 网络命令合集.在 It's FOSS 我们并非每天都谈论 Linux 的"命令行方面 ...
- Linux网络管理——Linux网络命令
3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- Linux 基础——常用的Linux网络命令
一.学Linux网络命令有什么好处 网络的出现,我们的生活更方便了,处理事情的效率也越来越高,也可以看到全世界文化的差异.同时我们接受新事物的信息越来越来强,新事物的信息也越来越来多.网络对于我们尔等 ...
- 初中级DBA必需要学会的9个Linux网络命令,看看你有哪些还没用过
笔者不久前写了一篇文章<做DBA必须学会,不会会死的11个Linux基本命令>,博文地址为:http://blog.csdn.net/ljunjie82/article/details/4 ...
- [置顶]
Linux 常用命令集锦
出处:http://www.vaikan.com/what-are-the-most-useful-swiss-army-knife-one-liners-on-unix/ Linux命令行里的&qu ...
- Linux网络命令与脚本使用
作为系统管理员,经常需要诊断和解决网络问题,而配置.监控与保护网络有助于发现问题并在事情范围扩大前得意解决,并且网络的性能与安全也是管理与诊断网络的重要部分.这里总结一下常用与Linux网络管理的命令 ...
- Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!
目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...
- Linux网络命令必知必会之瑞士军刀 nc(netcat)
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. nc,全名叫 ...
随机推荐
- 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)
(题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...
- 配置Nginx 扩展实现图片剪裁
在此之前需要安装ngx_http_image_filter_module,如果是采用的Docker的话可以看看我历史文章. 然后修改配置文件,增加几个location模块,配置如下,仅供参考 serv ...
- 浅谈AsyncLocal,我们应该知道的那些事儿
前言 最近查看有关框架源码,发现AsyncLocal这玩意水还挺深,于是花了一点功夫去研究,同时对比ThreadLocal说明二者区别以及在何时场景下使用AsyncLocal或ThreadLocal. ...
- How tomcat works(深入剖析tomcat)(7) Logger
How tomcat works (7)日志记录器 总体概述 顾名思义,这一章将的是tomcat的日志记录器组件,比较简单,tomcat提供了几种类型不同的日志记录器,但是所有的日志记录器都需要实现L ...
- HBase中Memstore存在的意义以及多列族引起的问题和设计
Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...
- PADS生成贴片文件
PADS生成贴片文件 VIEW-BOTTOM VIEW能够使Bottom层正常显示. 1. pastmask_top->Output Devices->Device Setup- 2. 进 ...
- sql中count(1)、count(*)与count(列名)的区别
1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!从执行计划来看,count(1)和count(*)的效果是 ...
- 解决调用WebService报基础连接已经关闭: 服务器关闭了本应保持活动状态的连接的错误的方法
问题可能原因之一:网速的快慢,我经过测试,如果外网访问的话网速慢就是出现此类问题,但是我没有精确测出当在网络流量最低在什么情况下可以避免此类问题问题可能之二:程序发布之前没把原引用的web servi ...
- Cys_Control(四) MTabControl
一.查看TabControl原样式 <ControlTemplate TargetType="{x:Type TabControl}"> <Grid x:Name ...
- go语言之---数组(array)和切片(slice)
一.数组 1.什么是数组? 1.数组是一系列同一类型数据的集合 2.数组中包含的每个数据被称为数组元素 3.一个数组中包含的元素个数成为数组长度 4.数组的长度是固定的 5.一个数组可以由零个或者多个 ...