如何使用 tcpdump 发现服务器上的异常流量

你的服务器变慢了。你运行 tcpdump,看到大量 SYN 数据包涌入。这就是异常现象。Tcpdump 是一款命令行抓包分析工具,可让你捕获网络流量。随后,你可以分析抓包结果,寻找危险信号。异常行为通常表现为不寻常的 TCP 标志位组合、过高的数据包速率,或意料之外的流量来源。危险信号包括客户端无法连接、重复的连接尝试,或异常的标志位组合。Tcpdump 有助于故障排查。你可以按特定标志位进行过滤,从而理解流量模式。本文将介绍关键命令、过滤器以及解读技巧,帮助你尽早发现问题。先抓取一部分数据包样本,然后开始识别异常模式。
关键要点
先捕获正常流量,建立基线,便于后续对比。
使用 tcpdump 过滤器发现 SYN 洪泛、端口扫描以及 UDP/ICMP 异常。
通过解读标志位、TTL 和数据包速率来识别危险信号。
将抓包结果保存为 pcap 文件,以便使用 Wireshark 进行更深入的分析。
经常练习,逐步建立识别异常流量的信心。
使用 tcpdump 捕获基线网络流量
在你着手排查异常模式之前,需要先有一个参考点。你必须了解服务器上的正常网络流量是什么样子。研究人员早已将这一思路系统化。Qayyum 等人提出了一种基于统计分析的异常检测技术,其核心在于建立正常流量模型。他们先设定正常基线,任何偏离该基线的行为都被视为异常流量。这个过程会增强你的判断信心。你会知道服务器在健康运行时应该呈现怎样的状态。
Qayyum 等人提出了一种基于统计分析的网络异常流量检测技术,其重点在于建立正常流量模型并设定正常基线。在进行异常流量检测时,任何偏离该基线的行为都会被视为异常流量。
你也可以用 tcpdump 采用同样的思路。先在正常运行期间捕获流量。Tcpdump 为此提供了一个轻量级工具。你从日常业务时段开始抓包,再通过分析这些抓包结果,学习典型流量模式。
为接口抓包配置 Tcpdump
第一步是选择正确的网络接口。运行 tcpdump -D 列出可用接口。找到你的外部网络接口,通常名称类似 eth0。回环接口处理的是内部流量,而你需要的是连接服务器与外部网络的那个接口。
如果系统中尚未安装 tcpdump,请使用包管理器安装。在 Debian 系统上,运行 apt-get install tcpdump。在 CentOS 系统上,运行 yum install tcpdump。
接着测试环境是否配置正确。运行 tcpdump -i eth0 -c 100。该命令会记录 100 个数据包。Tcpdump 会立即显示每个数据包的标志位和地址信息,你可以实时看到输出。
观察正常网络流量模式
现在开始采集基线流量。选择一个业务正常、负载平稳的时间段,避免高峰期。运行 tcpdump -i eth0 -c 1000 -w baseline.pcap。该命令会静默捕获 1000 个数据包,并将其保存到文件中。这些数据将构成你的基线,稍后你可以借助 tcpdump 过滤器进行分析。
请仔细研究这份基线数据。观察流量构成。Web 服务器通常会看到大量带有 SYN 和 ACK 标志位的数据包,而且大多数连接都能完成三次握手。数据包速率会保持平稳,来源地址也会以可预测的方式重复出现。这些网络流量揭示了典型模式。特别要注意数据包速率,正常服务器通常表现为稳定速率,而突增则可能意味着问题。同时记录正常时段常见的源 IP 地址。
这份基线将有助于后续故障排查。将新的抓包结果与基线对比,任何差异都可能是危险信号。大量 SYN 包会非常显眼,ICMP 回显风暴也会一目了然。这些过滤器可以帮助你快速隔离特定模式。你的抓包技能会让你更早发现问题。
使用 tcpdump 捕获并分析流量模式
现在,你要从建立基线转向实际检测。你将使用 tcpdump 来捕获并分析服务器上的网络流量。关键技能在于编写正确的过滤器。Tcpdump 可以让你精准捕获并筛选网络数据包,这些过滤器能够将特定异常从正常网络流量中分离出来。你可以配合 -l 参数进行实时监控,该参数会启用行缓冲,让输出在数据包到达时立即显示。将过滤器与实时输出结合使用,能够快速发现异常。
过滤 SYN 洪泛和端口扫描
SYN 洪泛会留下非常清晰的迹象。你会看到大量 SYN 数据包,却几乎没有后续 ACK。你需要一个只捕获这些初始握手请求的过滤器。Berkeley Packet Filter 语法,也称 berkeley packet filter syntax,允许你基于协议头中的字节偏移编写过滤条件。这种方法能对数据包选择进行精细控制。
先从实时过滤开始。运行 tcpdump -i eth0 -l "tcp[13] == 0x02"。你会看到所有进入服务器的 SYN 数据包。正常服务器通常会有稳定的 SYN 流量,而在遭遇洪泛时,你会看到短时间内出现大量 SYN,却没有对应连接完成后的 ACK。若某一来源每秒发出数百个以上 SYN 包,就可能意味着攻击。你要持续观察速率变化,并与之前建立的基线对照。差异通常会立刻显现出来。
端口扫描的表现则不同。扫描器会按顺序向不同端口分别发送 SYN 包。你会在短时间窗口内看到某一源地址访问许多不同的目标端口。运行 tcpdump -i eth0 -l -nn "tcp[13] == 0x02"。参数 -nn 会阻止 DNS 解析,这样你就能清楚看到原始 IP 地址和端口号。如果一个 IP 在短时间内探测大量端口,通常说明它正在进行侦察。你可以借助 tcpdump 按端口过滤,从而更清晰地看到这一模式。
你还可以按主机过滤,单独锁定一个可疑来源。在过滤条件中加入 and src host X.X.X.X。Tcpdump 就会将视野收窄到这一个攻击者。这样你便能更细致地分析其行为模式、扫描方式和目标选择。
识别 UDP 和 ICMP 异常
UDP 异常需要不同的过滤器。DNS 放大攻击大量依赖 UDP。攻击者会向 DNS 服务器发送一个很小的查询请求,并伪造源 IP 地址,随后该服务器会将一个更大的响应发给受害者。运行 tcpdump -i eth0 -l "udp dst port 53"。你会看到大量发往 53 端口的 UDP 数据包,且大小各不相同。正常查询通常会产生小于 512 字节的响应,而更大的响应则可能意味着放大攻击。你可以统计响应大小,以确认这种异常。
ICMP 异常则包括 ping 洪泛。攻击者会以极高频率发送 ICMP 回显请求。服务器每次都响应,从而消耗带宽。运行 tcpdump -i eth0 -l "icmp and icmp[icmptype] == 8"。该过滤器只捕获回显请求。正常服务器通常只会偶尔收到来自监控工具的 ping,而洪泛攻击则会表现为某一来源每秒发送数百个请求,这种流量模式会非常明显。
在捕获并分析网络流量时,你还应关注 TTL 值。正常 ICMP 数据包的 TTL 通常会因来源不同而保持一定规律。如果同一个源 IP 的 TTL 突然发生变化,就可能意味着源地址被伪造。Tcpdump 可以帮助你识别这种不一致。
这些过滤器构成了你的检测工具箱。你需要反复练习,熟悉每一种过滤方式,并根据自身环境进行调整。这个过程离不开持续抓包。你会逐渐掌握如何有效地捕获并分析流量,学会为发现模式而分析网络流量,也学会为事后复盘而保留抓包数据。你要把 tcpdump 当作主要工具,认真分析每一份抓包结果,定期重复这些捕获和分析过程。持续练习会不断增强你的判断能力。
解读 Tcpdump 输出中的危险信号
如果不会正确解读,原始输出本身意义并不大。你必须逐项分析每个字段,并将其与基线进行对比。只有这样,成片的文本才会转化为清晰的诊断结论。
解码标志位、TTL 和数据包速率
TCP 标志位字段讲述了每一条连接的故事。一个健康的握手过程应当依次出现 SYN、SYN-ACK、ACK。你需要在 tcpdump 输出中观察这一序列。如果看到一连串 SYN 却没有响应,就可能表示遭遇了洪泛攻击,或者目标端口被阻断。RST 标志表示连接被拒绝。如果某一主机发出大量 RST,则往往意味着有扫描器正在探测关闭的端口。
TTL 值可以反映数据包的大致来源。不同操作系统会设置各自默认的 TTL。在正常情况下,同一来源发出的数据包 TTL 往往较为一致。如果某个地址的 TTL 突然变化,就可能暗示存在伪装或欺骗。攻击者很少能精确模拟被冒充主机原本的 TTL。
数据包速率通常是最清晰的异常信号。Tcpdump 会在每一行输出时间戳。你可以据此统计每秒到达的数据包数量。基线通常会呈现稳定节奏,而一旦出现三倍以上的突增,就值得警惕。你可以使用带有 -tttt 参数的 tcpdump 来显示完整时间戳,从而更准确地衡量数据包之间的时间间隔。如果你看到成千上万的数据包之间的间隔极短,那往往意味着它们来自自动化工具,而非真实用户行为。
识别重复连接与异常来源
重复行为会暴露意图。一个正常客户端会建立一条连接,完成操作后结束;而攻击者可能会在几秒钟内建立数百条连接。你可以对单一源地址进行过滤,然后统计其出现次数。Tcpdump 借助主机过滤器就能轻松做到这一点。随后,你再结合端口和标志位模式进行分析。
异常来源通常会以多种方式暴露出来。你可能会看到来自你并无用户分布地区的地址;也可能看到内部地址突然与从未联系过的外部主机通信;还可能看到某一地址按顺序访问大量端口。不同模式反映不同威胁。一个地址依次探测所有端口,通常是侦察行为;一个地址反复发送相同载荷,则可能是暴力尝试。
你还应关注半开连接。这类连接表现为只看到 SYN,却没有完成最终 ACK。当服务器资源耗尽时,这类连接会不断堆积。Tcpdump 会在标志位列中清楚地显示它们。你可以使用过滤器将这些数据包单独提取出来,并测量它们的数量。如果计数持续上升,那就说明问题正在恶化。
你的目标是诊断,而不是猜测。要将每一个危险信号都与基线进行对比,再通过第二次抓包加以确认,随后基于充分证据采取行动。
抓包中的真实攻击模式
检测 UDP 异常(DNS 放大、Ping 洪泛)
你可以使用 tcpdump 识别 DNS 放大攻击。攻击者会向开放解析器发送一个很小的查询请求,并伪造源 IP 地址,而解析器会将更大的响应发回你的服务器。你可以通过过滤 UDP 53 端口流量来检测这一现象,重点关注超过 512 字节的响应。正常 DNS 响应通常低于这一阈值,而超大响应则可能意味着滥用。Tcpdump 会显示每个超大响应的来源地址。如果你看到同一个解析器持续向同一目标发送大量大包响应,就可以确认攻击正在进行。你还可以追踪数据包速率,以衡量攻击强度。
Ping 洪泛会表现为 ICMP 回显请求的密集突发。使用 tcpdump 配合 ICMP type 8 回显请求过滤器运行,就能将回显请求从其他数据中分离出来。接着查看接口上的到达速率。健康服务器通常只会收到来自监控工具的零星 ping,而洪泛攻击则会在几秒内让某个来源发来数百个回显请求。Tcpdump 会捕获所有这些数据。你还可以检查 TTL 值以判断是否存在伪造,不同 TTL 出现在同一个源 IP 上,通常意味着地址是假的。
缓慢连接尝试(低窗口大小 SYN 数据包)
有些攻击者会采用更隐蔽的扫描技术。他们发送窗口大小很低的 SYN 数据包,故意放慢连接建立过程。标准扫描器通常使用默认窗口值,而异常偏低的窗口值往往意味着这是经过精心构造的数据包。攻击者试图通过更接近正常流量的方式来规避检测。正常连接通常会针对特定操作系统呈现较稳定的窗口大小,而 tcpdump 可以帮助你识别这些异常尝试。
Tcpdump 让这类分析变得相对直接。窗口大小位于 TCP 头部的第 14-15 字节。你可以运行一个过滤器,专门筛选窗口值低于 1024 的 SYN 段。Tcpdump 会显示每个可疑数据包的源地址和目标地址。再将其出现频率与基线比较。合法客户端很少会发送如此小窗口的数据包。如果同一个来源突然大量发送这类数据包,就可能意味着缓慢扫描。你可以记录该源地址并进行封禁,同时保存抓包数据留待后续分析。Tcpdump 为你提供了采取行动所需的证据。
保存抓包用于事后流量分析
实时监控可以帮助你第一时间发现问题,但当数据包高速飞过时,你无法在当下研究每一个细节。将抓包结果保存下来,便意味着你还有第二次分析机会。Tcpdump 通过文件输出支持这种工作方式,能够为取证分析保留原始证据。这种做法将实时检测与深入调查分离开来。
将抓包结果写入文件
Tcpdump 会将数据包保存为 pcap 格式。这一标准格式会保留原始头部和载荷,其他分析工具也可以直接读取,无需转换。你可以使用 -w 参数创建 pcap 文件。例如,tcpdump -i eth0 -w incident.pcap 会将所有传入数据写入文件。Tcpdump 会直接写盘,而不是将结果输出到屏幕,这样可以在高数据包速率下减少系统开销,并帮助你的服务器持续抓取流量而不轻易丢包。
你还可以使用 -C 参数控制文件大小。Tcpdump 会在文件达到指定 MB 大小时自动创建新文件,这样可以避免单个 pcap 数据集过大而难以管理。你也可以用 -c 参数限制抓包总数,到达指定数量后 tcpdump 会自动停止。请为抓包文件使用有意义的命名方式,例如包含日期、时间和事件类型。这样 tcpdump 保存下来的证据会更有组织,后续在与其他日志进行关联分析时,也能更快定位到特定抓包。这一习惯在事后报告中尤其有价值。
为 Wireshark 审查准备抓包文件
命令行分析适合快速检查,而复杂流量则需要更丰富的可视化视角。为此,你可以在 Wireshark 中打开保存好的 pcap 文件。Wireshark 会自动解码协议,并提供协议解码器与流图等工具,让你能更清晰地看到连接建立和通信顺序,从而了解一台主机如何随时间与另一台主机交互。
TLS 握手细节也会更加清晰。Wireshark 可以解码版本、密码套件和告警信息,而 tcpdump 无法以易读方式呈现这些内容。这样你就能获得更完整的网络流量全貌。导入 pcap 文件也很简单,只需点击 File > Open。随后应用显示过滤器,即可隔离特定会话。保存和读取抓包文件同样有助于长期留存。你可以出于合规或团队培训需要保留 pcap 文件,让事件响应团队在之后基于同一份证据进行复盘。这种方法能够确保组织内部分析口径一致。请经常练习使用 tcpdump,以不断提升技能。
Tcpdump 本身非常轻量。一旦你知道该重点关注什么——标志位、速率和来源——它就能帮助你发现异常行为。建议先在测试环境中练习。先建立基线,再将新的抓包结果与之比较。这样的习惯会不断提升你排查真实问题时的敏锐度。
然后继续深入。你可以通过脚本实现自动采集,把这些文件发送到 SIEM,或者尝试使用 Bro 与 Zeek 做更深层的检测。每前进一步,都是在把原始数据包转化为可执行的答案。今天就开始抓包吧——你的网络日志里,也许已经藏着故障的第一道征兆。
常见问题
我怎么判断服务器是否正在遭受 SYN 洪泛攻击?
你会看到大量 SYN 数据包快速涌入,却没有对应的 ACK 响应。运行 tcpdump -i eth0 -l "tcp[13] == 0x02" 并观察速率。如果某一来源每秒达到数百个,就可能是在攻击。将这种表现与你的基线抓包结果进行比较。
Tcpdump 能显示 DNS 放大攻击是否正在发生吗?
可以。过滤 UDP 53 端口流量,并关注响应大小。正常响应通常较小,而某个解析器持续向单一目标发送超大响应,则说明存在滥用行为。Tcpdump 会显示每个大响应的来源地址。
为什么 pcap 文件在事后分析中很有用?
Pcap 文件保留了原始头部和载荷。你之后可以在 Wireshark 中打开它,查看协议解码结果和流图。团队成员也能基于同一份证据进行复盘。建议按照日期和事件类型对 pcap 文件进行分类整理,以便日后快速检索。
为什么攻击者会发送低窗口大小的 SYN 数据包?
较低的窗口大小会故意拖慢连接握手过程。标准扫描器通常使用默认值,因此这类异常偏低的窗口值往往代表更隐蔽的扫描行为。如果同一来源突然大量发送这种构造过的数据包,就很可能是一次隐蔽扫描。你可以通过过滤窗口较小的 SYN 段来发现它们。
我应该多久抓一次流量,才能建立可靠的基线?
应当在日常业务正常运行期间,连续数天进行抓包。第一次采样时尽量避开高峰期。稳定的数据包速率和可预测的来源地址会构成你的参考基线。之后任何偏离该模式的现象,都值得你进一步调查。
