章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • linux

  • windows

  • 中间件

  • 网络

    • tcpdump 抓包分析全攻略
    • 网络代理
    • 网络工具
    • 给你的域名申请一个泛域名证书
    • tcpdump抓包教程
      • 1. 关注 packets dropped by kernel的值
    • Wireshark抓包教程
    • 使用frp实现内网穿透
    • nat vps配置ddns
  • 安全

  • 存储

  • 防火墙

  • 数据库

  • 系统

  • docker

  • other

  • 监控

  • 运维
  • 网络
章工运维
2024-04-26
目录

tcpdump抓包教程

# 查看帮助文档

从帮助文档可以看出,包过滤的表达式一定要放在最后一个参数

       tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
               [ -c count ] [ --count ] [ -C file_size ]
               [ -E spi@ipaddr algo:secret,...  ]
               [ -F file ] [ -G rotate_seconds ] [ -i interface ]
               [ --immediate-mode ] [ -j tstamp_type ] [ -m module ]
               [ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ --version ]
               [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]
               [ -z postrotate-command ] [ -Z user ]
               [ --time-stamp-precision=tstamp_precision ]
               [ --micro ] [ --nano ]
               [ expression ]
1
2
3
4
5
6
7
8
9
10
11
12

# 列出所有网卡

tcpdump -D

1.enp89s0 [Up, Running, Connected]
2.docker0 [Up, Running, Connected]
3.vetha051ecc [Up, Running, Connected]
4.vethe67e03a [Up, Running, Connected]
5.vethc58c174 [Up, Running, Connected]
1
2
3
4
5
6
7

# 指定网卡 -i

tcpdump -i eth0
1

# 所有网卡

tcpdump -i any
1

# 不要域名解析

tcpdump -n -i any
1

# 指定主机

tcpdoump host 192.168.0.1
1

# 指定源IP或者目标IP

# 根据源IP过滤
tcpdump src 192.168.3.2

# 根据目标IP过滤
tcpdump dst 192.168.3.2
1
2
3
4
5

# 指定协议过滤

tcpdump tcp
1

# 指定端口

# 根据某个端口过滤
tcpdomp port 33

# 根据源端口或者目标端口过滤
tcpdump dst port 33
tcpdump src port 33

# 根据端口范围过滤
tcpdump portrange 30-90
1
2
3
4
5
6
7
8
9

# 根据IP和地址

tcpdump -i ens33 tcp and host 192.168.40.30
1

# 抓包结果写文件

tcpdump -i ens33 tcp and host 192.168.40.30 -w log.pcap
1

# 每隔30秒写一个文件

  • -G 30 表示每隔30秒写一个文件
  • 文件名中的%实际上是时间格式
tcpdump -i ens33 -G 30 tcp and host 192.168.40.30 -w %Y_%m%d_%H%M_%S.log.pcap
1

# 每达到30MB产生一个文件

  • -C 30 每达到30MB产生一个文件
tcpdump -i ens33 -C 30 tcp and host 192.168.40.30 -w log.pcap
1

# 指定抓包的个数

在流量很大的网络上抓包,如果写文件的话,很可能将磁盘写满。所以最好指定一个最大的抓包个数,在达到包的个数后,自动退出。

tcpdump -c 100000 -i eth0 host 21.23.3.2 -w test.pcap
1

# 抓包文件太大,切割成小包

把原来的包文件切割成20M大小的多个包

tcpdump -r old_file -w new_files -C 20
1

# 按照包长大小过滤

# 包长小于某个值
tcpdump less 30

# 包长大于某个值
tcpdump greater 30
1
2
3
4
5

# 按照16进制的方式显示包的内容

# BPF 过滤规则

port 53
src port 53
dest port 53
host 1.2.3.4
src host 1.2.3.4
dest host 1.2.3.4
host 1.2.3.4 and port 53
1
2
3
4
5
6
7

# 读取old.pcap文件 然后根据条件过滤 产生新的文件

适用于从一个大的pcap文件中过滤出需要的包

tcpdump -r old.pcap -w new.pcap less 1280
1

# 最佳实践

# 1. 关注 packets dropped by kernel的值

有时候,抓包停止后,tcpdump打印xxx个包drop by kernel。一旦这个值不为零,就要注意了。某些包并不是在网络中丢包了,而是在tcpdump这个工具给丢弃了。

60 packets captured
279514 packets received by filter
279368 packets dropped by kernel
1
2
3

默认情况下,tcpdump抓包时会做dns解析,这个dns解析会降低tcpdump的处理速度,造成tcpdump的buffer被填满,然后就被tcpdump丢弃。

我们可以用两个方法解决这个问题

  1. -B 指定buffer的大小,默认单位为kb。例如-B 1024
  2. -n -nn 设置tcpdump 不要解析host地址,不要抓换协议和端口号
-n     Don't convert host addresses to names.  This can be used to avoid DNS lookups.

-nn    Don't convert protocol and port numbers etc. to names either.

-B buffer_size
--buffer-size=buffer_size
  Set the operating system capture buffer size to buffer_size, in units of KiB (1024 bytes).
1
2
3
4
5
6
7

# 参考

  • https://serverfault.com/questions/131872/how-to-split-a-pcap-file-into-a-set-of-smaller-ones
  • http://alumni.cs.ucr.edu/~marios/ethereal-tcpdump.pdf
  • ethereal-tcpdump.pdf (opens new window)
  • https://unix.stackexchange.com/questions/144794/why-would-the-kernel-drop-packets

« PREV
Wireshark抓包教程 (opens new window)
NEXT » (opens new window)

微信 支付宝
上次更新: 2024/04/26, 11:31:18

← 给你的域名申请一个泛域名证书 Wireshark抓包教程→

最近更新
01
shell脚本模块集合
05-13
02
生活小技巧(认知版)
04-29
03
生活小技巧(防骗版)
04-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式