关于tcpdump:TCPDump使用

## TCP 抓包查看以后应用的网卡,个别就是流量变动最大的网卡:watch cat /proc/net/dev# 依据指标ip进行过滤tcpdump -i eth2 dst 192.168.10.200# 依据源端口进行过滤tcpdump src port 8088# 依据指标端口进行过滤tcpdump dst port 8088具体应用参考:https://blog.csdn.net/weixin_...

July 7, 2022 · 1 min · jiezi

关于tcpdump:网络抓包-tcpdump-使用指南

在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优良工具一样,它的特点就是简略而弱小。它是基于Unix零碎的命令行式的数据包嗅探工具,能够抓取流动在网卡上的数据包。 监听所有网卡所有包 tcpdump监听指定网卡的包 tcpdump -i ens18监听指定IP的包 tcpdump host 192.168.1.11监听指定起源IP tcpdump src host 192.168.1.11监听指标地址IP tcpdump dst host 192.168.1.11监听指定端口 tcpdump port 80监听TCP tcpdump tcp监听UDP tcpdump udp监听192.168.1.11的tcp协定的80端口的数据包 tcpdump tcp port 80 and src host 192.168.1.1111:59:07.836563 IP 192.168.1.11.39680 > hello.http: Flags [.], ack 867022485, win 502, length 011:59:07.836711 IP 192.168.1.11.39680 > hello.http: Flags [P.], seq 0:77, ack 1, win 502, length 77: HTTP: HEAD / HTTP/1.111:59:07.838462 IP 192.168.1.11.39680 > hello.http: Flags [.], ack 248, win 501, length 011:59:07.838848 IP 192.168.1.11.39680 > hello.http: Flags [F.], seq 77, ack 248, win 501, length 011:59:07.839192 IP 192.168.1.11.39680 > hello.http: Flags [.], ack 249, win 501, length 0监听IP之间的包 ...

January 14, 2022 · 5 min · jiezi

关于tcpdump:tcpdump抓取客户端IP

一、简略疾速抓取客户端IP tcpdump tcp -i eth1 port 9200 >> /tmp/tcpdump.logless /tmp/tcpdump.log | grep 127.0.0.1 | awk '{print $3}' | grep -v '127.0.0.1' | awk -F . 'OFS="."{$NF="";print}' | sort | uniq -c | sort -nr

December 13, 2021 · 1 min · jiezi

关于tcpdump:抓包工具-tcpdump-用法说明

tcpdump采纳命令行形式对接口的数据包进行筛选抓取,其丰盛个性体现在灵便的表达式上。 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump过程终止才会进行抓包。 例如: shell> tcpdump -nn -i eth0 icmp上面是具体的tcpdump用法。 1.1 tcpdump选项它的命令格局为: tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]        [ -s snaplen ] [ -w file ] [ expression ]抓包选项:-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可缓存的数据包的数量,      :从而会导致数据包的失落,所以在能抓取咱们想要的包的前提下,抓取长度越小越好。输入选项:-e:输入的每行中都将包含数据链路层头部信息,例如源MAC和指标MAC。-q:疾速打印输出。即打印很少的协定相干信息,从而输入行都比拟简短。-X:输入包的头部数据,会以16进制和ASCII两种形式同时输入。-XX:输入包的头部数据,会以16进制和ASCII两种形式同时输入,更具体。-v:当剖析和打印的时候,产生具体的输入。-vv:产生比-v更具体的输入。-vvv:产生比-vv更具体的输入。其余功能性选项:-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都能够用于"-i"后。-F:从文件中读取抓包的表达式。若应用该选项,则命令行中给定的其余表达式都将生效。-w:将抓包数据输入到文件中而不是规范输入。能够同时配合"-G time"选项使得输入文件每time秒就主动切换到另一个文件。可通过"-r"选项载入这些文件以进行剖析和打印。-r:从给定的数据包文件中读取数据。应用"-"示意从规范输出中读取。举荐给你:值得珍藏!Linux零碎常用命令速查手册 所以罕用的选项也就这几个: tcpdump -Dtcpdump -c num -i int -nn -XX -vvv1.2 tcpdump表达式表达式用于筛选输入哪些类型的数据包,如果没有给定表达式,所有的数据包都将输入,否则只输入表达式为true的包。在表达式中呈现的shell元字符倡议应用单引号突围。 tcpdump的表达式由一个或多个"单元"组成,每个单元个别蕴含ID的修饰符和一个ID(数字或名称)。有三种修饰符: (1).type:指定ID的类型。 能够给定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默认的type为host。 (2).dir:指定ID的方向。 能够给定的值包含src/dst/src or dst/src and dst,默认为src or dst。例如,"src foo"示意源主机为foo的数据包,"dst net 128.3"示意指标网络为128.3的数据包,"src or dst port 22"示意源或目标端口为22的数据包。 (3).proto:通过给定协定限定匹配的数据包类型。 罕用的协定有tcp/udp/arp/ip/ether/icmp等,若未给定协定类型,则匹配所有可能的类型。例如"tcp port 21","udp portrange 7000-7009"。 所以,一个根本的表达式单元格局为"proto dir type ID" 除了应用修饰符和ID组成的表达式单元,还有关键字表达式单元:gateway,broadcast,less,greater以及算术表达式。 表达式单元之间能够应用操作符" and / && / or / || / not / ! "进行连贯,从而组成简单的条件表达式。如"host foo and not port ftp and not port ftp-data",这示意筛选的数据包要满足"主机为foo且端口不是ftp(端口21)和ftp-data(端口20)的包",罕用端口和名字的对应关系可在linux零碎中的/etc/service文件中找到。 ...

November 19, 2020 · 1 min · jiezi

tcpdump-icmp-ip报文分片

介绍主要演示了tcpdump捕捉icmp报文以及用ping命令指定icmp长度后ip分组的查看。 A发起正常包pingC:\Users\yaxia>ping 10.70.30.60正在 Ping 10.70.30.60 具有 32 字节的数据:来自 10.70.30.60 的回复: 字节=32 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=32 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=32 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=32 时间<1ms TTL=6410.70.30.60 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 0ms,平均 = 0msB 端查看结果root@php56:/home/tb# tcpdump -ntv -i enp0s3 icmptcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytesIP (tos 0x0, ttl 128, id 27746, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4795, length 40IP (tos 0x0, ttl 64, id 30075, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4795, length 40IP (tos 0x0, ttl 128, id 27748, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4796, length 40IP (tos 0x0, ttl 64, id 30127, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4796, length 40IP (tos 0x0, ttl 128, id 27750, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4797, length 40IP (tos 0x0, ttl 64, id 30365, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4797, length 40IP (tos 0x0, ttl 128, id 27752, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4798, length 40IP (tos 0x0, ttl 64, id 30534, offset 0, flags [none], proto ICMP (1), length 60) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4798, length 40A发送大于MTU的数据包C:\Users\yaxia>ping 10.70.30.60 -l 1473正在 Ping 10.70.30.60 具有 1473 字节的数据:来自 10.70.30.60 的回复: 字节=1473 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=1473 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=1473 时间<1ms TTL=64来自 10.70.30.60 的回复: 字节=1473 时间<1ms TTL=6410.70.30.60 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 0ms,平均 = 0msB接收结果(可以看到ip包多了一倍)P (tos 0x0, ttl 128, id 27801, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4799, length 1480IP (tos 0x0, ttl 128, id 27801, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.47 > 10.70.30.60: ip-proto-1IP (tos 0x0, ttl 64, id 10022, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4799, length 1480IP (tos 0x0, ttl 64, id 10022, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.60 > 10.70.30.47: ip-proto-1IP (tos 0x0, ttl 128, id 27803, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4800, length 1480IP (tos 0x0, ttl 128, id 27803, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.47 > 10.70.30.60: ip-proto-1IP (tos 0x0, ttl 64, id 10189, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4800, length 1480IP (tos 0x0, ttl 64, id 10189, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.60 > 10.70.30.47: ip-proto-1IP (tos 0x0, ttl 128, id 27805, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4801, length 1480IP (tos 0x0, ttl 128, id 27805, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.47 > 10.70.30.60: ip-proto-1IP (tos 0x0, ttl 64, id 10418, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4801, length 1480IP (tos 0x0, ttl 64, id 10418, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.60 > 10.70.30.47: ip-proto-1IP (tos 0x0, ttl 128, id 27807, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4802, length 1480IP (tos 0x0, ttl 128, id 27807, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.47 > 10.70.30.60: ip-proto-1IP (tos 0x0, ttl 64, id 10429, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4802, length 1480IP (tos 0x0, ttl 64, id 10429, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.60 > 10.70.30.47: ip-proto-1摘出来一个被分片的ip数据包IP (tos 0x0, ttl 128, id 27801, offset 0, flags [+], proto ICMP (1), length 1500) 10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4799, length 1480IP (tos 0x0, ttl 128, id 27801, offset 1480, flags [none], proto ICMP (1), length 21) 10.70.30.47 > 10.70.30.60: ip-proto-1简单解释id都为27081,说明为同一个ip数据报的分片。第一个ip分组的offset 为0,第二个为1480.第一个ip分组的flags为+,实则设置了MF标志,表示后续还有分片,第二个flag为none第一个ip分组长度为1500,第二个为21-l 1473字节的由来win下查看A端mtu ...

November 4, 2019 · 4 min · jiezi

tcp-快速掌握tcpdump抓包

一说到抓包,好像有点高深莫测,其实在工作中,大部分是应用发生异常时需要抓包,以此来分析原因,Linux下一般用tcpdump命令抓包,而使用tcpdump其实常用的参数也就那么几个 抓包主要是看数据传输是否都走了正确的TCP协议,比如因为网络或者攻击导致某些包(SYN TIME_WAIT)等特别多,这个时候抓包就很容看出来 因此抓包不必记太多参数,只要能过滤到我们想要的包即可 tcpdump命令常用参数-i 指定网络接口,例如eth0、lo、pp0等等的界面看一段直接用tcpdump命令抓包的文档-S 将tcp的序列号以绝对值形式输出,默认相对值-nn 不进行端口名称的转换,默认转换,比如22端口会显示ssh-w 存储抓到的包,一般.cap格式-v 输出更详细的报文信息,可以多个v一起使用,如-vvvvor|and|nor 与或非,以下参数如多个使用,则需要用到host 指定过滤的ip,比如10.0.0.1,那么只抓与该ip相关的包port 指定过滤的端口src host 指定过滤的源ipdst host 指定过滤的目的ipsrc port 指定过滤的源端口dst port 指定过滤的目的端口tcpdump抓包实例tcpdump -S -nn port 443 and host 10.88.77.15tcpdump -S -nn port 443 and host 10.88.77.15 -w /tmp/dump.wap 如抓取过滤有host为10.25.137.230和端口443tcpdump -S -nn host 10.25.137.230 and port 443 15:39:07.427683 IP 10.25.137.230.20260 > 10.29.64.142.443: Flags [P.], seq 1026816011:1026816267, ack 1193238686, win 115, length 256以此行为例15:39:07.427683 网络包发生的时间IP 10.25.137.230.20260 > 10.29.64.142.443: IP标识源ip或者源主机名和端口20260;>流向符,数据包从左边发往右边目的ip或者目的主机名和端口443Flags [P.] Flags的标记,此处为[P.],代表PST和ACK(.代表ACK确认) ...

July 4, 2019 · 1 min · jiezi

tcp-使用socket模拟分析tcp协议

写两段简单的python代码,然后来抓包分析tcp协议 服务端IP:172.16.196.145客户端IP:172.16.196.142 TCP三次握手、四次挥手server端代码import sockets = socket.socket()s.bind(('172.16.196.145',60000))s.listen(5)while 1: conn, addr = s.accept() date = conn.recv(1024) if date == 'get': conn.send('200 ok') conn.close() print 'Connected by', addr, 'now closed'client端代码import sockets = socket.socket()s.connect(('172.16.196.145',60000))s.send('get')print s.recv(1024)s.close()tcpdump抓包1 12:43:46.905723 IP 172.16.196.142.41334 > 172.16.196.145.60000: Flags [S], seq 3255498564, win 14600, options [mss 1460,sackOK,TS val 1412272238 ecr 0,nop,wscale 7], length 02 12:43:46.905751 IP 172.16.196.145.60000 > 172.16.196.142.41334: Flags [S.], seq 4195434198, ack 3255498565, win 14480, options [mss 1460,sackOK,TS val 1425611003 ecr 1412272238,nop,wscale 7], length 03 12:43:46.905987 IP 172.16.196.142.41334 > 172.16.196.145.60000: Flags [.], ack 4195434199, win 115, options [nop,nop,TS val 1412272238 ecr 1425611003], length 04 12:43:46.906031 IP 172.16.196.142.41334 > 172.16.196.145.60000: Flags [P.], seq 3255498565:3255498568, ack 4195434199, win 115, options [nop,nop,TS val 1412272238 ecr 1425611003], length 35 12:43:46.906041 IP 172.16.196.145.60000 > 172.16.196.142.41334: Flags [.], ack 3255498568, win 114, options [nop,nop,TS val 1425611003 ecr 1412272238], length 06 12:43:46.906265 IP 172.16.196.145.60000 > 172.16.196.142.41334: Flags [P.], seq 4195434199:4195434205, ack 3255498568, win 114, options [nop,nop,TS val 1425611003 ecr 1412272238], length 67 12:43:46.906305 IP 172.16.196.145.60000 > 172.16.196.142.41334: Flags [F.], seq 4195434205, ack 3255498568, win 114, options [nop,nop,TS val 1425611003 ecr 1412272238], length 08 12:43:46.906406 IP 172.16.196.142.41334 > 172.16.196.145.60000: Flags [.], ack 4195434205, win 115, options [nop,nop,TS val 1412272239 ecr 1425611003], length 09 12:43:46.906487 IP 172.16.196.142.41334 > 172.16.196.145.60000: Flags [F.], seq 3255498568, ack 4195434206, win 115, options [nop,nop,TS val 1412272239 ecr 1425611003], length 010 12:43:46.906500 IP 172.16.196.145.60000 > 172.16.196.142.41334: Flags [.], ack 3255498569, win 114, options [nop,nop,TS val 1425611004 ecr 1412272239], length 0逐行分析第一行: 客户端172.16.196.142,端口41336向服务端172.16.196.145端口60000发起SYN主动请求,seq:3255498564第二行: 服务端172.16.196.145.60000给客户端172.16.196.142.41336确认ACK ack为3255498564+1=3255498565,并同时也发起SYN同步第三行: 客户端回复服务端的SYN确认,三次握手建立连接第四行: 客户端调用s.send('get'),发送数据,因此为P标记(PST),seq:3255498565:3255498568第五行: 服务端回复客户端ACK确认标记,ack:3255498568第六行: 服务端调用conn.send('200 ok')给客户端回复数据,为P标记(PST),seq:4195434199:4195434205第七行: 服务端发送回复数据后,关闭连接,发起FIN主动关闭,seq:4195434205第八行: 客户端回复服务端数据(第六行)的确认ACK,ack:4195434205第九行: 客户端发送FIN关闭连接,seq:3255498568 ack:4195434206第十行: 服务端发送客户端FIN的确认,由此,整个连接关闭 ack:3255498569 ...

July 3, 2019 · 4 min · jiezi

tcp-tcpdump抓包第三次握手ack数值为1

在用tcpdump抓包时,发现前面两次握手的seq和ack能对应起来,但是第三次由客户端发起的确认ack值为1,熟悉tcp三次握手的都知道,ack的值是对方的seq+1,第三次握手的ack值不应该是1,测试抓了各种端口的tcp包发现都是这样,难道是因为tcp协议改动了? tcpdump抓包复现直接tcpdump命令即可,如果更详细点的信息,可加-v不过跟当前复现内容没有太多关系 14:29:06.049398 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [S], seq 413886776, win 29130, options [mss 1942,sackOK,TS val 2047175890 ecr 0,nop,wscale 9], length 014:29:06.049406 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [S.], seq 1511062036, ack 413886777, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 014:29:06.049711 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [.], ack 1, win 57, length 014:29:06.050075 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [P.], seq 1:20, ack 1, win 57, length 1914:29:06.050087 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [.], ack 20, win 115, length 014:29:06.050107 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [P.], seq 1:184, ack 20, win 115, length 18314:29:06.050118 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [F.], seq 184, ack 20, win 115, length 0第一行100.116.251.137端口53686向10.0.0.15端口81发起了SYN主动连接的请求,seq为413886776 ...

June 26, 2019 · 1 min · jiezi

Directory-Not-Empty-删不掉的幽灵

无法删除的文件最近部门NAS测试团队遇到一个非常诡异的问题,在删除一棵存在SMB共享文件夹的文件树时,删除完子目录的所有文件后,再删除这个子目录的时候居然系统报出“Directory Not Empty”的错误从而导致用例测试未通过,打开这个目录一看,确实有一个文件并未删除成功,再查看I/O工具的日志,报告所有的文件都已经成功删除。难道是I/O工具出了问题而没有正确报出错误,这个经过工具开发者的研究后确认后貌似工具没有任何问题,这个问题起初被开发团队踢皮球,死活不承认是SMB2服务器的问题。死活非得让抓取网络包来证实。 作为一个网络分析的伪专家,自己也厚着脸皮主动蹭入NAS测试团队强行出力,希望把这个悬案搞个谁落石出。 抓包重现首先,设置好抓包参数,同时重现问题,这一步很顺利。由于测试参数没有任何更改,很顺利的重现了问题,并且将出问题对应时间点的网络包悉数抓到。 在Windows2106的客户端开启抓包工具wireshark(其对应的命令行工具为 tshark), 并且设置好相关参数: $ tshark -i ens1 -B 4096 -s 1024 -w client-traffic.pcap参数的含义就是在接口ens1上抓取长度为1024字节的每一个帧, 并把这些帧存在client-traffic.pcap的文件里 分析在抓取到网络包以后,我们开始解包分析: 同样通过tshark命令解包分析, 并将揭开的内容分别重定向到摘要文件client-traffic.summary和详细展开格式的client-traffic.detail文件当中: $ tshark -t ud -Y "ip.addr==<server-ip>" -r client-traffic.pcap >>client-traffic.summary$ tshark -t ud -O smb2 -Y "ip.addr==<server-ip>" -r client-traffic.pcap >>client-traffic.detail打开client-traffic.summary文件后的一步就是要找到对应未删除成功的文件(文件名: VCg8iMkGWgll2VJoEFMUa0FKp1DJHEG2)最后一次出现的帧,简单的通过文本搜索便可定位,找到对应的帧以后发现,这个操作是一个Create操作,根据协议[MS-SMB2], 删除操作是通过一组三元操作 Create/SetInfo/Close来实现的,称为Delete-On-Close,由于我们正要寻找的是删除操作,借此可以大胆推测,这个Create (Frame #210725)请求正是三元删除重的第一步, 再往后的帧一个个寻找,果然找到了第二步SetInfo (Frame #210727) 和第三步Close (Frame #210757, 通过该帧展开后确认其FileID属性与前两步操作对象一致) 两个请求以及对应的服务器端的回复:最后Close并未得到服务器回复 Delete-On-Close 操作中的前两步Delete-On-Close 操作中的前两步然而最后的一步的close 请求(Frame #210757)并未得到服务器端的回复,那么问题显然出在了这里,继续往下分析,为什么服务器没有对最后一步close操作作出响应呢? 最后Close并未得到服务器回复 奇怪的是,这个close操作发出后在0.1秒内没有得到任何回复,于是出发了TCP层的超时重传(RTO)(Frame #210765),按道理说在同一个实验室的内部网络下,网络状况是十分好的,基本上不可能发生RTO的情况(即便连快速重传也是极为罕见的),除非服务器出现了宕机。此时我突然想到我们测试当中为了测试SMB2的CA功能(Continues Availability:高可靠性,容忍服务器重启或者故障转移), 经常会引入错误注入的测试用例,再次翻看测试日志,果然发现在创建和删除文件操作的同时有重启服务器节点的操作执行,查看时间戳和发生问题的时间点一直,现在基本可以明确的是,发生的问题和CA有关了。 删除文件同时服务器重启 现在来看看正常的CA流程,当客户端一个SMB2请求遇到服务器重启的情况下,网络会暂时断开,发出的请求在若干次超时重传以后会收到服务重启后发出的TCP重置请求(RST)(Frame #210769), 客户端在收到此请求后便可得知网络发生了断连,为是后续操作得以延续,必须再次建立TCP的连接(通过三次握手 Frame #210770, #210771, #210772), 重新协商(Negotiate. Frame #210773)建立会话(Session Setup. Frame #210776)和共享文件根目录的连接(Tree Connect. Frame #210785), 最后,因为客户端知道在网络断连之前最后一次没有响应的操作即目标文件,此时客户端会通过Create操作(Frame #210787)重新发起一个对目标文件的连接(在client-traffic.detail可看到展开后的Create操作的RECONNECT信息),从而接续上服务器从其前的步骤,实现CA的功能特性 ...

May 11, 2019 · 1 min · jiezi

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

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。[TOC] 这篇文章我总结得比较详尽,可以当字典查,建议收藏,不过别光顾着收藏,点赞什么的鼓励我一下,这能让我更有动力给大家输出更好的内容。 01 简介tcpdump 是一款 Linux 平台的抓包工具。它可以抓取涵盖整个 TCP/IP 协议族的数据包,支持针对网络层、协议、主机、端口的过滤,并提供 and、or、not 等逻辑语句来过滤无用的信息。 tcpdump 是一个非常复杂的工具,掌握它的方方面面实属不易,也不推荐,能够用它来解决日常工作问题才是关系。 02 tcpdump 命令选项tcpdump 有很多命令选项,想了解所有选项可以 Linux 命令行输入 tcpdump -h,man tcpdump 查看每个选项的意思。 [root@by ~]# tcpdump -htcpdump version 4.9.2libpcap version 1.5.3OpenSSL 1.0.2k-fips 26 Jan 2017Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q|-P in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]下面列举一些常用选项: ...

April 22, 2019 · 4 min · jiezi

网络分析利器wireshark命令版:tshark使用示例(2)

tshark是wireshark网络分析工具下的一个分支,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理介绍tshark相关内容。基本用法常用命令查看tshark版本tshark -v列出当前存在的网络接口tshark -D网卡描述依据OS有不同的编号方式,在不了解网络设备及编号情况下,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。注: linux可以结合ifconfig命令查看tshark对指定网卡监听,抓包sudo tshark -i <interface>抓取网卡eth0的流量并写入capture123.pcaptshark -i eth0 -w capture123.pcap读取之前的文件capture123.pcaptshark -i eth0 -r capture123.pcap抓取网卡eth0的流量10分钟tshark -i eth0 -a duration:600注: 默认时间单位为秒抓取网卡eth0的10000个数据包tshark -c 10000 -i eth0抓取网卡eth0涉及192.168.1.1的流量报文tshark -i eth0 -f “host 192.168.1.1”注: 与wireshark、tcpdump一致,均使用BPF过滤表达式抓取网卡eth0指定协议的流量报文tshark -i eth0 -f “<协议名>”协议名可以为: tcp, udp, dns, icmp, http等案例实时打印当前mysql查询语句tshark -s 512 -i eth1 -n -f ’tcp dst port 3306’ -R ‘mysql.query’ -T fields -e mysql.query说明:-s 512 :只抓取前512个字节数据-i eth0 :监听eth0网卡-n :禁止域名解析-f ‘tcp dst port 3306’ :只捕捉协议为tcp,目的端口为3306的数据包-R ‘mysql.query’ :过滤出mysql.query查询语句的报文-T fields -e mysql.query :打印mysql查询语句实时打印当前http请求的url(包括域名)tshark -s 512 -i eth1 -n -f ’tcp dst port 8000’ -R ‘http.host and http.request.uri’ -T fields -e http.host -e http.request.uri -l | tr -d ’t’说明:-s 512 :只抓取前512个字节数据-i eth1 :监听eth1网卡-n :禁止网络对象名称解析-f ‘tcp dst port 8000’ :只捕捉协议为tcp,目的端口为8000的数据包-R ‘http.host and http.request.uri’ :过滤出http.host和http.request.uri-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri-l :输出到标准输出读取之前抓包文件进行报文数据分析需要从抓包的文件evidence04.pcap中提取出报文相关数据信息,如时间、源IP、目的IP、协议名、源Port、標Port、包大小等信息,最后输出到csv文件。tshark -r evidence.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e frame.len -E header=n -E separator=, -E quote=n -E occurrence=f > output.csv说明:-r evidence.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time_relative 取出封包的相对时间-e ip.src 提取源IP-e ip.dst 提取目的IP-e ip.proto 提取协议名-e tcp.srcport 提取源Port-e tcp.dstport 提取目的Port-e frame.len 提取数据帧大小-E header=n 是否输出字段名称(cvs的第1行)-E separator=, 指定分割符,/t是tab,/s是一格空格-E quote=n 指定是否对字段用引号,d是双引号,s是单引号,n是不用-E occurrence=f 多值时是否保留,f是第一个值,l是最后一个值,a是所有值都列出,默认全部output.csv 输出文件路径及名称DNS报文过滤使用tshark过滤dns cap包中源ip、目的ip、request请求tshark -r test.cap -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -R ‘udp.dstport==53 || dns’说明:-r test.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time 提取数据帧时间-e ip.src 提取源IP-e ip.dst 提取目的IP-e dns.qry.name 提取dns查询的域名信息-R ‘udp.dstport==53 || dns’ 显示过滤,仅对udp目标端口为53或者dns协议的报文进行处理默认直接显示在终端上,不记录文件。常见问题tshark: Only read filters, not capture filters, can be specified when reading a capture file.tshark -r 20190409.pcap -f ‘udp’ -w udp-20190409.pcap读取文件时只能使用显示过滤,也就是只能使用-Y或-2 -R过滤tshark: -R without -2 is deprecated. For single-pass filtering use -Y.tshark -r 20190409.pcap -R ‘udp’ -w udp-20190409.pcap显示过滤-R参数需要和-2一起使用,或使用-Y参考:tshark很快,但要怎麼用?ethereal-filter使用tshark 和 shell脚本分析 DNS pcap包 系列文章: 网络分析利器wireshark命令版:tshark简介(1)网络分析利器wireshark命令版:tshark使用示例(2) ...

April 16, 2019 · 2 min · jiezi

网络分析利器wireshark命令版:tshark简介(1)

tshark是网络分析工具wireshark下的一个工具,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理tshark相关:简介安装在linux下安装(debian或ubuntu)sudo apt-get install tshark安装完成后在抓包之前,可以先检查版本、查看帮助等了解tshark初步了解安装后检查按照安装wireshark的方式,安装完成后,启动“终端”(命令提示符):tshark -vtshark参数命令解析查看帮助如下:➜ ~ tshark -hTShark (Wireshark) 3.0.1 (v3.0.1-0-gea351cd8)Dump and analyze network traffic.See https://www.wireshark.org for more information.Usage: tshark [options] …主要参数说明接口报文捕捉 -i <interface> 接口名或网卡编号 (默认: 第一个非环回接口) -f <capture filter> 使用libpcap过滤表达式进行包过滤 -s <snaplen> 设置每个抓包的大小,默认为65535。 (相当于tcpdump的-s,tcpdump默认抓包的大小仅为68) -p 不使用混杂模式抓捕报文(即只抓取与本机有关的流量) -I 如果支持则启用镜像模式 -B <buffer size> 内核缓存大小 (默认2MB) -y <link type> 链路层类型 (默认为找到的第一个协议) –time-stamp-type <type> 接口时间戳类型 -D 列出所有接口并退出 -L 列出所有接口链路层类型并退出(供-y参数使用) –list-time-stamp-types 列出所有接口时间戳类型并退出(供–time-stamp参数使用)捕获终止条件 -c <packet count> 捕获到n个包时停止 (默认不限,持续捕获) -a <autostop cond.> … duration:NUM - 捕获进行NUM后停止 filesize:NUM - 输出文件大于NUM KB后停止 files:NUM - 输出超过NUM个文件后停止捕获输出 -b <ringbuffer opt.> … duration:NUM - 在NUM秒后写入下一个文件(文件名由-w参数决定) interval:NUM - create time intervals of NUM secs filesize:NUM - 在文件大于NUM KB后写入下一个文件 files:NUM - 循环缓存: 在NUM个文件后替换早前的读取文件-r <infile|-> 设置需要读取的文件名及路径(或’-‘表示标准输入,从终端输入)分析处理 -2 执行two-pass分析 -M <packet count> 执行会话自动重置 -R <read filter> 包读取过滤使用wireshark显示过滤表达式(配合-2参数) -Y <display filter> 包显示过滤使用wireshark显示过滤表达式 -n 不进行名称解析 (def: all enabled) -N <name resolve flags> 启用指定的地址名字解析: “mnNtdv” (“m”代表MAC层,“n”代表网络层,“t”代表传输层,“N”代表当前异步DNS查找。) -d <layer_type>==<selector>,<decode_as_protocol> … “解析为”,详见man帮助页面。例: tcp.port==8888,http (注意选择子和解包协议之间不能留空格) -H <hosts file> 读取主机列表文件,将被写入捕获的文件(Implies -W n) –enable-protocol <proto_name> 启用协议报文解析 –disable-protocol <proto_name> 不对指定协议报文解析 –enable-heuristic <short_name> 启用协议报文启发式解析 –disable-heuristic <short_name> 不对指定协议报文启发式解析输出 -w <outfile|-> 使用pcapng格式将报文写入"outfile"文件 (或’-‘表示标准输出,直接显示在终端) -C <config profile> 启动时使用指定的配置文件 -F <output file type> 设置输出文件格式类型, 默认为pcapng格式 “-F"留空则列出所有的文件类型 -V 输出中增加报文层次树(包详细信息) -O <protocols> 仅显示以下协议的详细信息,逗号分割 -P 每写入一个文件后进行包情况汇总 -S <separator> 数据包之间的行分割符 -x 输出中增加16进制和ascii字符信息(报文按字节显示) -T pdml|ps|psml|json|jsonraw|ek|tabs|text|fields|? 文本输出格式 (默认文本:text) -j <protocolfilter> 当-T ek|pdml|json 设置时协议层过滤 (例:“ip ip.flags text”, 过滤不展开的所有字节点,除非过滤中有指定的子节点) -J <protocolfilter> 当 -T ek|pdml|json 选项设置时进行顶层协议过滤, (例: “http tcp”, 过滤展开的所有字节点) -e <field> 当 -T fields 设置时打印字段 (如tcp.port,_ws.col.Info) 此选项可以多个用于打印多个字段 -E<fieldsoption>=<value> 当-Tfields选项启用时用于输出配置: bom=y|n 打印UTF-8 BOM header=y|n 选择首行是否输出字段名(类似表头) separator=/t|/s|<char> 选择字段采用tab、空格、指定可打印字符为分割符 occurrence=f|l|a 打印第一个、最后一个或全部出现的数值(默认全部) aggregator=,|/s|<char> 选择字段采用逗号、空格、指定可打印字符聚合字段 quote=d|s|n 选择对数值采用双引号、单引号、不用引号 -t a|ad|d|dd|e|r|u|ud|? 输出格式化的时间戳(默认r: rel. 优先) -u s|hms 输出格式化秒(默认s:秒) -l 每个包之后就刷新标准输出 -q 向终端输出少量信息 (e.g. 当使用统计) -Q 仅向stderr输出确切错误信息(比-q信息更少) -g 启用组用户读取输出文件 -W n 如果支持,保存额外信息到文件中 n = 写入网络地址解析信息 -X <key>:<value> 扩展选项,详见man页面 -U tap_name PDUs专家模式, 详见man帮助页面 -z <statistics> 大量统计,详见man帮助页面 –capture-comment <comment> 在最新创建的输出文件中增加捕获注释(仅支持pcapng格式) –export-objects <protocol>,<destdir> 保存指定导出协议对象到指定目录 –color 在输出的文本格式中支持类似Wireshark图形界面的色彩,终端需要支持24位彩色 同时支持pdml、psml的色彩属性(注:这两张属性非标准) –no-duplicate-keys 如果-T json设置, 合并重复键,将多个值归并在一个键下的数组中 –elastic-mapping-filter <protocols> 如果指定-G elastic-mapping,设置仅mapping文件中指定的协议杂项 -h 显示帮助 -v 显示版本 -o <name>:<value> … 覆盖配置项 -K <keytab> 使用keytab文件用于解密kerberos -G [report] 生成一份或多份报告,默认report=“fields” 使用”-G help"获取更多信息补充说明支持包输出格式可用作不同格式转化工具,推荐使用默认的pcapngtshark -Ftshark: option requires an argument – Ftshark: The available capture file types for the “-F” flag are:… pcap - Wireshark/tcpdump/… - pcap pcapng - Wireshark/… - pcapng…捕获过滤(Capture Filter)抓包前在网络接口上设置过滤的,使用BPF表达式(tcpdump、libpcap通用)。通常用于抓取指定的ip、协议,可定位到3层,可以通过简单字符进行。不建议作过多过滤(规则复杂可能影响抓包性能)读取(显示)过滤(Display Filter)用于抓包之后,能够对报文可识别的协议字段进行过滤,可对2~7层过滤,可使用逻辑表达式,多个条件结合使用。注意:建议在使用时,先在wireshare过滤栏调试,具有字段提示,表达式合规会显示绿色参考:tshark linux 命令tshark官方文档 ...

April 16, 2019 · 2 min · jiezi

网络分析利器:tshark

tshark是wireshark网络分析工具下的一个分支,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。主要参数抓包接口类-i 设置抓包的网络接口,不设置则默认为第一个非自环接口-D 列出当前存在的网络接口-f 设定抓包过滤表达式-s 设置每个抓包的大小,默认为65535。(相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)-p 设置网络接口以非混合模式工作,即只关心和本机有关的流量。-B 设置内核缓冲区大小,仅对windows有效。-y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。-L 列出本机支持的数据链路层协议,供-y参数使用。 抓包进度控制-c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。-a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。文件控制-b 设置ring buffer文件参数。 ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件;“-b filesize:5”表示每达到5kB写下一个ring buffer文件;“-b files:7”表示ring buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。过滤处理-R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来-n 禁止所有地址名字解析(默认为允许所有)-N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析-d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格输出格式-w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数-F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式-V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary-x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据-T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)-S 在向raw文件输出的同时,将解码结果打印到控制台-l 在处理每个包时即时刷新输出-X 扩展项-q 设置安静的stdout输出(例如做统计时)-z 设置统计参数其它-h 显示命令行帮助-v 显示tshark的版本信息-o 重载选项基本用法在linux下安装(debian或ubuntu)sudo apt-get install tshark安装完成后在抓包之前,可以先检查版本、查看帮助等了解tshark初步了解查看tshark版本tshark -v列出当前存在的网络接口tshark -D网卡描述依据OS有不同的编号方式,在不了解网络设备及编号情况下,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。注: linux可以结合ifconfig命令查看tshark对指定网卡监听,抓包sudo tshark -i <interface>抓取网卡eth0的流量并写入capture123.pcaptshark -i eth0 -w capture123.pcap读取之前的文件capture123.pcaptshark -i eth0 -r capture123.pcap抓取网卡eth0的流量10分钟tshark -i eth0 -a duration:600注: 默认时间单位为秒抓取网卡eth0的10000个数据包tshark -c 10000 -i eth0抓取网卡eth0涉及192.168.1.1的流量报文tshark -i eth0 -f “host 192.168.1.1”注: 与wireshark、tcpdump一致,均使用BPF过滤表达式抓取网卡eth0指定协议的流量报文tshark -i eth0 -f “<协议名>”协议名可以为: tcp, udp, dns, icmp, http等案例实时打印当前mysql查询语句tshark -s 512 -i eth1 -n -f ’tcp dst port 3306’ -R ‘mysql.query’ -T fields -e mysql.query说明:-s 512 :只抓取前512个字节数据-i eth0 :监听eth0网卡-n :禁止域名解析-f ‘tcp dst port 3306’ :只捕捉协议为tcp,目的端口为3306的数据包-R ‘mysql.query’ :过滤出mysql.query查询语句的报文-T fields -e mysql.query :打印mysql查询语句实时打印当前http请求的url(包括域名)tshark -s 512 -i eth1 -n -f ’tcp dst port 8000’ -R ‘http.host and http.request.uri’ -T fields -e http.host -e http.request.uri -l | tr -d ’t’说明:-s 512 :只抓取前512个字节数据-i eth1 :监听eth1网卡-n :禁止网络对象名称解析-f ‘tcp dst port 8000’ :只捕捉协议为tcp,目的端口为8000的数据包-R ‘http.host and http.request.uri’ :过滤出http.host和http.request.uri-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri-l :输出到标准输出读取之前抓包文件进行报文数据分析需要从抓包的文件evidence04.pcap中提取出报文相关数据信息,如时间、源IP、目的IP、协议名、源Port、標Port、包大小等信息,最后输出到csv文件。tshark -r evidence.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e frame.len -E header=n -E separator=, -E quote=n -E occurrence=f > output.csv说明:-r evidence.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time_relative 取出相對封包時間的欄位資料-e ip.src 提取源IP-e ip.dst 提取目的IP-e ip.proto 提取协议名-e tcp.srcport 提取源Port-e tcp.dstport 提取目的Port-e frame.len 提取包大小-E header=n 是否输出字段名称(cvs的第1行)-E separator=, 指定分割符,/t是tab,/s是一格空格-E quote=n 指定是否对字段用引号,d是双引号,s是单引号,n是不用-E occurrence=f 多值时是否保留,f是第一个值,l是最后一个值,a是所有值都列出,默认全部 output.csv 输出文件路径及名称参考:tshark linux 命令tshark官方文档tshark很快,但要怎麼用?ethereal-filter ...

April 13, 2019 · 2 min · jiezi