tcpdump 捕获特定方向数据流需用 src/dst 修饰符精准指定源或目的地址/端口:src 抓本机发出流量(如 curl、DB 连接),dst 抓到达本机流量(如 SSH、DNS 响应),结合协议和端口过滤可提高准确性,复杂条件须用英文双引号包裹。

tcpdump 捕获特定方向的数据流,关键在于用 src 和 dst 修饰符明确指定数据包的来源或去向,而不是笼统地匹配端口或主机。这能精准分离“发出去的”和“收进来的”流量,避免混杂干扰。
只抓从本机发出的流量(src)
当你想观察本机主动发起的连接(比如 curl 请求、数据库客户端连接),用 src 限定源地址或端口:
- 抓本机发往目标 443 端口的所有 TCP 包:sudo tcpdump -i any src port 443 and tcp
- 抓本机(IP 192.168.1.100)作为源地址发出的所有包:sudo tcpdump -i any src host 192.168.1.100
- 抓本机发往特定网段的 UDP 流量:sudo tcpdump -i any src host 192.168.1.100 and dst net 10.0.0.0/24 and udp
只抓到达本机的流量(dst)
排查服务是否收到请求、验证防火墙规则是否放行入向连接,用 dst 锁定目的地址或端口:
- 抓所有发往本机 22 端口(SSH)的包:sudo tcpdump -i any dst port 22
- 抓来自 10.5.0.0/24 网段、目的地为本机的全部流量:sudo tcpdump -i any src net 10.5.0.0/24 and dst host 192.168.1.100
- 只看 DNS 响应(目的端口是 53 的 UDP 包):sudo tcpdump -i any udp dst port 53
组合方向与协议/端口提高准确性
单独用 src/dst 容易漏掉协议细节,加上协议类型和端口能进一步缩小范围:
- 只捕获本机作为源、目标为 8080 端口的 HTTP 请求(TCP):sudo tcpdump -i any src port 8080 and tcp
- 排除本地回环(127.0.0.1)参与的 Redis 流量,只看外部访问:sudo tcpdump -i any port 6379 and not host 127.0.0.1 and (src or dst)
- 抓某 IP 主动连接本机 3306 端口(MySQL)的完整握手过程:sudo tcpdump -i any src host 172.16.0.5 and dst port 3306 and tcp
注意引号和逻辑优先级
当表达式含空格或逻辑运算符时,必须用英文双引号包裹整个过滤条件,否则 shell 会提前解析:
- 正确写法(抓来自 192.168.1.20 且目的为 80 或 443 的包):sudo tcpdump -i any "src host 192.168.1.20 and (dst port 80 or dst port 443)"
- 错误写法(未加引号会导致语法错误或部分条件失效):sudo tcpdump -i any src host 192.168.1.20 and dst port 80 or dst port 443

















