zoukankan      html  css  js  c++  java
  • 计算机网络基础 — Tcpdump 抓包工具

    目录

    前文列表

    计算机网络基础 — 以太网
    计算机网络基础 — 物理网络
    计算机网络基础 — TCP/IP 网络模型
    计算机网络基础 — Linux 内核网络协议栈
    计算机网络基础 — 虚拟网络
    计算机网络基础 — Linux 虚拟交换机
    计算机网络基础 — Linux 路由器
    计算机网络基础 — Linux 虚拟路由器

    tcpdump 指令

    tcpdump(dump the traffic on a network)是 Linux 强大网络数据采集分析工具,可以将网络中传输的数据包(涵盖整个 TCP/IP 协议族的数据包)完全截获下来提供分析。它支持针对网络层、协议、主机、网络接口或端口的过滤,并提供 and、or、no t等逻辑原语来帮助你筛选出关注的信息。

    基本上 tcpdump 的输出格式为:

    系统时间 源主机.端口 > 目标主机.端口 数据包参数

    官方网站:tcpdump

    关键字

    关于类型

    • host - 主机:host 210.27.48.2 指明 210.27.48.2 是一台主机
    • net - 网络(网段):net 10.0 指明 10.0 是一个网络地址
    • port - 端口:port 23 指明端口号是 23

    NOTE:缺省类型是 host。

    关于传输方向

    • src - 源:src 210.27.48.2 指明 IP 数据包中的源 IP 地址是 210.27.48.2
    • dst - 目标:dst net 10.0 指明 IP 数据包中的目的网络地址是 10.0
    • dst or src
    • dst and src

    NOTE:缺省方向是 src or dst

    关于协议

    • ip
    • arp
    • rarp
    • tcp
    • udp
    • fddi

    NOTE: 缺省是所有协议的包

    关于逻辑条件

    • and
    • or
    • not

    NOT:不同的关键字之间结合使用需要逻辑运算符

    其他

    • gateway
    • broadcast
    • less
    • greater

    常用指令选项

    Help:

    [root@localhost ~]# tcpdump --help
    tcpdump version 4.9.2
    libpcap version 1.5.3
    OpenSSL 1.0.2k-fips  26 Jan 2017
    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 ]
    • -i:指定监听的 interface
    • -n:不启用主机名解析,显示 IP 地址,默认显示为 hostname
    • -nn:不启用主机名解析与端口名称转换,显示端口号,默认显示端口号对应的服务名
    • -c:指定抓取数据宝的数量
    • -D:显示操作系统当前所有可以使用 tcpdump 抓包的 interface 设备名
    • -b:在数据链路层上选择协议,包括 ip、arp、rarp、ipx 等
    • -N:不显示主机名中的域名部分。e.g. hostname nic.ddn.mil 只输出nic
    • -t:不打印时间戳
    • -tttt:输出 date 默认格式的时间戳
    • -q:只输出少量的协议信息
    • -v:输出稍微详细的信息,例如输出 IP 数据包中的 ttl 和服务类型信息
    • -vv:输出详细的报文信息
    • -vvv:输出更加详细的报文信息
    • -w:直接将抓取的数据包信息写入文件
    • -P:指定要抓取的包是流入还是流出包,可以指定 in、out、inout 参数,默认为 inout
    • -s len:设置抓取的数据包长度为 len,默认为 65535Byte,如果要抓取的数据包长度大于 len,可能会发生包截断。
    • -S 将 TCP 的序列号以绝对值形式输出,而不是相对值

    常规操作示例

    在这里插入图片描述

    NOTE: 测试环境 IP 172.18.22.200,hostname localhost.localdomain.ssh

    查看哪些接口可用于捕获

    $ sudo tcpdump -D
    
    1.eth0
    2.virbr0
    3.eth1
    4.any (Pseudo-device that captures on all interfaces)
    5.lo [Loopback]

    过滤主机

    抓取经过指定 interface 的,并且 DST_IP 或 SRC_IP 是 172.18.22.200 的数据包。

    tcpdump -i ens160 host 172.18.22.200
    • 筛选 SRC_IP,抓取经过 interface 且从 172.18.22.200 发出数据包
    tcpdump -i ens160 src host 172.18.22.200
    • 筛选 DST_IP,抓取经过 interface 且发送到 172.18.22.200 的数据包
    tcpdump -i ens160 dst host 172.18.22.200

    应用场景:你希望查看发送到 host 172.18.22.208 的数据包有没有经过当前主机的 ens160 网卡

    [root@localhost ~]# tcpdump -i ens160 -nnt -c 1 dst host 172.18.22.208 and icmp
    ...
    IP 172.18.128.204 > 172.18.22.208: ICMP echo request, id 27729, seq 138, length 64

    过滤端口

    抓取经过指定 interface 的,并且 DST_PORT 或 SRC_PORT 是 22 的数据包。

    tcpdump -i ens160 port 22
    • 筛选 SRC_PORT
    tcpdump -i ens160 src port 22
    • 筛选 DST_PORT
    tcpdump -i ens160 dst port 22

    应用场景:你希望查看发送到 host 172.18.22.208 的 22 号端口的数据包有没有经过当前主机的 ens160 网卡

    [root@localhost ~]# tcpdump -i ens160 -nnt -c 1 dst host 172.18.22.208 and port 22
    ...
    IP 172.18.128.204.60812 > 172.18.22.208.22: Flags [S], seq 908466914, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 949822094 ecr 0,sackOK,eol], length 0

    过滤网络(网段)

    抓取经过指定 interface 的,并且 DST_NET 或 SRC_NET 是 172.18.22 的数据包。

    tcpdump -i ens160 net 172.18.22
    • 筛选 SRC_NET
    tcpdump -i ens160 src net 172.18.22
    • 筛选 DST_NET
    tcpdump -i ens160 dst net 172.18.22

    过滤协议

    tcpdump -i ens160 icmp
    tcpdump -i ens160 ip
    tcpdump -i ens160 tcp
    tcpdump -i ens160 udp
    tcpdump -i ens160 arp

    复杂的逻辑表达式过滤条件

    抓取经过 interface ens160,发送到 host 172.18.22.208 或 172.18.22.200 的 TCP 协议 22 号端口的数据包。

    [root@localhost ~]# tcpdump -i ens160 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 172.18.22.208) or (dst host 172.18.22.200)))'
    ...
    IP (tos 0x10, ttl 61, id 0, offset 0, flags [DF], proto TCP (6), length 52)
        172.18.128.204.59180 > 172.18.22.200.22: Flags [.], cksum 0x89d7 (correct), seq 3833060046, ack 3808611483, win 4092, options [nop,nop,TS val 950233961 ecr 87616963], length 0
    IP (tos 0x10, ttl 61, id 0, offset 0, flags [DF], proto TCP (6), length 52)
        172.18.128.204.59180 > 172.18.22.200.22: Flags [.], cksum 0x88b1 (correct), seq 0, ack 293, win 4086, options [nop,nop,TS val 950233965 ecr 87616967], length 0

    抓取经过 interface ens160,DST_MAC 或 SRC_MAC 地址是 00:50:56:bf:c2:c5 的 ICMP 数据包。

    [root@localhost ~]# tcpdump -i ens160 '((icmp) and ((ether host 00:50:56:bf:c2:c5)))'
    ...
    15:19:50.522900 IP localhost.localdomain > 172.18.22.41: ICMP redirect 172.18.41.24 to host localhost.localdomain, length 68

    抓取经过 interface ens160,目标网络是 172.18 但目标主机又不是 172.18.22.204 的 TCP 且非 22 号端口的数据包。

    [root@localhost ~]# tcpdump -i ens160 -c 10 -nnt '((tcp) and (not port 22) and ((dst net 172.18) and (not dst host 172.18.22.204)))'
    ...
    IP 172.18.22.74.47580 > 172.18.22.237.8080: Flags [S], seq 2124823039, win 29200, options [mss 1460,sackOK,TS val 274062379 ecr 0,nop,wscale 7], length 0
    IP 172.18.22.237.8080 > 172.18.22.74.47580: Flags [R.], seq 0, ack 2124823040, win 0, length 0

    抓取流入 interface ens160,host 为 172.18.22.208 且协议为 ICMP 的数据包。
    172.18.128.204 > 172.18.22.200(curr) > 172.18.22.208

    [root@localhost ~]# tcpdump -i ens160 -nnt -P in host 172.18.22.208 and icmp
    ...
    IP 172.18.128.204 > 172.18.22.208: ICMP echo request, id 42579, seq 2314, length 64

    抓取流出 interface ens160,host 为 172.18.22.208 且协议为 ICMP 的数据包。
    172.18.22.208 > 172.18.128.200(curr) > 172.18.128.204

    [root@localhost ~]# tcpdump -i ens160 -nnt -P out host 172.18.22.208 and icmp
    ...
    IP 172.18.22.208 > 172.18.128.204: ICMP echo reply, id 42579, seq 2436, length 64

    检查数据包内容

    有时我们需要检查数据包的内容,以确保我们发送的消息包含我们需要的消息或我们收到的预期响应。对于加密连接,此输出不太有用。

    • -X:以十六进制打印内容
    • -A:以 ASCII 码打印内容
    $ sudo tcpdump -i any -c10 -nn -A port 80
    
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
    13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
    E..<..@.@.....zb6.'....P...@......r............
    ............................
    13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
    E..<..@./..a6.'...zb.P..o..&...A..q a..........
    .R.W.......     ................
    13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
    E..4..@.@.....zb6.'....P...Ao..'...........
    .....R.W................
    13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
    E.....@.@..1..zb6.'....P...Ao..'...........
    .....R.WGET / HTTP/1.1
    User-Agent: Wget/1.14 (linux-gnu)
    Accept: */*
    Host: opensource.com
    Connection: Keep-Alive
    
    ................
    13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
    E..4.F@./.."6.'...zb.P..o..'.......9.2.....
    .R.a....................
    13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
    E....G@./...6.'...zb.P..o..'.......9.......
    .R.b....HTTP/1.1 302 Found
    Server: nginx
    Date: Sun, 23 Sep 2018 17:02:14 GMT
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 207
    X-Content-Type-Options: nosniff
    Location: https://opensource.com/
    Cache-Control: max-age=1209600
    Expires: Sun, 07 Oct 2018 17:02:14 GMT
    X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
    X-Varnish: 632951979
    Age: 0
    Via: 1.1 varnish (Varnish/5.2)
    X-Cache: MISS
    Connection: keep-alive
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>302 Found</title>
    </head><body>
    <h1>Found</h1>
    <p>The document has moved <a href="https://opensource.com/">here</a>.</p>
    </body></html>
    ................
    13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
    E..4..@.@.....zb6.'....P....o..............
    .....R.b................
    13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
    E..4..@.@.....zb6.'....P....o..............
    .....R.b................
    13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
    E..4.H@./.. 6.'...zb.P..o..........9.I.....
    .R......................
    13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
    E..4..@.@.....zb6.'....P....o..............
    .....R..................
    
    10 packets captured
    10 packets received by filter
    0 packets dropped by kernel

    输出格式

    08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372
    • 08:41:13.729687:表示根据本地时钟接收的数据包的时间戳。
    • IP:IPv6 协议,对于 IPv6 的数据包,值为 IP6。
    • 192.168.64.28.22:源 IP 和源端口号
    • 192.168.64.1.41916:目的 IP 和目的端口号
    • [P.]:TCP 标记
      在这里插入图片描述
    • seq 196:568:数据包中包含的数据序列号。对于捕获的第一个数据包,这是一个绝对数字。后续数据包使用相对数字,以便更容易遵循。
    • ack 1:ACK 编号。因为这是发送数据的一方,所示 ACK 编号为 1,而对于接收数据的一方,该字段表示该流上的下一个预期字节(数据)。例如,此流程中下一个数据包的 ACK 编号为 568。
    • win 309:窗口大小。表示接收缓冲区中可用的字节数。
    • options [nop,nop,TS val 117964079 ecr 816509256]:TCP 选项,例如 MSS(最大段大小)或窗口比例。
    • length 372:数据包长度。

    参考资料

    https://www.cnblogs.com/chenpingzhao/p/9108570.html
    https://www.cnblogs.com/f-ck-need-u/p/7064286.html
    https://blog.csdn.net/minxihou/article/details/80243484

    相关阅读:

  • 相关阅读:
    学用 ASP.Net 之 "字符串" (5): StringBuilder 类
    学用 ASP.Net 之 System.DateTime 结构
    学用 ASP.Net 之 "字符串" (4): string 类的扩展方法
    学用 ASP.Net 之 System.Char 结构
    学用 ASP.Net 之 System.TimeSpan 结构
    学用 ASP.Net 之 "字符串" (6): StringInfo 类
    学用 ASP.Net 之 System.Math 类
    学用 ASP.Net 之 System.Random 类
    学用 ASP.Net 之 System.Collections.Hashtable 类与 DictionaryEntry 结构
    [收藏]如何开始创业
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13310088.html
Copyright © 2011-2022 走看看