看着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。

这两个值,在LISTENESTAB状态分别代表不同意义。一般,正常的应用程序这两个值都应该为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 网络命令集锦的更多相关文章

  1. 你必须了解的基础的 Linux 网络命令

    Linux 基础网络命令列表 我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作. 连通性 ping <host>:发送 ICMP ech ...

  2. 基础的 Linux 网络命令,你值得拥有

    导读 有抱负的 Linux 系统管理员和 Linux 狂热者必须知道的.最重要的.而且基础的 Linux 网络命令合集.在 It's FOSS 我们并非每天都谈论 Linux 的"命令行方面 ...

  3. Linux网络管理——Linux网络命令

    3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  4. Linux 基础——常用的Linux网络命令

    一.学Linux网络命令有什么好处 网络的出现,我们的生活更方便了,处理事情的效率也越来越高,也可以看到全世界文化的差异.同时我们接受新事物的信息越来越来强,新事物的信息也越来越来多.网络对于我们尔等 ...

  5. 初中级DBA必需要学会的9个Linux网络命令,看看你有哪些还没用过

    笔者不久前写了一篇文章<做DBA必须学会,不会会死的11个Linux基本命令>,博文地址为:http://blog.csdn.net/ljunjie82/article/details/4 ...

  6. [置顶] Linux 常用命令集锦

    出处:http://www.vaikan.com/what-are-the-most-useful-swiss-army-knife-one-liners-on-unix/ Linux命令行里的&qu ...

  7. Linux网络命令与脚本使用

    作为系统管理员,经常需要诊断和解决网络问题,而配置.监控与保护网络有助于发现问题并在事情范围扩大前得意解决,并且网络的性能与安全也是管理与诊断网络的重要部分.这里总结一下常用与Linux网络管理的命令 ...

  8. Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

    目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...

  9. Linux网络命令必知必会之瑞士军刀 nc(netcat)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. nc,全名叫 ...

随机推荐

  1. 下载配置VNC

    VNC通常使用连接图形化系统电脑可以安装了Gnome或者KDE yum autoremo ve tigervnc-server //移除 vncreboot //重启yum install tiger ...

  2. CentOS 安装ElasticSearch-head插件

    1 下载ElasticSearch-head安装包 1.1 Git下载ElasticSearch-head #安装git,若机器环境已存在,不需要再次安装 yum install git #下载 gi ...

  3. 浅尝 Elastic Stack (三) Logstash + Beats

    本文使用 Filebeat,如果没有安装需要安装: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat- ...

  4. JVM(五)-垃圾收集器入门

    概述: 大家都知道java相较于c.c++而言最大的优点就是JVM会帮助程序员去回收垃圾,实现对内存的自动化管理.那为什么程序员还需要去了解垃圾回收和内存分配?答案很简单,当需要排查各种内存溢内存泄漏 ...

  5. (转)oracle体系结构

    对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...

  6. 查询满足条件的最新数据(逐步优化,mysql、达梦数据库)

    1.条件:报警信息表sensor_warning 2.需求: 查询当前车厢的.不同设备的.所有处理未完成的.不同报警原因的.时间最新的数据集合,最后按设备id或报警时间排序 3.原始sql,不满足实际 ...

  7. 团队作业4-Day1

    团队作业4-Day1 1. 各个成员在 Alpha 阶段认领的任务 Alpha任务分配 人员 小程序样式实现 吴安冬+吴梓华 小程序js代码及云数据实现 庾艺锋+白军强 项目测试 王泽鑫+赵玮锋 2. ...

  8. SNOI2020 部分题解

    D1T1 画图可以发现,多了一条边过后的图是串并联图.(暂时不确定) 然后我们考虑把问题变成,若生成树包含一条边\(e\),则使生成树权值乘上\(a_e\),否则乘上\(b_e\),求最终的生成树权值 ...

  9. Array的简单使用(Boost和STL通用)

    目录 目录 介绍 使用 Boost和STL的区别 介绍 本来这一次是想简单介绍一下Boost里面的协程库的使用的,但是Boost.Coroutine已经被废弃了,而Boost.Coroutine2目前 ...

  10. react项目中对dom元素样式修改的另一种方法以及将组件插入到node节点中

    在项目中,以前如果遇到对dom元素的操作都是直接获取dom元素,比如说: 但是如果修改的样式比较多的话,不如直接"切换"dom元素,如下例子: 这样会节省一些性能.因为操作dom的 ...