一、Tcpdump

1、概念需知

  TCPDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
  linux服务器上使用tcpdump来抓包,服务器端提前开启端口的监听。建议提前关闭防火墙或者设置好策略。
辅助工具nc:
  nc是netcat的简写,是一个功能强大的网络工具。nc命令在linux系统中实际命令是ncat,nc是软连接到ncat,nc的主要命令如下。

1.实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
使用nc命令在服务器上开启1234的端口监听

[root@gfqh-ctp-test ~]# nc -l 1234

另外打开一个服务器连接查看端口是否启动

#可以看到,1234端口的监听已经开启。第一个是ipv4的,第二个是ipv6的
[root@gfqh-ctp-test ~]# netstat -anp |grep 1234
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      192881/nc
tcp6       0      0 :::1234                 :::*                    LISTEN      192881/nc

2、linux服务器(Centos7.9)安装tcpdump

#查看是否安装了tcpdump
[root@gfqh-ctp-test ~]# whereis nc
nc: /usr/bin/nc /usr/share/man/man1/nc.1.gz
[root@gfqh-ctp-test ~]# whereis tcpdump
tcpdump: /usr/sbin/tcpdump /usr/share/man/man8/tcpdump.8.gz
#上面是已经安装好了的,没有安装的需要进行安装
[root@gfqh-ctp-test ~]# yum -y install tcpdump nc

3、对服务器进行抓包

用客户端的telnet端口去连接或者需要抓包的端口在服务器已有现成的接口被连接则不需要telent
(1)确认需要抓包的服务器网卡
在这里插入图片描述
(2)用tcpdump命令进行抓包
只抓网卡ens0的tcp协议包,并且主机是192.168.x.x端口是1234的数据报文,将抓包文件保存到家目录下命名为tcpdump文件

tcpdump tcp -i eth0 and host 192.168.xx.xx and port 12345 -w ~/tcpdump

此时,客户端向服务器端口1234发送的数据就会被tcpdump抓取到

二、Wireshark

1、tcp协议—三次握手、四次挥手

TCP运输连接有以下三个阶段:

  • 建立TCP连接,也就是通过三报文握手来建立TCP连接。
  • 数据传送,也就是基于已建立的TCP连接进行可靠的数据传输。
  • 释放连接,也就是在数据传输结束后,还要通过四报文挥手来释放TCP连接。

1.1 tcp的三次握手

在这里插入图片描述
客户端:“在?”(第一次)

服务器:“在,上”(第二次,如果这时候服务器一个人上了,可能被卖。)

客户端:“上!”(第三次,这个时候服务器就可以上了)
总结:
① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:

  • 标志位为 SYN,表示请求建立连接;
  • 序号为 Seq = x(x 一般取随机数);
  • 随后客户端进入 SYN-SENT 阶段。
    ② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:
  • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
  • 序号为 Seq = y;
  • 确认号为 Ack = x + 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。
    ③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:
  • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
  • 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
  • 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
  • 随后客户端进入 ESTABLISHED。
    当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手。
    详解:
    (1)TCP连接时向TCP服务器进程发送TCP连接请求报文段,并进入同步已发送状态。
    在这里插入图片描述
  • TCP 连接请求报文段首部中的同步位SYN被设置为1,,表明这是一个tcp连接请求报文段。
  • 序号字段seq被设置了一个初始值x作为TCP客户进程所选择的初始序号。
      由于TCP连接建立是由TCP客户进程主动发起的,因此称为主动打开连接。 请注意TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号。
    (2)TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态。
    在这里插入图片描述
  • 该报文段首部中的同步位SYN和确认位ACK 都设置为1,表明这是一个TCP连接请求。
  • 序号字段seq被设置了一个初始值y,作为TCP服务器进程所选择的初始序号。
  • 确认号字段ack的值被设置成了x+1,这是对TCP客户进程所选择的初始序号seq的确认
    请注意这个报文段也不能携带数据,因为它是SYN被设置为一的报文段但同样要消耗掉一个序号。
    (3)TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP 确认报文段并进入连接已建立状态。
    在这里插入图片描述
  • 该报文段首部中的确认位ACK被设置为1,表明这是一个普通的TCP确认报文段 。
  • 序号字段seq 被设置为x+1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x,并且不携带数据,因此第二个报文段的序号为x +1。
  • 确认号字段ack被设置为y + 1,这是对TCP服务器进程所选择的初始序号的确认。
      请注意TCP规定,普通的TCP确认报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x + 1
      TCP服务器进程收到该确认报文段后也进入连接已建立状态,现在TCP双方都进入了连接已建立状态,他们可以基于已建立好的TCP连接进行可靠的数据传输了。

1.2 tcp的四次挥手

在这里插入图片描述

  • 首先客户端要关闭连接,先把报文中标志位FIN置为1,然后向服务端发送FIN报文表示要关闭连接.之后客户端进入FIN_WAIT1状态
  • 服务端收到客户端发来的FIN报文之后,内核会自动回复一个ACK给客户端,之后服务端进入CLOSED_WAIT状态.
  • 等待服务端进程调用close函数,也就是等待服务端处理完数据之后,服务端在给客户端发送FIN报文表示请求断开连接,之后服务端进入LAST_ACK状态
  • 客户端收到服务端发来的FIN报文之后,会回复最后一个ACK报文,客户端进入TIME_WAIT状态,2MSL后,进入closed状态 (注意只有主动关闭连接的一方才会有TIME_WAIT状态)
  • 服务端接收到客户端的最后一个ACK报文后,就会进入closed状态,关闭连接

2、tcpdump抓取的报文分析

(1)下载wireshark客户端程序并安装https://www.wireshark.org/download.html
在这里插入图片描述
(2)将上面抓取到的报文文件tcpdump,拖拽到wireshark里面进行查看
在这里插入图片描述
通过wireshark的视图-着色规则查看颜色的意思
在这里插入图片描述

粗略来说,黑色背景代表报文的各类错误,红色背景代表各类异常情景,其它颜色代表正常。
(3)下面这张图是对wireshark报文各个字段的分析(重点)
在这里插入图片描述
在这里插入图片描述

  • 备注:wireshark过滤报文小技巧
    1、使用tcp contains “979258” 筛选需要查找的内容在这里插入图片描述
    2、IP地址过滤
    ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。
    ip.src
    192.168.1.114 //筛选出源IP地址是182.254.110.91的数据包
    ip.dst==192.168.1.114 //筛选出目的地址是192.168.1.114的数据包。

端口过滤
tcp.port80 //根据TCP端口筛选数据包,包括源端口或者目的端口
tcp.dstport
80 //根据目的TCP端口筛选数据包。
tcp.srcport80 //根据源TCP端口筛选数据包。
udp.port
4010 //根据UDP端口筛选数据包,包括源端口或者目的端口
udp.srcport4010 //根据源UDP端口筛选数据包。
udp.dstport
4010 //根据目的UDP端口筛选数据包。

3、逻辑条件组合筛选
逻辑表达式汇总:

字符注释
||逻辑或
&&逻辑与
!逻辑非
//逻辑与筛选方法

命令:ip.src==192.168.1.114&&ip.dst==180.114.144.101
或(ip.src==192.168.1.114&&(ip.dst==121.114.244.119)

含义:筛选出源ip地址是192.168.1.114并且目的地址是180.114.144.101的数据包。

//逻辑或筛选

命令:ip.src==192.168.1.114||ip.src==182.254.110.91

含义:筛选出源IP地址是192.168.1.114或者源ip地址是182.254.110.91的数据包

//逻辑非筛选

命令:!(ip.addr==192.168.1.114)

含义:筛选出不是192.168.1.114的数据包。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐