什么是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 条评论) “” |