4.3. IP关键字¶
4.3.1. ttl¶
ttl关键字用于检查IP数据包标头中time-to-live值, 其格式是:
ttl:<number>
例如:
ttl:10;
在ttl关键字的末尾,您可以输入要匹配的值。Time-to-live值决定定数据包在网络中传输的最长时间,如果此字段设置为0,则必须销毁数据包,time-to-live基于跳数,数据包每经过一跳,TTL值就减一。这个机制的目的是限制数据包无限循环路由。
规则中ttl关键字例子:
4.3.2. ipopts¶
ipopts关键字用来检查特定的IP选项是否设定。Ipopts必须在规则的开头使用,每条规则只能匹配一个选项。 这些选项包括:
| IP选项 | 描述 |
|---|---|
| rr | 记录路由 |
| eol | 列表结束 |
| nop | 无操作 |
| ts | 时间戳 |
| sec | IP安全 |
| esec | IP安全扩展 |
| lsrr | 宽松源路由选项 |
| ssrr | 严格源路由选项 |
| satid | 流标识符 |
| any | 任意IP选项 |
ipopts关键字格式:
ipopts: <name>
例如:
ipopts: lsrr;
规则中使用ipopts的例子:
4.3.3. sameip¶
每个数据包都有一个源IP地址和一个目的IP地址。 可以是源IP与目的IP相同。 使用sameip关键字,您可以检查源IP地址是否与目的IP地址相同。 sameip 关键字的格式是:
sameip;
规则中使用sameip的例子:
4.3.4. ip_proto¶
使用ip_proto关键字,您可以匹配数据包头中的IP协议。您可以使用协议的名称或编号来匹配下面的协议:
1 ICMP 因特网消息控制协议
6 TCP 传输控制协议
17 UDP 用户数据报协议
47 GRE 通用路由封装协议
50 ESP IPv6 Encap安全有效负载
51 AH Ipv6身份验证标头
58 IPv6-ICMP ICMP for Ipv6
完整的协议和协议号列表请参考 http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
规则中使用ip_proto的例子:
例子中的命名变量为:
ip_proto:PIM
4.3.5. id¶
使用id关键字,您可以匹配指定的IP ID值。 ID标识主机发送的每个数据包,并且通常每发送一个数据包就递增一个数值。 IP ID用作片段标识号。 每个数据包都有一个IP ID,当数据包被分段时,该数据包的所有分段都具有相同的ID。 以这种方式,分组的接收器知道哪些分段属于同一数据包。 (IP ID不关心ID号顺序,分段重组时使用偏移来完成,它阐明了分段的顺序。)
id关键字格式为:
id:<number>;
规则中使用id的例子:
4.3.6. geoip¶
geoip关键字使您能够匹配源和目标IP地址来自哪个网络以及它所属的国家/地区。Suricata使用Maxmind的GeoIP API来实现这个功能。
geoip的语法格式为:
geoip: src, RU;
geoip: both, CN, RU;
geoip: dst, CN, RU, IR;
geoip: both, US, CA, UK;
geoip: any, CN, IR;
因此,您可以使用以下标识符来明确匹配的方向:
both: 使用指定geoip (geopip’s)来匹配双向
any: 使用指定geoip (’s)来匹配任意一个方向.
dest: 使用指定geoip来匹配目的.
src: 使用指定geoip来匹配源.
这个关键字仅支持IPv4. 由于他使用了Maxmind的GeoIP API, 必须将libgeoip编译入suricata.
4.3.7. fragbits (IP分段)¶
使用fragbits关键字,可以检查IP头中是否设置了分段和保留位。fragbits关键字应放在规则的开头。Fragbits用于IP分段机制。 在将数据包从一个Internet网络路由到另一个Internet网络期间,可能发生数据包大于网络可以处理的最大数据包长度的情况。 在这种情况下,可以分段发送数据包。网络中数据包长度的最大值称为最大传输单位(MTU).
您可以匹配以下比特位:
M - 更多分段
D - 不要分段
R - 保留位
可以使用以下修饰符更多地指定对此位的匹配:
+ 匹配指定的位,以及任何其他位
* 如果设置了任何指定位,则匹配
! 如果未设置指定的位,则匹配
格式:
fragbits:[*+!]<[MDR]>;
规则中使用fragbits的例子:
4.3.8. fragoffset¶
使用fragoffset关键字,您可以匹配IP分段偏移字段的指定十进制值。 如果要检查会话的第一个分段,则必须将fragoffset 0与More Fragment选项组合在一起来使用。分段的偏移字段便于重组。 id用于确定哪些分段属于哪个数据包,而分段的偏移字段用于说明分段的顺序.
您可以使用以下修饰符:
< 如果小于指定值,则匹配
> 如果大于指定值,则匹配
! 如果指定的值不存在则匹配
fragoffset格式:
fragoffset:[!|<|>]<number>;
规则中使用fragoffset的例子:
4.4. TCP关键字¶
4.4.1. seq¶
可以在规则中使用seq关键字来检查指定的TCP序列号。序列号是TCP连接两端随机生成的数字。客户端和服务器都创建一个序列号,随着各方发送字节的增加而增加,所以双方这个序列号是不同的。该序列号必须由连接的双方确认。TCP通过序列号处理数据包的确认、顺序和重传。它的数字着发送方发送的每个数据字节而增加。seq有助于跟踪字节在所属的数据流中处于哪个位置。如果SYN标志设置为1,则数据的第一个字节的序列号是此数字加1(以此类推,2)
例子:
seq:0;
规则中使用seq的例子:
数据包中seq的例子 (Wireshark):
4.4.2. ack¶
ack是对TCP连接另一端发送的所有先前(数据)字节的接收的确认。 在大多数情况下,TCP连接的每个数据包在第一个SYN之后都有一个ACK标志,而ack-number随着每个新数据字节的接收而增加。 可以在规则中使用ack关键字来检查指定的TCP确认号.
ack的格式:
ack:1;
规则中使用ack的例子:
数据包中ack的例子(Wireshark):
4.4.3. window¶
window关键字用于检查指定的TCP窗口大小。TCP窗口大小是一种控制数据流的机制。窗口由接收端设置(接收端通告的窗口大小),并指示可以接收的字节数。在发送方可以发送相同数量的新数据之前,接收端必须先确认此数据量。该机制用于防止接收端数据溢出。窗口大小的值是有限的,可以是2到65535字节。为了更多地利用带宽,您可以使用更大的TCP窗口。
window关键字格式:
window:[!]<number>;
规则中使用window的例子:
4.5. ICMP关键字¶
ICMP(Internet消息控制协议)是IP协议栈的一部分。 在传输数据(数据报)方面,IP协议本身并不可靠。ICMP协议可以在出现问题时提供反馈。它不会阻止问题的发生,但有助于理解出错的原因和地点。如果需要可靠性,使用IP的协议必须自己处理可靠性。很多情况下会发送ICMP消息。 例如,当目的地不可达时,如果没有足够的缓冲容量来转发数据,或者当数据报发送时不能进行分段,则等等。 更多信息可参考ICMP消息类型列表。
ICMP消息有四个重要内容,可以与相应的ICMP关键字匹配。 它们是:消息的类型,代码,id和序列号。
4.5.1. itype¶
itype关键字用于匹配指定的ICMP类型(数字)。ICMP有几种消息,并使用代码来表示这些消息。不同的消息由不同的名称区分,但更重要的是类型代码。 有关更多信息,请参阅包含消息类型和代码列表。
itype关键字格式:
itype:min<>max;
itype:[<|>]<number>;
例如 这个例子匹配类型代码大于10的ICMP数据包:
itype:>10;
规则中使用itype关键字的例子:
下面列出了撰写本文时所有的已知ICMP类型。可以在 IANA的网站 找到最新的列表
| ICMP类型 | Name |
|---|---|
| 0 | 回显应答 |
| 3 | 目标不可达 |
| 4 | 源端被关闭(基本流控制) |
| 5 | 重定向 |
| 6 | Alternate Host Address |
| 8 | 回显请求 |
| 9 | 路由器通告 |
| 10 | 路由器请求 |
| 11 | TTL为0 |
| 12 | 参数错误 |
| 13 | 时间戳请求 |
| 14 | 时间戳请求应答 |
| 15 | 信息请求 |
| 16 | 信息请求应答 |
| 17 | 地址掩码请求 |
| 18 | 地址掩码应答 |
| 30 | Traceroute |
| 31 | 数据报转换错误 |
| 32 | Mobile Host Redirect |
| 33 | IPv6 Where-Are-You |
| 34 | IPv6 I-Am-Here |
| 35 | Mobile Registration Request |
| 36 | Mobile Registration Reply |
| 37 | Domain Name Request |
| 38 | Domain Name Reply |
| 39 | SKIP |
| 40 | Photuris |
| 41 | Experimental mobility protocols such as Seamoby |
4.5.2. icode¶
使用icode关键字,您可以匹配指定的ICMP代码。 ICMP消息的代码阐明了该消息。与ICMP类型一起,它表明您正在处理什么样的问题。每个ICMP类型的代码都有不同的用途。
icode关键字格式:
icode:min<>max;
icode:[<|>]<number>;
例如: 这个例子匹配ICMP代码大于5的数据包:
icode:>5;
规则中使用icode关键字的例子:
下面列出了所有ICMP类型的含义。如果未列出类型,则仅定义代码0,并且具有上表中ICMP类型的含义。 最新的列表可以在 IANA的网站 上找到。
| ICMP类型 | ICMP代码 | 描述 |
|---|---|---|
| 3 |
|
|
| 5 |
|
|
| 9 |
|
|
| 11 |
|
|
| 12 |
|
|
| 40 |
|
|
4.5.3. icmp_id¶
使用icmp_id关键字,您可以匹配指定的ICMP id值。每个ICMP数据包在发送时都会获得一个id。在接收方收到数据包时,它将使用相同的ID发送回复,以便发送方识别它并将其与正确的ICMP请求关联。
icmp_id关键字格式:
icmp_id:<number>;
例如: 这个例子匹配ICMP ID为0的数据包:
icmp_id:0;
规则中使用icmp_id关键字的例子:
4.5.4. icmp_seq¶
您可以使用icmp_seq关键字检查ICMP序列号。 ICMP消息都有序列号。 这可以用于(与id一起)用于检查哪个回复消息属于哪个请求消息。
icmp_seq关键字格式:
icmp_seq:<number>;
例如: 这个例子匹配ICMP序列号为0的数据包:
icmp_seq:0;
规则中使用icmp_seq关键字的例子: