Linux Tcpdump抓包入门

Linux Tcpdump抓包入门
一、Tcpdump简介

tcpdump 是一个在Linux系统上用于网络分析和抓包的强大工具。它能够捕获网络数据包并提供详细的分析信息,有助于网络管理员和开发人员诊断网络问题和监控网络流量。

  1. 安装部署

    sh 复制代码
    # 在Debian/Ubuntu上安装
    sudo apt-get install tcpdump
    
    # 在CentOS/RHEL上安装
    sudo yum install tcpdump
  2. 底层原理

    复制代码
    1、tcpdump由C语言开发,主要功能通过libpcap库实现,而libpcap是linux平台下的一个网络数据包捕获功能包, 通过内核BPF技术实现数据过滤功能。tcpdump使用BPF虚拟机的指令集定义过滤器表达式,然后传递给内核,并由解释器执行,这使得包过滤可以在内核中进行,避免了向用户态进程复制全部数据包,从而提升数据包的过滤性能。tcpdump将包过滤指令注入到内核,返回按条件过滤的数据包,提供多种输出功能将抓取的报文格式化处理能力。
    2、tcpdump的包过滤指令由BPF代码实现,通过对libpcap库的调用可以把一个输入输出的逻辑表达式变为BPF代码,实现在用户输入的命令行和BPF代码之间的转换。tcpdump 程序支持使用 -d参数来 dump 出过滤规则转化后的BPF指令字节码。
    3、应用在接收报文的时候,硬件的硬中断首先触发内核的软中断,通过内核驱动程序进入网络设备层进行数据包的处理,然后数据包进入协议栈的网络层和传输层,最后被用户进程接收。而应用在发送报文时,首先经过内核的协议层,由邻居子系统实现L3层ip地址转化为L2层mac地址,然后进入网络设备层,数据包处理完成后,经驱动程序流转,最后由硬件将报文发出。tcpdump为了能抓取数据包,首先需要创建socket套接字,用于在应用系统接收和发送报文时获取抓取的数据包,然后将过滤条件也就是对应的BPF程序注入到内核网络设备层,获取过滤后的数据包后再进行格式化处理。
  3. 其他

二、Tcpdump命令参数
  • 基本参数

    • 设置不解析域名提升速度

      sh 复制代码
      -n:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
      -nn:不把协议和端口号转化成名字,速度也会快很多。
      -N:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'. 将抓取到的数据包保存为文件,可以借助wireshark进行分析
    • 从文件中读取包数据

      sh 复制代码
      tcpdump icmp -r all.pcap
    • 输出控制参数-显示内容

      sh 复制代码
      -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
      -vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。
      -vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
    • 输出控制参数-显示时间

      sh 复制代码
      -t:在每行的输出中不输出时间
      -tt:在每行的输出中会输出时间戳
      -ttt:输出每两行打印的时间间隔(以毫秒为单位)
      -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
    • 输出控制参数-显示数据包头部

      sh 复制代码
      -x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
      -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
      -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
      -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
    • 其他显示控制参数

      sh 复制代码
      -i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any
      -Q:选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法
      -q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短
      -c : 捕获 count 个包 tcpdump 就退出
      -s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
      -S : 使用绝对序列号,而不是相对序列号
      -A : 显示格式为ASCII
      -C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)
      -F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.
  • 过滤参数

    • 指定ip地址过滤-host

      sh 复制代码
      tcpdump host 192.168.10.100
      
      # 根据源ip进行过滤
      tcpdump -i eth2 src 192.168.10.100
      # 根据目标ip进行过滤
      tcpdump -i eth2 dst 192.168.10.200
    • 基于网段进行过滤:net

      sh 复制代码
      tcpdump net 192.168.10.0/24
      
      # 根据源网段进行过滤
      tcpdump src net 192.168
      # 根据目标网段进行过滤
      tcpdump dst net 192.168
    • 基于端口进行过滤:port

      sh 复制代码
      tcpdump port 8088
      # 根据源端口进行过滤
      tcpdump src port 8088
      
      # 根据目标端口进行过滤
      tcpdump dst port 8088
      
      #同时指定两个端口
      tcpdump port 80 or port 8088 
      
      #指定端口的范围
      tcpdump portrange 8000-8080
      tcpdump src portrange 8000-8080
      tcpdump dst portrange 8000-8080
    • 基于协议进行过滤:proto

      proto 后面跟的 的关键词是固定的,只能是 ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui 这里面的其中一个。

      sh 复制代码
      tcpdump icmp
      
      #过滤IPV4数据包(友情提示:数字 6 表示的是 tcp 在ip报文中的编号。)
      tcpdump ip proto 6
      tcpdump ip protochain 6
    • 过滤条件基本语法

      • and:所有的条件都需要满足,也可以表示为 &&

      • or:只要有一个条件满足就可以,也可以表示为 ||

      • not:取反,也可以使用 !

      • =:判断二者相等

      • ==:判断二者相等

      • !=:判断二者不相等 tcpdump 还提供了一些关键字的接口来方便我们进行判断

      • if:表示网卡接口名、

      • proc:表示进程名

      • pid:表示进程 id

      • svc:表示 service class

      • dir:表示方向,in 和 out

      • eproc:表示 effective process name

      • epid:表示 effective process ID

        sh 复制代码
        #过滤出源地址是1.1.1.1发往任意主机的3389端口的数据包
        tcpdump src 1.1.1.1 and dst port 3389
        
        #过滤出源地址是1.1.1.1发往任意主机的3389端口或者22端口的数据包
        tcpdump 'src 1.1.1.1 and (dst port 3389 or 22)'
        
        #过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包
         tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"
    • 特殊过滤

      • 根据 tcpflags 进行过滤

        sh 复制代码
        tcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0"
      • 基于包大小进行过滤

        sh 复制代码
        tcpdump less 32 
        tcpdump greater 64 
        tcpdump <= 128
      • 根据 mac 地址进行过滤

        sh 复制代码
        tcpdump ether host [ehost]
        tcpdump ether dst	[ehost]
        tcpdump ether src	[ehost]
      • 过滤广播/多播数据包

        sh 复制代码
        tcpdump ether broadcast
        tcpdump ether multicast
        
        tcpdump ip broadcast
        tcpdump ip multicast
        
        tcpdump ip6 multicast
三、使用示例
  • 查看网卡ens33,端口9093,协议udp的流量信息,要求显示流量详情

    sh 复制代码
    tcpdump udp -i ens33 port 9093 -XX -vvv -nn 
  • HTTP 请求头中提取 HTTP 的 User-Agent

    sh 复制代码
    tcpdump -nn -A -s1500 -l | grep "User-Agent:"
  • 抓取 HTTP GET 请求包

    sh 复制代码
    tcpdump -vvAls0 | grep 'GET'
  • 提取 HTTP 请求的主机名和路径

    sh 复制代码
    tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
  • 将抓包信息保存到文件

    sh 复制代码
     tcpdump -i eth0 -s 0 -n -w capture.pcap
  • 分别抓取所有tcp、udp、icmp流量

    sh 复制代码
    sudo tcpdump -i eth0 -s 0 -n 'tcp'
    sudo tcpdump -i eth0 -s 0 -n 'udp
    sudo tcpdump -i eth0 -s 0 -n 'icmp'
  • 仅显示HTTP请求和响应的头信息:

    sh 复制代码
    sudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[13] & 8!=0)'
  • 抓取指定主机(例如192.168.1.100)的HTTP流量,并保存到文件:

    sh 复制代码
    tcpdump -i eth0 -s 0 -w http_traffic.pcap 'tcp and host 192.168.1.100 and (port 80 or port 443)'
四、参考资料
相关推荐
和煦的春风11 小时前
性能案例分析 | Waiting for GPU completion
android·linux
道路与代码之旅12 小时前
Delphi - IndyHttpServer接收上传文件
运维·服务器
lybugproducer12 小时前
深入 Linux 文件系统:从数据存储到万物皆文件
linux
烦躁的大鼻嘎12 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
羚羊角uou12 小时前
【Linux】system V共享内存
linux·运维·服务器
林克爱塞尔达12 小时前
Linux入门(二)
linux·运维·chrome
破烂儿13 小时前
Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
linux·服务器·ubuntu
Hello.Reader13 小时前
Kafka 运维实战基本操作含命令与最佳实践
运维·kafka·linq
存储服务专家StorageExpert13 小时前
手搓一个 DELL EMC Unity存储系统健康检查清单
linux·运维·服务器·存储维护·emc存储
笑口常开xpr13 小时前
Linux 库开发入门:静态库与动态库的 2 种构建方式 + 5 个编译差异 + 3 个加载技巧,新手速看
linux·c语言·动态库·静态库