• Linux tcpdump 命令使用详解


    文章目录
    一、介绍
    二、基础用法
    三、进阶用法
    四、总结和建议
    一、介绍
    在日常工作中,我们总是能遇上各种各样奇怪的网络问题,比如我这台机器怎么 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
  • 相关阅读:
    区别TPS QPS HPS RPS PV UV
    C/C++常用库及工具
    CentOS常用命令备忘
    PHP的学习--Traits新特性
    CentOS7创建本地YUM源的三种方法
    CentOS下iptables详解
    Linux备份压缩命令
    Nginx HTTPS功能部署实践
    Fuel 30 分钟快速安装OpenStack
    hadoop学习通过虚拟机安装hadoop完全分布式集群
  • 原文地址:https://www.cnblogs.com/nizuimeiabc1/p/16730422.html
Copyright © 2020-2023  润新知