🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;更复杂的 过滤器表达式 可以 通过 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 ```