linux网络工具

1 tcpdump

安装:

yum install -y tcpdump

工作中的常用用法

一 参数详解

1 抓包选项

-c:指定要抓取的包数量。注意,是最终要获取这么多个包。
    例如,指定"-c 10"将获取10个包,但可能已经处理了100个包,
    只不过只有10个包是满足条件的包。
-i interface:指定tcpdump需要监听的接口。
    若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口
    (不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
    一旦找到第一个符合条件的接口,搜寻马上结束。
    可以使用'any'关键字表示所有网络接口。
-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-N:不打印出host的域名部分。例如tcpdump将会打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入还是流出的包。
    可以给定的值为"in"、"out"和"inout",默认为"inout"。
-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。
    对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断,
    输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。
    但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,从而会导致数据包的丢失,
    所以在能抓取我们想要的包的前提下,抓取长度越小越好。

2 输出选项

-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-v:当分析和打印的时候,产生详细的输出。
-vv:产生比-v更详细的输出。
-vvv:产生比-vv更详细的输出。

3 其他选项

-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。
-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。
-w:将抓包数据输出到文件中而不是标准输出。
    可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。
    可通过"-r"选项载入这些文件以进行分析和打印。
-r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。

二、tcpdump常用用法:

1,-i 指定网口 -vnn 常用选项,显示详细信息并且不解析IP,端口 ;

抓取某个网口上发往或来自某个IP的报文

tcpdump -i ethX host 192.168.1.100 -vnn

2,可以用or 或者and 连接多个过滤条件,port前的tcp表示tcp协议,也可为udp

抓取某个网口上发往或来自某个IP、并且指定端口的报文

tcpdump -i ethX host 192.168.1.100 and tcp port 22(端口号) -vnn

3, -c 指定抓取报文的数量, 用 -w 把抓取的数据包写入文件;

抓取某网口50个包并写入dump.cap(为什么是 .cap?因为wireshark识别此扩展名)文件:

tcpdump -i ethX -c 50 -w /root/dump.cap

4,可以用关键字 src 或者 dst 表示 源 或者 目的;

抓取源端口号为22(tcp协议)的报文

tcpdump -i ethX tcp src port 22(端口号) -vnn

tcpdump tcp port 8099 and host ip -w xueyuan.cap

2 WireShark抓包分析

官网下载地址:https://www.wireshark.org/download.html

介绍

标准三窗格包浏览器

  • 多平台:在Windows,Linux,OS X,Solaris,FreeBSD,NetBSD和其他许多平台上运行

  • 多接口:与标准GUI一起,Wireshark包括TShark,一种文本模式分析器,可用于远程捕获,分析和脚本编写

业界最强大的显示器滤波器

VoIP分析

支持实时捕获和离线分析

读/写许多不同的捕获文件格式:tcpdump(libpcap),NAI的Sniffer(压缩和未压缩),Sniffer Pro,NetXray,Sun snoop和atmsnoop,Shomiti / Finisar Surveyor,AIX的iptrace,Microsoft的网络监视器,Novell的LANalyzer,RADCOM的WAN /来自ISDN4BSD项目的LAN分析器,HP-UX nettl,i4btrace,Cisco Secure IDS iplog,pppd日志(pppdump-format),AG Group / WildPacket的EtherPeek / TokenPeek / AiroPeek,Visual Networks的Visual UpTime等等

  • 使用gzip压缩的捕获文件可以动态解压缩

  • 支持数百种协议,并且一直在添加更多协议

  • 着色规则可以应用于数据包列表,从而简化分析

中文设置

1 Wireshark for Mac,点击【preference】

wireshark分析报文

可参考网址:https://blog.csdn.net/ITermeng/article/details/77833356?locationNum=4&fps=1

1,淡紫色数据包为正常数据包,包括数据包和ACK包1,淡紫色数据包为正常数据包,包括数据包和ACK包

2,黑色为异常包,包括丢包ACK、重传等2,黑色为异常包,包括丢包ACK、重传等

2.1 Packet Size limited during capture

这个标志说明数据包并没被完全抓到,而只是抓到了一部分。这种情况多数是由于抓包方式引起,在某些系统中tcpdump只抓每个帧的前96个字节。我们可以”-s”参数来指定想要的字节数。

2.2 TCP previous segment not captured

TCP传输过程中同一台主机发出的数据应该是连续的,即后一个数据包的Sequence应该等一前一个数据包的sequence+len,如果后面捕捉到的数据包不符合这样的规律,即sequence比前一个包的sequence+len大的话,我们就可以认定中间的数据包就没有抓到,导致这个数据包没有按时到达的原因可能有乱序或者丢包导致。

2.3 TCP ACKed unseen segment

当WireShark发现被ACK的那个包没被抓到,就会提示[TCP ACKed unseen segment],这种提示一般没有什么问题,就是WireShark漏抓了。

2.4 TCP Dup ACK

当出现乱序或者丢包等情况的时候,本来应该收到的数据包没有收到,反而收到了一些Sequence号比较大的数据包,这时候客户端就会回复一个ACK,ACK本应该收到却没有收到的包,如果后面来的还不是所期望的数据包,那么客户端每收到一个其他数据包就会回复一个ACK,由于这些ACK是重复的,所以就会提示[TCP Dup ACK]。

2.5 TCP Out-of-Order

TCP传输过程中数据包的Sequence号应该是持续递增的,也就是说每个数据包之间应该只差一个Len的数据,但是在传输过程中如果Sequence比较大的数据包比Sequence比较小的数据包先到达的话,就会触发[TCP Previous Segment not cpatured],然后如果在后续收到了“迟到”的数据包,就会被标记[TCP Out-of-order]。

2.6 TCP Fast Retransmission

当服务器收到3个或以上的[TCP Dup ACK]后就会判定所ACK的包丢失了,哪怕还没有超过定时器的规定,都会立即重新发送,客户端收到后会标记为[TCP fast retransmission]。

2.7 TCP Retransmission

一般来说一个数据包丢失后又没有足够的后续数据包来触发[TCP Fast Retransmission]的话,超过定时器的时限后就会触发超时重传,这时候客户端收到的数据包就会被标记[TCP Retransmission]。

2.8 TCP Zerowindow

在TCP数据包中,Info那一栏的中的”win=XX”中XX代表了接收窗口的大小,代表了这个信息的源地址的主机还有多少数据可以接收,或者说缓存区还有多少空间。当win=0的时候就会给相应ACK打上[TCP Zerowindow]的标志,告诉发送方我没有数据可以接收了。

2.9 TCP window full

当出现这个标志的时候证明发送方已发送的但还没有确认的数据包已经达到了接收方接收窗口的上限,也就是说这个时候发送方就会停止发送数据,而不是等接收方回复[TCP Zerowindow]后才停止发送。所以[TCP window full]针对的是发送方没法发送数据,而[TCP Zerowindow]指的是接收方没法接收数据,不管出现哪一种情况,都会中断数据的传输,直到缓存区有新的空间存放数据。

3,数据包的标签从左到右依次为:

数据包编号—时间—源地址—目标地址—协议类型—长度—总长度—数据包序号—下一个数据包序号—ACK号—身份识别码—RTT—一些窗口参数

4,再点击一个报文后,我们在WireShark的下端可以看到更为详细的信息:

分别对应OSI七层模型的,数据链路层、网络层、传输层、应用层

ubuntu网络流量ethstatus

ubuntu下用ethstatus可以监控实时的网卡带宽占用。这个软件能显示当前网卡的 RX 和 TX 速率,单位是Byte

安装 ethstatus 软件 sudo apt-get install ethstatus

查看 ADSL 的速度 sudo ethstatus -i ppp0

查看 网卡 的速度 sudo ethstatus -i eth0(网卡名称)

4 curl命令详解

简介

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

1、curl命令查看响应时间

curl -w “%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}” “\n”

参数

含义

time_namelookup

DNS解析域名时间

time_connect

TCP连接的时间,三次握手的时间

time_starttransfer

从请求开始到第一个字节将要传输的时间

time_total

总时间

speed_download

下载速度,单位-字节每秒

time_appconnect

SSL、SSH等上层连接建立的时间

time_pretransfer

从请求开始到响应开始传输的时间

time_redirect

从开始到最后一个请求事务的时间

2、CURL 发送POST请求

curl -H “Content-Type: application/json” -X POST -d ‘{“user_id”: “123”, “coin”:100, “success”:1, “msg”:”OK!” }’ “http://192.168.0.1:8001/test"
参数 内容
-H 请求头
-d POST内容
-X 请求协议
-A
-A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。

$ curl -A ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36’ https://google.com

上面命令将User-Agent改成 Chrome 浏览器。

$ curl -A ‘’ https://google.com

上面命令会移除User-Agent标头。

也可以通过-H参数直接指定标头,更改User-Agent。

$ curl -H ‘User-Agent: php/1.0’ https://google.com

-b
-b参数用来向服务器发送 Cookie。

$ curl -b ‘foo=bar’ https://google.com

上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。

$ curl -b ‘foo1=bar;foo2=bar2’ https://google.com

上面命令发送两个 Cookie。

$ curl -b cookies.txt https://www.google.com

上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

-c
-c参数将服务器设置的 Cookie 写入一个文件。

$ curl -c cookies.txt https://www.google.com

上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

-d
-d参数用于发送 POST 请求的数据体。

$ curl -d’login=emma&password=123’-X POST https://google.com/login
或者
$ curl -d ‘login=emma’ -d ‘password=123’ -X POST https://google.com/login

使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。

-d参数可以读取本地文本文件的数据,向服务器发送。

$ curl -d @data.txt"">'@data.txt‘ https://google.com/login

上面命令读取data.txt文件的内容,作为数据体向服务器发送。

–data-urlencode
–data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

$ curl –data-urlencode ‘comment=hello world’ https://google.com/login

上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

-e
-e参数用来设置 HTTP 的标头Referer,表示请求的来源。

curl -e ‘https://google.com?q=example' https://www.example.com

上面命令将Referer标头设为https://google.com?q=example。

-H参数可以通过直接添加标头Referer,达到同样效果。

curl -H ‘Referer: https://google.com?q=example' https://www.example.com

-F
-F参数用来向服务器上传二进制文件。

$ curl -F @photo.png"">'file=@photo.png‘ https://google.com/profile

上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。

-F参数可以指定 MIME 类型。

$ curl -F @photo.png"">'file=@photo.png;type=image/png’ https://google.com/profile

上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。

-F参数也可以指定文件名。

$ curl -F @photo.png"">'file=@photo.png;filename=me.png’ https://google.com/profile

上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

-G
-G参数用来构造 URL 的查询字符串。

$ curl -G -d ‘q=kitties’ -d ‘count=20’ https://google.com/search

上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略--G,会发出一个 POST 请求。

如果数据需要 URL 编码,可以结合–data–urlencode参数。

$ curl -G –data-urlencode ‘comment=hello world’ https://www.example.com

-H
-H参数添加 HTTP 请求的标头。

$ curl -H ‘Accept-Language: en-US’ https://google.com

上面命令添加 HTTP 标头Accept-Language: en-US。

$ curl -H ‘Accept-Language: en-US’ -H ‘Secret-Message: xyzzy’ https://google.com

上面命令添加两个 HTTP 标头。

$ curl -d ‘{“login”: “emma”, “pass”: “123”}’ -H ‘Content-Type: application/json’ https://google.com/login

上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

-i
-i参数打印出服务器回应的 HTTP 标头。

$ curl -i https://www.example.com

上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

-I
-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。

$ curl -I https://www.example.com

上面命令输出服务器对 HEAD 请求的回应。

–head参数等同于-I。

$ curl –head https://www.example.com

-k
-k参数指定跳过 SSL 检测。

$ curl -k https://www.example.com

上面命令不会检查服务器的 SSL 证书是否正确。

-L
-L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。

$ curl -L -d ‘tweet=hi’ https://api.twitter.com/tweet

–limit-rate
–limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。

$ curl –limit-rate 200k https://google.com

上面命令将带宽限制在每秒 200K 字节。

-o
-o参数将服务器的回应保存成文件,等同于wget命令。

$ curl -o example.html https://www.example.com

上面命令将www.example.com保存成example.html。

-O
-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

$ curl -O https://www.example.com/foo/bar.html

上面命令将服务器回应保存成文件,文件名为bar.html。

-s
-s参数将不输出错误和进度信息。

$ curl -s https://www.example.com

上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。

如果想让 curl 不产生任何输出,可以使用下面的命令。

$ curl -s -o /dev/null https://google.com

-S
-S参数指定只输出错误信息,通常与-s一起使用。

$ curl -s -o /dev/null https://google.com

上面命令没有任何输出,除非发生错误。

-u
-u参数用来设置服务器认证的用户名和密码。

$ curl -u ‘bob:12345’ https://google.com/login

上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。

curl 能够识别 URL 里面的用户名和密码。

$ curl 12345@google.com/login"target="_blank"">https://bob:12345@google.com/login

上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。

$ curl -u ‘bob’ https://google.com/login

上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

-v
-v参数输出通信的整个过程,用于调试。

$ curl -v https://www.example.com

–trace参数也可以用于调试,还会输出原始的二进制数据。

$ curl –trace - https://www.example.com

-x
-x参数指定 HTTP 请求的代理。

$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com

上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。

如果没有指定代理协议,默认为 HTTP。

$ curl -x james:cats@myproxy.com:8080 https://www.example.com

上面命令中,请求的代理使用 HTTP 协议。

-X
-X参数指定 HTTP 请求的方法。

$ curl -X POST https://www.example.com

上面命令对https://www.example.com发出 POST 请求。

5 nessus 网络安全工具

1 MAC

在 /Library/Nessus/run/sbin 目录下找到 nessuscli

运行

sudo ./nessuscli update all-2.0.tar.gz

plugin_feed_info.inc文件

PLUGIN_SET = "202111302104"; #这里要和更新显示的日期一致
PLUGIN_FEED = "ProfessionalFeed (Direct)";


PLUGIN_FEED_TRANSPORT = "Tenable Network Security Lightning";

1.1 把 plugin_feed_info.inc 文件放到下面的目录中:

/Library/Nessus/run/lib/nessus/
/Library/Nessus/run/lib/nessus/plugins/

1.2 后期更新的时候,插件这个位置,推荐进入命令行编辑(因为里面文件很多,打开很慢)

sudo vi /Library/Nessus/run/lib/nessus/plugin_feed_info.inc
sudo vi /Library/Nessus/run/lib/nessus/plugins/plugin_feed_info.inc

插件内容为:

PLUGIN_SET = "202107050714";
PLUGIN_FEED = "ProfessionalFeed (Direct)";


PLUGIN_FEED_TRANSPORT = "Tenable Network Security Lightning";

1.3 然后重新启动服务即可

/Library/Nessus/run/sbin/nessusd restart

1.4 MAC 下卸载:

rm -rf /Library/Nessus
rm -rf /Library/LaunchDaemons/com.tenablesecurity.nessusd.plist
rm -rf /Library/PreferencePanes/Nessus Preferences.prefPane
rm -rf /Applications/Nessus

2 Nessus初步使用

2.1 web页面

解决:就是在当前页面用键盘输入 thisisunsafe

3、忘记密码解决方法

很长时间没用,忘记密码,解决办法如下:

cd /Library/Nessus/run/sbin
##显示用户
sudo ./nessuscli lsuser
##改密码
sudo ./nessuscli chpasswd wxr

6 阿里Arthas-java进程排查工具

介绍

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。

Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  • 是否有一个全局视角来查看系统的运行状况?

  • 有什么办法可以监控到JVM的实时运行状态?

  • 怎么快速定位应用的热点,生成火焰图?

本教程会以一个简单的应用为例,演示thread命令。

Github: https://github.com/alibaba/arthas
文档: https://arthas.aliyun.com/doc/

1 实际安装使用

官网教程:https://arthas.aliyun.com/doc/quick-start.html#arthas

启动arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
  • 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。

  • 如果attach不上目标进程,可以查看~/logs/arthas/ 目录下的日志。

  • 如果下载速度比较慢,可以使用aliyun的镜像:java -jar arthas-boot.jar –repo-mirror aliyun –use-http

  • java -jar arthas-boot.jar -h 打印更多参数信息。

2 thread命令指定pid进程的java排查cpu最高3位

https://arthas.aliyun.com/doc/thread.html

支持一键展示当前最忙的前N个线程并打印堆栈:

thread -n 3

  • 没有线程ID,包含[Internal]表示为JVM内部线程,参考dashboard命令的介绍。

  • cpuUsage为采样间隔时间内线程的CPU使用率,与dashboard命令的数据一致。

  • deltaTime为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。

  • time 线程运行总CPU时间。