tcpdump按子网抓包的核心是使用net关键字配合cidr表示法,如tcpdump net 192.168.1.0/24捕获该子网双向流量,支持src net和dst net限定方向,并可与port、proto等组合实现精准过滤。

Linux 中按子网网段过滤抓包数据,核心在于在抓包工具中使用正确的过滤表达式,而不是依赖 iptables(iptables 是防火墙规则工具,用于丢弃/转发数据包,不用于“抓包”)。常用抓包工具是 tcpdump 和 tshark(Wireshark 命令行版),它们支持基于网络层的 BPF(Berkeley Packet Filter)语法,可直接按源/目标 IP 的子网范围精确匹配。
用 tcpdump 按子网抓包(最常用)
tcpdump 支持 CIDR 表示法(如 192.168.1.0/24),自动转换为对应掩码匹配逻辑:
-
抓取发往或来自 192.168.1.0/24 子网的所有流量:
tcpdump net 192.168.1.0/24
-
只抓源地址属于该子网的包:
tcpdump src net 192.168.1.0/24
-
只抓目的地址属于该子网的包:
tcpdump dst net 192.168.1.0/24
-
同时限定协议和端口(例如只抓该子网的 HTTP 流量):
tcpdump net 192.168.1.0/24 and port 80
✅ 注意:
net关键字会同时匹配源和目的;若子网含多个接口(如10.0.0.0/8),它仍能正确识别所有符合 CIDR 的地址。
用 tshark 按子网过滤(更灵活,支持显示过滤)
tshark 有两套语法:捕获过滤器(类似 tcpdump,内核级,轻量)和显示过滤器(应用层,功能强但需先抓全量):
-
捕获时过滤(推荐,节省资源):
tshark -f "net 172.16.0.0/12" -i eth0
-
抓全量后再筛选(适合分析阶段):
tshark -r capture.pcap "ip.src == 10.0.0.0/8 or ip.dst == 10.0.0.0/8"
⚠️ 提示:显示过滤中的
==不支持/24写法,必须用 CIDR 函数:tshark -r capture.pcap "ip.src in 192.168.5.0/24 or ip.dst in 192.168.5.0/24"
常见子网写法对照(避免手算掩码)
| 子网需求 | 正确写法 | 错误写法示例 |
|---|---|---|
| 192.168.0.0/16 | 192.168.0.0/16 |
192.168.*.*(不合法) |
| 10.10.20.0/24 | 10.10.20.0/24 |
10.10.20.0/255.255.255.0(tcpdump 不支持) |
| 多个子网(OR) | net 192.168.1.0/24 or net 10.0.0.0/8 |
net {192.168.1.0/24,10.0.0.0/8}(无效) |
补充:为什么不用 iptables 过滤抓包?
-
iptables工作在内核 netfilter 框架,用于策略性丢弃、修改或转发真实流量,不是抓包工具。 - 它不能“导出数据包内容”,也无法保存原始报文供分析。
- 若你误以为
iptables -j LOG能替代抓包:它仅记录简略日志(如 IP+端口),不含载荷、无时间戳精度、不保证顺序,不适合调试或取证。
不复杂但容易忽略:子网过滤的关键是选对工具和语法——tcpdump 的 net 最直接,tshark 的 in 适合回溯分析,两者都原生支持 CIDR,无需额外计算。











