正文
:
30.247048
IP rhel75.33696
>
gateway.domain:
37429
+ PTR? 28.64.168.192.in-addr.arpa.
(
44
)
5
packets captured
12
packets received by filter
0
packets dropped by kernel
$
在这种情况下,tcpdump在捕获五个数据包后自动停止捕获。这在不同的场景中很有用,例如,如果正在排除连接并捕获一些初始包就足够了。当我们应用过滤器捕获特定数据包时,这甚至更有用(如下所示)。
默认情况下,tcpdump将IP地址和端口解析为名称,如上例所示。在排除网络问题时,通常更容易使用IP地址和端口号;使用选项-n和端口解析与-nn禁用名称解析:
$
sudo
tcpdump
-i
any
-c5
-nn
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
23
:
56
:
24.292206
IP 192.168.64.28.22
>
192.168.64.1.35110: Flags
[
P.
]
,
seq
166198580
:
166198776
, ack
2414541257
, win
309
, options
[nop
,
nop
,TS val
615664
ecr
540031155
]
, length
196
23
:
56
:
24.292357
IP 192.168.64.1.35110
>
192.168.64.28.22: Flags
[
.
]
, ack
196
, win
1377
, options
[nop
,
nop
,TS val
540031229
ecr
615664
]
, length
0
23
:
56
:
24.292570
IP 192.168.64.28.22
>
192.168.64.1.35110: Flags
[
P.
]
,
seq
196
:
568
, ack
1
, win
309
, options
[nop
,
nop
,TS val
615664
ecr
540031229
]
, length
372
23
:
56
:
24.292655
IP 192.168.64.1.35110
>
192.168.64.28.22: Flags
[
.
]
, ack
568
, win
1400
, options
[nop
,
nop
,TS val
540031229
ecr
615664
]
, length
0
23
:
56
:
24.292752
IP 192.168.64.28.22
>
192.168.64.1.35110: Flags
[
P.
]
,
seq
568
:
908
, ack
1
, win
309
, options
[nop
,
nop
,TS val
615664
ecr
540031229
]
, length
340
5
packets captured
6
packets received by filter
0
packets dropped by kernel
如上所示,捕获输出现在显示IP地址和端口号。这还可以防止tcpdump发出DNS查找,这有助于在排除网络问题时降低网络流量。
现在已经能够捕获网络数据包了,让我们来探索一下这些输出意味着什么。
3.了解输出格式
Tcpdump能够捕获和解码许多不同的协议,例如TCP,UDP,ICMP等等。虽然我们不能在这里介绍所有这些,但为了帮助入门,让我们探索TCP数据包。可以在tcpdump的手册页中找到有关不同协议格式的更多详细信息。tcpdump捕获的典型TCP数据包如下所示:
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表示网络层协议 - 在这种情况下是IPv4。对于IPv6数据包,值为IP6。
下一个字段192.168.64.28.22是源IP地址和端口。接下来是目标IP地址和端口,由192.168.64.1.41916表示。
在源和目标之后,可以找到TCP 标记 [P.]。 该字段的典型值包括:
值
|
标记类型
|
描述
|
S
|
SYN
|
连接开始
|
F
|
FIN
|
连接结束
|
P
|
PUSH
|
数据 push
|
R
|
RST
|
连接重置
|
.
|
ACK
|
确认
|
该字段也可以是这些值的组合,例如用于SYN-ACK分组的[S.]。
接下来是数据包中包含的数据的序列号。对于捕获的第一个数据包,这是一个绝对数字。后续数据包使用相对数字,以便更容易遵循。在该示例中,序列是seq 196:568,这意味着该分组包含该流的字节196到568。
接下来是Ack编号:ack 1.在这种情况下,它是1,因为这是发送数据的一方。对于接收数据的一方,该字段表示该流上的下一个预期字节(数据)。例如,此流程中下一个数据包的Ack编号为568。
下一个字段是窗口大小win 309,它表示接收缓冲区中可用的字节数,后跟TCP选项,例如MSS(最大段大小)或窗口比例。有关TCP协议选项的详细信息,请参阅传输控制协议(TCP)参数。
最后,我们有数据包长度,长度372,它表示有效载荷数据的长度(以字节为单位)。长度是序列号中最后一个字节和第一个字节之间的差值。
现在让我们学习如何过滤包以缩小结果范围,并更轻松地解决特定问题。
4.过滤数据包
如上所述,tcpdump可以捕获太多的软件包,其中一些甚至与正在排除故障的问题无关。 例如,如果正在解决与Web服务器的连接问题,那么对SSH流量不感兴趣,因此从输出中删除SSH数据包可以更轻松地处理真正的问题。
tcpdump最强大的功能之一是它能够使用各种参数过滤捕获的数据包,例如源和目标IP地址,端口,协议等。让我们看看一些最常见的参数。
协议
要根据协议过滤数据包,请在命令行中指定协议。例如,仅使用以下命令捕获ICMP数据包:
$
sudo
tcpdump
-i
any
-c5
icmp
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
在另一个终端中,尝试ping另一台机器:
$
ping
opensource.com
PING opensource.com
(
54.204.39.132
)
56
(
84
)
bytes of data.
64
bytes from ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com
(
54.204.39.132
)
:
icmp_seq
=
1
ttl
=
47
time
=
39.6
ms
回到tcpdump捕获,请注意tcpdump仅捕获并显示与ICMP相关的数据包。在这种情况下,tcpdump不显示解析名称opensource.com时生成的名称解析数据包:
09:
34
:
20.136766
IP rhel75
>
ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com: ICMP
echo
request,
id
20361
,
seq
1
, length
64
09:
34
:
20.176402
IP ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com
>
rhel75: ICMP
echo
reply,
id
20361
,
seq
1
, length
64
09:
34
:
21.140230
IP rhel75
>
ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com: ICMP
echo
request,
id
20361
,
seq
2
, length
64
09:
34
:
21.180020
IP ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com
>
rhel75: ICMP
echo
reply,
id
20361
,
seq
2
, length
64
09:
34
:
22.141777
IP rhel75
>
ec2-
54
-
204
-
39
-
132
.compute-
1
.amazonaws.com: ICMP
echo
request,
id
20361
,
seq
3
, length
64
5
packets captured
5
packets received by filter
0
packets dropped by kernel
主机
使用主机过滤器将捕获限制为仅限与特定主机相关的数据包
:
$
sudo
tcpdump
-i
any
-c5
-nn
host 54.204.39.132
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
09:
54
:
20.042023
IP 192.168.122.98.39326
>
54.204.39.132.80: Flags
[
S
]
,
seq
1375157070
, win
29200
, options
[
mss
1460
,sackOK,TS val
122350391
ecr
0
,
nop
,wscale
7
]
, length
0
09:
54
:
20.088127
IP 54.204.39.132.80
>
192.168.122.98.39326: Flags
[
S.
]
,
seq
1935542841
, ack
1375157071
, win
28960
, options
[
mss
1460
,sackOK,TS val
522713542
ecr
122350391
,
nop
,wscale
9
]
, length
0
09:
54
:
20.088204
IP 192.168.122.98.39326
>
54.204.39.132.80: Flags
[
.
]
, ack
1
, win
229
, options
[nop
,
nop
,TS val
122350437
ecr
522713542
]
, length
0
09:
54
:
20.088734
IP 192.168.122.98.39326
>
54.204.39.132.80: Flags
[
P.
]
,
seq
1
:
113
, ack
1
, win
229
, options
[nop
,
nop
,TS val
122350438
ecr
522713542
]
, length
112
: HTTP: GET
/
HTTP
/
1.1
09:
54
:
20.129733
IP 54.204.39.132.80
>
192.168.122.98.39326: Flags
[
.
]
, ack
113
, win
57
, options
[nop
,
nop
,TS val
522713552
ecr
122350438
]
, length
0
5
packets captured
5
packets received by filter
0
packets dropped by kernel
在此示例中,tcpdump仅捕获并显示与主机54.204.39.132之间的数据包。
端口
要根据所需的服务或端口过滤数据包,请使用端口过滤器。例如,使用以下命令捕获与Web(HTTP)服务相关的数据包:
$
sudo
tcpdump
-i
any
-c5
-nn
port
80
tcpdump: verbose output suppressed, use
-v
or
-vv