tcpdump命令可以对网络上的数据包进行截获和分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
**安装命令:** yum install tcpdump -y
**tcpdump 命令格式说明:**
```
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
```
> **option:**
> * -a:试着 把 网络和广播地址 转换成 名称.
> * -c:当 收到 count 报文 后 退出.
> * -d:把 编译好的 报文匹配代码 (packet-matching code) 翻译成 可读形式, 传往 标准输出, 然后退出.
> * -dd:把 报文匹配代码 (packet-matching code) 以 C 程序片断 的 形式 输出.
> * -ddd:把 报文匹配代码 (packet-matching code) 以 十进制数 形式 输出 (前面 加上 总数).
> * -e:显示 链路层报头
> * -f: 以 数字形式 显示 '外部的' 互联网地址, 而不是 字符形式
> * -F:把 file 的内容 用作 过滤表达式. 忽略 命令行 上 的 表达式
> * -i: 监听 interface. 如果不指定接口, tcpdump 在 系统 的 接口 清单 中, 寻找 号码最小, 已经 配置好的 接口 (loopback 除外). 选中的时候会中断连接.
> * -l:行缓冲 标准输出. 可用于 捕捉 数据 的 同时 查看 数据. 例如, `tcpdump -l | tee dat'' or ``tcpdump -l > dat & tail -f dat'`
> * -n:不要把地址转换成名字(指的是主机地址,端口号等)
> * -N:不显示主机名字中的域名部分. 例如, 如果使用这个选项, tcpdump 只显示 `nic`,而不是`nic.ddn.mil`
> * -O: 禁止运行报文匹配代码的优化器. 这个选项只有当你怀疑优化器有bug时才有用.
> * -p:禁止把接口置成 promiscuous(杂凑) 模式. 注意, 接口有可能因其他原因而处于 promiscuous 模式; 因此, '-p' 不能 作为 `ether host {local-hw-addr} 或 ether broadcast' 的 简写.
> * -r: <数据包文件>从 file中读入数据报 (文件 是用 -w 选项 创建的). 如果 file 是 ``-'', 就从标准输入读入.
> * -s:<数据包大小> 设置每个数据包的大小
> * -S:用绝对而非相对数值列出TCP关联数
> * -T:<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型
> * -t:禁止显示时戳标志
> * -tt:显示未格式化的时戳标志
> * -v:详细显示指令执行过程
> * -vv:更详细显示指令执行过程
> * -w: <数据包文件>把数据包数据写入指定的文件
> * -x:用十六进制字码列出数据包资料
**expression 解析**
<p style="text-indent:2em;">expression 是用来选择要转储的数据报,如果没有指定 expression , 就转储网络的全部报文,否则,只转储相对 expression 为 `true' 的 数据报。</p>
<p style="text-indent:2em;">expression s 由一个或多个 <span style="font-weight: bold;">原语 (primitive) </span>组成, 原语是通常由一个标识 (id, 名称或数字), 和标识前面的一个或多个<span style="font-weight: bold;">修饰子(qualifier) </span>组成。修饰子有三种不同的类型:</p>
1. type 限定符显示标识名称或数字所指的原语类型。可能的类型为 host、net 和 port。例如,“host foo”、“net 128.3”和“port 20”。如果没有类型限定符,那么将采用 host。
2. dir 限定符指定到标识和/或来自标识的特定传输方向。可能的方向为 src、dst、src 或 dst 和 src 以及 dst。如果没有 dir 限定符,那么将采用 src 或 dst。对于某些链接层(例如,SLIP)和某些其他设备类型,入站和出站限定符可以用来指定希望的方向。
3. proto 限定符限制与特定协议相匹配。可能的协议为 fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp 和 udp。如果没有 proto 限定符,那么将采用与该类型一致的所有协议。
<p style="text-indent:2em;">`fddi` 实际上 是 `ether` 的 别名,分析器 把 它们 视为 "用在 指定 网络接口 上的 数据链路层",FDDI报头包含类似于以太协议的源目地址, 而且通常包含类似于以太协议的报文类型, 因此你可以过滤FDDI域, 就象分析以太协议
一样,FDDI 报头也包含其他域, 但是你不能在过滤器表达式里显式描述。
</p>
<p style="text-indent:2em;">作为上述的补充, 有一些特殊的'原语' 关键字: gateway, broadcast, less, greater和数学表达式。 它们不同于上面的模式,这些在后面有叙述。
</p>
更复杂的 过滤器表达式 可以 通过 and, or 和 not 连接 原语 来 组建. 例如 `host foo and not port ftp and not port ftp-data `, 为了少敲点键键盘,可以忽略相同的修饰子。 例如, `tcp dst port ftp or ftp-data or domain` 实际上 就是 `tcp
dst port ftp or tcp dst port ftp-data or tcp dst port domain`
**允许的原语有:**
* dst host host:如果报文中IP的目的地址域是host, 则逻辑为真。host既可以是地址, 也可以是主机名
* src host host
:如果报文中IP的源地址域是host,则逻辑为真。
* host host:如果报文中IP的源地址域或者目的地址域是host,则逻辑为真,上面所有的host表达式都可以加上ip, arp, 或rarp关键字做前缀, 就象:`ip host host
`,它等价于` ether proto ip and host host
` ,如果host是拥有多个IP地址 的, 它的每个地址都会被查验
* ether dst ehost:如果报文的以太目的地址是 ehost,则逻辑为真, Ehost既可以是名字 (/etc/ethers 里有), 也可以是 数字
* ether src ehost:如果报文的以太源地址是ehost, 则逻辑为真
* ether host ehost:如果报文的以太源地址或以太目的地址是ehost, 则逻辑为真
* gateway host: 如果报文把host当做网关, 则逻辑为真。 也就是说,报文的以太源或目的地址是host, 但是IP的源目地址都不是host,host必须是个主机名,而且必须存在` /etc/hosts `和 `/etc/ethers` 中 (一个等价的表达式是`ether host ehost and not host host
` 。对于 host / ehost, 它既可以是 名字, 也可以是 数字.)
* dst net net:如果报文的IP目的地址属于网络号net, 则逻辑为真。 net既可以是名字 (存在 `/etc/networks` 中), 也可以是网络号
* src net net:如果报文的IP源地址属于网络号net, 则逻辑为真
* net net:如果报文的IP源地址或目的地址属于网络号net, 则逻辑为真
* net net mask mask:如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真。 本原语可以用src或dst修饰
* net net/len:如果IP地址匹配指定网络掩码的net,则逻辑为真。 掩码的有效位宽为len, 本原语可以用src或dst修饰
* dst port port:如果报文是ip/tcp或ip/udp,并且目的端口是port, 则逻辑为真。 port是一个数字, 也可以是 `/etc/services` 中说明过的名字 (参看 tcp(4P) 和 udp(4P))。 如果使用名字, 则检查端口号和协议。 如果使用数字或者有歧义的名字,则只检查端口号 (例如, dst port 513 将显示 tcp/login 的数据 和 udp/who 的数据, 而 port domain 将显示 tcp/domain 和 udp/domain 的数据)
* src port port:如果报文的源端口号是port,则逻辑为真
* port port:如果报文的源端口或目的端口是port, 则逻辑为真。 上述的任意一个端口表达式都可以用关键字tcp或 udp做前缀, 就象:`tcp src port port`
,它只匹配源端口是port的TCP报文
* less length:如果报文的长度小于等于length, 则逻辑为真。它等同于:len <= length
* greater length:如果报文的长度大于等于length, 则逻辑为真。它等同于:len >= length
* ip proto protocol:如果报文是IP数据报,其内容的协议类型是protocol, 则逻辑为真。 Protocol可以是数字, 也可以是下列名称中的: icmp, igrp, udp, nd, 或 tcp。 注意 这些 标识符 tcp, udp, 和 icmp 也是 关键字, 所以
必须 用 反斜杠(\) 转义, 在 C-shell 中 应该是 \\
* ether broadcast:如果报文是以太广播报文, 则逻辑为真。 关键字ether是可选的
* ip broadcast:如果报文是IP广播报文, 则逻辑为真。 Tcpdump检查全0和全1广播约定, 并且检查本地的子网掩码
* ether multicast:如果报文是以太多目传送报文(multicast),则逻辑为真。 关键字ether是可选的。 这实际上 是 `ether[0] & 1 != 0` 的简写
* ip multicast:如果报文是IP多目传送报文,则逻辑为真
* ether proto protocol:如果信息包为 ether 类型协议,那么为 True。protocol 可以为数字或以下名称之一:ip、ip6、arp、rarp、atalk、aarp、decnet、sca、lat、mopdl、moprc、iso、stp、ipx 或 netbeui。请注意,这些标识也是关键字,并且必须通过反斜杠(\)进行转义。[如果是 FDDI (例如, `fddi protocol arp'), 协议
标识 来自 802.2 逻辑链路控制(LLC)报头, 它 通常 位于 FDDI 报头 的 顶层. 当 根据 协议标识 过滤 报文 时, Tcpdump 假设 所有的 FDDI 报文 含有 LLC 报头, 而且 LLC 报头 用的是 SNAP 格式.]
* decnet src host:如果DECNET的源地址是host, 则逻辑为真, 该主机地址的形式可能是 “10.123”, 或者是 DECNET主机名. [只有 配置成 运行 DECNET 的 Ultrix 系统 支持 DECNET 主机名.]
* decnet dst host:如果 DECNET的目的地址是host, 则逻辑为真
* decnet host host:如果DECNET的源地址或目的地址是host, 则逻辑为真
* expr relop expr:如果关系成立,其中 relop 是 >、=、<=、= 和 != 中的一个,expr 是算术表达式,此算术表达式由整数常量(用标准 C 语法表示)、常规二目运算符 \[+、-、\*、/、& 和 |\]、长度运算符和特殊信息包数据存取器组成,那么为 true。要访问信息包里的数据,请使用以下语法:`proto [ expr : size ]`。
* Proto 是 ether、fddi、tr、wlan、ppp、slip、link、ip、arp、rarp、tcp、udp、icmp 或 ip6 其中之一,并且表明索引操作的协议层。(ether、fddi、wlan、tr、ppp、slip 和 link 都称为链接层。)请注意,tcp、udp 和其他上层协议类型仅适用于 IPv4,而不是 IPv6(以后将对其进行修订)。与表明的协议层相关的字节偏移量由 expr 给定。size 为可选,它表明兴趣字段里的字节数;它可以为 1、2 或 4,缺省值为 1。由关键字 len 表示的长度运算符给定信息包的长度。
* 例如,ether\[0\] & 1 != 0 捕获所有多点广播流量。表达式 ip\[0\] & 0xf !=5 捕获带有选项的所有 IP 信息包。表达式 ip\[6:2\] & 0x1fff = 0 仅捕获未分段的信息包和分段信息包的片段零。此检查隐式适用于 tcp 和 udp 索引操作。例如,tcp\[0\] 始终表示 TCP 标题的第一个字节,而从不表示插入片段的第一个字节
**原语可以用下述方法结合使用:**
1. 圆括弧括起来的原语和操作符 (圆括弧在Shell中有专用, 所以必须转义).
2. 取反操作 (`! or not`).
3. 连结操作 (`&& or and`).
4. 或操作 (`|| or or`).
<p style="text-indent:2em;">取反操作有最高优先级, 或操作和and操作有相同的优先级, 运算时从左到右结合, 注意and操作需要显式的and算符,而不是并列放置。</p>
<p style="text-indent:2em;">如果给出了不带关键字的标识,那么假定使用最新的关键字。例如,not host vs and ace 是 not host vs and host ace 的缩略语,不应与 not ( host vs or ace ) 混淆。表达式自变量可作为单自变量或多自变量(选择两者中较方便的一种)传递给 tcpdump。通常,如果表达式包含 Shell 元字符,将其作为单个的、加引号的自变量来传递会更容易。多自变量在语法分析之前以空格并置</p>
| 命令 | 解释 |
| --- | ---- |
|tcpdump -i eth1| 监视指定网络接口的数据包 |
|tcpdump tcp port 23 and host 210.27.48.1|监视指定主机和端口的数据包|
|tcpdump net ucb-ether|监听指定网络的数据包|
|tcpdump host 210.27.48.1|截获所有210.27.48.1 的主机收到的和发出的所有的数据包|
|tcpdump ip host ace and not helios|显示 ace 和 除了 helios 以外的 所有 主机 的 IP报文|
|tcpdump ip and not net localnet|显示 既不是 来自 本地主机, 也不是 传往 本地主机 的 网络数据|
|tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet'|显示 每个 TCP会话 的 起始 和 结束 报文 (SYN 和 FIN 报文), 而且 会话方 中 有一个 远程主机.|
|tcpdump 'gateway snup and ip[2:2] > 576'|显示 经过 网关 snup 中 大于 576 字节的 IP 数据报|
```
// 实例一:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
// 实例二:使用tcpdump抓取HTTP包,0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
```
- PHP
- PHP基础
- PHP介绍
- 如何理解PHP是弱类型语言
- 超全局变量
- $_SERVER详解
- 字符串处理函数
- 常用数组函数
- 文件处理函数
- 常用时间函数
- 日历函数
- 常用url处理函数
- 易混淆函数区别(面试题常见)
- 时间戳
- PHP进阶
- PSR规范
- RESTFUL规范
- 面向对象
- 三大基本特征和五大基本原则
- 访问权限
- static关键字
- static关键字
- 静态变量与普通变量
- 静态方法与普通方法
- const关键字
- final关键字
- abstract关键字
- self、$this、parent::关键字
- 接口(interface)
- trait关键字
- instanceof关键字
- 魔术方法
- 构造函数和析构函数
- 私有属性的设置获取
- __toString()方法
- __clone()方法
- __call()方法
- 类的自动加载
- 设计模式详解
- 关于设计模式的一些建议
- 工厂模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 区别和适用范围
- 策略模式
- 单例模式
- HTTP
- 定义
- 特点
- 工作过程
- request
- response
- HTTP状态码
- URL
- GET和POST的区别
- HTTPS
- session与cookie
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希尔排序算法
- 选择排序算法
- 快速排序算法
- 循环算法
- 递归与尾递归
- 迭代
- 日期相关的类
- DateTimeInterface接口
- DateTime类
- DateTimeImmutable类
- DateInterval类
- DateTimeZone类
- DatePeriod类
- format参数格式
- DateInterval的format格式化参数
- 预定义接口
- ArrayAccess(数组式访问)接口
- Serializable (序列化)接口
- Traversable(遍历)接口
- Closure类
- Iterator(迭代器)接口
- IteratorAggregate(聚合迭代器) 接口
- Generator (生成器)接口
- composer
- composer安装与使用
- python
- python3执行tarfile解压文件报错:tarfile.ReadError:file could not be opened successfully
- golang
- 单元测试
- 单元测试框架
- Golang内置testing包
- GoConvey库
- testify库
- 打桩与mock
- GoMock框架
- Gomonkey框架
- HTTP Mock
- httpMock
- mux库/httptest
- 数据库
- MYSQL
- SQL语言的分类
- 事务(重点)
- 索引
- 存储过程
- 触发器
- 视图
- 导入导出数据库
- 优化mysql数据库的方法
- MyISAM与InnoDB区别
- 外连接、内连接的区别
- 物理文件结构
- PostgreSQL
- 编译安装
- pgsql常用命令
- pgsql应用目录(bin目录)文件结构解析
- pg_ctl
- initdb
- psql
- clusterdb
- cluster命令
- createdb
- dropdb
- createuser
- dropuser
- pg_config
- pg_controldata
- pg_checksums
- pgbench
- pg_basebackup
- pg_dump
- pg_dumpall
- pg_isready
- pg_receivewal
- pg_recvlogical
- pg_resetwal
- pg_restore
- pg_rewind
- pg_test_fsync
- pg_test_timing
- pg_upgrade
- pg_verifybackup
- pg_archivecleanup
- pg_waldump
- postgres
- reindexdb
- vacuumdb
- ecpg
- pgsql数据目录文件结构解析
- pgsql数据目录文件结构解析
- postgresql.conf解析
- pgsql系统配置参数说明
- pgsql索引类型
- 四种索引类型解析
- 索引之ctid解析
- 索引相关操作
- pgsql函数解析
- pgsql系统函数解析
- pgsql窗口函数解析
- pgsql聚合函数解析
- pgsql系统表解析
- pg_stat_all_indexes
- pg_stat_all_tables
- pg_statio_all_indexes
- pg_statio_all_tables
- pg_stat_database
- pg_stat_statements
- pg_extension
- pg_available_extensions
- pg_available_extension_versions
- pgsql基本原理
- 进程和内存结构
- 存储结构
- 数据文件的内部结构
- 垃圾回收机制VACUUM
- 事务日志WAL
- 并发控制
- 介绍
- 事务ID-txid
- 元组结构-Tuple Structure
- 事务状态记录-Commit Log (clog)
- 事务快照-Transaction Snapshot
- 事务快照实例
- 事务隔离
- 事务隔离级别
- 读已提交-Read committed
- 可重复读-Repeatable read
- 可序列化-Serializable
- 读未提交-Read uncommitted
- 锁机制
- 扩展机制解析
- 扩展的定义
- 扩展的安装方式
- 自定义创建扩展
- 扩展的管理
- 扩展使用实例
- 在pgsql中使用last、first聚合函数
- pgsql模糊查询不走索引的解决方案
- pgsql的pg_trgm扩展解析与验证
- 高可用
- LNMP
- LNMP环境搭建
- 一键安装包
- 搭建方法
- 配置文件目录
- 服务器管理系统
- 宝塔(Linux)
- 安装与使用
- 开放API
- 自定义apache日志
- 一键安装包LNMP1.5
- LNMP1.5:添加、删除站点
- LNMP1.5:php多版本切换
- LNMP1.5 部署 thinkphp项目
- Operation not permitted解决方法
- Nginx
- Nginx的产生
- 正向代理和反向代理
- 负载均衡
- Linux常用命令
- 目录与文件相关命令
- 目录操作命令
- 文件编辑命令
- 文件查看命令
- 文件查找命令
- 文件权限命令
- 文件上传下载命令
- 用户和群组相关命令
- 用户与用户组的关系
- 用户相关的系统配置文件
- 用户相关命令
- 用户组相关命令
- 压缩与解压相关命令
- .zip格式
- .tar.gz格式
- .gz格式
- .bz2格式
- 查看系统版本
- cpuinfo详解
- meminfo详解
- getconf获取系统信息
- 磁盘空间相关命令
- 查看系统负载情况
- 系统环境变量
- 网络相关命令
- ip命令详解
- ip命令格式详解
- ip address命令详解
- ip link命令详解
- ip rule命令详解
- ip route命令详解
- nslookup命令详解
- traceroute命令详解
- netstat命令详解
- route命令详解
- tcpdump命令详解
- 系统进程相关命令
- ps命令详解
- pstree命令详解
- kill命令详解
- 守护进程-supervisord
- 性能监控相关命令
- top命令详解
- iostat命令详解
- pidstat命令详解
- iotop命令详解
- mpstat命令详解
- vmstat命令详解
- ifstat命令详解
- sar命令详解
- iftop命令详解
- 定时任务相关命令
- ssh登录远程主机
- ssh口令登录
- ssh公钥登录
- ssh带密码登录
- ssh端口映射
- ssh配置文件
- ssh安全设置
- 历史纪录
- history命令详解
- linux开启操作日志记录
- 拓展
- git
- git初始化本地仓库-https
- git初始化仓库-ssh
- git-查看和设置config配置
- docker
- 概念
- docker原理
- docker镜像原理
- docker Overlay2 文件系统原理
- docker日志原理
- docker日志驱动
- docker容器日志管理
- 原理论证
- 验证容器的启动是作为Docker Daemon的子进程
- 验证syslog类型日志驱动
- 验证journald类型日志驱动
- 验证local类型日志驱动
- 修改容器的hostname
- 修改容器的hosts
- 验证联合挂载技术
- 验证启动多个容器对于磁盘的占用情况
- 验证写时复制原理
- 验证docker内容寻址原理
- docker存储目录
- /var/lib/docker目录
- image目录
- overlay2目录
- 数据卷
- 具名挂载和匿名挂载
- 数据卷容器
- Dockerfile详解
- dockerfile指令详解
- 实例:构造centos
- 实例:CMD和ENTRYPOINT的区别
- docker网络详解
- docker-compose
- 缓存
- redis
- redis的数据类型和应用场景
- redis持久化
- RDB持久化
- AOF持久化
- redis缓存穿透、缓存击穿、缓存雪崩
- 常见网络攻击类型
- CSRF攻击
- XSS攻击
- SQL注入
- Cookie攻击
- 历史项目经验
- 图片上传项目实例
- 原生php上传方法实例
- base64图片流
- tp5的上传方法封装实例
- 多级关系的递归查询
- 数组转树结构
- thinkphp5.1+ajax实现导出Excel
- JS 删除数组的某一项
- 判断是否为索引数组
- ip操作