文章目录 一、介绍 二、基础用法 三、进阶用法 四、总结和建议 一、介绍 在日常工作中,我们总是能遇上各种各样奇怪的网络问题,比如我这台机器怎么 ping 不通了,我的 ssh 怎么又连不上了,这个控制台怎么又访问不了了等等各种网络问题,当然有时候可以通过 ping、telnet、arp 这些命令和工具来排查和解决,但这些都比不上去抓个包来得实在,也就是下面要分享的 tcpdump 命令。 tcpdump 是 Linux 系统中最有效的网络工具之一,凡是有网络问题十有八九都可以用它快速定位。它运行在用户态,本质是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能。tcpdump 是非常强大的,并且相较其他的 Linux 命令和工具而且要稍微复杂一些,我们没必要完全掌握它,关键是灵活运用,能解决实际问题就好了。 二、基础用法 1、监听网卡 eth0,这个方式最简单了,但是用处不多,因为基本上只能看到数据包的信息刷屏,压根看不清,可以使用 ctrl+c 中断退出,如果真有需求,可以将输出内容重定向到一个文件,这样也更方便查看。 [root@benarchen ~]# tcpdump -i eth0 #如果直接使用 tcpdump 一般是抓取除 lo 外的第一张网卡 1 1 2、监听指定的主机的流量,抓包时指定 -nn 选项,不解析主机和端口名。这个参数很关键,会影响抓包的性能,一般抓包时都需要指定该选项。 [root@benarchen ~]# tcpdump -i eth0 -nn 'host 192.168.1.231' 这样的话,192.168.1.231 这台主机接收到的包和发送的包都会被抓取。 [root@benarchen ~]# tcpdump -i eth0 -nn 'src host 192.168.1.231' 这样只有 192.168.1.231 这台主机发送的包才会被抓取。 [root@benarchen ~]# tcpdump -i eth0 -nn 'dst host 192.168.1.231' 这样只有 192.168.1.231 这台主机接收到的包才会被抓取。 1 2 3 4 5 6 1 2 3 4 5 6 3、监听指定端口,用来监听主机的 80 端口收到和发送的所有数据包,结合 -A (以 ascii 的方式显示数据包)参数,在 web 开发中,真是非常有用。 [root@benarchen ~]# tcpdump -i eth0 -nnA 'port 80' 1 1 4、监听指定主机和端口 [root@benarchen ~]# tcpdump -i eth0 -nnA 'port 80 and src host 192.168.1.231' #多个条件可以用 and,or 连接。上例表示监听 192.168.1.231 主机通过 80 端口发送的数据包。 1 2 1 2 5、监听除某个端口外的其它端口 [root@benarchen ~]# tcpdump -i eth0 -nnA '!port 22' #如果需要排除某个端口或者主机,可以使用 “!” 符号,上例表示监听非 22 端口的数据包。 1 2 1 2 6、抓取指定端口范围的流量 [root@benarchen ~]# tcpdump -ni eth0 portrange 80-9000 1 1 7、抓取指定网段的流量 [root@benarchen ~]# tcpdump -ni eth0 net 192.168.1.0/24 1 1 8、监听指定协议的数据,这个是用来监听 icmp 协议的数据,类似的,如果要监听 tcp或者是 udp 协议,只需要例中的 icmp 就可以了。 [root@benarchen ~]# tcpdump -i eth0 -nn 'icmp' 1 1 9、将数据输出到一个指定的文件 [root@benarchen ~]# tcpdump -i eth0 -nn port 8000 -w xxx.pcap 1 1 三、进阶用法 这里我说的进阶用法,其实也就是基础用法通过灵活组合的方式以达到解决问题的效果,这也正是 tcpdump 的强大之处。 1、抓取指定客户端访问 ssh 的数据包 [root@benarchen ~]# tcpdump -ni eth0 src 113.88.13.223 and dst port 22 # 也可以反过来,抓取本机 22 端口发送给指定客户端的数据包 [root@benarchen ~]# tcpdump -ni eth0 src port 22 and dst 113.88.13.223 1 2 3 1 2 3 2、抓取从某个网段来,到某个网段去的流量 [root@benarchen ~]# tcpdump -nn src net 113.88.13.223/32 and dst net 10.0.0.0/24 or 172.17.0.0/16 1 1 3、抓取来自某个主机,发往非 ssh 端口的流量 [root@benarchen ~]# tcpdump -nni eth0 src 113.88.13.223 and not dst port 22 1 1 4、在某些复杂查询的时候需要使用引号、单引号告诉 tcpdump 忽略特定的特殊字符,这里的 () 就是特殊符号,如果不用引号的话,就需要使用转义字符 [root@benarchen ~]# tcpdump -ni eth0 'src 113.88.13.223 and (dst port 3389 or 22)' # 或者也可以使用转义 [root@benarchen ~]# tcpdump -ni eth0 src 113.88.13.223 and \(dst port 3389 or 22\) 1 2 3 1 2 3 5、还可以基于包大小进行筛选,如果你正在查看特定的包大小,可以使用这个参数 # 小于等于 48 字节 [root@benarchen ~]# tcpdump -ni less 48 # 等于 48 字节 [root@benarchen ~]# tcpdump -ni eth0 length == 48 # 大于等于 48 字节 [root@benarchen ~]# tcpdump -ni eth0 greater 48 1 2 3 4 5 6 1 2 3 4 5 6 6、过滤 TCP 特殊标记的数据包,可以帮助快速定位到网络问题 # 抓取某主机发送的 RST 数据包 [root@benarchen ~]# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-rst) != 0' # 抓取某主机发送的 SYN 数据包 [root@benarchen ~]# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-syn) != 0' # 抓取某主机发送的 FIN 数据包 [root@benarchen ~]# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-fin) != 0' # 抓取 TCP 连接中的 SYN 或 FIN 包 [root@benarchen ~]# tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 7、抓取端口是 80,网络层协议为 IPv4, 并且含有数据,而不是 SYN、FIN 以及 ACK 等不含数据的数据包 [root@benarchen ~]# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' # 整个 IP 数据包长度减去 IP 头长度,再减去 TCP 头的长度,结果不为 0,就表示数据包有 data 1 2 1 2 四、总结和建议 1、常规参数 # 基础参数 -i:指定网络接口 -D:列出可用于抓包的接口 -s:指定数据包抓取的长度 -c:指定要抓取的数据包的数量 -w:将抓包数据保存在文件中 -r:从文件中读取数据 -C:指定文件大小,与 -w 配合使用 -F:从文件中读取抓包的表达式 -n:不解析主机和端口号,这个参数很重要,一般都需要加上 -P:指定要抓取的包是流入还是流出的包,可以指定的值in、out、inout # 输出参数 -e:输出信息中包含数据链路层头部信息 -t:显示时间戳,tttt 显示更详细的时间 -X:显示十六进制格式 -v:显示详细的报文信息,尝试 -vvv,v 越多显示越详细 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2、组合表达式参数 # 操作对象 type,表示对象的类型,比如:host、net、port、portrange,如果不指定 type 的话,默认是 host dir:表示传输的方向,可取的方式为:src、dst。 proto:表示协议,可选的协议有:ether、ip、ip6、arp、icmp、tcp、udp。 # 组合连接词 or:表示或操作 and:表示与操作 not:表示非操作 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 3、建议 tcpdump 也不是万能的,还是要讲究灵活应用,配合其他的工具(ping、telnet、curl、arp 等)来解决实际问题 tcpdump 抓包是对系统性能有不小损耗的,生产环境慎用,并且应该尽量带上 -nn 选择,以降低性能损耗 抓包时尽可能要有针对性的指定过滤规则,减少无效数据包的干扰 连接转自:https://blog.csdn.net/wchenjt/article/details/114001914
标签:tcpdump,抓取,benarchen,Linux,数据包,root,详解,eth0 From: https://www.cnblogs.com/nizuimeiabc1/p/16730422.html