tcpdump 介绍
tcpdump 是一个运行在命令行下的抓包工具.它允许用户拦截和显示发送或收到过网络连接到该计算机的 TCP/IP 和其他数据包.tcpdump 适用于
大多数的类 Unix 系统操作系统 (如 linux,BSD 等).类 Unix 系统的 tcpdump 需要使用 libpcap 这个捕捉数据的库就像 windows 下的 WinPcap.
在学习 tcpdump 前最好对基本网络的网络知识有一定的认识.
tcpdump 命令格式及常用参数
Tcpdump 的大概形式如下:
例: tcpdump -i eth0 'port 1111' -X -c 3
-X 告诉 tcpdump 命令,需要把协议头和包内容都原原本本的显示出来(tcpdump 会以 16 进制和 ASCII 的形式显示),这在进行协议分析时是绝对的利器.
tcpdump 采用命令行方式,它的命令格式为:
tcpdump [-adeflnNOpqStvx] [-c 数量] [-F 文件名]
[-i 网络接口] [-r 文件名] [-s snaplen]
[-T 类型] [-w 文件名] [表达式]
tcpdump 的选项介绍
-a 将网络地址和广播地址转变成名字;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以 c 语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e 在输出行打印出数据链路层的头部信息,包括源 mac 和目的 mac,以及网络层的协议;
-f 将外部的 Internet 地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 指定将每个监听到数据包中的域名转换成 IP 地址后显示,不把网络地址转换成名字;
-nn: 指定将每个监听到的数据包中的域名转换成 IP,端口从应用名称转换成端口号后显示
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在 ip 包中可以包括 ttl 和服务类型的信息;
-vv 输出详细的报文信息;
-c 在收到指定的包的数目后,tcpdump 就会停止;
-F 从指定的文件中读取表达式, 忽略其它的表达式;
-i 指定监听的网络接口;
-p: 将网卡设置为非混杂模式,不能与 host 或 broadcast 一起使用
-r 从指定的文件中读取包 (这些包一般通过 - w 选项产生);
-w 直接将包写入文件中,并不分析和打印出来;
-s snaplen snaplen 表示从一个包中截取的字节数.0 表示包不截断,抓完整的数据包.默认的话 tcpdump 只显示部分数据包, 默认 68 字节.
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有 rpc (远程过程调用)和 snmp(简单网络管理协议;)
-X 告诉 tcpdump 命令,需要把协议头和包内容都原原本本的显示出来(tcpdump 会以 16 进制和 ASCII 的形式显示),这在进行协议分析时是绝对的利器.
------------------------------------------------
1,抓取回环网口的包:tcpdump -i lo
2,防止包截断:tcpdump -s0
3,以数字显示主机及端口:tcpdump -n
如键入命令: tcpdump -i eth0 'port 1111' -X -c 3
-i 是 interface 的含义,是指我们有义务告诉 tcpdump 希望他去监听哪一个网卡,
-X 告诉 tcpdump 命令,需要把协议头和包内容都原原本本的显示出来(tcpdump 会以 16 进制和 ASCII 的形式显示),这在进行协议分析时是绝对的利器.
port 1111 我们只关心源端口或目的端口是 1111 的数据包.
-c 是 Count 的含义,这设置了我们希望 tcpdump 帮我们抓几个包.
其中还有另外一个比较重要的参数- l 使得输出变为行缓冲
-l 选项的作用就是将 tcpdump 的输出变为 "行缓冲" 方式,这样可以确保 tcpdump 遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于利用管道
或重定向方式来进行后续处理.
Linux/UNIX 的标准 I/O 提供了全缓冲,行缓冲和无缓冲三种缓冲方式.
标准错误是不带缓冲的,终端设备常为行缓冲,而其他情况默认都是全缓冲的.
例如我们只想提取包的每一行的第一个域 (时间域),这种情况下我们就需要 - l 将默认的全缓冲变为行缓冲了.
tcpdump -i eth0 port 1111 -l | awk '{print $1}'
参数-w -r
-w 直接将包写入文件中 (即原始包,如果使用 重定向 > 则只是保存显示的结果,而不是原始文件),即所谓的 "流量保存"--- 就是把抓到的网络包能存储到磁盘上,
保存下来,为后续使用.参数 - r 达到 "流量回放"--- 就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析.
通过 - w 选项将流量都存储在 cp.pcap(二进制格式) 文件中了. 可以通过 -r 读取 raw packets 文件 cp.pcap.
如:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 即可进行流量回放.
问:流量回放又有啥子用?
tcpdump 的输出结果介绍
键入命令:sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 所截获包内容如下:
-n 不把网络地址转换成名字;
sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111'
第一行:"tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode"
提示使用选项 - v 和 - vv,可以看到更全的输出内容.
第二行 "listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes"
我们监听的是通过 eth0 这个 NIC 设备的网络包,且它的链路层是基于以太网的,要抓的包大小限制是 65535 字节.包大小限制值可以通过 - s 选项来设置.
第三行 "12:40:33.569037 00:19:e0:b5:10:94> 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),"
12:40:33.569037 分别对应着这个包被抓到的 "时","分","秒","微妙".
00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示 MAC 地址 00:19:e0:b5:10:94 发送到 MAC 地址为 00:1a:a0:31:39:d4 的主机,ethertype IPv4 (0x0800) 表示
Ethernet 帧的协议类型为 ipv4(即代码为 0x0800).
第四行 "length 66: 210.45.123.249.27236> 172.16.0.11.1111: Flags [S],seq 1624463808,
length 66 表示以太帧长度为 66. 210.45.123.249.27236 表示这个包的源 IP 为 210.45.123.249,源端口为 27236,'>'表示数据包的传输方向, 172.16.0.11.1111,
表示这个数据包的目的端 ip 为 172.16.0.11, 目标端口为 1111,1111 端口是我的一个 web 服务器监听端口.Flags 是 [S],表明是 syn 建立连接包 (即三次握手的第一次
握手),seq1624463808 序号为 1624463808,这个其实就是 TCP 三次握手的第一次握手:client(210.45.123.249) 发送 syn 请求建立连接包.
第五行 "win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0"
win 8192 表示窗口大小为 8192 字节.options[mss 1460,nop,wscale 2,nop,nop,sackOK] 为 tcp 首部可选字段 mss 1460 表示 mss 是发送端(客户端)通告的最大
报文段长度,发送端将不接收超过这个长度的 TCP 报文段 (这个值和 MTU 有一定关系).nop 是一个空操作选项, wscale 指出发送端使用的窗口扩大因子为 2, sackOK
表示发送端支持并同意使用 SACK 选.
下面几行分别是 IP,TCP 首部 ,这里不再敷述.
tcpdump 过滤语句介绍
可以给 tcpdump 传送 "过滤表达式" 来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式.
可以通过命令 man pcap-filter 来参考过滤表达式的帮助文档
过滤表达式大体可以分成三种过滤条件,"类型","方向" 和 "协议",这三种条件的搭配组合就构成了我们的过滤表达式.
关于类型的关键字,主要包括 host,net,port, 例如 host 210.45.114.211,指定主机 210.45.114.211,net 210.11.0.0 指明 210.11.0.0 是一个网络地址,port 21 指明
端口号是 21.如果没有指定类型,缺省的类型是 host.
关于传输方向的关键字,主要包括 src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向.举例说明,src 210.45.114.211 , 指明 ip 包中源地址是 210.45.114.211, dst net 210.11.0.0 指明目的网络地址是 210.11.0.0 .如果没有指明
方向关键字,则缺省是 srcor dst 关键字.
关于协议的关键字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp 等类型.这几个的包的协议内容.如果没有指定任何协议,则 tcpdump 将会监听所有协议的
信息包.
如我们只想抓 tcp 的包命令为: sudo tcpdump -i eth0 -nn -c1 'tcp'
除了这三种类型的关键字之外,其他重要的关键字如下:
gateway, broadcast,less,greater, 还有三种逻辑运算,取非运算是'not' '!', 与运算是'and','&&'; 或运算是'or' ,'||';
可以利用这些关键字进行组合,从而组合为比较强大的过滤条件.下面举例说明
(1) 只想查目标机器端口是 21 或 80 的网络包,其他端口的我不关注:
sudo tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
(2) 想要截获主机 172.16.0.11 和主机 210.45.123.249 或 210.45.123.248 的通信,使用命令 (注意括号的使用):
sudo tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or210.45.123.248)'
(3) 想获取使用 ftp 端口和 ftp 数据端口的网络包
sudo tcpdump 'port ftp or ftp-data'
这里 ftp,ftp-data 到底对应哪个端口? linux 系统下 /etc/services 这个文件里面,就存储着所有知名服务和传输层端口的对应关系.如果你直接把 / etc/services 里
的 ftp 对应的端口值从 21 改为了 3333,那么 tcpdump 就会去抓端口含有 3333 的网络包了.
(4) 如果想要获取主机 172.16.0.11 除了和主机 210.45.123.249 之外所有主机通信的 ip 包,使用命令:
sudo tcpdump ip 'host 172.16.0.11 and ! 210.45.123.249'
(5) 抓 172.16.0.11 的 80 端口和 110 和 25 以外的其他端口的包
sudo tcpdump -i eth0 'host 172.16.0.11 and! port 80 and ! port 25 and ! port 110'
下面介绍一些 tcpdump 中过滤语句比较高级的用法
想获取 172.16.10.11 和 google.com 之间建立 TCP 三次握手中带有 SYN 标记位的网络包.
命令为:sudo tcpdump -i eth0 'host 172.16.0.11 andhost google.com and tcp[tcpflags]&tcp-syn!=0' -c 3 -nn
上面的命令是不是看着有点晕的感觉. 是的.
下面详细介相关知识.
其实我们理解这种语法: proto [expr : size] ,就不难理解上面的语句了.
下面详细介绍 proto [expr : size]
Proto 即 protocol 的缩写,它表示这里要指定的是某种协议名称,如 ip,tcp,udp 等.总之可以指定的协议有十多种,如链路层协议 ether,fddi,tr,wlan,ppp,slip,link,
网络层协议 ip,ip6,arp,rarp,icmp 传输层协议 tcp,udp 等.
expr 用来指定数据报字节单位的偏移量,该偏移量相对于指定的协议层,默认的起始位置是 0;而 size 表示从偏移量的位置开始提取多少个字节,可以设置为
1,2,4, 默认为 1 字节.如果只设置了 expr,而没有设置 size,则默认提取 1 个字节.比如 ip[2:2],就表示提取出第 3,4 个字节;而 ip[0] 则表示提取 ip 协议头的
第一个字节.在我们提取了特定内容之后,我们就需要设置我们的过滤条件了,我们可用的 "比较操作符" 包括:>,<,>=,<=,=,!=,总共有 6 个.
举例:想截取每个 TCP 会话的起始和结束报文 (SYN 和 FIN 报文), 而且会话方中有一个远程主机.
sudo tcpdump 'tcp[13] & 3 != 0 and not(src and dst net 172.16.0.0)' -nn
如果熟悉 tcp 首部报文格式可以比较容易理解这句话,因为 tcp 便宜 13 字节的位置为 2 位保留位和 6 位标志位 (URG,ACK,PSH,RST,SYN,FIN), 所以与 3 相与就可以得出
SYN,FIN 其中是否一个置位 1.
从上面可以看到在写过滤表达式时,需要我们对协议格式比较理解才能把表达式写对.这个比较有难度的...为了让 tcpdump 工具更人性化一些,有一些常用的偏移量,
可以通过一些名称来代替,比如 icmptype 表示 ICMP 协议的类型域,icmpcode 表示 ICMP 的 code 域,tcpflags 则表示 TCP 协议的标志字段域.
更进一步的,对于 ICMP 的类型域,可以用这些名称具体指代:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect,icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob,icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq,icmp-maskreply.
而对于 TCP 协议的标志字段域,则可以细分为 tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg.
对于 tcpdump 只能通过经常操作来熟练这些语句了.也可以把网络包用 tcpdump 截获保存到指定文件, 然后用 wireshark 等可视化软件分析网络包.
参考:
http://network.51cto.com/art/200512/15473.htm
http://fanqiang.chinaunix.net/app/other/2006-07-14/4833.shtml
http://hi.baidu.com/sxq5858/item/af17d7bf0397ca77244b0953
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
来源: http://www.bubuko.com/infodetail-2477181.html