TCPDUMP示例 - 在Linux中捕获网络流量
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"这表示以字节为单位的有效载荷数据的长度。