基于位字段值的防火墙过滤器匹配条件
位字段值的匹配条件
表 1 列出了 防火墙过滤器 匹配条件,这些条件基于是否设置数据包中的某些位字段。第二列和第三列列出了支持匹配条件的流量类型。
位域匹配条件 |
匹配值 |
标准无状态防火墙过滤器的协议族 |
服务过滤器的协议族 |
---|---|---|---|
fragment-flags flags |
IP 标头中三位 IP 分段标志字段的十六进制值或文本别名。 |
family inet |
family inet |
fragment-offset value |
IP 报头中 13 位片段偏移量字段的十六进制值或文本别名。 |
family inet |
family inet |
tcp-flags value† |
TCP 标头中 8 位 TCP 标志字段的低阶 6 位的十六进制值或文本别名。 |
family inetfamily inet6family vplsfamily bridge |
family inetfamily inet6 |
†匹配 IPv4 流量的 TCP 标志时,Junos OS 不会自动检查第一个片段位。要仅检查 IPv4 流量的第一个片段位,请使用 first-fragment 匹配条件。 |
常见位字段值或组合的匹配条件
表 2 描述防火墙过滤器匹配条件,这些条件基于是否设置数据包中某些常用值或位字段 组合 。
可以使用文本同义词来指定一些常见的位字段匹配项。在前面的示例中,您可以指定 tcp-initial 为相同的匹配条件。
某些数字范围和位字段匹配条件允许您指定文本同义词。有关同义词的完整列表:
如果您使用的是 J-Web 界面,请从相应的列表中选择同义词。
如果使用的是 CLI,请在语句后from键入问号 (?)。
匹配条件 |
Description |
标准无状态防火墙过滤器的协议族 |
服务过滤器的协议族 |
---|---|---|---|
first-fragment |
位字段匹配条件 fragment-offset 0的文本别名 ,表示分片数据包的第一个分片。 |
family inet |
family inet |
is-fragment |
位字段匹配条件 fragment-offset 0 except的文本别名 ,表示分片数据包的尾随分片。 |
family inet |
family inet |
tcp-established |
位字段匹配条件 tcp-flags "(ack | rst)"的别名 ,表示已建立的 TCP 会话,但不是 TCP 连接的第一个数据包。 |
family inetfamily inet6 |
— |
tcp-initial |
位字段匹配条件 tcp-flags "(!ack & syn)"的别名 ,表示 TCP 连接的第一个数据包,但不是已建立的 TCP 会话。 |
family inetfamily inet6 |
— |
位字段值的逻辑运算符
表 3 列出了在指定无状态防火墙过滤器匹配条件时可以应用于 单个 位字段值的逻辑运算符。运算符按从最高优先级到最低优先级的顺序列出。操作是左关联操作,这意味着操作从左到右进行处理。
优先顺序 |
位域逻辑运算符 |
Description |
---|---|---|
1 |
(complex-match-condition) |
分组 - 在应用括号外的任何运算符之前评估复杂匹配条件。 |
2 |
! match-condition |
否定 - 如果匹配条件为 false,则发生匹配。 |
3 |
match-condition-1 & match-condition-2(也称为数字签名match-condition-1 + match-condition-2 |
逻辑 AND — 如果两个匹配条件都为真,则会发生匹配。 |
4 |
match-condition-1 | match-condition-2(也称为数字签名match-condition-1 , match-condition-2 |
逻辑 OR - 如果任一匹配条件为真,则发生匹配。 |
匹配单个位字段值或文本别名
fragment-flags对于和tcp-flags位匹配条件,您可以根据是否设置数据包字段中的特定位来指定防火墙过滤器匹配条件。
用于指定单个位的数值 - 可以使用设置了一个位的数值指定单个位字段匹配条件。根据匹配条件,您可以指定十进制值、二进制值或十六进制值。要指定二进制值,请指定带前缀 b的数字。要指定十六进制值,请指定带前缀 0x的数字。
在以下示例中,如果设置了 TCP 标志字段中的位,则 RST 会发生匹配:
[edit firewall family inet filter filter_tcp_rst_number term term1 from] user@host# set tcp-flags 0x04
用于指定单个位的文本别名 - 通常使用用双引号 (“ ”) 括起来的文本别名来指定单个位字段匹配条件。
在以下示例中,如果设置了 TCP 标志字段中的位,则 RST 会发生匹配:
[edit firewall family inet filter filter_tcp_rst_alias term term1 from] user@host# set tcp-flags “rst”
匹配多个位字段值或文本别名
您可以根据是否设置数据包字段中的特定位集来指定防火墙过滤器匹配条件。
用于指定多个设置位的数值 - 如果指定其二进制表示形式具有多个设置位的数值,则该值将被视为设置位的逻辑 AND。
在以下示例中,两个匹配条件相同。如果未设置位 0x01 或 0x02 未设置,则会发生匹配:
[edit firewall family inet filter reset_or_not_initial_packet term term5 from] user@host# set tcp-flags “!0x3” user@host# set tcp-flags “!(0x01 & 0x02)”
指定常见位字段匹配的文本别名 - 您可以使用文本别名指定一些常见的位字段匹配。您可以将这些匹配项指定为单个关键字。
在以下示例中 tcp-established ,条件(作为 的 “(ack | rst)”别名)指定在连接的第一个数据包以外的 TCP 数据包上进行匹配:
[edit firewall family inet filter reset_or_not_initial_packet term term6 from] user@host# set tcp-established
对否定位字段值进行匹配
若要否定匹配项,请在值前面加上感叹号。
在以下示例中,如果 RST 未设置 TCP 标志字段中的位,则发生匹配:
[edit firewall family inet filter filter_tcp_rst term term1 from] user@host# set tcp-flags “!rst”
匹配两个位字段值的逻辑 OR
可以使用 (| 或 ,) 指定如果位字段与指定的两个位字段值中的任何一个匹配,则进行匹配。
在以下示例中,如果数据包不是 TCP 会话中的初始数据包,则会发生匹配:
[edit firewall family inet filter not_initial_packet term term3 from] user@host# set tcp-flags "!syn | ack"
在 TCP 会话中,SYN 标志仅在发送的初始数据包中设置,而 ACK 标志在初始数据包之后发送的所有数据包中设置。在不是 TCP 会话中的初始数据包的数据包中,未设置 SYN 标志或设置 ACK 标志。
两个位字段值的逻辑 AND 上的匹配
可以使用 (& 或 +) 指定当位字段与指定的两个位字段值都匹配时进行匹配。
在以下示例中,如果数据包是 TCP 会话中的初始数据包,则会发生匹配:
[edit firewall family inet filter initial_packet term term2 from] user@host# set tcp-flags “syn & !ack”
在 TCP 会话中,SYN 标志仅在发送的初始数据包中设置,而 ACK 标志在初始数据包之后发送的所有数据包中设置。在作为 TCP 会话中的初始数据包的数据包中,将设置 SYN 标志,但未设置 ACK 标志。
分组位字段匹配条件
可以使用 指定 在应用括号外的任何运算符之前计算括号内的复杂匹配条件。
在以下示例中,如果数据包是 TCP 重置或数据包不是 TCP 会话中的初始数据包,则会发生匹配:
[edit firewall family inet filter reset_or_not_initial_packet term term4 from] user@host# set tcp-flags “!(syn & !ack) | rst”
在 TCP 会话中,SYN 标志仅在发送的初始数据包中设置,而 ACK 标志在初始数据包之后发送的所有数据包中设置。在不是 TCP 会话中的初始数据包的数据包中,未设置 SYN 标志,并设置 ACK 字段。