什么是tcpdump,tcpdump是Linux上一个强大的网络请求采集工具。它可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 为方便查看,我们一般会选择将tcpdump 根据条件抓取主机上的请求数据包写入cap/pcap 文件,在请求量比较大的服务器或者设置过滤条件不合理,会导致抓到的数据包很庞大,因此抓包前需考虑好分包和磁盘空间,以免造成生产异常。下面开始介绍tcpdump 基本操作。 使用:tcpdump 参数;参数列表可通过help查看。默认tcpdump 命令直接运行,将监视第一个网络接口上所有流过的数据包。其详细参数如下:
这里列出自己比较常用的命令:
#抓取全量包,以50M分一个包 tcpdump -i any -s0 -C 50 -w /1.cap #抓50个包,全量 tcpdump -i any -s0 -c 50 -w /1.cap#抓1分钟包,全量tcpdump -i any -s0 -G 60 -w /1.cap#根据目标IP,指定网卡tcpdump -i eth0 -s0 dst 127.0.0.1 and port 80 -n -w /1.cap记录该命令以供参考,来源Linux命令大全:
tcpdump
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。
打印所有进入或离开sundown的数据包。
tcpdump host sundown
指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1
打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host helios and ( hot or ace )
截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 )
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname
监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 host 210.27.48.1
对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump udp port 123
打印本地主机与Berkeley网络上的主机之间的所有通信数据包
tcpdump net ucb-ether
ucb-ether此处可理解为“Berkeley网络”的网络地址,此表达式最原始的含义可表达为:打印网络地址为ucb-ether的所有数据包
打印所有通过网关snup的ftp数据包
tcpdump ‘gateway snup and (port ftp or ftp-data)’
注意:表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析
打印所有源地址或目标地址是本地主机的IP数据包
tcpdump ip and not net localnet
如果本地网络通过网关连到了另一网络,则另一网络并不能算作本地网络。
TCP 连接断开简述
抓到包后,一般通过嗅探包解析工具进行分析。我们这边采用 wireshark 进行分析,在此也通过 wireshark 进行讲解。
在讲述 wireshark 分析 tcpdump 前,需要先了解 TCP 协议及其传输数据过程,以便理解数据库含义。
在此仅讲述 tcp 连接、断开过程中的 3 次握手和 4 次挥手过程
tcp 三次握手
TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端连接工作。
所谓三次握手,是指建立一个 TCP 连接时需要客户端和服务端总共发送三个包已确认连接的建立。
先来了解下相关名词:
字段 | 含义 |
URG | 紧急指针是否有效。为1,表示某一位需要优先被处理 |
ACK | 确认号是否有效。一般置为1 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走 |
RST | 对方要求重建连接,复位 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始设定,建立连接,设置为1 |
FIN | 希望断开连接 |
三次握手详图如下:
三次握手的过程如下
第一次:客户端尝试连接服务器,向服务器发送 syn 包(同步序列编号 Synchronize Sequence Numbers),syn=j,客户端进入 SYN_SEND 状态等待服务器确认。
第二次:服务器接收客户端 syn 包并确认(ack=j+1),同时向客户端发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态
第三次:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手
当三次连接完成后,客户端和服务端便可以开始通信
在通信过程中,依旧采用一问一答模式。
四次挥手,是指在客户端和服务端断开时,需要发送四个包以进行断开确认
四次挥手详图如下:
四次挥手过程如下:
第一次:客户端发出释放 FIN=1,自己序列号 seq=u,进入 FIN-WAIT-1 状态。
第二次:服务器收到客户端的后,发出 ACK=1 确认标志和客户端的确认号 ack=u+1,自己的序列号 seq=v,进入 CLOSE-WAIT 状态。
第三次:客户端收到服务器确认结果后,进入 FIN-WAIT-2 状态。此时服务器发送释放 FIN=1 信号,确认标志 ACK=1,确认序号 ack=u+1,自己序号 seq=w,服务器进入 LAST-ACK(最后确认态)。
第四次:客户端收到回复后,发送确认 ACK=1,ack=w+1,自己的 seq=u+1,客户端进入 TIME-WAIT(时间等待)。客户端经过 2 个最长报文段寿命后,客户端 CLOSE;服务器收到确认后,立刻进入 CLOSE 状态。
四次挥手过程理解:
因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client 端,“你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。
1.为了保证 A 发送的最后一个 ACK 报文段能够到达 B。这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的 B 收不到对已发送的 FN+ACK 报文段的确认。B 会超时重传这个 FIN+ACK 报文段,而 A 就能在 2MSL 时间内收到这个重传的 FN+ACK 报文段。接着 A 重传一次确认,重新启动 2MSL 计时器。最后,A 和 B 都正常进入到 CLOSED 状态。如果 A 在 TIME-WAIT 状态不等待一段时间,而是在发送完 ACK 报文段后
立即释放连接,那么就无法收到 B 重传的 FIN+ACK 报文段,因而也不会再发送一次确认报文段。这样,B 就无法按照正常步骤进入 CLOSED 状态。
2.防止之前提到的“已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段 B 只要收到了 A 发出的确认,就进入 CLOSED 状态。同样,B 在撤销相应的传输控制块 TCB 后,就结束了这次的 TCP 连接。我们注意到,B 结束 TCP 连接的时间要比 A 早
些。
3 次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机 S 和 C 之间的通信,假定 C 给 S 发送一个连接请求分组,S 收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S 认为连接已经成功地建立了,可以开始发送数据分组。可是,C 在 S 的应答分组在传输中被丢失的情况下,将不知道 S 是否已准备好,不知道 S 建立什么样的序列号,C 甚至怀疑 S 是否收到自己的连接请求分组。在这种情况下,C 认为连接还未建立成功,将忽略 S 发来的任何数据分 组,只等待连接确认应答分组。而 S 在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
TCP 还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为 2 小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔 75 秒钟发送一次。若一连发送 10 个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
过滤器语法如下:
1、抓包过滤器语法和实例
抓包过滤器类型 Type(host、net、port)、方向 Dir(src、dst)、协议 Proto(ether、ip、tcp、udp、http、icmp、ftp 等)、逻辑运算符(&& 与、|| 或、!非)(1)协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。 TCP,只显示 TCP 协议的数据包列表 HTTP,只查看 HTTP 协议的数据包列表 ICMP,只显示 ICMP 协议的数据包列表(2)IP 过滤
host 192.168.1.104 src host 192.168.1.104 dst host 192.168.1.104(3)端口过滤
port 80 src port 80 dst port 80(4)逻辑运算符&& 与、|| 或、!非
src host 192.168.1.104 && dst port 80 抓取主机地址为 192.168.1.80、目的端口为 80 的数据包 host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104 或者192.168.1.102 的数据包 !broadcast 不抓取广播数据包wireshark提供了着色分析,即不通数据包通过不同颜色标明,也可以已在自定义,通过试图–>着色规则可查看
在抓取到的包中,通常会存在这一些异常包说明,常见的TCP错误如下:
当我们过滤到需要的数据包后,可通过follow tcp的方式来跟踪起整个tcp 流程
右键数据流即可打开
会打开两个窗口,分别为过滤的请求包和数据包中具体信息。
打开包后,即可开始具体信息
包的结构如下
| 留言与评论(共有 0 条评论) “” |