tcpdump 是一个能够撷取所有本机网路封包的软体,在 Linux 与 Mac 系统内建都已经安装好这个软体,而 windows 则是有其他的替代方案如 http://www.winpcap.org/windump/
透过 tcpdump 我们可以看到网路传输中最原始的内容,方便软体工程师 Debug,其中也包含 FTP, HTTP 等等 的header 与 content, 因为 FTP, HTTP 都是没有经过加密的传输协定,所以可以轻松的看懂原始码,但是若封包经过 SSL 加密,例如 HTTPS,则没办法透过 tcpdump 解密出来,需要使用 ssldump 工具。
最简单的 tcpdump 用法,下面这个指令会撷取所有使用 HTTP Protocol 的网路封包, 1024 代表我只印出每个封包的前面 1024 个 Bytes 长度。
sudo tcpdump -i any -A -s 1024 "dst port 80"
各种参数说明
- -A : 用 ASCII 码印出所有封包内容
- -B : 设定系统 Buffer (单位 KB)
- -c : 当撷取的封包数大於你指定的数字,则停止 tcpdump process
- -d : 将封包内容转给人类看得懂的语言
- -dd : 将封包内容输出成 C 语言程式。
- -ddd : 将封包内容输出成十进位
- -D : 列出所有网卡
- sudo tcpdump -D
- 1.eth0
- 2.eth1
- 3.eth2
- 4.any (Pseudo-device that captures on all interfaces)
- 5.lo
- -e : 印出 link-level header 资讯。
- -i : 指定要撷取哪一张网卡的封包。
- -s : snapshot length,每次要撷取的封包大小,如 -s 1024 ,代表我每次取得 1024 bytes 的资料,大於 1024 bytes 的封包内容会被放弃。
- -E : 加解密封包的演算法,预设是 des-cbc。
- -F : (Filter Expression Syntax), 过泸封包内容, -F 后面要带一个档案路径,然后将过泸的语法写进档案当中,相关的语法可以在这里查到 http://www.tcpdump.org/manpages/pcap-filter.7.html 。
- Filter expression: "dst 10.0.2.15 and port 80"
Filter 使用范例
sudo tcpdump "dst 10.0.2.15" ,(destination) 这是指我只要撷取送给 "10.0.2.15" 这个 IP 的封包。
sudo tcpdump "src 10.0.2.15" ,(source) 这是指我要撷取封包来自 "10.0.2.15" 这个 IP。
sudo tcpdump "dst 10.0.0.0 and port 80",使用 and 可以将两种 filter 方式合并。
- -C : 指定档案大小的上限, tcpdump 可以使用 -w 将封包写入一个档案,当档案的大小超过你指定的大小时,则建立一个新的档案,例如你的档案名称设定给 test ,当档案大小超过限制, 程式会自动建立 test1, test2, test3 ...等 , -C 1 : 代表档案最大为 1 MB
- -w : 写入的档名。
- -W : 最多储存档案,要与 -C, -w 搭配使用。
- -G : rotates the dump file, -G 5
sudo tcpdump -C 1 -W 10 -w aa , 会将封包存到 aa0, aa1 ~ aa10,每个档案大小为 1 MB
- -l : 小写 L ,可以将封包内容转换成 stdout line buffer,这样就能透过 Linux Pipe 功能,自已过泸封包内容,如 sudo tcpdump -l |grep "http"。
- -X : 用 hex dump 出封包内容
- -nn: 不要显示 dns lookup 讯息
Dump Mysql 连线资讯
sudo tcpdump -i any -nnXSs 0 "dst localhost and port 3306"
- 13:23:29.493219 IP 127.0.0.1.3306 > 127.0.0.1.56xx1: Flags [P.], seq 2282647505:2282647645, ack 116685703, win 512, options [nop,nop,TS val 945789841 ecr 945789838], length 140
- 0x0000: 4508 00c0 6044 4000 4006 dbe9 7f00 0001 E...`D@.@.......
- 0x0010: 7f00 0001 0cea dd4b 842e 6131 06f4 7b87 .......K..o...{.
- 0x0020: 8018 0200 fea4 0000 0101 020a 385f 9b91 ............8_..
- 0x0030: 385f 9abe 8800 001b 00d1 8255 5502 0100 8_.........UU...
- 0x0040: 0000 8200 0000 e015 510c 0000 4acc 0dd0 ........Q...J...
- 0x0050: 0000 0000 0600 001a 0000 0040 0000 0100 ...........@....
- 0x0060: 0000 0000 0000 0006 0373 1234 0421 0021 .........std.!.!
- 0x0070: 00c0 006d 7222 6974 6500 7570 6461 7465 ...da1ite.aspste
- 0x0080: 2010 6572 7230 3360 2333 6574 2060 736f .`bgxxx`.set.`so
- 0x0090: 7274 603d 2731 3833 3333 3727 2077 6865 rt`='183997'.whe
- 0x00a0: 7265 2020 2820 6073 6964 6020 3d20 2731 re..(.`idd`.=.'1
- 0x00b0: 3833 3939 3727 2029 206c 696d 6974 2031 83997'.).limit.1
每次用 tcpdump 时,常常会扫出一堆 ssh 连线的封包,但是大部分的状态之下,我们不用看 ssh 封包的,ssh 使用的通讯 port 为 22 ,这时就可以用 「port not 22」,泸掉这些资讯。
- sudo tcpdump -i any -nnXSs 0 port not 22
windump 使用范例
- windump -i 4 -A tcp port 80
tcpdump 官方文件 http://www.tcpdump.org/