TCP dump使用
抓包工具在分析通信网络传输故障时发挥着重要作用,不仅可以用wireshark 进行抓包,也可以用Linux的tcpdump做抓包。
下面是tcpdump的基本使用方法:
1 基本语法
过滤主机
- 抓取所有经过 eth1,目的或源地址是192.168.1.1 的网络数据
# tcpdump -i eth1 host 192.168.1.1
- 源地址
# tcpdump -i eth1 src host 192.168.1.1
- 目的地址
# tcpdump -i eth1 dst host 192.168.1.1
过滤端口
- 抓取所有经过 eth1,目的或源端口是25 的网络数据
# tcpdump -i eth1 port 25
- 源端口
# tcpdump -i eth1 src port 25
- 目的端口
# tcpdump -i eth1 dst port 25网络过滤
--------
# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168
协议过滤
# tcpdump -i eth1 arp
# tcpdump -i eth1 ip
# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp
2常用表达式
非 : ! or "not" ( 去掉双引号 )且 : && or "and"
或 : || or "or"
抓取所有经过 eth1,目的地址是192.168.1.254 或192.168.1.200 端口是80 的TCP 数据:
# tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))'
抓取所有经过 eth1,目标 MAC 地址是00:01:02:03:04:05 的ICMP 数据:
# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
抓取所有经过 eth1,目的网络是192.168,但目的主机不是192.168.1.200 的TCP 数据:
# tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
只抓 SYN 包:
# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
抓 SYN, ACK:
# tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
抓 SMTP 数据
# tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。
抓 HTTP GET 数据
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
"GET "的十六进制是 47455420
抓 SSH 返回
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
"SSH-"的十六进制是 0x5353482D
# tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2]
= 0x312E)'抓老版本的 SSH返回信息,如"SSH-1.99.."
抓 DNS 请求数据
# tcpdump -i eth1 udp dst port 53
其他
-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C还是
抓的太多,于是可以用-c 参数指定抓多少个包。
# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令计算抓 10000 个SYN 包花费多少时间,可以判断访问量大概是多少。
实时抓取端口号8000的GET包,然后写入GET.log
tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
3tcpdump选项介绍
tcpdump抓包并保存成cap文件
首选介绍一下tcpdump的常用参数
tcpdump采用命令行方式,它的命令格式为:
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名] [表达式]
-a将网络地址和广播地址转变成名字;
-b在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。tcpdump -b arp 将只显示网络中的arp即地址转换协议信息;
-c在收到指定数目的包后,tcpdump就会停止;
-d将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd将匹配信息包的代码以c语言程序段的格式给出;
-ddd将匹配信息包的代码以十进制的形式给出;
-e在输出行打印出数据链路层的头部信息;
-f将外部的Internet地址以数字的形式打印出来;
-F从指定的文件中读取表达式,忽略其它的表达式;
-i指定监听的网络接口;
-l使标准输出变为缓冲行形式,如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中;
-n不进行IP地址到主机名的转换;
-N不打印出默认的域名
-nn不进行端口名称的转换;
-O不进行匹配代码的优化,当怀疑某些bug是由优化代码引起的,此选项将很有用;
-r从指定的文件中读取包(这些包一般通过-w选项产生);
-s抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包
-t在输出的每一行不打印UNIX时间戳,也就是不显示时间;
-T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp;
-tt打印原始的、未格式化过的时间;
-v输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv输出详细的报文信息;
-w直接将包写入文件中,并不分析和打印出来;
tcpdump默认的是标准输出,一般来讲就是显示器,如果要将抓包结果保存到文件则需要使用-w参数,例如:
tcpdump -i eth1 -w /tmp/xxx.cap
抓eth1的包
更多推荐
所有评论(0)