TCPDUMP示例 - 在Linux中捕获网络流量

时间:2020-03-05 15:25:50  来源:igfitidea点击:

TCPDUMP是一个网络故障排除命令,也称为分组嗅探器用于捕获和从网络中显示数据包。
TCPDump允许用户捕获和显示连接的TCP/IP和其他数据包(UDP,ARP或者ICMP),通过连接计算机的网络传输或者接收。

我们可以将过滤器应用于数据包,可以避免我们不希望看到的流量。
我们可以捕获整个本地网络的所有数据,并将该数据放入文件中以供以后分析。
要运行tcpdump命令,我们需要使用sudo权限的root或者用户。

在本教程中,我们将学习如何使用TCPDump命令分析Linux机器上流动的流量。

1.捕获接口的流量

使用TCPDUMP没有任何选项时,它将分析所有接口上的流量,运行以下命令:

$sudo tcpdump

我们必须点击Ctrl + C按钮以停止它。

要捕获特定界面上的流量使用"-i""选项,并将数据包数量限制为"-C"选项:

以下TCPDUMP示例分析了"ENS160"界面并将数据包限制为5:

$sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured

2)捕获特定主机的流量

我们可以使用"-host""选项从特定主机捕获传入和传出数据包。

$sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219

现在,我们可以看到请求和回复数据包:

tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2017-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2017-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2017-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2017-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2017-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156

3)通过端口查找数据包

查找指定端口号的数据包使用-port选项。

假设我们要分析"ENS160"网络接口并将数据包数量限制为5到5,请运行以下命令:

$sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196

当我们拦截数据包时,忽略一个端口使用不是端口

如果要分析22以外的"ENS160"网络接口端口,请运行以下命令:

$sudo tcpdump -i ens160 -nn not port 22

我们可以使用一系列端口以捕获网络流量。

例如,如果要在端口范围内分析ENS160网络接口:从端口20到端口23,请运行以下命令:

$sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23

4)从特定协议捕获数据包

我们可以决定是否仅捕获ICMP(Internet Control消息协议)或者TCP(传输控制协议)数据包。
以下命令将仅捕获TCP数据包:

$sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212

5)将日志保存到特定文件

可以将捕获的数据包保存在文件中。
默认情况下,在将数据包捕获到文件中时,它将仅从每个数据包中保存68字节的数据。
忽略其余信息。

我们可以使用"-s""选项来告诉TCPDUMP Linux为每个数据包进行保存和指定"0的多少个字节作为数据包快照长度告诉tcpdump保存整个数据包,请使用以下命令:

$sudo tcpdump -i ens160 -c 5-nn tcp -w packets-record.pcap -s 0

Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured

6)阅读TCPDUMP记录文件

我们无法读取包含与"CAT"或者"更少"之类的常用命令保存TCPDUMP数据包的文件的内容,但我们需要使用TCPDUMP命令的"-R"参数:

$sudo tcpdump -r packets-record.pcap

现在,我们可以阅读TCPDUMP记录文件的内容:

reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0

我们还可以使用此PCAP文件进行Wireshark进行查看。

7)来自特定源的过滤包

为了过滤来自特定源IP的数据包,我们可以使用"SRC"选项。

$sudo tcpdump src 100.9.8.40

如果我们想在其他方向上看到流量,请使用"DST"选项:

$sudo tcpdump dst 14.249.62.219

8)通过网络捕获数据包

从网络捕获传入和传出使用-NET选项。
以下命令捕获来自192.168.0.0/24网络的流量:

$sudu tcpdump net 192.169.0.0/24

9)ASCII捕获数据包

在ASCII中显示捕获的数据包使用-a选项,这是方便捕获的网页。

$sudo tcpdump -A -i eth0

TCPDUMP还可以以十六进制和ASCII格式显示数据包内容,然后使用"-X""选项:

$sudo tcpdump -X -i eth0

10)捕获IPv6数据包

我们可以使用"IP6"选项和PROTO捕获IPv6流量,以指定TCP或者UDP协议。

PROTO 6 TCP.

PROTO 17 UDP

以下使用TCP协议捕获所有IPv6流量:

$sudo tcpdump -nn ip6 proto 6

11)过滤HTTP用户代理

以下命令过滤HTTP用户代理和HTTP用户代理和主机来自HTTP请求标题:

$sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

捕获cookie使用以下命令:

$sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

12)列出可用接口

我们可以使用TCPDump列出"具有"-D"选项的可用接口。

例如:

$sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)

13)旋转捕获文件

如果我们正在使用TCPDUMP捕获流量,因此在达到一定数量的文件大小或者时间时创建新文件很好。

以下命令将每30分钟(-g 1800)创建一个新的'network-02-30.pcap'文件,其中文件限制为100MB(-C 100),文件数为24(-W 48)。

$sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100

tcpdump选项

TCPDUMP提供了几种选择,可增强或者修改其输出,让我们检查哪些:

  • -i <interface>:侦听指定的接口。
  • -n:不要解析主机名。我们可以使用-nn不要解析主机名或者端口名称。
  • -t:在每个倾倒线上打印人类可读时间戳,-tttt:给出最大的人类读取时间戳输出。
  • -X:在十六进制和ASCII中显示数据包的内容。
  • -V-vv-vvv:增加我们回来的数据包信息量。
  • -c n:只得到n个数据包,然后停止。
  • -s:以字节为单位定义捕获的Snaplength(大小)。使用-s0获得一切,除非我们有意捕获较少。
  • -S:打印绝对序列号。
  • -Q:显示较少的协议信息。
  • -w <文件名>:将原始数据包写入文件

和,或者不是运算符的力量

TCPDUMP命令支持组合'和','或者'和"不是"运算符来过滤掉更准确的结果。

捕获来自10.20.0.0/16的流量,并使用显示人类可读时间戳(TT)的网络10.30.0.0/16,没有主机名或者端口号(NN),详细输出(VV),并使用绝对序列数字:

$sudo  -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16

从源192.168.0.10显示流量,这不是UDP协议:

$sudo tcpdump src 192.168.0.10 and src net and not udp

要为特定主机捕获ARP或者Ping流量并将输出保存到名为PacketFile.txt的文件:

$sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt

TCPDUMP输出格式

让我们从TCPDump输出中获取一条新线以了解其格式。

10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212

其中:

10:31:13.401128在当地时间捕获数据包的时间。

IP表示数据包协议是IPv4.

"ubuntu.ssh"这表明源IP地址或者源主机名和.ssh意味着端口(这里将为22)。

117.6.129.86.50376这表明由端口号分隔的目标IP地址和点(。
)。

标志:

[p.]这是TCP标志字段。

[.]ack(确认)。

[s]syn(开始连接)。

[p]p sh(推送数据)。

[f]fin(完成连接)。

[r]rst(重置连接)。

[s.]syn-ack(synack数据包)。

SEQ 188:400序列号表示数据包包含数据字节为"188"到"400"。

"Win 501"此字段是Windows大小,它表示接收缓冲区中可用的字节数。

选项[NOP,NOP,TS Val 468736347 ECR 335665367]这些是TCP选项,如MSS(最大段大小)或者窗口比例。
我们可以有关TCP协议选项的更多信息。

"长度212"这表示以字节为单位的有效载荷数据的长度。