tcpdump四元组精确过滤需组合src host、dst host、src port、dst port并强制使用-nn参数,避免主机名和端口名解析干扰,确保ip与端口号以纯数字形式呈现,从而准确识别流量方向与通信关系。

tcpdump 做四元组精确过滤,核心就是把源IP、目的IP、源端口、目的端口这四个要素组合起来,再配合 -nn 避免解析干扰,才能真正看清流量走向。
必须加 -nn:让数字说话,不靠猜测
默认情况下,tcpdump 会把 192.168.1.100:3306 解析成 host.local:mysql,把 203.0.113.45:22 显示为 remote.example.com:sshd——这种“友好”反而掩盖真实通信关系。加 -nn 后,所有地址和端口都以纯数字呈现,比如:
-
192.168.1.100.54321 > 203.0.113.45.22(明确是客户端某端口连服务器22) -
10.5.20.30.8080 > 172.16.0.10.3000(一眼看出是反向代理到后端服务)
没加 -nn 就等于在雾里看包,排查时容易误判。
四元组写法:用 src/dst + host/port 组合
四元组不是硬编码一个参数,而是用逻辑组合表达:src host + dst host + src port + dst port。注意端口要搭配方向才准确:
- 抓「从 A(192.168.1.10)访问 B(203.0.113.45)的 80 端口」:
tcpdump -nn src host 192.168.1.10 and dst host 203.0.113.45 and dst port 80 - 抓「B 主动回给 A 的响应包」(即 A 是服务端,B 是客户端):
tcpdump -nn src host 203.0.113.45 and dst host 192.168.1.10 and src port 80 - 想一次性捕获 A↔B 之间所有 TCP 流量(双向,含握手和数据):
tcpdump -nn host 192.168.1.10 and host 203.0.113.45 and tcp
进阶技巧:排除干扰、限定协议、保存结果
真实环境里,光写对四元组还不够,得加几道“滤网”:
-
限定协议类型:加
tcp或udp,避免 ICMP、ARP 等无关包混入; -
排除广播/组播:末尾加
and not broadcast and not multicast,减少噪音; -
指定网卡:用
-i eth0或-i any,防止跨接口抓到镜像流量; -
限制数量或保存文件:加
-c 100抓100个包,或-w out.pcap存盘供 Wireshark 分析。
常见误区提醒
写错一个关键字,整个过滤就失效:
-
port 80表示“源或目的端口是80”,不是“目的端口是80”;要精确就得写dst port 80或src port 80; -
host A and host B等价于(src host A or dst host A) and (src host B or dst host B),它包含所有 A 和 B 参与的流量,不区分方向; - 多个条件并列时,
and优先级高于or,复杂逻辑务必用\( \)括起来,比如:tcpdump -nn \( src host 10.1.1.1 or src host 10.1.1.2 \) and dst port 3306










