tcpdump的使用

在Ubuntu系统中安装tcpdump的步骤如下:

  1. 更新软件源
1
sudo apt update
  1. 安装tcpdump
1
sudo apt install tcpdump
  1. 验证安装
1
tcpdump -v

如果看到tcpdump的版本信息,则说明安装成功。

  1. 使用tcpdump
1
tcpdump

将显示本机网络交互,按Ctrl+C可以退出。

你也可以指定过滤条件来抓取特定流量:

1
tcpdump port 80 

过滤HTTP端口流量

1
tcpdump host 192.168.1.100

过滤特定主机流量

1
tcpdump -i eth0

只监听eth0接口流量

  1. 使用iptables过滤特定流量

给tcpdump命令加上-w可以写到文件:

1
tcpdump -w captured.pcap

也可以添加-i指定接口,同时可以使用iptables禁止特定端口流量写入文件用于下载分析。

所以在Ubuntu系统中,使用apt更新源后直接安装tcpdump就可以开始抓包分析网络流量了。



tcp SYNC 报文是什么?有何作用?


TCP SYN 报文是TCP(传输控制协议)三次握手过程中的第一个报文,用于建立两个TCP套接字之间的连接。在TCP/IP模型中,建立一个稳定的连接之前,两端(通常称为客户端和服务器)必须执行一个称为“三次握手”(Three-Way Handshake)的过程,SYN 报文在这个过程中扮演了关键的角色。

三次握手过程

  1. SYN: 第一步由客户端执行,发送一个SYN(Synchronize Sequence Numbers)报文到服务器。在这个SYN报文中,客户端选择一个随机的序列号(Seq=X)作为连接的起始序列号,表示开始传输数据的序列号。

  2. SYN-ACK: 服务器接收到SYN报文后,会回复一个SYN-ACK(Synchronize-Acknowledgment)报文。这个报文确认(ACK=X+1)了客户端的SYN报文,并且服务器也选择了一个随机的序列号(Seq=Y)作为自己的起始序列号。

  3. ACK: 最后,客户端再发送一个ACK(Acknowledgment)报文作为响应,确认(ACK=Y+1)了服务器的SYN-ACK报文。此时,客户端到服务器方向的连接被建立。同时,这个ACK报文也可能携带客户端向服务器发送的第一个数据包。

SYN 报文的作用

  • 初始化连接: SYN 报文的主要作用是在TCP连接的初始化阶段,通知接收方(服务器)发送方(客户端)希望建立连接,并且提供了初始化序列号,用于后续数据传输的可靠性控制。

  • 同步序列号: 通过SYN报文中的初始序列号,双方能够同步彼此的序列号,这对于TCP协议的可靠传输至关重要。

  • 协商参数: 在TCP选项中,SYN报文也可以用来协商两端的TCP参数,如最大报文段长度(MSS),窗口缩放因子,选择确认(SACK)等,这有助于优化TCP连接的性能。

SYN 报文是建立TCP连接的基础,它通过三次握手过程确保了连接的可靠性和序列号的同步,使得TCP能够提供一种面向连接、可靠的字节流服务。






研究如何使用tcpdump抓非空网络包,花了30分钟!

最近我们有一个老旧服务想下线,需要观察是否还有调用流量,但服务没有日志,代码来源也不确定,不敢加日志。只能通过网络抓包来观察了。

首先我让运维帮忙抓包,并使用WireShark分析,可以发现都是一些TCP握手与挥手的包,没有实际发送数据的TCP包。但运维只抓了45秒的包,要确认服务无流量需要更长时间。运维反馈长时间抓包数据量可能很大,磁盘有风险。

我想如果tcpdump能只抓有数据的网络包就好了。首先问了ChatGPT,它回答利用TCP的PSH标志来过滤,显然是不对的。TCP数据包不一定带PSH标志。

我想到如果能得到TCP包数据长度,过滤出大于0的就可以实现。经了解,TCP包头中没有直接定义数据长度字段,但可通过IP包长度减去IP包头长度,再减去TCP包头长度计算得到。

IP包中第3-4字节是包长度,用”ip.len”表示。IP包头长度存储在第1字节后4位,单位4字节,需左移2位。TCP包头长度存储在第13字节前4位,单位同样4字节,需右移2位。

我打算问ChatGPT tcpdump是否支持加减运算,看它的回答加减号表示与和或的关系,似乎实现不了。我又尝试了tshark,发现其显示过滤器不支持运算。

带着疑惑继续搜索,终于通过”tcpdump tcp.payload”关键词,找到了man page中的相关内容,原来tcpdump支持使用”greater”过滤非空TCP包!

我也实际试了下,确实可以实现。通过加上”nohup”后台运行,再用”timeout”指定期限为1天,就可以长时间抓取非空包了。一天后就可分析抓包数据了。

通过这次经历,不可全信ChatGPT,得勤看官方文档啊。最后邀请大家点赞关注,我们下次再见。