Linux复习与归纳9-tcpdump和Wirshark上篇

Linux

Linux复习与归纳9~

tcpdump和Wirshark

​ tcpdump可用于网络问题的调试,它是基于Unix系统命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。

​ tcpdump只能抓取流经本机的数据包。如果要抓取其它主机MAC地址的数据包,必须开启网卡混杂模式(就是允许网卡抓取任何经过它的数据包,不管该数据包是不是发给它的)

​ 开启混杂模式的命令:

$ ifconfig en0 promisc		//en0时要打开混杂模式的网卡

抓包原理

​ 通过注册一种虚拟的底层网络协议来获取对网络报文的处理权。当网卡接收到一个网络报文后,它会遍历系统中所有已经注册的网络协议来尝试对报文进行解析。

​ 此时抓包模块会把自己伪装成一个网络协议,系统也会让这个伪协议对报文进行处理。这时候模块就会趁机对报文进行窥探(也就是拷贝),然后汇报给抓包模块。

tcpdump和Wireshark优劣

​ linux可以直接使用tcpdump,有图形界面平台下可以使用Wireshark。其中,tcpdump用来抓取数据非常方便,Wireshark用于分析抓取到的数据比较方便

关于tcpdump

格式

格式和常用参数为:

tcpdump [options] [expression]

常用选项

//-D 列出可用于抓包的接口(包括编号和接口名)
//-c 用于指定最终要获取的包数量(满足条件的包数量)
//-i 用于指定tcpdump要监听的接口(若没有指定,系统会从接口列表中搜寻编号最小的已配置好的接口)
//-e 输出每行都包括数据链路层头部信息,例如源MAC和目标MAC
//-nn 对地址、端口以数字的方式显示(否则为主机名、端口服务名)
//-XX 输出包的头部数据,会以16进制和ASCII两种方式同时输出(相比-X更详细)
//-vvv	当分析和打印的时候,产生详细的输出(相比-v,-vv更详细)
//-s len 设置tcpdump数据包抓取长度为len(默认为65535字节),长度不够会产生包截断,但是长度过长会导致包的处理时间越长(在保证能抓到想要包的前提下,长度越小越好)
//-w 将抓包数据输出到文件中,配合"-G time"每time秒就自动切换到另外一个文件

表达式

​ 表达式用于筛选输出哪些类型的数据包,表达式出现元字符建议用单引号扩起。

​ 表达式由一个或多个"单元"组成,每个单元一般包含ID的修饰符和一个ID:

表达式的单元格式为:proto dir type ID

type: 指定ID的类型(包括host(指明主机,例如host 210.27.48.2)、net(指明网络地址,例如net 202.0.0.0)、port(指明端口号,例如port 70)、protrange(指明),默认为host)

dir: 指定ID的方向(包括src(源)、dst(目的)、src or dst(源或目的)、src and dst(源和目的),默认为src or dst)

proto: 通过给定协议限定匹配的数据包类型(常用协议有tcp、udp、arp、ip、ether、icmp)

​ 除了上述表达式单元外,还有关键字表达式单元:gateway、broadcast、less、greater以及算术表达式。

​ 表达式单元之间可以通过&&、||、!、and、or、not连接,从而组成更复杂的条件表达式。

​ 使用()可以改变表达式优先级,注意()需要用\转义

使用样例

1. 直接启动,默认抓取所有经过第一个网络接口上(一般是eth0)的数据包
$ tcpdump

2. 抓取所有经过指定网络接口上的数据包
$ tcpdump -i en0

3. 抓取所有经过en0,目的或源地址是10.37.63.255的网络数据
$ tcpdump -i en0 host 10.37.63.255

4. 抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信
$ tcpdump host 10.37.63.255 && \( 10.37.63.61 || 10.37.63.95 \)

5. 抓取主机192.168.13.210除了和10.37.63.61以外的所有主机通信的数据包
$ tcpdump host 192.168.13.210 && \( ! 10.37.63.61 \)

6. 抓取主机192.168.13.210和10.37.63.61通信的ip包
$ tcpdump ip host 192.168.13.210 && 10.37.63.61

7. 抓取主机10.37.63.3发送的所有数据
$ tcpdump -i en0 src host 10.37.63.3

8. 抓取主机10.37.63.3接收的所有数据
$ tcpdump -i en0 dst host 10.37.63.3

9. 抓取主机10.37.63.3所有在TCP 80端口的数据包
$ tcpdump -i en0 host 10.37.63.3 && tcp port 80

10. 抓取HTTP主机10.37.63.3在80端口接收到的数据包
$ tcpdump -i en0 http host 10.37.63.3 && dst port 80

11. 抓取所有经过en0,目的或源端口是25的网络数据
$ tcpdump -i en0 port 25

12. 抓取所有经过 en0,网络是 192.168上的数据包
$ tcpdump -i en0 net 192.168

13. 抓取所有经过en0,目的地址是192.168.1.254或192.168.1.200,端口是80的TCP数据
$ tcpdump -i en0 tcp && dst && port 80 && \( host 192.168.1.254 || host 192.168.1.20 \)

14. 抓取所有经过en0,目标MAC地址是00:01:02:03:04:05的ICMP数据
$ tcpdump -i en0 icmp && ether dst host 00:01:02:03:04:05

15. 抓取所有经过en0,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
$ tcpdump -i en0 tcp && \( dst net 192.168 && \( ! dst host 192.168.1.200 \) \)

16. 只抓SYN包
$ tcpdump -i en0 'tcp[tcpflags] = tcp-syn'

17. 抓SYN, ACK
$ tcpdump -i en0 'tcp[tcpflags]'

18. 抓SMTP数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为0x4d41494c
$ tcpdump -i en0 'port 25 && tcp[(tcp[12]>>2):4] = 0x4d41494c'

19. 抓 HTTP GET数据,”GET “的十六进制是0x47455420
$ tcpdump -i en0 'tcp[ \( tcp[12]>>2 \) :4] = 0x47455420'

20. 抓ssh返回,”SSH-“的十六进制是 0x5353482D
$ tcpdump -i en0 'tcp[ \( tcp[12]>>2 \) :4] = 0x5353482D'

21. 抓取端口大于1024的tcp数据包
$ tcpdump -i en0 'tcp[0:2] > 1024'

22. 抓DNS请求数据
$ tcpdump -i en0 udp dst port 53

23. 通过抓n个SYN包花费多少时间,可以用于判断访问量
time tcpdump -i en0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

你可能感兴趣的:(Linux)