---
url: /article/pry9jhsz/index.md
---
## 序言

通常在 Windows 上查看分析 tcp 协议会使用 wireshark，但 Linux 上一般使用 tcpdump. deepin 上使用`apt-get install tcpdump`安装命令。如果提示权限不足，使用`sudo`提权。

## 1. tcpdump 常用的参数

|参数|释义|示例|备注|
|--|--|--|--|
|host|基于 host 过滤|tcpdump host 127.0.0.1||
|src|基于源过滤|tcpdump src 127.0.0.1||
|dst|基于目的地过滤|tcpdump dst 127.0.0.1||
|net|基于网段过滤|tcpdump net 1192.168.31.0/24|同样可以指定源和目的 tcpdump \[src\dst] net 192.168.31.0/24|
|port|基于端口过滤|tcpdump tcp port 80|加上具体的协议 tcp 可以更精准的捕获。同样可以指定源和目的 tcpdump \[src\dst] port 80。如果要指定多个端口 tcpdump port 80 or port 22 或 tcpdump port 80 or 22。如果要抓去一个端口范围 tcpdump portrange 8000-8080。对于一些常见的协议可以使用协议名如 tcpdump tcp port http|
|icmp|基于协议过滤|tcpdump icmp|一般常用的协议，如 ip, ip6, arp, icmp, udp 等。但 http, dns, https, ssh 等应用层协议不能直接这样写，需要写成 tcpdump port http 或 tcpdump port 53(dns)。|
|-i|指定监听网络接口|tcpdump -i eht0|未指定时，默认监听第一块网卡上通过的数据包。tcpdump -i any 监听所有网卡，用来查看是否有网络流量。|
|-w|将捕获的信息保存到文件中|tcpdump -i eth0 -w a.pcap|不分析和打印到屏幕，导出文件为 cap 或 pcap 格式，可以直接使用 wireshark 打开，进行报文分析。|
|-r|从文件中读取数据|tcpdump -r a.pcap|读取后可以使用上述语法进行过滤分析|
|-n|直接显示 ip|tcpdump -n|避免执行 dns lookups 解析为主机名，速度会快很多。但端口还是会翻译为协议名|
|-nn|不把协议和端口转化成名字|tcpdump -nn|速度会快很多|
|-N|不打印 host 域名部分内容|tcpdump -N|如 192.168.10.135.12345 会被简化为 192.12345|
|-t|不输出时间|tcpdump -t||
|-tt|输出显示为时间戳|tcpdump -tt||
|-ttt|输出每两行打印的时间间隔|tcpdump -ttt|单位：毫秒|
|-tttt|在时间戳之前输出日期|tcpdump -tttt|输出的时间最直观|
|-v|详细输出|tcpdump -v||
|-vv|更详细输出|tcpdump -vv||
|-vvv|更更详细输出|tcpdump -vvv||
|-c|指定抓包数量|tcpdump -c 20|抓满20包个停止|
|-C|文件分割|tcpdump -C 1 -W 3 -w a.pcap|-C 与 -w 一起使用，数据在写入文件前检查是否超过了file\_size(这里是1百万个字节)，单位是百万字节 1000000 个字节，超过后会自动写入新文件，文件名为 a.pcap1,a.pcap2 ... -W 表示最多写 3 个文件。|
|-Q|过滤数据包的方向|tcpdump -Q in\out\inout|不写和 inout 一样双向的。-Q 也可以用 --direction 等价代替|
|-q|简洁打印|tcpdump -q||
|-D|显示所有可用网卡|tcpdump -D||
|-L|列出网卡的已知数据链路|tcpdump -L||
|-s|指定捕获包的长度|tcpdump -s 20|单位是 byte，默认是 262144 个 byte。如果超过了大小，显示就会被截断，而打印出\[|proto] 这种标识，proto 表示报文协议的名字，如 tcp。一般包越长，处理的时间就越长，并且会减少 tcpdump 可缓存的包数量，从而导致数据包丢失，所以一般下去的长度越小越好。(-s 0 表示用默认长度)，不同 tcpdump 的版本，默认抓取的长度不一样。|
|-A|以 ASCII 格式打印所有分组数据|tcpdump -A|这样方便使用 grep 等工具解析输出内容。例如：tcpdump -A | grep baidu|
|-X|同时使用十六进制和 ASCII 字符串打印报文|tcpdump -X|-X 和 -A 不能一起用|
|-e|打印出数据链路层的头部信息|tcpdump -e|如显示源和目的 MAC 地址，及 WLAN tag 信息|
|-F|使用指定文件(filter\_rule)中的表达式抓包|tcpdump -F filter\_rule|此时命令行后输入的规则将被忽略,这种情况适合表达式长期维护|
|-l|对标准输出进行缓冲|tcpdump -l|使标准输出设备遇到换行符时就讲这行内容打印出来，这在观察输出的同时写入文件很有用。如：tcpdump -l | tee a.txt 或 tcpdump -l > a.txt & tail -f a.txt 。(tee 读取标准输入，并将数据输出到文件; > 表示重定向操作)|
|less|基于包大小进行过滤|tcpdump less 32|抓取小于 32 个 byte 的数据包|
|greater|基于包大小进行过滤|tcpdump greater 50|抓取大于 100 个 byte 的数据包|
|-v|查看版本|tcpdump -v||

tcpdump 帮助命令`man tcpdump`, 使用`quit`退出。

## 2. tcp 协议分析

逻辑运算符：and(&&) or(||) not(!)。and 优先级高于 or。多个过滤器组合时需要用到圆括号，但在 shell 中圆括号是特殊字符，需要用引号，如：tcpdump "src 127.0.0.1 and (dst port 3306 or 22)"

只抓 SYN 包 tcpdump 'tcp\[tcpflags] = tcp-syn'
抓 SYN 和 ACK tcpdump 'tcp\[tcpflags]'

注意，监听本机时应使用回环地址 lo。
