用户态 tcpdump 如何实现抓到内核网络包的?

一、tcpdump 的语法结构长啥样?

标准格式如下:

tcpdump [参数] [过滤表达式]

  • 参数:控制抓包行为(接口、输出方式、数量等)
  • 过滤表达式:控制抓什么(指定协议/IP/端口/方向等)

非常好,你提供的内容很细致,补充得非常实用。下面我将原文章中【“二、常用参数一览(建议熟到写代码一样)”】部分进行结构优化+内容融合,将你列的各项参数统一合并,条理更清晰、内容更完整,确保整体风格一致且便于读者理解:

二、tcpdump 常用参数全解

真正会用 tcpdump 的人,参数都烂熟于心,不靠百度。

用户态 tcpdump 如何实现抓到内核网络包的?

用户态 tcpdump 如何实现抓到内核网络包的?

组合用法示例:

tcpdump -i eth0 -s 0 -c 100 -w test.pcap
tcpdump -i eth0 -nn -l | grep 192.168.10.1
tcpdump -r test.pcap -nn -X

三、过滤表达式怎么写?这些组合得会背

tcpdump 最强大的地方,其实在于它灵活的 过滤表达式(filter expression)。

会不会写过滤,直接决定你抓不抓得到想看的东西。

基本语法结构:

[协议] [方向] [对象]

举个例子:

tcpdump -i eth0 src host 192.168.1.10 and dst port 80

翻译一下: 抓“源地址为 192.168.1.10 且目的端口是 80 的包”。

常用过滤表达式分类梳理:

1. IP 地址相关过滤:

host 192.168.1.10 # 源或目的地址是它
src host 192.168.1.10 # 源地址
dst host 192.168.1.10 # 目的地址

2. 端口相关过滤:

port 80 # 抓 HTTP 流量
src port 53 # DNS 响应
dst port 22 # SSH 登录请求

3. 协议类型过滤:

tcp # 抓 TCP 协议(比如网页、SSH)
udp # 抓 UDP 协议(比如DNS、DHCP)
icmp # ping 包
arp # ARP 包,排查网关、IP冲突

4. 组合过滤(逻辑运算):

host 192.168.1.10 and port 443
src 192.168.1.10 and dst port 80
not port 22
tcp and dst port 3306 and not src net 192.168.1.0/24

常用于细化抓包范围,比如只抓“不是内网发起的 MySQL 请求”。

四、典型抓包场景举例

光会写命令不够,要知道什么时候用哪个组合最管用。

场景 1:某设备无法访问,怀疑网络不通

tcpdump -i eth0 host 192.168.1.10

看这个 IP 有没有进出流量:

  • 没有请求 → 应用没发包 / 配置问题
  • 有请求没响应 → 网关/链路问题

场景 2:网页打不开,是 DNS 解析失败吗?

tcpdump -i eth0 udp port 53 -nn -vvv

看是否有 DNS 请求发出、服务端有没有回复。 还能看到具体查询了哪个域名。

场景 3:应用连接超时,是 TCP 三次握手没完成?

tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' -nn

快速观察:

  • 有没有 SYN 发出去?
  • 有没有回 SYN+ACK?
  • 客户端有没有发 ACK?

场景 4:怀疑某接口 VLAN tag 被剥了?

tcpdump -i eth0 -e vlan

加 -e 能显示 VLAN ID,检查看有没有 tag。 可配合抓广播流验证二层隔离。

场景 5:网络剧烈抖动,怀疑是广播风暴?

tcpdump -i eth0 broadcast
tcpdump -i eth0 arp

看是否存在大量重复广播(ARP 洪泛、未知单播泛洪等)。

场景 6:用 hybrid 接口承载多个 VLAN,是否有异常流量串 VLAN?

tcpdump -i eth0 vlan and not vlan 10 and not vlan 20

排查非预期 VLAN 出现的情况(比如 VLAN tag 错位、ACL 配置问题)

上一篇 Horizon简介
下一篇 Windows10 桌面运维常见故障及解决办法