Tcpdump的用法介绍和解决问题范例
Tcpdump的用法介绍和解决问题范例
目录
2.1. 常用的选项和对应参数................................................................................... 2
3.1. Tcpdump -D显示对应的系统的网口,用于-i后面指定网络接口用................. 4
3.2. tcpdump -i eth0 -n -c 8 icmp;指定eth0,关闭反查dns,抓8包.................. 6
3.3. 不使用-n时,会反查源ip和目标ip对应的url地址......................................... 6
3.4. -nn取消反向dns的过程,并用数字显示ip端口之类....................................... 8
3.6. -e 用来显示源,目标ip的mac地址.............................................................. 10
3.7. -w写文件,参数是路径和文件名,不写路径默认是系统默认路径.................. 11
3.8. -x,-xx ,-X,-XX的用法........................................................................... 12
3.9. 复杂的过滤条件表达式范例.......................................................................... 13
Tcpdump是linux环境下抓包工具,可以对对应网络接口流量进行过滤抓取,可以打印输出到屏幕,也可以保存到指定文件。指定的文件可以用wireshark来打开查看。可以快速查看符合网络接口符合某一条件的抓包,方便我们确定网络问题。
可以在linux系统环境下输入man tcpdump回车来查看它的帮助说明。如下图:
其命令格式是:tcpdump 选项和对应参数 表达式
用ctrl+c来终止抓取,有的系统用ctrl+z,有的环境中ctrl+z不生成文件,必须用ctrl+c;
-D 是显示所有的接口用的选项和参数;
-i 端口号 是指定抓取网卡的名称或者数字编号;
-n 来关闭dns反向解析功能,-nn是关闭反向查询功能并以数字格式显示ip地址端口号,和url地址。不带这个选项回显会很慢。
-c 用于指定抓取包的包数;
-C 用于指定抓取保存文件的大小,单位是兆;
-e用于显示对应的源,目的的mac地址
-w 文件路径和文件名 用于指定保存文件的路径和名称,没有指定路径默认在系统默认路径下;
-t是不显示时间戳,-tttt显示时间戳,-ttt显示请求和响应的时间的时间差;
-v是显示一些协议的详细资料,-vv,-vvv来显示更详细的资料;
-X是用16进制和asc码显示ip层以上各协议包头;
-x 小写x是用16进制打印从ip层开始的帧内容
-xx 小写的xx是用16进制打印从数据链路层开始的帧内容
-X 大写的X是用16进制打印从ip层开始的帧内容
-XX 大写的XX是用16进制打印从数据链路层开始的
-G 后面跟秒数,多少秒后重写另一个文件;
-Z 后面跟用户名,表示要用该用户名来执行;
当选项后面没有参数时,可以把几个选项连接起来使用,如-nne,-envv等等。
表达式是指过滤表达式,符合正则表达式的过滤式和wireshark的预过滤描述方法一致。
过滤表达式:协议 方向 关键词 值 可以使用关系符
协议icmp,arp,tcp ,sctp,udp,ether之类;
方向源src,目的dst;
关键词 host主机, port端口, portrange端口范围;
多个条件可以使用and ,or,not ;
如:net 18.250.0.0/24 and not“sctp[12] = 04 or sctp[12] = 05”
Tcpdump -D显示对应的系统的网口,用于-i后面指定网络接口用
-i后面可以跟上面显示的数字编号,也可以使用数字编号后后面的名称。但要注意,每个接口都有自己的ip地址,如2,3,4,5,6,7,8,14,若使用-i 1后者 -i eth0就抓取eth0上所有子接口ip的消息。
-i any是抓取所有接口接口的消息。
lo只内部回环ip地址。没有使用-i时,默认抓取最小数字的网络接口。我们下面pc18.250.0.145去ping服务器18.250.0.4为例来显示我们的我们的tcpdump抓包过程。
- tcpdump -i eth0 -n -c 8 icmp;指定eth0,关闭反查dns,抓8包
-c用于指定抓包的包数,到达指定包数后自动停止抓包,不用ctrl+c来停止。
tcpdump -i eth0 -nvv -c 8 icmp;加一个-vv会显示更详细的解码
不使用-n时,会反查源ip和目标ip对应的url地址,回显会很慢
-n用于关闭对ip包的dns反向查询功能,不使用-n,收到包后,系统会执行根据ip反向查询url地址的过程。有时执行tcpdump后,等十几秒才会有显示,使用-n后抓包后立即显示。tcpdump -i 1 -c 15 icmp or udp port 53,我们使用表达式icmp or udp 53来表示抓符合icmp协议的包和进行dns查询的包,为比较期间,我们用两台服务器相互访问为例,wireshark进行抓包比较;
- -nn取消反向dns的过程,并用数字显示ip端口之类
下面是一个跟踪2121端口的对比图:
没有使用-i默认是-i 1或者-i eth0,使用最小网络接口编号的进行。
- -tt;-ttt;-tttt的用法
-tt显示时戳,时分秒和秒后6位微秒
-ttt显示每包间的时间差
-tttt显示每包的日期和时间
- -e 用来显示源,目标ip的mac地址
-i any监视所有端口的icmp消息,-e用来显示源和目的端口的mac地址。
- -w写文件,参数是路径和文件名,不写路径默认是系统默认路径
注意没有设置抓包大小时,用ctrl+z终止不会生成文件,必须用ctrl+c来终止。下面是生成抓包文件名。
可以用-c来指定抓包个数的大小
上面的语句-c 1000是指抓取符合条件的1000包数据后自动停止,条件是arp消息和sctp消息。
查看生成文件的大小
拷贝出来文件查看
打开查看包数符合1000个。
- -x,-xx ,-X,-XX的用法
tcpdump -nnex port 5060和tcpdump -nnexx port 5060的用法比较
tcpdump -nneX port 5060和tcpdump -nneXX port 5060的用法比较
可以用or,and,not来组合过滤条件,如icmp and arp,和wireshark的预过滤语句的写法相同。
如我们要过滤arp消息和其成功后的icmp的ping消息,用服务器18.250.0.25去ping服务器18.250.0.4。
proto[位置:个数] = 0x十六进制数,proto指协议,位置是指协议字段开始的偏移量,个数指从偏移位置开始的字节数,[]里都是十进制数字。
语句:arp[14:4]=0x12fa0019 or arp[24:4]=0x12fa0019 or icmp
-
Arp请求消息中偏移量为14开始的4个字节是源ip,arp应答消息偏移量为24开始的4个字节是向请求的源ip进行回答。Arp从偏移量为8的地方为源mac地址,从18开始为目的mac地址。
过程如下:
在18.250.0.25侧
在18.250.0.4侧有这样的显示
- Tcpdump执行时的常见错误提示
- 表达式的语法没有错误,但没有交集没有符合条件的包
-
- 根据偏移量和个数过滤出错
-
proto[位置:个数] = 0x十六进制数,个数必须是1,2,4的偶数
Proto包括:ether,host,arp,sctp,tcp,udp等等
-
tcpdump -i 1 arp[24:4] = 0x12fa000e or icmp 抓目的ip和icmp消息的抓包,注意源ip是arp[14:x]开始的,目的ip是24开始的。
- syntax error near unexpected token `('
-
linux中不能出现(),把括号去掉就没有问题了(需要使用转义符)
用“”来转义就没有问题了
- 语法错误
-
tcpdump抓取流量,输出到屏幕上时,不做过滤,会有大量包弹出,不利于我们判断问题,所以要采用表达式过滤流量,显示特定的包,这样方便我们发现问题。
-
范例回程路由的问题确定:
办公环境中的192.168.207.0/24网段pc192.168.207.25要通过路由方式访问服务器18.250.0.25,发现ping不通, 如下图:
看图中表现,ping包已经发出,没有等到响应包,超时了。
处理思路:
在207网段pc侧长ping服务器ip,在服务器侧18.250.0.25侧执行tcpdump看是否收到包,收到了证明前向路由没有问题,没有收到,检查经过节点的路由指向。有回包的话,证明服务器的回程路由没有问题,检查经过节点的回程路由指向,回包在哪一级丢了。没有回包检查服务器本身的回程路由。
服务器侧执行tcpdump -nnevv host 192.168.207.25,看到收到ping的request消息,但没有响应reply消息发出。
判断服务器侧的回程路由有问题,检查回程路由。
发现本身只有直连路由18.250.0.0/24的直连路由,没有回程路由。
确定服务器本身mac地址是d4:ae:52:ce:5c:7b,在上图的tcpdump消息里ping的request消息是由c8:50:e9:67:fa:0c发来的,只要知道这个MAC地址对应的ip,把回程路由指向这个mac地址对应的ip就能实现回程路由。
确定c8:50:e9:67:fa:0c对应的ip的方法,因为发包前,服务器的上级设备应该和服务器在同一网段,并发arp查询消息过来,得到响应后,转发request消息给服务器。知道这样流程后,重新来过,207侧ping,服务器侧抓tcpdump -nnevv arp[14:2]=0x12fa and arp[24:2]=0x12fa or host 192.168.207.25看看?它是从协议的起始开始计算偏移量,等号只有一个。
-
确定是从18.250.0.100的mac c8:50:e9:67:fa:0c发出的arp请求消息,已知18.250.0.100是三层交换机的一个子接口ip地址,由此确定做一个回程路由指向18.250.0.100,考虑办公网的ip段是192.168.192.0/19,因此做一个这样的回程路由看看,route add -net 192.168.192.0/19 gw 18.250.0.100。
添加成功后,再次ping一下看看?
问题解决。
- 过滤rtp流用用udp[8:1]=0x80
-