-n 与 -nn 在做什么
默认情况下 tcpdump 会把地址翻译成主机名、把端口号翻译成服务名,这需要查 DNS 与本地服务表。抓包机如果没有可用的内网 DNS,反查会先超时才输出,输出速度跟不上收包速度就直接丢包;而且同一份报文在不同解析环境下打印出来的内容不一致。-n 关闭主机名解析,-nn 连端口名也不解析,输出 443 而不是 https。排障与统计一律建议加 -nn,这是服务器侧抓包的默认习惯。
基本信息
| -n | 不解析主机名与域名 |
|---|---|
| -nn | 不解析主机名,也不解析端口名与服务名 |
| 影响范围 | 只影响显示输出,不影响抓包内容与落盘文件 |
| 离线同样生效 | tcpdump -nn -r file.pcap 也能稳定输出数字形式 |
| 对照项 | Wireshark 有独立的名称解析开关,默认关闭 |
典型使用场景
- 服务器现场抓包:默认加 -nn,避免反查带来的停顿与丢包
- 与业务日志比对:日志里记录的是数字地址与端口,输出保持同一种形式才好对齐
- 离线批量分析:tshark 处理大文件时开启解析会成倍放大耗时
- 内网无 DNS 环境:不加 -n 时输出会夹杂解析失败留下的怪异后缀
- 需要知道对端是谁:先解析出地址,再用 ip.addr 或 host 精确过滤
对比示例
对比示例
tcpdump -i eth0 -c 3 # 可能显示 client.example.com.https
tcpdump -i eth0 -nn -c 3 # 稳定显示 10.0.0.5.52344 > 10.0.0.9.443
tcpdump -nn -r a.pcap -c 5 # 离线读取同样不解析
tcpdump -i eth0 -nn -ttt port 443 # 数字地址加相对时间,排查时延常用
tcpdump -i eth0 -nn -c 5 host 10.0.0.9 # 过滤里用数字地址,避免触发解析解析行为对照
| 用法 | 显示形式 | 代价 |
|---|---|---|
| 默认 | 10.0.0.5.https 这类形式 | 每次都要查主机名与端口名,无 DNS 时会卡顿 |
| -n | 10.0.0.5.443 或仍带服务名 | 不查主机名,端口名是否解析随版本而异 |
| -nn | 10.0.0.5.443 | 完全不解析,输出稳定且速度快 |
| -nn -r 文件 | 同上 | 离线分析结果最稳定,便于多人核对 |
| -nn -ttt | 数字地址加相对时间戳 | 排查重传与时延间隔的常用组合 |
名称解析只影响显示,不影响抓包与落盘内容。同一个 pcap 文件加不加 -nn 读出来的是同一批报文,所以贴结论时优先贴数字形式。
在 DNS 服务器上抓包时更要加 -nn:反向解析本身会产生额外查询流量,污染现场数据,让排查结论失真。
按需解析
按需解析
getent hosts 10.0.0.9 # 想看某地址对应哪台机器,单独解析
dig -x 10.0.0.9 +short # 用 dig 反查,比让 tcpdump 自己解析可控
grep -E '10\.0\.0\.9[[:space:]]' /etc/hosts # 内网静态映射查一下使用建议
- 抓包命令模板里把 -nn 写进固定参数,避免每次靠人记得加
- 与 -s 0 同时使用:一个解决内容完整,一个解决输出速度
- 需要给人看的报告里保留数字地址,再附一张地址与主机的对照表
- 批量脚本里不要依赖主机名,数字输出在跨环境复现时不会产生歧义
常见误区
- 以为 -nn 会改变抓到的内容:它只改显示,同一份文件两种读法数据一致
- 以为加了 -n 就万事大吉:不同版本的端口名解析行为有差异,统一用 -nn 才不会误判输出格式
- 用主机名做过滤条件:解析结果随环境变化,过滤条件应该用数字地址
- 在无 DNS 的机器上不加密析选项,导致输出断续且抓包丢包,误判成网络本身在丢包