流 TCP 检查器

流 TCP 检查器概述

类型

检查器(流)

使用方式

检测

实例类型

多实例

所需其他检查器

已启用

true

传输控制协议 (TCP) 是一种面向连接的状态传输层协议。TCP 能够通过 IP 网络在客户端和服务器之间可靠地传输有序的字节流。TCP 一次仅允许存在一个具有相同连接参数值的连接。主机操作系统管理 TCP 连接的状态。

stream_tcp 检查器提供 TCP 流跟踪、数据流规范化和数据流重组。每个流 TCP 检查器都可以处理网络中的一个或多个主机的 TCP 流量。此外,如果您有足够的有关向您的网络发送 TCP 流量的主机的信息,则可以为这些主机配置 stream_tcp 检查器。

在网络分析策略 (NAP) 中,Snort 将每个配置的 stream_tcp 检查器应用于 绑定程序 检查器配置中定义的 TCP 服务。

您可以配置多个流 TCP 检查器来处理各种操作系统和 TCP 流量。

stream_tcp 检查器配置包括:

  • TCP 主机上的操作系统

  • 操作系统选项:在重组期间如何处理重叠

  • 流量处理选项:会话或方向中的最大字节数或分段数

  • TCP 数据流重组选项:重组的最大 PDU 大小



在内联 IPS 模式下, stream_tcp 检查器会规范化负载流,以便始终将重叠解析为所见的第一个副本。每个流 TCP 检查器处理重复的 SYN、RST 验证和时间戳检查。

配置流 TCP 检查器的最佳实践

在配置 stream_tcp 检查器时,请考虑以下最佳实践:

  • 不要在设备上部署感应接口,以便 Snort 只能检查流量的一端。您可以启用 stream_tcp 检查器中的 reassembly_async 参数以处理非对称流量。但是,流 TCP 检查器不能在所有情况下处理非对称流量。例如,对 HTTP HEAD 请求的响应可能会导致 HTTP 检查器不同步。在 IDS 模式下,由于缺少 TCP 确认,因此更容易规避。

    对于 IPS 模式,我们建议您仅在 Snort 可以检查流量两端时才部署 设备。

  • 为您希望发送或接收 TCP 流量的每个 TCP 主机操作系统创建一个 stream_tcp 检查器。您可以在同一网络分析策略中使用多个版本的 stream_tcp 检查器。每个 stream_tcp 检查器中定义的 TCP 策略都会应用于 绑定程序 检查器中指定的 TCP 主机。

  • 要启用 IPS 模式,请将 规范器 检查器中的 normalizer.tcp.ips 参数设置为 true

  • 在网络分析策略 (NAP) 的高级设置中,确认要在自定义的基于目标的 stream_tcp 检查器中标识的网络是否匹配或是其父 NAP 处理的网络、区域和 VLAN 的子集。

  • 系统会为每个枝叶域构建单独的网络映射。在多域部署中,使用文字 IP 地址限制此配置可能会出现意外结果。 通过使用支持覆盖的对象,后代域管理员可为其本地环境自定义全局配置。

  • 生成事件并在内联部署中丢弃攻击性数据包,启用 stream_tcp 检查器规则 (GID 129)。

TCP 数据流重组最佳实践

stream_tcp 检查器收集和重组属于 TCP 会话的服务器到客户端通信数据流和/或客户端到服务器通信数据流的一部分的所有数据包。TCP 流重新组装允许 Snort 将流作为一个单独的、重新组装的实体、一个协议数据单元(PDU)来检查,而不是只检查作为给定流一部分的单个数据包。如果 PDU 很大,规则引擎会将其拆分为多个部分。

数据流重组允许 Snort 识别基于数据流的攻击,在检查个别数据包时它可能无法检测此类攻击。您可以根据网络需要指定要重新组装的通信流。例如,在监控网络服务器上的流量时,您可能只希望检查客户端流量,因为您不太可能从自己的网络服务器接收到恶意流量。

对于每个 stream_tcp 检查器,您可以在 绑定程序 配置中指定 TCP 端口列表。TCP 数据流检查器会自动且透明地包含已配置的端口,以识别和重组流量。启用自适应文件更新后,您可以列出用于识别要重组的流量的服务(以替代端口或端口组合的形式)。

在以下 Snort 检查器的 绑定程序 配置中指定 TCP 端口:

  • dnp3

  • ftp_server

  • gtp_inspect (默认提供端口)

  • http_inspect

  • imap

  • iec104 (默认情况下提供端口)

  • mms (默认情况下提供的端口)

  • Modbus (默认提供端口)

  • 弹出

  • sip

  • smtp

  • ssh

  • ssl

  • telnet



重组多种流量类型(客户端、服务器或两者)时,Snort 资源需求可能会增加。


流 TCP 检查器参数

流 TCP 重组配置

绑定程序 检查器会为网络分析策略 (NAP) 定义 TCP 数据流重组配置。指定要对其应用 TCP 数据流重组策略的主机 IP 地址。流 TCP 检查器会自动与在 NAP 的 绑定程序 中配置的端口相关联。有关详细信息,请参阅绑定程序检查器概述



系统会为每个枝叶域构建单独的网络映射。在多域部署中,使用文字 IP 地址限制此配置可能会出现意外结果。 通过使用支持覆盖的对象,后代域管理员可为其本地环境自定义全局配置。


默认策略中的 default 设置指定受监控网段上其他基于目标的策略未涵盖的所有 IP 地址。因此,不能且不需要为默认策略指定 IP 地址或 CIDR 块/前缀长度,并且不能在其他策略中将此设置留空或使用地址记法来表示 any(例如,0.0.0.0/0::/0)。

策略

指定目标主机或主机的操作系统。操作系统可确定适当的 TCP 重组策略和操作系统特征。只能为每个流 TCP 检查器定义一个 策略 参数。



如果将 策略 参数设置为 第一个,Snort 可能会提供一些保护,但会错过攻击。您应编辑 TCP 数据流检查器的 策略 参数指定相应的操作系统。


类型: enum

有效值:策略 参数设置一种操作系统类型。

表 1. TCP 操作系统策略

策略

操作系统

第一

未知的操作系统

最后一个

思科 IOS

bsd

AIX

FreeBSD

OpenBSD

hpux_10

HP-UX 10.2 及更高版本

hpux_11

HP-UX 11.0 及更高版本

irix

SGI Irix

linux

Linux 2.4 内核

Linux 2.6 内核

macos

Mac OS 10 (Mac OS X)

old_linux

Linux 2.2 及更低版本的内核

solaris

Solaris OS

SunOS

vista

Windows Vista

windows

Windows 98

Windows NT

Windows 2000

Windows XP

win_2003

Windows 2003

默认值: bsd

max_window

指定接收主机允许的最大 TCP 窗口大小。可以指定小于 65535 的整数,或指定 0 以禁用 TCP 窗口大小检测。


小心


max_window 的上限是 RFC 1323 允许的最大窗口大小。您可以设置上限以防止攻击者逃避检测,但是,如果将最大 TCP 窗口大小设置得过大,则可能会导致自身造成的拒绝服务。


类型: 整数

有效范围: 01,073,725,440

默认值: 0

overlap_limit

指定每个 TCP 会话中允许的重叠网段的最大数量。指定 0 以允许无限数量的分段重叠。如果设置介于 0255之间的数字,则会话的网段重组将会停止。

生成事件并在内联部署中丢弃攻击性数据包启用规则 129:7。

类型: 整数

有效范围: 04,294,967,295(最大 32)

默认值: 0

max_pdu

指定最大重组协议数据单元 (PDU) 大小。

类型: 整数

有效范围: 146032768

默认值: 16384

reassemble_async

确保在两个方向上看到流量之前,数据已排队等待重组。如果受监控的网络为异步网络,则必须启用 reassembly_async 参数。异步网络一次仅允许单个方向和一个流上的流量。如果启用了 reassembly_async 参数,则 Snort 在提高性能时不会重组 TCP 流。



流 TCP 检查器在所有情况下都无法正确处理非对称流量。例如,对 HTTP HEAD 请求的响应可能会导致 HTTP 检查器不同步。在 IDS 模式下,由于缺少 TCP 确认,因此更容易规避。对于 IPS 模式,我们建议您仅在规则引擎可以检查流量的两端时才部署 设备。


Cisco Secure Firewall Threat Defense 路由和透明接口的 reassembly_async 参数将被忽略。

类型: boolean

有效值: truefalse

默认值: true

require_3whs

指定流 TCP 检查器停止跟踪中间会话之前从启动经过的秒数。指定 -1 以跟踪所有中间 TCP 会话,无论这些会话何时发生。

Snort 不会同步大多数协议流。如果 Snort 需要任何握手选项(时间戳、窗口缩放或 MSS),则始终接收 SYN。通常,允许中流代扣器不会提高 IPS 效率。

类型: 整数

有效范围: -12,147,483,647(最大 31)

默认值: -1

queue_limit.max_bytes

指定 TCP 连接一端的会话排队的最大字节数。指定 0 以允许无限个字节。


小心


我们建议您联系思科 TAC,然后再更改 queue_limit.max_bytes 参数的默认设置。


类型: 整数

有效范围: 04,294,967,295(最大 32)

默认值: 4,194,304

queue_limit.max_segments

指定在 TCP 连接的一端等待会话排队的数据分段的最大数。指定 0 以允许无限数量的数据段。


小心


我们建议您联系思科 TAC,然后再更改 queue_limit.max_segments 参数的默认设置。


类型: 整数

有效范围: 04,294,967,295(最大 32)

默认值: 3072

small_segments.count

指定大于连续小 TCP 分段的预期数量的数字。指定 0 以忽略连续的小 TCP 分段的计数。

您必须使用相同类型的值设置 small_segments.countsmall_segments.maximum_size 参数。为两个参数指定 0 或将每个参数设置为非零值。



即使每个网段长度为 1 字节,Snort 也会考虑 2000 个连续网段,这超出了连续 TCP 网段的正常数量。

Snort 会忽略 威胁防御 路由和透明接口的 small_segments.count 参数。

您可以对 生成事件并在内联部署中丢弃攻击性数据包启用规则 129:12。

类型: 整数

有效范围: 02048

默认值: 0

small_segments.maximum_size

指定将 TCP 分段标识为大于小 TCP 分段的字节数。小 TCP 分段大小的范围为 12048 字节。指定 0 以忽略小数据段的最大大小。

Snort 会忽略 威胁防御 路由和透明接口的 small_segments.maximum_size 参数。

您必须为 small_segments.maximum_sizesmall_segments.count 参数设置相同类型的值。为两个参数指定 0 或将每个参数设置为非零值。



2048 字节的 TCP 分段大于普通的 1500 字节的以太网帧。

您可以对 生成事件并在内联部署中丢弃攻击性数据包启用规则 129:12。

类型: 整数

有效范围: 02048

默认值: 0

session_timeout

指定 Snort 在其状态表中保持非活动 TCP 流的秒数。如果数据流在指定时间内未重组,则 Snort 会将其从状态表中删除。如果会话仍处于活动状态并且显示更多数据包,Snort 会将该流作为中游流处理。

我们建议将 session_timeout 参数设置为大于或等于主机 TCP 会话超时。

类型: 整数

有效范围: 02,147,483,647(最大 31)

默认值: 180

流 TCP 检查器规则

启用 stream_tcp 检查器规则,以 生成事件并在内联部署中丢弃攻击性数据包

表 2. 流 TCP 检查器规则

GID:SID

Rule Message

129:1

已建立会话的 SYN

129:2

SYN 数据包上的数据

129:3

在流上发送的数据不接受数据

129:4

TCP 时间戳位于 PAWS 窗口之外

129:5

错误的分段,调整后的大小小于或等于 0(已弃用)

129:6

窗口大小(扩展后)大于策略允许的大小

129:7

达到重叠 TCP 数据包数量限制

129:8

TCP 重置发送后,在流中发送的数据

129:9

TCP 客户端可能被劫持,以太网地址不同

129:10

TCP 服务器可能被劫持,不同的以太网地址

129:11

未设置 TCP 标志的 TCP 数据

129:12

超过阈值的连续 TCP 小分段

129:13

检测到 4 次握手

129:14

缺少 TCP 时间戳

129:15

在窗口外部重置

129:16

FIN 编号大于上一个 FIN

129:17

ACK 编号大于先前 FIN

129:18

收到 TCP 重置后在流中发送的数据

129:19

TCP 窗口在接收数据前已关闭

129:20

不带三次握手的 TCP 会话

流 TCP 检查器入侵规则选项

stream_reassemble

指定是否对匹配流量启用 TCP 数据流重组。stream_reassemble 规则选项包含四个参数: stream_reassemble.actionstream_reassemble.directionstream_reassemble.noalertstream_reassemble.fastpath

语法: stream_reassemble: <enable|disable>, <server|client|both>, noalert, fastpath;

示例: stream_reassembly: disable,client,noalert;

stream_reassemble.action

停止或开始流重组。

类型: enum

语法: stream_reassemble: <action>;

有效值: 禁用启用

示例: stream_reassembly: enable;

stream_reassembly.direction

操作适用于给定的方向。

类型: enum

语法: stream_reassemble: <direction>

有效值: clientserverboth

示例: stream_reassembly: Both;

stream_reassembly.noalert

规则匹配时不提醒。 stream_reassembly.noalert 参数是可选的。

语法: stream_reassembly: noalert;

示例: stream_reassembly: noalert;

stream_reassembly.fastpath

(可选)信任会话的其余部分。 stream_reassembly.fastpath 参数是可选的。

语法: stream_reassembly: fastpath;

示例: stream_reassembly: fastpath;

stream_size

用于检查流大小的检测选项。允许规则根据观察到的字节数(由 TCP 序列号确定)匹配流量。 stream_size 规则选项包括两个参数: stream_size.directionstream_size.range

语法: stream_size: <server|client|both|either>, <operator><number>;

示例: stream_size: client, <6;

stream_size.direction

比较适用于流的方向。

类型: enum

语法: stream_size: <direction>;

有效值:

  • either

  • to_server

  • to_client

  • both

示例: stream_size: to_client;

stream_size.range

检查数据流大小是否在指定范围内。指定 范围 运算符和一个或多个正整数。

类型: 间隔

语法: stream_size: <range_operator><positive integer>; or stream_size: <positive integer><range_operator><positive integer>;

有效值: 一组一个或多个正整数以及 范围格式 中指定的一个 range_operator

示例: stream_size: +6;

表 3. 范围格式

范围格式

Operator

说明

operator i

<

少于

>

大于

=

平分

不等于

小于或等于

大于或等于

j operator k

<>

大于 j 且小于 k

<=>

大于或等于 j 且小于或等于 k