Linux系统抓包命令tcpdump使用实例

本文介绍如何在Linux系统中使用tcpdump工具进行网络抓包。包括基本命令格式、常用参数及各种过滤条件的应用,如监听特定协议、主机、端口等。

linux系统网络抓包用tcpdump,首先当然是看有没有安装了,没有就用yum安装一下。

tcpdumplinux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是centos 7

tcpdump
的命令格式
tcpdump
的参数众多,通过man tcpdump可以查看tcpdump的详细说明,这边只列一些笔者自己常用的参数:
tcpdump [-i 
网卡] -nnAX '表达式'
各参数说明如下:
-i
interface 监听的网卡。
-nn
:表示以ipport的方式显示来源主机和目的主机,而不是用主机名和服务。
-A
:以ascii的方式显示数据包,抓取web数据时很有用。
-X
:数据包将会以16进制和ascii的方式显示。
表达式:表达式有很多种,常见的有:host 主机;port 端口;src host 发包主机;dst host 收包主机。多个条件可以用andor组合,取反可以使用!,更多的使用可以查看man 7 pcap-filter
下面进行一些命令测试,如果没有权限,可以先切换成root用户。

监听网卡eth0
$ tcpdump -i eth0

这个方式最简单了,但是用处不多,因为基本上只能看到数据包的信息刷屏,压根看不清,可以使用ctrl+c中断退出,如果真有需求,可以将输出内容重定向到一个文件,这样也更方便查看。

监听指定协议的数据
$ tcpdump -i eth0 -nn 'icmp'

这个是用来监听icmp协议的数据,就是ping命令使用的协议。类似的,如果要监听tcp或者是udp协议,只需要修改上例的icmp就可以了。ping下监听的机器,输出如下:

linux使用tcpdump抓包示例
每一行的各个数据表示的含义:
抓到包的时间 IP 发包的主机和端口 > 接收的主机和端口 数据包内容

监听指定的主机
$ tcpdump -i eth0 -nn 'host 192.168.1.231'
这样的话,192.168.1.231这台主机接收到的包和发送的包都会被抓取。
$ tcpdump -i eth0 -nn 'src host 192.168.1.231'
这样只有192.168.1.231这台主机发送的包才会被抓取。
$ tcpdump -i eth0 -nn 'dst host 192.168.1.231'
这样只有192.168.1.231这台主机接收到的包才会被抓取。

监听指定端口
$ tcpdump -i eth0 -nnA 'port 80'
上例是用来监听主机的80端口收到和发送的所有数据包,结合-A参数,在web开发中,真是非常有用。

监听指定主机和端口
$ tcpdump -i eth0 -nnA 'port 80 and src host 192.168.1.231'
多个条件可以用andor连接。上例表示监听192.168.1.231主机通过80端口发送的数据包。

监听除某个端口外的其它端口
$ tcpdump -i eth0 -nnA '!port 22'
如果需要排除某个端口或者主机,可以使用“!”符号,上例表示监听非22端口的数据包。

同时可以将数据输出到一个指定的文件

tcpdump -i em2 -vnn port 8000 -w xxx.cap


小结:
tcpdump
这个功能参数很多,表达式的选项也非常多,非常强大,不过常用的功能确实不多。详情可以通过man查看系统手册。
另外在抓取web包的时候,发送网页内容都是很奇怪的字符,发现是apache开启了gzip压缩的缘故,关闭掉gzip压缩就可以了。在centos 7下,编辑vim/etc/apache2/mods-enabled/deflate.load文件,将加载模块deflate_module的语句注释掉,然后重启apacheOK了。



<think>我们正在详细解释tcpdump命令的输出结果。根据用户的问题,重点在于返回结果的详解。同时,结合用户提供的引用内容,我们可以补充一些常用的过滤方法和参数使用。 首先,tcpdump的输出格式通常如下: 时间戳 协议 源地址.源端口 > 目的地址.目的端口: 标志位 序列号 确认号 窗口大小 选项 长度 下面我们将逐一解析每个字段。 1. 时间戳(Timestamp): 格式为:时:分:秒.微秒(例如:13:45:32.123456) 表示数据包被捕获的时间点,精确到微秒。 2. 协议(Protocol): 表示数据包使用的网络层协议,常见的有: IP:IPv4协议 IP6:IPv6协议 ARP:地址解析协议 RARP:反向地址解析协议 3. 源地址和源端口(Source Address and Port): 格式为:IP地址.端口号(例如:192.168.1.1.53) 源地址是发送数据包的主机IP,源端口是发送方的端口号。 4. 目的地址和目的端口(Destination Address and Port): 格式为:IP地址.端口号(例如:192.168.1.2.49232) 目的地址是接收数据包的主机IP,目的端口是接收方的端口号。 5. 标志位(Flags,仅TCP协议): TCP协议的数据包会显示标志位,常见的标志位有: S:SYN(同步序列号,用于建立连接) F:FIN(结束连接) P:PSH(推送数据,接收方应尽快将数据交给应用层) R:RST(重置连接) .:ACK(确认数据) U:URG(紧急指针) 这些标志位可以组合出现,例如 [S.] 表示SYN和ACK同时被设置(即SYN-ACK包)。 6. 序列号(Sequence Number,仅TCP协议): 格式为:seq 数字(例如:seq 123456789) 表示该数据包的序列号,用于保证数据的有序性和可靠性。 7. 确认号(Acknowledgment Number,仅TCP协议): 格式为:ack 数字(例如:ack 987654321) 表示发送方期望接收的下一个序列号。 8. 窗口大小(Window Size,仅TCP协议): 格式为:win 数字(例如:win 64240) 表示接收窗口的大小,用于流量控制。 9. 选项(Options,仅TCP协议): 格式为:options [选项值](例如:options [mss 1460]) TCP选项,如最大段大小(MSS)、窗口缩放因子等。 10. 长度(Length): 格式为:length 数字(例如:length 32) 表示数据包中有效载荷的长度(单位:字节)。对于TCP/UDP,这通常是应用层数据的长度。 除了TCP协议,其他协议的数据包输出会有所不同。例如: ICMP协议: 14:22:10.987654 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 1234, seq 1, length 64 这里会显示ICMP的类型(如echo request)以及标识符(id)和序列号(seq)。 UDP协议: 13:45:32.123456 IP 192.168.1.1.53 > 192.168.1.2.49232: UDP, length 32 相对简单,只显示协议和长度。 另外,用户提供的引用中,有一些有用的过滤方法: 1. 根据IP地址过滤: - 抓取特定主机的所有数据包:`tcpdump host 210.27.48.1` [^1] - 根据源IP过滤:`tcpdump src 192.168.10.100` [^4] - 根据目的IP过滤:`tcpdump dst 192.168.10.200` [^4] 2. 根据TCP标志位过滤: - 抓取所有ACK包:`tcpdump &#39;tcp[tcpflags] == tcp-ack&#39;` [^2] - 抓取SYN或FIN包:`tcpdump &#39;tcp[tcpflags] & (tcp-syn|tcp-fin) != 0&#39;` [^2] 3. 其他参数: - `-i`:指定网络接口(如`-i eth0`)[^1] - `-c`:指定抓包数量(如`-c 10`表示抓10个包)[^1] - `-w`:将抓包数据写入文件(如`-w capture.pcap`)[^1] - `-l`:行缓冲输出,便于同时查看和保存(如`tcpdump -l | tee dat`)[^3] 下面我们通过几个具体例子来详细解释输出: 例1:TCP三次握手中的第一个SYN包 12:34:56.789012 IP 192.168.1.100.49152 > 192.168.1.200.80: Flags [S], seq 1234567890, win 65535, options [mss 1460], length 0 - 时间:12:34:56.789012 - 协议:IP(IPv4) - 源:192.168.1.100的49152端口(临时端口) - 目的:192.168.1.200的80端口(HTTP服务) - 标志位:[S] 表示SYN包 - 序列号:seq 1234567890 - 窗口大小:win 65535 - 选项:mss 1460(最大段大小) - 长度:0(没有数据,因为这是建立连接的包) 例2:SYN-ACK包(第二次握手) 12:34:56.789123 IP 192.168.1.200.80 > 192.168.1.100.49152: Flags [S.], seq 987654321, ack 1234567891, win 65535, options [mss 1460], length 0 - 标志位:[S.] 表示SYN和ACK - 序列号:seq 987654321(服务器端的初始序列号) - 确认号:ack 1234567891(注意:确认号是客户端的初始序列号+1,即1234567890+1=1234567891) 例3:ACK包(第三次握手) 12:34:56.789234 IP 192.168.1.100.49152 > 192.168.1.200.80: Flags [.], ack 987654322, win 65535, length 0 - 标志位:[.] 表示ACK(没有其他标志) - 确认号:ack 987654322(服务器端的初始序列号+1) 例4:携带数据的TCP包 12:34:56.789345 IP 192.168.1.100.49152 > 192.168.1.200.80: Flags [P.], seq 1234567891:1234567895, ack 987654322, win 65535, length 4 - 标志位:[P.] 表示PSH和ACK(推送数据) - 序列号范围:seq 1234567891:1234567895(表示这个包的数据从1234567891到1234567895,共4个字节) - 确认号:ack 987654322(确认之前的数据) - 长度:length 4(有效载荷4字节) 例5:UDP包(如DNS查询) 12:34:56.789456 IP 192.168.1.100.49153 > 8.8.8.8.53: UDP, length 32 - 协议:UDP - 源:192.168.1.100:49153 - 目的:8.8.8.8:53(DNS服务) - 长度:32字节 例6:ICMP包(如ping请求) 12:34:56.789567 IP 192.168.1.100 > 192.168.1.200: ICMP echo request, id 12345, seq 1, length 64 - 类型:echo request(ping请求) - id:12345(标识符) - seq:1(序列号) - 长度:64字节 通过以上解释,用户应该能够理解tcpdump输出结果中各字段的含义。同时,结合引用中的过滤方法,可以更有效地捕获和分析特定数据包。 最后,如果用户需要更详细的信息,可以使用`-v`(verbose)参数,甚至`-vv`或`-vvv`来增加详细程度。例如,使用`-v`可以显示TTL、ID、总长度等更多IP层信息。 生成相关问题:</think>### `tcpdump` 抓包结果详解 `tcpdump` 的输出包含网络数据包的详细信息,以下是关键字段的逐行解析(以 TCP 协议为例): --- #### **标准输出格式** ```bash 14:22:10.987654 IP 10.0.0.1.80 > 10.0.0.2.50321: Flags [S.], seq 123456789:123456801, ack 987654321, win 64240, options [mss 1460], length 0 ``` 1. **时间戳** `14:22:10.987654` - 格式:`时:分:秒.微秒` - 表示数据包捕获的精确时间[^3]。 2. **协议类型** `IP` - 网络层协议:常见值包括: - `IP`(IPv4)、`IP6`(IPv6)、`ARP`、`ICMP`、`UDP`。 3. **源地址与端口** `10.0.0.1.80` - `10.0.0.1`:源 IP 地址 - `80`:源端口号(此处为 HTTP 服务端口)。 4. **目的地址与端口** `10.0.0.2.50321` - `10.0.0.2`:目标 IP 地址 - `50321`:目标端口号(临时端口)。 5. **TCP 标志位** `Flags [S.]` - 单字母缩写表示 TCP 控制标志: - `S`:SYN(发起连接) - `.`:ACK(确认包) - `F`:FIN(结束连接) - `R`:RST(重置连接) - `P`:PSH(推送数据) - `U`:URG(紧急指针) - 组合示例:`[S.]` = SYN-ACK 包(三次握手第二步)[^2]。 6. **序列号与确认号** - `seq 123456789:123456801` - 当前数据包的序列号范围(12 字节数据)。 - `ack 987654321` - 期望接收的下一个序列号(确认对方数据)。 7. **窗口大小** `win 64240` - 接收窗口大小(单位:字节),用于流量控制。 8. **TCP 选项** `options [mss 1460]` - 协议选项: - `mss 1460`:最大报文段长度(Maximum Segment Size)。 - 其他常见值:`nop`(空操作)、`wscale`(窗口缩放因子)。 9. **数据长度** `length 0` - 应用层数据长度(单位:字节)。 - `length 0` 表示纯控制包(如 SYN、ACK)。 --- #### **其他协议示例** 1. **UDP 数据包** ```bash 15:30:45.123456 IP 192.168.1.1.53 > 192.168.1.2.49232: UDP, length 64 ``` - 无标志位/序列号,直接显示协议和长度。 2. **ICMP 数据包** ```bash 16:40:22.654321 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 1234, seq 1, length 64 ``` - `echo request`:ICMP 类型(Ping 请求) - `id/seq`:请求标识符和序列号。 --- ### **过滤与输出控制技巧** 1. **按 IP 过滤** ```bash tcpdump host 210.27.48.1 # 抓取指定主机的流量[^1] tcpdump src 192.168.1.100 # 仅源IP[^4] tcpdump dst 192.168.1.200 # 仅目标IP[^4] ``` 2. **按 TCP 标志过滤** ```bash tcpdump &#39;tcp[tcpflags] == tcp-syn&#39; # 仅SYN包[^2] tcpdump &#39;tcp[tcpflags] & (tcp-syn|tcp-fin) != 0&#39; # SYN或FIN包[^2] ``` 3. **保存与实时查看** ```bash tcpdump -i eth0 -w capture.pcap # 保存为pcap文件[^1] tcpdump -l | tee dat # 实时输出+保存[^3] ``` --- ### **关键参数说明** | 参数 | 作用 | |------|------| | `-i any` | 监听所有网卡 | | `-c 10` | 捕获10个包后退出 | | `-v` | 显示详细信息(TTL、校验和等) | | `-X` | 十六进制+ASCII 格式输出内容 | | `-s0` | 捕获完整数据包(避免截断) | 通过结合过滤器和参数,可精准捕获和分析特定流量(如端口 `257` 的日志)[^1][^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值