tcpdumpLinux下自带的网络分析工具。可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供andornot等逻辑语句来帮助你去掉无用的信息。

 
 
tcpdump 主要选项
类型
host, net, port
方向
src, dst, src or dst, src and dst
协议
ip, tcp, udp, arp, rarp, ether, fddi
逻辑
and, or, not 或者 &&, ||, !
选项
-i 指定网卡, -n 显示ip, -A 文本显示
-c 抓包数, -x/-xx/-X/-XX 二进制显示, -r , -w
 
类型
host 指定主机或目的地址。
net 制定网络地址。net 可以用来指定子网。
port 指定监听端口。
如果要制定多种类型,用逻辑运算符号连接。
tcpdump net 192.168.1 。监听子网192.168.1.0
tcpdump net 192.168.1.0/24
tcpdump host 192.168.1.124 and port 80 。监听指定主机的80 端口。
 
方向
src 指定源地址,dst 指定目的地址。
监听来自192.168.1.10 192.168.1.11 80 端口:
tcpdump port 80 and \(src 192.168.1.10 or src 192.168.1.11\)
 
协议
用来捕获特定协议的数据包有:ether(ethernet), tcp, udp, icmp, ip, ip6(ipv6), arp, rarp(reverse arp) 等。
 
逻辑
tcpdump port 80 and \(host 192.168.1.10 or host 192.168.1.11\) 。监听主机192.168.1.10 192.168.1.11 80 端口。
使用 () 一定要用 \ 转义
获取主机210.27.48.1 除了和主机210.27.48.2 之外所有主机通信的ip 包:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
 
选项
-i :指定网卡。
-n :显示ip ,而不是主机名。
-c :指定抓多少个包后退出。
-A :以ASCII 方式显示包内容,这个选项对文本格式的协议包非常有用。
-s :指定抓包显示一行的宽度,-s0 表示显示完整的包,经常和-A 一起用。
-x/-xx/-X/-XX :以十六进制显示包内容,几个选项只有细微的差别,详见man 手册。
-vv :详细信息。
-r :从文件中读取。
-w :导出到指定文件。
监听来自172.25.38.145 到端口7012 的数据,并到处到指定文件:
tcpdump tcp dst port 7012 and src host 172.25.38.145 -vv –w output.dat
从指定文件加载监听数据:
tcpdump -r output.dat
监听网卡eth1 端口7012 的数据:
tcpdump tcp port 7012 -ieth1 –n
 
tcpdump 解析 tcp 连接建立和释放
下面命令抓包:
# tcpdump tcp port 7012 and host 172.25.34.88 -ieth1 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
 
1.          14:44:52.174122 IP 172.25.38.145.49563 > 172.25.34.88.7012: S 1986599379:1986599379(0) win 5840
2.          14:44:52.174249 IP 172.25.34.88.7012 > 172.25.38.145.49563: S 4294961892:4294961892(0) ack 1986599380 win 5792
3.          14:44:52.174228 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 1 win 1460
4.          14:44:52.174433 IP 172.25.38.145.49563 > 172.25.34.88.7012: P 1:109(108) ack 1 win 1460
5.          14:44:52.174443 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 109 win 1448
6.          14:44:52.186891 IP 172.25.34.88.7012 > 172.25.38.145.49563: P 1:857(856) ack 109 win 1448
7.          14:44:52.186914 IP 172.25.34.88.7012 > 172.25.38.145.49563: F 857:857(0) ack 109 win 1448
8.          14:44:52.187054 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 857 win 1888
9.          14:44:52.195347 IP 172.25.38.145.49563 > 172.25.34.88.7012: F 109:109(0) ack 858 win 1888
10.       14:44:52.195355 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 110 win 1448
 
每一行中间都有这个包所携带的标志:
S=SYN ,发起连接标志。
P=PUSH ,传送数据标志。
F=FIN ,关闭连接标志。
ack     表示确认包。
RST=RESET ,异常关闭连接。
. 表示没有任何标志。
 
上面抓包的过程解析:
1 行:14:44:52 这个时间,从172.25.38.145 client )的临时端口49563 172.25.34.88 server )的7012 监听端口发起连接,client 初始包序号为1986599379 ,滑动窗口大小为5840 字节(滑动窗口即tcp 接收缓冲区的大小,用于tcp 拥塞控制),mss 大小为1460 (即可接收的最大包长度,通常为MTU 40 字节,IP 头和TCP 头各20 字节)。
2 行:server 响应连接,同时带上第一个包的ack 信息,为client 端的初始包序号加1 ,即 1986599380 ,即server 端下次等待接受这个包序号的包,用于tcp 字节流的顺序控制。Server 端的初始包序号为 4294961892 mss 也是1460
3 行:client 再次确认,tcp 连接三次握手完成。
4 行:client 发请求包,包长度108 字节。
5 行:server 响应ack
6 行:server 回包,包长度856 字节。
7 行:client 响应ack
8 行:client 发起关闭连接请求。
9 行:server 响应ack ,并且也发送FIN 标志关闭。
10 行:客户端响应ack ,关闭连接的四次握手完成。