简要记录下tcpdump用法
监控某个ip上的某个端口的流量
tcpdump -i enp0s25 tcp port 5432 -nn -S
各个参数作用
-i enp0s25 指定抓包的网卡是enp0s25
-nn 显示ip地址和数字端口 ,如果只 -n 则显示ip,但是端口为services文件中的服务名
如果一个n也不指定,则显示域名以及服务名
port 抓取该端口中的信息
-S TCP的seq以及ack显示绝对值
更详细的参数信息可以参考
Linux系统 tcpdump 抓包命令使用教程 - 知乎
https://www.cnblogs.com/wongbingming/p/13212306.html
客户端telnet 192.186.100.138 命令下,服务器端显示如下
tcp三步握手SYN=1 seq=3967800135
客户端处于SYN_SEND状态
16:38:20.116860 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [S], seq 3967800135, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0SYN=1 ACK=1 seq=504220911(随机值) ack=3967800136(上一步seq+1), 服务器端处于SYN_RCVD,这步完成后客户端的状态为ESTABLISHED
16:38:20.116915 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [S.], seq 504220911, ack 3967800136, win 65535, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0ACK=1 ack=504220912(上一步的seq+1),完成这步后服务器端状态也变成了ESTABLISHED16:38:20.117243 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [.], ack 504220912, win 8212, length 0tcp结束链接,由于tcp属于全双工通讯,所以关闭实际上分为4步骤,此例子由于使用telnet链接的5432端口的pg服务,因此服务器端超时后,服务器端主动关闭链接,因此前两步为关闭服务器
服务器发起断开链接FIN=1 ACK=1 seq=504220912 完成后服务器状态为FIN_WAIT_1,客户端状态为CLOSE_WAIT
16:39:20.118195 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [F.], seq 504220912, ack 3967800136, win 1024, length 0客户端回复ACK=1 ack=504220913(上一步seq+1),完成后服务器的状态为FIN_WAIT_2, 客户端状态为LAST_ACK
16:39:20.118419 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [.], ack 504220913, win 8212, length 0
此时服务器端已经不能再发送应用数据给客户端了,但是客户端是可以发送数据给服务器端的,因此现在的状态处于半双工状态后两步是关闭客户端客户端发送断开链接请求FIN=1 ACK=1 ack=504220913(上一步的ack) seq=3967800136(随机),此时服务器端状态为TIME_WAIT
16:39:20.118551 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [F.], seq 3967800136, ack 504220913, win 8212, length 0服务器端回复请求ACK=1 ack=3967800137 (上一步seq+1), 此时客户端的状态为CLOSED,服务器的状态TIME_WAIT等待2MSL时间后变成CLOSED
16:39:20.118575 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [.], ack 3967800137, win 1024, length 0
借用网络上的两个图
图1 ,三次握手连接图
图2 四次挥手关闭连接图
当然这个图是客户端先发起关闭链接请求,跟实际测试例子不同,因此仅仅为了参考使用。
当然上述过程也可以使用cisco packet tracer等网络模拟工具查看,具体如何在cisco packet tracer上模拟http协议,进行抓包,可以查看网络,本文中不在介绍,抓取完成内容如下:
1. 完成界面
2-4步为三次握手链接,对应图一的三个步骤
2. 客户端发起链接,发送SYN,SYN置位以及syn和ack给服务器
3. 服务器接收到SYN后的回复信息
ACK=上一步seq+1, 同时随机生成seq, SYN+ACK置位
4. 服务器回复客户端
ack=seq(上一步)+1
同时只有ACK置位
后续5-7步骤为四次挥手断开链接
5.
对应图2 中的第一步
6. 对应上面图2的第2,3步
服务器把ACK和FIN合并一步发送了,所以ACK和FIN都置位了
7. 对应上图2中的第四步
RST位
关于tcp标志位可以参考
TCP标志位详解(TCP Flag)-CSDN博客
telnet服务器上一个没有监听进程的端口(服务器正常状态)
服务器上抓取置位RST的包
tcpdump -i enp0s25 "tcp[tcpflags] & tcp-rst != 0" -nn
telnet 192.168.100.138 5433服务器回复给客户端的都是RST标志
13:38:39.291773 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
13:38:39.799136 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
13:38:40.307957 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
13:38:40.817424 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
13:38:41.326290 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length