精华内容
下载资源
问答
  • Tcpdump抓包命令详解

    千次阅读 2021-04-23 13:45:19
    只有将tcpdump进程终止,抓包停止。 二、选项 选项 含义 -c 指定抓取包的数量。即最终获取的包,真实获取的包是10个。即只有10个包满足条件。不一定只抓取了10个包。 -i 指定tcpdump需要监听的接口。...

    一、采用命令行方式对接口的数据包进行筛选抓取。

             不带任何选项的tcpdump ,默认抓取第一个网络接口。只有将tcpdump进程终止,抓包停止。

    二、选项

    tcpdump的选项与含义
    -c指定抓取包的数量,即最后显示的数量
    -i

    指定tcpdump监听的端口。未指定,选择系统中最小的以配置端口。

    -i any:监听所有网络端口 -i lo:监听lookback接口。

    -nn对监听地址以数字方式呈现,且对端口也以数字方式呈现。如果不指定 ,地址以主机名方式呈现,端口以服务名方式呈现
    -P指定要抓取的包是流入还是流出 (in out inout[默认])
    -s 设置tcpdump的数据包抓取长度,默认为65535字节。
    -e输出的每行都包含数据链路层的头部信息。
    -D列出所有可以用于抓包的表达式。
    -X显示协议头和包的全部内容。
    -F从文件中读取抓包的表达式。

    三、例子

    (1)tcpdump -i eth0 host 192.168.1.1 【过滤主机】

             注:抓取所有经过网卡1,目的ip为192.168.1.1

    (2)tcpdump -i  eth0 dst port 22 【过滤端口】

           注:抓取所有经过网卡1,目的端口为22的网络数据

    (3)tcpdump -i eth0 udp 【过滤协议】

           注;抓取所有经过网卡1,协议为UDP的协议。

    (4)tcpdupmp -i lo udp 【抓取本地环路数据包】

    (5)特定协议特定端口

               tcpdump udp port 22

    (6)抓取特定类型的数据包

               tcpdump -i eth0 'tcp[tcpflags] = tcp-syn' (抓取所有经过网卡1的SYN类型的数据包)

              tcpdump -i eth0 udp dst port 53(抓取经过网卡1的所有DNS数据包)

    (7)逻辑语句过滤

              tcpdump -i eth0 '((tcp) and ((dst net 192.168.0) and (not dst host 192.168.0.2)))'

             注:抓取所有经过网卡1,目的网络是192.168.0,但目的主机不是192.168.0.2的TCP数据。   

    (8)抓包存取

           tcpdump -i eth0 host 192.168.1.51 and port 22 -w /tmp/tcpdump.cap

           注:抓取所有经过网卡1,目的主机为192.168.1.51的网络数据并存储。       

     

     

    展开全文
  • linux下抓包命令--tcpdump的使用
  • TCPdump抓包命令详解

    2020-12-22 07:03:17
    转:blog.csdn.net/s_k_yliu/article/details/6665673/TCPdump抓包命令tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查...

    转:blog.csdn.net/s_k_yliu/article/details/6665673/

    TCPdump抓包命令

    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。

    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统

    中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

    一、概述顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    # tcpdump -vv

    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

    11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF],

    proto 6, length: 92) asptest.localdomain.ssh > 192.168.228.244.1858: P

    3962132600:3962132652(52) ack 2726525936 win 1266

    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)

    11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF],

    proto 17, length: 151) 192.168.228.153.domain >

    asptest.localdomain.1077: 325 NXDomain q: PTR?

    244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)

    11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF],

    proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858:

    P 168:300(132) ack 1 win 1266

    347 packets captured

    1474 packets received by filter

    745 packets dropped by kernel

    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。

    二、选项介绍

    引用

    -A 以ASCII格式打印出所有分组,并将链路层的头最小化。

    -c 在收到指定的数量的分组后,tcpdump就会停止。

    -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size

    中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size

    的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。

    -d 将匹配信息包的代码以人们能够理解的汇编格式给出。

    -dd 将匹配信息包的代码以c语言程序段的格式给出。

    -ddd 将匹配信息包的代码以十进制的形式给出。

    -D 打印出系统中所有可以用tcpdump截包的网络接口。

    -e 在输出行打印出数据链路层的头部信息。

    -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。

    -f 将外部的Internet地址以数字的形式打印出来。

    -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。

    -i 指定监听的网络接口。

    -l 使标准输出变为缓冲行形式,可以把数据导出到文件。

    -L 列出网络接口的已知数据链路。

    -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。

    -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。

    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。

    -n 不把网络地址转换成名字。

    -nn 不进行端口名称的转换。

    -N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。

    -t 在输出的每一行不打印时间戳。

    -O 不运行分组分组匹配(packet-matching)代码优化程序。

    -P 不将网络接口设置成混杂模式。

    -q 快速输出。只输出较少的协议信息。

    -r 从指定的文件中读取包(这些包一般通过-w选项产生)。

    -S 将tcp的序列号以绝对值形式输出,而不是相对值。

    -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。

    -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。

    -t 不在每一行中输出时间戳。

    -tt 在每一行中输出非格式化的时间戳。

    -ttt 输出本行和前面一行之间的时间差。

    -tttt 在每一行中输出由date处理的默认格式的时间戳。

    -u 输出未解码的NFS句柄。

    -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。

    -vv 输出详细的报文信息。

    -w 直接将分组写入文件中,而不是不分析并打印出来。

    例子: tcpdump -n -i eth0 dst 192.168.31.147 or 192.168.31.157 and tcp

    三、tcpdump的表达式介绍

    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。

    在表达式中一般如下几种类型的关键字:

    引用

    第一种是关于类型的关键字,主要包括host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。

    第二种是确定传输方向的关键字,主要包括src,dst,dst or src,dst and src,

    这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net

    202.0.0.0 指明目的网络地址是202.0.0.0。如果没有指明 方向关键字,则缺省是src or dst关键字。

    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI

    (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether

    具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。

    其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。

    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater,

    还有三种逻辑运算,取非运算是 ‘not ' '! ‘, 与运算是’and’,’&&';或运算是’or’

    ,’||’; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

    四、输出结果介绍

    下面我们介绍几种典型的tcpdump命令的输出信息

    (1) 数据链路层头信息使用命令:

    #tcpdump --e host ICE

    ICE 是一台装有linux的主机。它的MAC地址是0:90:27:58:AF:1A H219是一台装有Solaris的SUN工作站。它的MAC地址是8:0:20:79:5B:46; 上一条命令的输出结果如下所示:

    引用

    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)

    21:50:12是显示的时间, 847509是ID号,eth0

    >表示从网络接口设备发送分组, 8:0:20:79:5b:46是主机H219的MAC地址, 它表明是从源地址H219发来的分组.

    0:90:27:58:af:1a是主机ICE的MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组,60 是分组的长度,

    h219.33357 > ICE. telnet 表明该分组是从主机H219的33357端口发往主机ICE的 TELNET(23)端口。

    ack 22535 表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。

    (2) ARP包的tcpdump输出信息

    使用命令:

    #tcpdump arp

    得到的输出结果是:

    引用

    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)

    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)

    22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has

    route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a是主机 ICE的MAC地址。

    (3) TCP包的输出信息

    用tcpdump捕获的TCP包的一般输出信息是:

    引用

    src > dst: flags data-seqno ack window urgent options

    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) ,

    R (RST) "." (没有标记); data-seqno是报文中的数据 的顺序号, ack是下次期望的顺序号,

    window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。

    (4) UDP包的输出信息

    用tcpdump捕获的UDP包的一般输出信息是:

    引用

    route.port1 > ICE.port2: udp lenth

    UDP十分简单,上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口,类型是UDP, 包的长度是lenth。

    展开全文
  • tcpdump抓包命令

    千次阅读 2017-06-12 21:50:57
    我并没有写这些东西,我做的事情仅仅是将网上的一些东西整合了起来,然后删掉了一些不常用的命令,仅此而已.tcpdump抓包命令tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取...

    我并没有写这些东西,我做的事情仅仅是将网上的一些东西整合了起来,然后删掉了一些不常用的命令,仅此而已.

    tcpdump抓包命令

    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。

    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

    一、概述

    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    # tcpdump -vv # -vv表示显示详细的信息
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF], proto 6, length: 92)
    
    asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
    
    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)
    
    11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077: 325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
    
    11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
    
    <==按下[ctrl]-c之后结束
    347 packets captured
    1474 packets received by filter
    745 packets dropped by kernel

    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。

    二、选项介绍

    tcpdump采用命令行方式,它的命令大致如下:

    tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
                   [ -c count ]
                   [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
                   [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
                   [ --number ] [ -Q in|out|inout ]
                   [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
                   [ -W filecount ]
                   [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
                   [ --immediate-mode ]
                   [ expression ]

    参数的含义如下:

    参数含义
    -A以ASCII格式打印出所有分组,通常用来抓取www的网页数据包数据。
    -c在收到指定的数量的分组后,tcpdump就会停止。
    -C在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
    -d将匹配信息包的代码以人们能够理解的汇编格式给出。
    -dd将匹配信息包的代码以c语言程序段的格式给出。
    -ddd将匹配信息包的代码以十进制的形式给出。
    -D打印出系统中所有可以用tcpdump截包的网络接口。
    -e在输出行打印出数据链路层的头部信息,也就是使用数据链路层的MAC数据包数据来显示.
    -f将外部的Internet地址以数字的形式打印出来。
    -F从指定的文件中读取表达式,忽略命令行中给出的表达式。
    -i指定监听的网络接口。
    -l使标准输出变为缓冲行形式,可以把数据导出到文件。
    -L列出网络接口的已知数据链路。
    -b在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
    -n不把网络地址转换成名字。
    -nn不进行端口名称的转换。
    -N不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
    -t在输出的每一行不打印时间戳。
    -O不运行分组分组匹配(packet-matching)代码优化程序。
    -P不将网络接口设置成混杂模式。
    -q快速输出。只输出较少的协议信息。
    -r从指定的文件中读取包(这些包一般通过-w选项产生)。
    -S将tcp的序列号以绝对值形式输出,而不是相对值。
    -s从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
    -T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议)。
    -t不在每一行中输出时间戳。
    -tt在每一行中输出非格式化的时间戳
    -ttt输出本行和前面一行之间的时间差。
    -tttt在每一行中输出由date处理的默认格式的时间戳。
    -v输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
    -vv输出详细的报文信息。
    -w直接将分组写入文件中,而不是不分析并打印出来。
    -X可以列出16进制以及ASCII的数据包内容,对于监听数据包内容很有用.

    推荐的一些写法:

    tcpdump -ntv -i xxx # -n表示不将网络地址转化为名称,-t不输出时间戳,-v输出一些比较详细的信息(这个很好用)
    

    三、tcpdump的表达式介绍

    表达式对应命令参数中最后的可省略的 expression.tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。

    在表达式中一般如下几种类型的关键字:

    表达式由一个或多个 表达元组成(nt: primitive, 表达元, 可理解为组成表达式的基本元素). 一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的 id组成(nt: 即, qualifiers id).

    有三种不同类型的修饰符: type, dir以及 proto.

    type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字. 可选的对象类型有: host, net, port 以及portrange(nt: host 表明id表示主机, net表明id是网络, port 表明 id是端口, 而 portrange表明 id是一个端口范围). 如, host foo, net 128.3, port 20, portrange 6000-6008(nt: 分别表示主机 foo, 网络 128.3, 端口 20, 端口范围 6000-6008). 如果不指定type修饰符, id默认的修饰符为host.

    dir 修饰符描述 id 所对应的传输方向, 即发往 id 还是从 id 接收(nt: 而 id到底指什么需要看其前面的 type修饰符).可取的方向为: src, dst, src or dst, src and dst.(nt:分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源并且是传输目的). 例如, src foo,dst net 128.3, src or dst port ftp-data.(nt: 分别表示符合条件的数据包中, 源主机是 foo, 目的网络是 128.3, 源或目的端口为 ftp-data).如果不指定 dir修饰符, id 默认的修饰符为 src or dst.

    proto修饰符描述id所属的协议. 常用的协议有: ether, wlan, ip, ip6, arp, rarp, tcp以及 upd.(nt | rt: ether可理解为物理以太网传输协议; wlan, 无线局域网协议; ip, ip6 即通常的 TCP/IP协议栈中所使用的 ipv4以及 ipv6网络层协议; arp, rarp 即地址解析协议, 反向地址解析协议; tcp and udp, 即通常 TCP/IP协议栈中的两个传输层协议).

    例如, ether src foo, arp net 128.3, tcp port 21, udp portrange 7000-7009分别表示 从以太网地址foo来的数据包, 发往或来自128.3网络的arp协议数据包, 发送或接收端口为21的tcp协议数据包, 发送或接收端口范围为7000-7009的udp协议数据包.

    如果不指定 proto 修饰符, 则默认为与相应 type匹配的修饰符.

    例子:

    1. src foo 含义是 (ip or arp or rarp) src foo (nt: 即, 来自主机 fooip/arp/rarp协议数据包, 默认 typehost).
    2. net bar 含义是 (ip or arp or rarp) net bar (nt: 即, 来自或发往 bar网络的 ip/arp/rarp协议数据包).
    3. port 53 含义是 (tcp or udp) port 53(nt: 即, 发送或接收端口为 53tcp/udp协议数据包).

    对于修饰符后跟id的格式,可理解为, type id是对包最基本的过滤条件: 即对包相关的主机, 网络, 端口的限制; dir 表示对包的传送方向的限制; proto表示对包相关的协议限制)

    除以上所描述的表达元(‘primitive’), 还有其他形式的表达元, 并且与上述表达元格式不同. 比如: gateway, broadcast, less, greater以及算术表达式(nt: 其中每一个都算一种新的表达元). 下面将会对这些表达元进行说明.

    表达元之间还可以通过关键字 and, or以及 not 进行连接, 从而可组成比较复杂的条件表达式. 比如,
    host foo and not port ftp and not port ftp-data(nt: 其过滤条件可理解为, 数据包的主机为 foo,并且端口不是 ftp(端口 21) 和 ftp-data(端口 20, 常用端口和名字的对应可在 linux 系统中的 /etc/service文件中找到)).

    为了表示方便, 同样的修饰符可以被省略, 如 tcp dst port ftp or ftp-data or domain与以下的表达式含义相同 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain.(nt: 其过滤条件可理解为,包的协议为 tcp, 目的端口为 ftpftp-datadomain(端口 53) ).

    可用的表达元

    ==========================================

    dst host host

    如果IPv4/v6 数据包的目的 ip地址是 host, 那么捕获该数据包. host 可以是一个 ip地址, 也可以是一个主机名.

    src host host

    如果IPv4/v6 数据包的源 ip地址是 host, 则捕获该数据包. host 可以是一个 ip地址, 也可以是一个主机名.

    host host

    如果IPv4/v6数据包的源或目的 ip地址是 host, 则捕获该数据包.以上的几个host 表达式之前可以添加以下关键字: ip, arp, rarp, 以及 ip6.比如:

    ip host host

    也可以表达为:

    ether proto \ip and host host # 这种表达方式在下面有说明, 其中ip之前需要有\来转义,因为ip 对tcpdump 来说已经是一个关键字了.

    如果 host是一个拥有多个 IP的主机, 那么任何一个地址都会用于包的匹配(nt: 即发向host 的数据包的目的地址可以是这几个IP中的任何一个, 从host 接收的数据包的源地址也可以是这几个IP中的任何一个).

    ==========================================

    ether dst ehost

    如果数据包(nt: 指tcpdump 可抓取的数据包, 包括ip 数据包, tcp数据包)的以太网目标地址是 ehost,则捕获该数据包.

    ehost 可以是 /etc/ethers 文件中的名字或一个 数字地址(nt: 可通过 man ethers 看到对 /etc/ethers 文件的描述, 样例中用的是数字地址)

    ether src ehost

    如果数据包的以太网源地址是 ehost, 则捕获该数据包.

    ether host ehost

    如果数据包的以太网源地址或目标地址是ehost, 则捕获该数据包..

    ==========================================

    dst net net

    如果数据包的目标地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    net可以是从网络数据库文件 /etc/networks 中的名字, 也可以用数字形式的来表示.

    一个数字IPv4 网络号可以用点分四元组(比如, 192.168.1.0), 或点分三元组(比如, 192.168.1), 或点分二元组(比如, 172.16), 或单一单元组(比如, 10)来表示.

    这四种情况对应的网络掩码分别为:四元组: 255.255.255.255(这实际上已经是是一个具体的网络地址了),三元组: 255.255.255.0, 二元组: 255.255.0.0, 一元组: 255.0.0.0.

    src net net

    如果数据包的源地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    net net

    如果数据包的源或目的地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    ==========================================

    net net mask netmask

    如果数据包的源或目的 ip地址的网络掩码与 netmask匹配, 则捕获该数据包.

    此选项之前还可以配合 srcdst来进一步限定数据包的来源,比如.

    src net net mask 255.255.255.0 

    ==========================================

    net net/len

    如果数据包的源或目的地址(IPv4或IPv6格式)的属于该网段( net/len表示的网段), 则捕获该数据包.

    此选项之前还可以配合 srcdst来进一步限定数据包的来源.

    src net net/24 # 表示需要匹配源地址的网络编号有24位的数据包

    ==========================================

    dst port port

    如果数据包(包括ip/tcp, ip/udp, ip6/tcp or ip6/udp协议)的目的端口为 port, 则捕获该数据包.

    port 可以是一个数字也可以是一个名字(相应名字可以在 /etc/services 中找到该名字, 也可以通过 man tcpman udp来得到相关描述信息 ). 推荐使用数字.

    dst port 80 # 监听目的端口为80的数据包

    src port port

    如果数据包的源端口为 port, 则捕获该数据包.

    port port

    如果数据包的源或目的端口为 port, 则捕获该数据包.

    ==========================================

    dst portrange port1-port2

    监听目的端口在[port1, port2]的数据包,当然,既然存在端口,那么这个数据包必然属于ip/tcp, ip/udp, ip6/tcp 或者ip6/udp这几种中的一种.

    src portrange port1-port2

    监听源端口在[port1, port2]范围内的数据包.

    portrange port1-port2

    如果数据包的源端口或目的端口在[port1,port2]这个端口范围, 则捕获该数据包.以上关于 port 的选项都可以在其前面添加关键字: tcp 或者 udp对数据包加以更严格的限定.

    tcp src port port # 抓取源端口是port的tcp数据包

    ==========================================

    less length

    如果数据包的长度比 length 小或等于 length, 则捕获该数据包. 这与 len <= length的含义一致.

    greater length

    如果数据包的长度比length 大或等于length, 则捕获该数据包. 这与 len >= length的含义一致.

    ==========================================

    ip proto protocol

    如果数据包为 ipv4数据包并且其协议类型为 protocol, 则与此对应的条件表达式为真. protocol可以是一个数字也可以是名字, 比如: icmp6, pim, udp, tcp 等. 由于 tcp , udp 以及 icmp是tcpdump 的关键字,所以在这些协议名字之前必须要用\来进行转义(如果在C-shell 中需要用\来进行转义). 注意此表达元不会把数据包中协议头链中所有协议头内容全部打印出来(nt: 实际上只会打印指定协议的一些头部信息, 比如可以用

     tcpdump -i eth0 'ip proto \tcp and host 192.168.3.144

    则只打印主机 192.168.3.144发出或接收的数据包中 tcp 协议头所包含的信息).

    tcpdump -i eth0 'ip proto \tcp or \udp' # 捕获通过eth0接口的tcp或者udp数据包.

    ==========================================

    ether broadcast

    如果数据包是以太网广播数据包, 则捕获该数据包. ether 关键字是可选的.

    ip broadcast

    如果数据包是 IPv4广播数据包, 则捕获该数据包.

    ==========================================

    ether multicast

    如果数据包是一个以太网多点广播数据包,则捕获该数据包.关键字ether可以省略.

    ip multicast

    如果数据包是 ipv4多点广播数据包, 则捕获该数据包.

    ==========================================

    ether proto protocol

    如果数据包属于以下以太协议类型, 则与此对应的条件表达式为真.协议(protocol)字段, 可以是数字或以下所列出的名字: ip, ip6, arp, rarp, stp(Spanning tree protocol, 生成树协议, 可用于防止网络中产生链接循环)等.必须要注意的是如果标识符也是关键字, 从而必须通过\来进行转义.

    四、输出结果介绍

    下面我们介绍几种典型的tcpdump命令的输出信息

    (1) 数据链路层头信息

    使用命令:

    #tcpdump --e host ICE

    ICE是一台装有 linux的主机。它的 MAC地址是0:90:27:58:AF:1A, H219是一台装有Solaris的SUN工作站。它的 MAC地址是8:0:20:79:5B:46.

    上一条命令的输出结果如下所示:

    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)

    21:50:12是显示的时间, 847509是ID号, eth0 > 表示从网络接口 eth0接收该分组, 同理 eth0 >表示从网络接口设备 eth0发送分组,8:0:20:79:5b:46是主机H219的 MAC地址, 它表明是从源地址H219发来的分组.0:90:27:58:af:1a是主机ICE的 MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组, 60是分组的长度, h219.33357 > ICE. telnet 表明该分组是从主机H219的 33357端口发往主机ICE的 TELNET(23)端口。 ack 22535表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。

    (2) ARP包的tcpdump输出信息

    使用命令:

    #tcpdump arp

    得到的输出结果是:

    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)

    22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a 是主机 ICE的MAC地址。

    (3) TCP包的输出信息

    用tcpdump捕获的TCP包的一般输出信息是:

    src > dst: flags data-seqno ack window urgent options

    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,具体描述如下:

    标识字符缩写描述
    SSYN同步标识
    FFIN终止标识
    RRST复位标识
    PPSH推送标识
    .以上四个标识bit全部为0

    data-seqno是报文中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。

    (4) UDP包的输出信息

    用tcpdump捕获的UDP包的一般输出信息是:

    route.port1 > ICE.port2: udp lenth

    UDP十分简单,上面的输出行表明从主机 routeport1端口发出的一个UDP报文 到主机 ICEport2端口,类型是UDP, 包的长度是 lenth

    五、举例

    (1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的分组:

    #tcpdump host 210.27.48.1 

    (2) 想要截获主机210.27.48.1 和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):

    #tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

    (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    (4) 如果想要获取主机192.168.228.246接收或发出的ssh包,并且不转换主机名使用如下命令:

    #tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp

    (5) 获取主机192.168.228.246接收或发出的ssh包,并把mac地址也一同显示:

    # tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn

    (6) 过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头:

    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

    (7) 过滤源主机物理地址为XXX的报头:

    tcpdump ether src 00:50:04:BA:9B and dst……

    (为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。
    (8) 过滤源主机192.168.0.1和目的端口不是telnet的报头,并导入到tes.t.txt文件中:

    Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt

    ip icmp arp rarptcpudpicmp 这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

    六.man手册中的一些例子

    打印所有进入或离开主机 sundown 的数据包.

    tcpdump host sundown

    打印主机 helios 与主机 hot 或者与主机 ace 之间通信的数据包

    tcpdump host helios and \( hot or ace \)

    打印主机 ace 与 任何其他主机之间通信的IP 数据包, 但不包括与 helios之间的数据包.

    tcpdump ip host ace and not helios

    打印本地主机与Berkeley网络上的主机之间的所有通信数据包.

    tcpdump net ucb-ether

    打印所有源地址或目标地址是本地主机的 IP 数据包(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络. localnet 在实际使用时要真正替换成本地网络的名字.

    tcpdump ip and not net localnet

    打印长度超过576字节, 并且网关地址是 snupIP 数据包

    tcpdump 'gateway snup and ip[2:2] > 576'

    以下列出了 tcp, ip头的结构, 以方便查看(需要以等宽字体查看).

    TCP 头格式(rfc793)

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |          Source Port          |       Destination Port        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                        Sequence Number                        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Acknowledgment Number                      |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |  Data |           |U|A|P|R|S|F|                               |
        | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
        |       |           |G|K|H|T|N|N|                               |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |           Checksum            |         Urgent Pointer        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Options                    |    Padding    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                             data                              |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    IPV4 头格式(rfc791)

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |Version|  IHL  |Type of Service|          Total Length         |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |         Identification        |Flags|      Fragment Offset    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |  Time to Live |    Protocol   |         Header Checksum       |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                       Source Address                          |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Destination Address                        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Options                    |    Padding    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    七.输出格式

    tcpdump 的输出格式与协议有关. 以下简要描述了大部分常用的格式及相关例子.

    链路层头

    ARP/RARP 数据包

    tcpdump对 arp/rarp包的输出信息中会包含请求类型及该请求对应的参数. 显示格式简洁明了. 以下是从主机rtsg到主机csam的 rlogin(远程登录)过程开始阶段的数据包样例:

    arp who-has csam tell rtsg
    arp reply csam is-at CSAM

    第一行表示: rtsg发送了一个 arp数据包(nt:向全网段发送, arp数据包)以询问 csam的以太网地址,csam以她自己的以太网地址做了回应(在这个例子中, 以太网地址以大写的名字标识, 而internet地址(即ip地址)以全部的小写名字标识).

    如果使用 tcpdump -n, 可以清晰看到以太网以及 ip地址而不是名字标识:

    arp who-has 128.3.254.6 tell 128.3.254.68
    arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

    如果我们使用 tcpdump -e, 则可以清晰的看到第一个数据包是全网广播的, 而第二个数据包是点对点的:

    RTSG Broadcast 0806  64: arp who-has csam tell rtsg
    CSAM RTSG 0806  64: arp reply csam is-at CSAM

    第一个数据包表明:以 arp包的源以太地址是RTSG, 目标地址是全以太网段, type域的值为16进制0806(表示ETHER_ARP即arp包的类型标识).包的总长度为64字节.

    TCP 数据包

    通常tcpdump对tcp数据包的显示格式如下:

    src > dst: flags data-seqno ack window urgent options

    srcdst 是源和目的 IP地址以及相应的端口. flags 标志由S(SYN), F(FIN), P(PUSH, R(RST)等组成,

    单独一个.表示没有flags标识. 数据段顺序号(Data-seqno)描述了此包中数据所对应序列号空间中的一个位置.

    ack描述的是同一个连接,同一个方向,下一个本端应该接收的(对方应该发送的)数据片段的顺序号.

    window是本端可用的数据接收缓冲区的大小(也是对方发送数据时需根据这个大小来组织数据).

    urg(urgent) 表示数据包中有紧急的数据. options 描述了tcp的一些选项, 这些选项都用尖括号来表示(如 <mss 1024>).

    src, dstflags 这三个域总是会被显示. 其他域的显示与否依赖于tcp协议头里的信息.

    下面是一个从主机trsg到csam的一个rlogin应用登录的开始阶段.

    rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
    csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
    rtsg.1023 > csam.login: . ack 1 win 4096
    rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
    csam.login > rtsg.1023: . ack 2 win 4096
    rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
    csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
    csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
    csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

    第一行表示有一个数据包从rtsg主机的tcp端口1023发送到了csam主机的 tcp端口login上. S表示设置了 SYN标志. 包的顺序号是768512, 并且没有包含数据.

    如果包含有数据,那么数据的表示格式为: first:last(nbytes), 其含义是此包中数据的顺序号从first开始直到last结束,不包括last. 并且总共包含nbytes的用户数据.

    没有捎带应答即ack, 可用的接受窗口的大小为4096bytes, 并且请求端(rtsg)的最大可接受的数据段大小是1024字节.

    主机csam 向主机rtsg 回复了基本相同的 SYN数据包, 其区别只是多了一个 piggy-backed ack(nt:捎带回的ack应答, 针对rtsg的SYN数据包).

    rtsg 同样针对csam的 SYN数据包回复了一 ACK数据包作为应答. .的含义就是此包中没有标志被设置. 由于此应答包中不含有数据, 所以包中也没有数据段序列号.

    提醒! 此ACK数据包的顺序号只是一个小整数1. 有如下解释:tcpdump对于一个tcp连接上的会话, 只打印会话两端的初始数据包的序列号,其后相应数据包只打印出与初始包序列号的差异.即初始序列号之后的序列号, 可被看作此会话上当前所传数据片段在整个要传输的数据中的’相对字节’位置(nt:双方的第一个位置都是1, 即’相对字节’的开始编号). -S将覆盖这个功能,使数据包的原始顺序号被打印出来.

    第六行的含义为:主机rtsg 向 主机csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了 PUSH标志.

    在第7行,主机csam回应道, 她已经从主机rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在主机csam的socket的接收缓冲中, 相应地,csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带PUSH标志.

    如果头部含有虚假的属性信息(比如其长度属性其实比头部实际长度长或短), tcpdump会为该头部显示[bad opt].

    如果头部的长度告诉我们某些选项(nt | rt:从下文来看, 指tcp包的头部中针对ip包的一些选项, 回头再翻)会在此包中,而真正的IP(数据包的长度又不够容纳这些选项, tcpdump会显示[bad hdr length].

    UDP 数据包

    UDP 数据包的显示格式,可通过 rwho这个具体应用所产生的数据包来说明:

            actinide.who > broadcast.who: udp 84

    其含义为: actinide主机上的端口 whobroadcast主机上的端口 who发送了一个 udp数据包.这个数据包包含有84个字节的用户数据.

    一些UDP服务可通过数据包的源或目的端口来辨别,也可从所显示的更高层协议信息来识别. 比如, Domain Name service requests(DNS 请求).

    UDP 名称服务请求

    名称服务请求有如下的格式:

    src > dst: id op? flags qtype qclass name (len)

    比如有一个实际显示为:

    h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

    主机 h2opolo 向主机 helios 上运行的名称服务器查询 ucbvax.berkeley.edu的地址记录(nt: qtype等于A). 此查询本身的id号为 3.

    符号 +意味着递归查询标志被设置(nt: dns服务器可向更高层dns服务器查询本服务器不包含的地址记录). 这个最终通过 IP包发送的查询请求数据长度为37字节, 其中不包括 UDPIP协议的头数据.

    因为此查询操作为默认值(nt | rt: normal one的理解), op字段被省略.如果op字段没被省略, 会被显示在 3+之间. 同样, qclass也是默认值, C_IN, 从而也没被显示, 如果没被忽略, 她会被显示在A之后.

    UDP 名称服务应答

    对名称服务应答的数据包,tcpdump会有如下的显示格式

        src > dst:  id op rcode flags a/n/au type class data (len)

    比如具体显示如下:

    helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
    helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

    第一行表示: 主机 helios 对主机 h2opolo所发送的3号查询请求回应了3条回答记录(nt | rt: answer records), 3条名称服务器记录,以及7条附加的记录. 第一个回答记录(nt: 3个回答记录中的第一个)类型为A(nt: 表示地址), 其数据为internet地址128.32.137.3.此回应UDP数据包, 包含273字节的数据(不包含UPD和IP的头部数据). op字段和rcode字段被忽略(nt: op的实际值为Query, rcode, 即response code的实际值为NoError), 同样被忽略的字段还有class 字段(nt | rt: 其值为C_IN, 这也是A类型记录默认取值)

    第二行表示: heliosh2opolo所发送的2号查询请求做了回应. 回应中, rcode编码为NXDomain(nt: 表示不存在的域)), 没有回答记录,但包含一个名称服务器记录, 不包含权威服务器记录(nt | ck: 从上文来看, 此处的authority records 就是上文中对应的additional records).

    *表示权威服务器回答标志被设置(nt: 从而additional records就表示的是authority records).

    由于没有回答记录, type, class, data字段都被忽略.

    flag字段还有可能出现其他一些字符, 比如 -(nt: 表示可递归地查询, 即RA 标志没有被设置), |(nt: 表示被截断的消息, 即TC 标志被置位). 如果应答(nt | ct: 可理解为, 包含名称服务应答的UDP数据包, tcpdump知道这类数据包该怎样解析其数据)的’question’段一个条目(entry)都不包含(nt: 每个条目的含义, 需补充),’[nq]’ 会被打印出来.

    要注意的是:名称服务器的请求和应答数据量比较大, 而默认的68字节的抓取长度(nt: snaplen, 可理解为tcpdump的一个设置选项)可能不足以抓取数据包的全部内容. 如果你真的需要仔细查看名称服务器的负载, 可以通过tcpdump 的-s 选项来扩大snaplen值.

    IP数据包分片

    IP分片数据包(nt: 即一个大的IP数据包切分后生成的小IP数据包)有如下两种显示格式.

    (frag id:size@offset+)
    (frag id:size@offset)

    (第一种格式表示, 此分片之后还有后续分片. 第二种格式表示, 此分片为最后一个分片.)

    id 表示分片的编号( 每个小 IP包被分配一个分片编号, 以便区分各个小分片).

    size表示此分片的大小,不包含分片头部数据.

    offset表示此分片所含数据在原始整个 IP包中的偏移.

    每个分片都会使tcpdump产生相应的输出打印. 第一个分片包含了高层协议的头数据(nt:从下文来看, 被分片IP数据包中相应 tcp头以及 IP头都放在了第一个分片中 ), 从而tcpdump会针对第一个分片显示这些信息, 并接着显示此分片本身的信息. 其后的一些分片并不包含高层协议头信息, 从而只会在显示源和目的之后显示分片本身的信息. 以下有一个例子:

    这是一个从 arizona.edulbl-rtsg.arpa途经CSNET网络的 ftp应用通信片段:

    arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
    arizona > rtsg: (frag 595a:204@328)
    rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

    有几点值得注意:
    第一, 第二行的打印中, 地址后面没有端口号.
    这是因为 TCP协议信息都放到了第一个分片中, 当显示第二个分片时, 我们无法知道此分片所对应 TCP包的顺序号.

    第二, 从第一行的信息中, 可以发现主机 arizonartsg发送308字节的用户数据, 而事实是, 相应IP包经分片后会总共产生512字节数据(第一个分片包含308字节的数据, 第二个分片包含204个字节的数据, 这超过了308字节).

    如果你在查找数据包的顺序号空间中的一些空洞(nt: hole,空洞, 指数据包之间的顺序号没有上下衔接上), 512这个数据就足够使你迷茫一阵(nt: 其实只要关注308就行,不必关注分片后的数据总量).

    一个 IP数据包如果带有非IP分片标志, 则显示时会在最后显示 (DF).

    时间戳

    tcpdump的所有输出打印行中都会默认包含时间戳信息.
    时间戳信息的显示格式如下

    hh:mm:ss.frac # 小时:分钟:秒.frac (未知, 需补充)

    此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间. 而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来.

    展开全文
  • 在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。 为了更好、更顺手地能够用好这两个工具,特整理本篇文章,...

    1 起因

    前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况。这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了。在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。

    为了更好、更顺手地能够用好这两个工具,特整理本篇文章,希望也能给大家带来收获。为大家之后排查问题,添一利器。

    2 tcpdump与Wireshark介绍

    在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具一样,它的特点就是简单而强大。它是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。

    默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。【比如本机的TCP通信,也必须要socket通信的基本要素:src ip port dst ip port】

    如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。

    Linux抓包原理:

    Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

    当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。

    Wireshark是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,一般只在图形界面平台下使用Wireshark,如果是Linux的话,直接使用tcpdump了,因为一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。

    在Mac平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。

    所以,tcpdump是用来抓取数据非常方便,Wireshark则是用于分析抓取到的数据比较方便。

    3 tcpdump使用

    3.1 语法

    类型的关键字

    host(缺省类型): 指明一台主机,如:host 210.27.48.2

    net: 指明一个网络地址,如:net 202.0.0.0

    port: 指明端口号,如:port 23

    确定方向的关键字

    src: src 210.27.48.2, IP包源地址是210.27.48.2

    dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0

    dst or src(缺省值)

    dst and src

    协议的关键字:缺省值是监听所有协议的信息包

    fddi

    ip

    arp

    rarp

    tcp

    udp

    其他关键字

    gateway

    broadcast

    less

    greater

    常用表达式:多条件时可以用括号,但是要用转义

    非 : ! or “not” (去掉双引号)

    且 : && or “and”

    或 : || or “or”

    3.2 选项

     

    技术分享
     

    3.3 命令实践

     

    1、直接启动tcpdump,将抓取所有经过第一个网络接口上的数据包

    技术分享
     

    2、抓取所有经过指定网络接口上的数据包

    技术分享
     

    3、抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据:

    技术分享
     

    4、抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信:

    技术分享
     

    5、抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包:

    技术分享
     

    6、抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包

    技术分享
     

    7、抓取主机10.37.63.3发送的所有数据:

    技术分享
     

    8、抓取主机10.37.63.3接收的所有数据:

    技术分享
     

    9、抓取主机10.37.63.3所有在TCP 80端口的数据包:

    技术分享
     

    10、抓取HTTP主机10.37.63.3在80端口接收到的数据包:

    技术分享
     

    11、抓取所有经过 en0,目的或源端口是 25 的网络数据

    技术分享
     

    12、抓取所有经过 en0,网络是 192.168上的数据包

    技术分享
     

    13、协议过滤

    技术分享
     

    14、抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据

    技术分享
     

    15、抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

    技术分享
     

    16、抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据

    技术分享
     

    17、只抓 SYN 包

    技术分享
     

    18、抓 SYN, ACK

    技术分享
     

    19、抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c

    技术分享
     

    20、抓 HTTP GET 数据,”GET “的十六进制是 0x47455420

    技术分享
     

    21、抓 SSH 返回,”SSH-“的十六进制是 0x5353482D

    技术分享
     

    22、高级包头过滤如前两个的包头过滤,首先了解如何从包头过滤信息:

    技术分享
     

    23、抓 DNS 请求数据

    技术分享
     

    24、其他-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是抓的太多,于是可以用-c 参数指定抓多少个包。

    技术分享
     

    3.4 抓个网站练练

    想抓取访问某个网站时的网络数据。比如网站 http://www.baidu.com/ 怎么做?

    1、通过tcpdump截获主机www.baidu.com发送与接收所有的数据包

    技术分享
     

    2、访问这个网站

    技术分享
     

    3、想要看到详细的http报文。怎么做?

    技术分享
     

    4、分析抓取到的报文

    技术分享
     

    4 tcpdump抓取TCP包分析

    TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址、目的IP地址,以及TCP数据报首部的源端口地址和目的端口地址。TCP首部结构如下:

    技术分享
     

    注意:通常情况下,一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手

    其中在TCP连接和断开连接过程中的关键部分如下:

    源端口号:即发送方的端口号,在TCP连接过程中,对于客户端,端口号往往由内核分配,无需进程指定;

    目的端口号:即发送目的的端口号;

    序号:即为发送的数据段首个字节的序号;

    确认序号:在收到对方发来的数据报,发送确认时期待对方下一次发送的数据序号;

    SYN:同步序列编号,Synchronize Sequence Numbers;

    ACK:确认编号,Acknowledgement Number;

    FIN:结束标志,FINish;

    4.1 TCP三次握手

    三次握手的过程如下:

    技术分享
     

    step1. 由客户端向服务器端发起TCP连接请求。Client发送:同步序列编号SYN置为1,发送序号Seq为一个随机数,这里假设为X,确认序号ACK置为0;

    step2. 服务器端接收到连接请求。Server响应:同步序列编号SYN置为1,并将确认序号ACK置为X+1,然后生成一个随机数Y作为发送序号Seq(因为所确认的数据报的确认序号未初始化);

    step3. 客户端对接收到的确认进行确认。Client发送:将确认序号ACK置为Y+1,然后将发送序号Seq置为X+1(即为接收到的数据报的确认序号);

    为什么是三次握手而不是两次对于step3的作用,假设一种情况,客户端A向服务器B发送一个连接请求数据报,然后这个数据报在网络中滞留导致其迟到了,虽然迟到了,但是服务器仍然会接收并发回一个确认数据报。但是A却因为久久收不到B的确认而将发送的请求连接置为失效,等到一段时间后,接到B发送过来的确认,A认为自己现在没有发送连接,而B却一直以为连接成功了,于是一直在等待A的动作,而A将不会有任何的动作了。这会导致服务器资源白白浪费掉了,因此,两次握手是不行的,因此需要再加上一次,对B发过来的确认再进行一次确认,即确认这次连接是有效的,从而建立连接。

    对于双方,发送序号的初始化为何值有的系统中是显式的初始化序号是0,但是这种已知的初始化值是非常危险的,因为这会使得一些黑客钻漏洞,发送一些数据报来破坏连接。因此,初始化序号因为取随机数会更好一些,并且是越随机越安全。

    tcpdump抓TCP三次握手抓包分析:

    sudotcpdump-n-S-ilo0host10.37.63.3andtcpport8080

    # 接着再运行:

    curlhttp://10.37.63.3:8080/atbg/doc

    控制台输出:

    技术分享
     

    每一行中间都有这个包所携带的标志:

    S=SYN,发起连接标志。

    P=PUSH,传送数据标志。

    F=FIN,关闭连接标志。

    ack,表示确认包。

    RST=RESET,异常关闭连接。

    .,表示没有任何标志。

    第1行:16:00:13.486776,从10.37.63.3(client)的临时端口61725向10.37.63.3(server)的8080监听端口发起连接,client初始包序号seq为1944916150,滑动窗口大小为65535字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为16344(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。【seq=1944916150,ack=0,syn=1】

    第2行:16:00:13.486850,server响应连接,同时带上第一个包的ack信息,为client端的初始包序号seq加1,即1944916151,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号seq为1119565918,mss也是16344。【seq=1119565918,ack=1944916151,syn=1】

    第3行:15:46:13.084161,client再次发送确认连接,tcp连接三次握手完成,等待传输数据包。【ack=1119565919,seq=1944916151】

    4.2 TCP四次挥手

    连接双方在完成数据传输之后就需要断开连接。由于TCP连接是属于全双工的,即连接双方可以在一条TCP连接上互相传输数据,因此在断开时存在一个半关闭状态,即有有一方失去发送数据的能力,却还能接收数据。因此,断开连接需要分为四次。主要过程如下:

    技术分享
     

    step1. 主机A向主机B发起断开连接请求,之后主机A进入FIN-WAIT-1状态;

    step2. 主机B收到主机A的请求后,向主机A发回确认,然后进入CLOSE-WAIT状态;

    step3. 主机A收到B的确认之后,进入FIN-WAIT-2状态,此时便是半关闭状态,即主机A失去发送能力,但是主机B却还能向A发送数据,并且A可以接收数据。此时主机B占主导位置了,如果需要继续关闭则需要主机B来操作了;

    step4. 主机B向A发出断开连接请求,然后进入LAST-ACK状态;

    step5. 主机A接收到请求后发送确认,进入TIME-WAIT状态,等待2MSL之后进入CLOSED状态,而主机B则在接受到确认后进入CLOSED状态;

    为何主机A在发送了最后的确认后没有进入CLOSED状态,反而进入了一个等待2MSL的TIME-WAIT主要作用有两个:

    第一,确保主机A最后发送的确认能够到达主机B。如果处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开连接请求,然后主机A就可以有足够的时间去再次发送确认。但是这也只能尽最大力量来确保能够正常断开,如果主机A的确认总是在网络中滞留失效,从而超过了2MSL,最后也无法正常断开;

    第二,如果主机A在发送了确认之后立即进入CLOSED状态。假设之后主机A再次向主机B发送一条连接请求,而这条连接请求比之前的确认报文更早地到达主机B,则会使得主机B以为这条连接请求是在旧的连接中A发出的报文,并不看成是一条新的连接请求了,即使得这个连接请求失效了,增加2MSL的时间可以使得这个失效的连接请求报文作废,这样才不影响下次新的连接请求中出现失效的连接请求。

    为什么断开连接请求报文只有三个,而不是四个因为在TCP连接过程中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,如果自己在这段事件内也有数据要发送,就跟确认一起发送,如果没有,则确认单独发送。而我们的抓包实验中,由服务器端先断开连接,之后客户端在确认的延迟时间内,也有请求断开连接需要发送,于是就与上次确认一起发送,因此就只有三个数据报了。

    5 Wireshark分析tcpdump抓包结果

     

    1、启动8080端口,tcpdump抓包命令如下:

    tcpdump-ilo0-s0-n-Shost10.37.63.3andport8080-w./Desktop/tcpdump_10.37.63.3_8080_20160525.cap

    # 然后再执行curl

    curlhttp://10.37.63.3:8080/atbg/doc

    2、使用Wireshark打开tcpdump_10.37.63.3_8080_20160525.cap文件

    技术分享
     

    No. 1-4 行:TCP三次握手环节;

    No. 5-8 行:TCP传输数据环节;

    No. 9-13 行:TCP四次挥手环节;

    3、顺便说一个查看 http 请求和响应的方法:

    技术分享
     

    弹窗如下图所示,上面红色部分为请求信息,下面蓝色部分为响应信息:

    技术分享
     

    以上是Wireshark分析tcpdump的简单使用,Wireshark更强大的是过滤器工具,大家可以自行去多研究学习Wireshark,用起来还是比较爽的。

    展开全文
  • tcpdump抓包命令详解大全

    千次阅读 2021-12-31 15:12:46
    tcpdump命令参数类型: tcpdump选项可划分为四大类型:控制tcpdump程序行为,控制数据怎样显示,控制显示什么数据,以及过滤命令
  • 1、本机服务器所有监听端口tcpdump -i any -XO -vvv -s0 -w /root/`hostname`_anyport.cap 2、本机指定端口(例如6000监听端口): tcpdump -i any port 6000 -w /root/`hostname`_6000....
  • 原文地址:tcpdump抓包规则命令大全 作者:xyaxlz 说是大全其实我列取得只是一些常用的命令与大家分享。   下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo。  ...
  • Tcpdump抓包命令使用

    千次阅读 2018-08-07 13:34:00
    tcpdump命令需要使用root...监视编址到指定端口的TCP或UDP数据包,那么执行以下命令tcpdump -i eth0 host 10.43.159.11 and port 8983 输出信息到文件 tcpdump -i eth0 host 10.43.159.11 and port 8983 -w...
  • Linux下tcpdump利用端口和ip抓包方式

    千次阅读 2019-11-18 17:29:56
    今天刚接触抓包,总结一下,以免忘记 tcpdump命令选项: -a #将网络地址和广播地址转变成名字 -A #以ASCII格式打印出所有分组,并将链路层的头最小化 -b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层 -c #...
  • 01-----tcpdump抓包命令

    2021-03-31 10:46:22
    tcpdump抓包命令 关于tcpdump的抓包命令,非常的多,这里我只记录我平时开发时比较常用的抓包命令,当然后面可能不断的在本篇补上对应的内容。 1 tcpdump的命令格式 tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -...
  • tcpdump抓包命令使用

    2019-11-12 19:57:56
    tcpdump抓包命令使用 抓包工具使用 1.作用: (1)捕获网络协议包 (2)分析网络协议包 2.分类: (1)命令行工具,如tcpdump (2)图像界面工具,wireshark 3.tcpdump命令行工具的使用 3.1格式:tcpdump ...
  • tcpdump抓包以及端口查看的一些操作

    万次阅读 2014-10-10 14:10:08
     nginx开启后会占用80端口,此时执行命令tcpdump tcp port 80   结果如下: [syswj@host ~]$ sudo tcpdump tcp port 80 [sudo] password for syswj: tcpdump: verbose output suppressed, use -v or -vv f
  • 一直在tcpdump的选项-a —— 将网络地址和广播地址转变成名字-d ——将匹配信息的代码以人们能够理解的汇编格式给出-dd ——将匹配信息的代码以c语言程序段的格式给出-ddd ——将匹配信息的代码以十进制的形式...
  • tcpdump抓包命令详解

    千次阅读 2016-09-21 21:26:01
    普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 监视指定网络接口的数据包 tcpdump -i eth1 如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定...
  • 今天我们就来快速了解tcpdump命令的基础用法,阅读后可以让你抓包不求人。 基础用法 可以根据条件设置抓取指定网卡、指定数量的消息,也可以设置过滤条件过滤掉不需要的地址或者端口消息。 首先,我们要知道...
  • tcpdump抓包命令和wireshark抓包分析

    万次阅读 多人点赞 2018-09-03 16:59:59
    tcpdump抓包命令 tcpdump 的抓包保存到文件的命令参数是-w xxx.cap 抓eth1的包 tcpdump -i eth1 -w /tmp/xxx.cap 抓 192.168.1.123的包 tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap 抓192.168.1.123的...
  • 在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。 为了更好、更顺手地能够用好这两个工...
  • 1.通过ip过滤抓包方法 tcpdump -i any -s 0 -w 100.pcap net 172.16.1.139 or 172.16.1.159 2.通过端口过滤抓包方法 tcpdump sctp or udp port 2123 or udp portrange 10000-11000 -i any -s 0 -w 01.pcap
  • Tcpdump抓包命令

    2020-09-04 13:39:43
    以下是我看过抓包命令写得比较详细,每一条抓包命令都有详细的参数说明,作为小白不担心看不懂哟! 转载自 http://blog.chinaunix.net/uid-25135004-id-1696519.html 作者:xyaxlz
  • tcpdump抓包使用详解

    千次阅读 2021-05-11 10:23:52
    tcpdump能帮助我们捕捉并保存网络包,...1.针对特定网口抓包(-i选项)当我们不加任何选项执行tcpdump时,tcpdump将抓取通过所有网口的包;使用-i选项,我们可以在某个指定的网口抓包:linux:/tmp/lx # tcpdump -i eth...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,389
精华内容 5,355
关键字:

tcpdump抓包命令端口