port 在做什么
port 是 BPF 表达式里按端口匹配的原语,默认同时匹配源端口与目的端口,也同时覆盖 TCP 与 UDP。加 src port 或 dst port 可以限定方向,加 tcp 或 udp 可以限定协议;区间用 portrange。同一条会话里客户端端口是随机分配的高位端口,所以判断服务是否可达时用 dst port 更精准,判断响应有没有回来时用 src port。把端口当成协议标识是常见误判:443 上同时跑 TLS(TCP)与 QUIC(UDP)。
基本信息
| 语法 | port <号> / src port / dst port / tcp port / udp port / portrange 起-止 |
|---|---|
| 等价关系 | port 443 等于 (tcp or udp) port 443 |
| 不支持 | host 10.0.0.9:443 这类冒号写法,BPF 语法里没有 |
| 组合 | 与 host、net 用 and/or 组合,方向修饰只作用于紧跟的原语 |
| 配套 | ss -lntu 核对本机监听端口 |
典型使用场景
- 验证服务端口可达性:dst port 443 看请求是否发出、是否有回包
- 排查 DNS:udp port 53 与 tcp port 53 分开抓,大响应截断后会回退到 TCP
- 看数据库访问:dst port 3306 精确筛出客户端发往数据库的请求
- Web 排障:443 的 TCP 与 UDP 都要抓,只看一半会漏掉 HTTP/3 流量
- 端口迁移期间同时看新旧两个端口:port 8080 or port 8443
常用示例
常用示例
tcpdump -i eth0 -nn port 53 # TCP 与 UDP 的 53 端口一起抓
tcpdump -i eth0 -nn dst port 443 # 只看发往 443 的请求
tcpdump -i eth0 -nn src port 53 # 只看 DNS 服务端返回的响应
tcpdump -i eth0 -nn 'tcp port 443 and host 203.0.113.10' # 精确到某个对端
tcpdump -i eth0 -nn 'udp portrange 5000-5100' # 端口区间
tcpdump -i eth0 -nn 'port 80 or port 8080' # 多端口并列
tcpdump -nn -r a.pcap 'dst port 3306' | wc -l # 离线统计请求条数
ss -lntu | grep -E ':(443|3306)' # 对照本机是否真的在监听端口写法对照
| 写法 | 含义 | 注意 |
|---|---|---|
| port 443 | 源或目的、TCP 或 UDP 全部命中 | 想只看 UDP 必须显式加 udp 关键词 |
| dst port 443 | 目的端口为 443 | 客户端发起方向,排除服务端回包,统计请求数用它 |
| src port 443 | 源端口为 443 | 服务端返回方向,用来确认响应是否回来 |
| tcp port 443 | 仅 TCP 的 443 | QUIC 走 UDP 443,用它会漏掉一半 Web 流量 |
| portrange 5000-5100 | 端口区间匹配 | 区间写法要与协议关键词组合才够精确 |
| port 443 and host A | 双向命中该端口且属于 A | 方向修饰只作用于紧跟的原语,写清楚再加其他条件 |
端口号只是配置约定,服务改端口后过滤条件必须跟着改;把端口当作协议标识会在迁移、复用端口或代理场景里得出错误结论。
只过滤 TCP 443 会漏掉 UDP 443 上的 QUIC 流量,Web 排障时容易误判成请求根本没有发出,两个都要看。
与监听状态对照
与监听状态对照
ss -lntu # 列出本机全部 TCP/UDP 监听端口
ss -lntp | grep :8443 # 确认是哪个进程在监听该端口
tcpdump -i any -nn -c 20 'dst port 8443' # 用实际监听端口过滤,避免猜端口常见误判
- 把过滤结果直接当作请求条数:port 会把服务端回包也算进去,统计请求应该用 dst port
- 只看一个协议族:DNS 与 Web 在新版本协议下都会跨 TCP 与 UDP
- 忽略 NAT 改写:经过 NAT 后端口可能已经改变,跨设备对照时要记录映射关系
- 在代理与负载均衡前面抓:看到的是代理端口,后端真实端口要在下一跳抓
与其他条件组合
- 与 host 组合定位到具体对端,避免同端口的多条会话混在一起看
- 与 net 组合可以只看某个网段发往该端口的请求,适合排查机房级问题
- 与 tcp[tcpflags] 组合可以只看该端口的建连报文,用最少的数据量判断服务是否可达
- 与 udp 组合可以只看无连接协议,避免 TCP 与 UDP 同号端口的输出互相干扰
- 与 not 组合可以排掉健康检查来源,让统计结果接近真实业务量
端口号在过滤表达式里不能写服务名以外的变体,写 https 这类服务名会触发服务表解析,跨机器结果可能不同,统一用数字端口更稳。