tcpdump过滤网关出口流量需基于“本机发出且目标属该网关负责网段”原则,用src host 本机ip and dst net 网段精准捕获,如sudo tcpdump -i eth0 'src host 192.168.5.100 and dst net 203.0.113.0/24'。

要过滤特定网关出口流量,核心是识别“出口”在 tcpdump 中的实际含义:它不是指路由表里的默认网关 IP,而是指**从本机发出、源地址为本机、目标地址经由该网关转发的流量**。由于 tcpdump 工作在链路层,它看不到路由决策过程,只能基于数据包的原始字段(src/dst IP、MAC、接口)做匹配。因此,“网关出口流量”需拆解为两个可操作的维度:方向 + 目标网段(或下一跳 IP)。
明确网关对应的子网或目标地址范围
网关本身不直接出现在每个出站包的目标字段里——出站包的目标是远端服务器 IP,但这些包会先发给网关(即目的 MAC 是网关 MAC,目的 IP 是最终目标)。所以更可靠的方式是:确认该网关负责哪些目的网段(比如你配置了 10.20.0.0/16 走网关 10.10.1.1),然后抓取发往这些网段的包。
- 查路由表确认网段归属:ip route | grep 'via 10.10.1.1'(把 10.10.1.1 换成你的网关 IP)
- 若结果含 10.20.0.0/16 via 10.10.1.1 dev eth0,说明该网段走此网关
- 过滤命令:sudo tcpdump -i eth0 'dst net 10.20.0.0/16'
按网关 IP 作为下一跳(需配合 ARP 或 MAC 过滤)
如果你只想抓“真正发给网关设备”的帧(即二层目的 MAC 是网关的 MAC),tcpdump 可通过 ether dst 实现,但这需要先获取网关 MAC:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 获取网关 MAC:arp -n | grep '10.10.1.1' 或 ip neigh show | grep '10.10.1.1'
- 假设得到 MAC 是 00:11:22:33:44:55,则命令为:sudo tcpdump -i eth0 'ether dst 00:11:22:33:44:55'
- 注意:该方式捕获的是所有发往该 MAC 的帧(包括 ARP、ICMP、TCP 等),且仅适用于同网段直连网关;跨 VLAN 或三层网关不适用
结合源地址 + 目标网段,排除本地环回和内网直连
避免误抓本机到同子网其他机器的流量(这类不经过网关),应限定为「本机发出 + 目标非本地子网」:
- 先查本机所在子网,例如:ip addr show eth0 | grep 'inet ' → 得到 192.168.5.100/24
- 假定网关是 192.168.5.1,它负责去往 203.0.113.0/24 的流量
- 精准过滤命令:sudo tcpdump -i eth0 'src host 192.168.5.100 and dst net 203.0.113.0/24'
- 加 -n -nn 避免解析延迟:sudo tcpdump -i eth0 -n -nn 'src host 192.168.5.100 and dst net 203.0.113.0/24'
验证是否真走该网关(辅助手段)
有时策略路由或多路径会让部分流量绕过默认网关。可用 traceroute 辅助确认:
- traceroute -n 203.0.113.10 → 观察第一跳是否为你的目标网关 IP
- 若第一跳是 192.168.5.1,则上述 dst net 过滤即有效
- 若第一跳不同,说明该目标实际走别的出口,需重新查路由










