第一次做抓包的人基本都会撞上同一件事:Wireshark 打开了、网卡选对了、抓了十分钟,一片安静。或者抓到了,但只有自己这台机器进出的流量,真正想看的「A 电脑访问 B 电脑」那一半根本没有。
问题不在 Wireshark,在拓扑。普通交换机只把每个包发给它该去的那一个口,你的电脑不在那条路径上,就永远收不到。想看到别人的流量只有两个办法:插到路径中间,或者让交换机复印一份给你。前者叫 TAP,后者叫端口镜像。
一、先想清楚:你到底要抓哪一段
抓包有三个位置,能看到的东西完全不同。选错位置,后面全白干。
| 抓包位置 | 能看到 | 看不到 |
|---|---|---|
| 被测主机本机(Wireshark / tcpdump) | 该机全部进出流量、本机 127.0.0.1 | 其他主机之间的流量 |
| 网关 / 路由器 / 防火墙 | 跨网段流量、NAT 前后、外网访问 | 同网段内部互访 |
| 交换机镜像口 | 指定端口或 VLAN 的全部流量,包括同网段互访 | 不经过这台交换机的路径上的流量 |
| 无线 monitor 模式 | 空口所有帧、管理帧 | 有线部分、已加密的业务内容 |
关键那一格是「同网段互访」。同网段的两个设备通信,包从 A 出发,交换机直接转发给 B,整个过程不经过任何一台可以装软件的主机。所以 192.168.1.10 访问 192.168.1.20,你在路由器上抓、在自己电脑上抓,都抓不到。这个场景里镜像口是唯一选项。
二、端口镜像到底做了什么
端口镜像(Port Mirroring;Cisco 叫 SPAN,Switched Port Analyzer)做的事一句话:把指定端口的流量复制一份,送到另一个端口。
三个关键词:
- 源端口(source / mirroring-port):被监视的口,可以是一个口、一组口,或者整个 VLAN
- 目的端口(destination / observe-port / monitor-port):接抓包电脑的口,只往外吐复制的包
- 方向(both / inbound / outbound):默认双向。排单向丢包时必须分开抓
三个必须知道的性质:
- 镜像不影响转发。复制是交换芯片内部的旁路动作,源口业务照常,设计上不改时延(高负载下芯片会额外排队,见第五节)。
- 目的口不能再当业务口。它只吐包不转发。给它配了 IP 接进网络,就会出现重复包,甚至环路。
- 镜像有容量上限。这是最容易被忽略的一条:一个千兆源口全双工跑满,双向合计 2 Gbps,而你镜像到一个千兆口,上限只有 1 Gbps,超出的部分直接丢,交换机不会报错。
三、配置:华为 / H3C / Cisco
三家的语法不同,逻辑一样:先定义目的口,再给源口挂上。
华为(VRP,S5700 这一类)
system-view
# 1) 定义观察口(目的口)
observe-port 1 interface GigabitEthernet0/0/24
# 2) 给源口挂镜像
interface GigabitEthernet0/0/1
port-mirroring to observe-port 1 both
quit
# 3) 看结果
display observe-port
display port-mirroring
H3C(Comware)
system-view
mirroring-group 1 local
mirroring-group 1 mirroring-port GigabitEthernet1/0/1 both
mirroring-group 1 monitor-port GigabitEthernet1/0/24
display mirroring-group all
Cisco(IOS / IOS-XE)
configure terminal
monitor session 1 source interface Gi0/1 both
monitor session 1 destination interface Gi0/24
end
show monitor session 1
要抓整个 VLAN 就把源换成 VLAN:华为是 port-mirroring to observe-port 1 both vlan 10,Cisco 是 monitor session 1 source vlan 10 both。这招在「不知道是哪台机器」的时候特别省事——先镜像整个 VLAN,抓到可疑流量再锁定单个口。
商用面板交换机(TP-LINK、H3C 迷你系列)大多有「端口镜像」菜单,选源口和目的口即可,逻辑同上。
四、抓包端:三件容易做错的事
1)目的口不要配 IP。抓包电脑正常联网走另一个网口或无线,镜像口只负责收包。Wireshark 会自动看到这些包,因为网卡处于混杂模式(promiscuous),会收下所有帧,不管目的 MAC 是不是自己。
2)先落盘,再分析。大流量镜像时,Wireshark 一边收一边解析很容易自己丢包(界面左下角的 dropped 就是它自己丢的)。换成 dumpcap 先写文件:
dumpcap -i eth1 -s 0 -b filesize:102400 -w /data/cap.pcapng
Linux 侧更省事,先用 tcpdump 把无关流量过滤掉:
tcpdump -i eth1 -n -s 0 -w /data/cap.pcap 'host 192.168.1.20'
3)先看 VLAN tag。镜像出来的包通常带着 802.1Q tag,因为复制点在交换芯片内部,tag 还没被剥掉。Wireshark 里看到的就是这样:
Frame 1: 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 10
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.1.10, Dst: 192.168.1.20
如果你拿 ip.addr == 192.168.1.20 去过滤却一个包都没有,先确认解析器有没有把 tag 剥掉。另一个办法是直接按 VLAN 过滤:
vlan.id == 10 and tcp.port == 80
五、六个真实的坑
| 症状 | 原因 | 处理 |
|---|---|---|
| 抓到的包少一半,只有请求没有响应(或反之) | 镜像方向设成了 inbound / outbound 单向 | 改成 both,或分两次抓再合并 |
| 峰值时段一大片重传,一抓就丢 | 镜像口带宽不够:源口双向 2 Gbps 对目的口 1 Gbps | 换万兆口、缩小镜像范围(单口而不是整 VLAN)、加过滤 |
| 包的顺序乱、时间戳对不上 | 镜像包和业务包共用队列,高负载时被排队 | 排时序问题改用硬件 TAP,或只看单条流的相对时间 |
| 目的口一接上就全网异常 | 目的口配了 IP 并参与转发,造成重复报文 / 环路 | 目的口不配 IP,不参与业务和生成树 |
| 本机 127.0.0.1 的流量抓不到 | 回环流量不出网卡,交换机根本看不到 | 只能在本机用 Wireshark 的 Loopback 接口抓 |
| 镜像配了,Wireshark 里什么都没有 | 抓包网卡选错、源口没流量、或源口目的口不在同一芯片组 | 先在目的口跑 tcpdump -i eth1 -c 5,确认有没有帧 |
第一条和第二条合起来解释了大部分「抓包不完整」的抱怨。尤其第二条,很多人以为是网络在丢包,其实是镜像口自己丢的——可以在交换机上看镜像丢弃计数,或者在抓包机上看 ifconfig 里的 RX dropped。
还有一条不算坑但很关键:堆叠 / 分布式交换机跨成员镜像,通常要求源口和目的口在同一台成员设备上,否则部分型号直接不支持,或者只镜像到本成员内的流量。
六、没有可配交换机怎么办
家里和小办公室的交换机往往没有镜像功能,或者干脆是路由器加一个傻瓜交换机。三条替代路线:
1)硬件 TAP。串在链路中间的分光器,一分二,一份给业务一份给抓包机。不丢包、不改时延,缺点是贵(几百到几千),而且必须断网才能插入。
2)Linux 软桥 + tc 镜像。把一台 Linux 机器做成透明网桥串在中间,用 tc 把入向流量复制到另一块网卡:
ip link add br0 type bridge
ip link set eth0 master br0
ip link set eth1 master br0
ip link set br0 up
# 把 eth0 的入向流量复制一份到 eth2
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol all u32 match u32 0 0
action mirred egress mirror dev eth2
然后在 eth2 上 tcpdump -i eth2 -n -s 0 -w cap.pcap。适合临时排查,串在核心链路上时要注意这台机器的吞吐会变成新瓶颈。
3)直接在被测主机上抓。如果目标只是「这台服务器为什么慢」,不用镜像,在它自己身上抓就行,还不会漏掉回环流量。镜像的价值只在「要看不属于任何一台你能登录的机器的流量」时才体现。
七、抓到之后别急着翻包
抓到 pcap 只是起点,真正省时间的是几条固定过滤:
# 只看某条 TCP 流
tcp.stream eq 3
# 只看 HTTP 请求行
http.request
# 只看被重置的连接
tcp.flags.reset == 1
# 只看重传
tcp.analysis.retransmission
# 只看某个 IP 的 80/443
ip.addr == 192.168.1.20 and tcp.port in {80,443}
排「慢」的时候顺序建议是:先看 tcp.analysis.flags 有没有重传和乱序,再看握手的 RTT,最后才看应用层内容。多数「网络慢」在二层三层就能定位,不需要去读 HTTP body。
端口号可以直接查站内的TCP/UDP 常用端口表;链路上的现象怎么和交换机行为对上,可以接着看交换机与路由器的区别和VLAN 实战。
八、一句话
镜像解决的是「你看不到」,不是「它不工作」。它能让你看到别人的包,代价是目的口带宽可能不够、方向可能只配了一半、tag 可能让你的过滤器失效。配之前先想清楚要抓哪一段,配之后先确认目的口真的在收包。
最后两条纪律:改交换机前先备份配置(display current-configuration / show run),抓完把镜像删掉。留着它等于让一个口永远在复制流量,既浪费芯片资源,也是个安全隐患。










暂无评论内容