高级策略表达式:IP 和 MAC 地址、吞吐量、VLAN ID

可以使用高级策略表达式前缀返回 IPv4 和 IPv6 地址、MAC 地址、IP 子网、有用的客户端和服务器数据,例如接口端口(Rx、Tx 和 RxTx)的吞吐速率以及接收数据包的 VLAN 的 ID。然后,您可以使用各种运算符来评估这些表达式前缀返回的数据。

IP 地址和 IP 子网的表达式

您可以使用高级策略表达式评估 Internet 协议版本 4 (IPv4) 或 Internet 协议版本 6 (IPv6) 格式的地址和子网。IPv6 地址和子网的表达式前缀在前缀中包括 IPv6。IPv4 地址和子网的表达式前缀在前缀中包含 IP。下面是标识请求是否源自特定 IPv4 子网的表达式示例。

client.ip.src.in_subnet(147.1.0.0/16)

下面是两个重写策略示例,它们检查从中接收数据包的子网并对主机头执行重写操作。配置了这两个策略后,执行的重写操作取决于请求中的子网。这两个策略评估 IPv4 地址格式的 IP 地址。

- add rewrite action URL1-rewrite-action replace "http.req.header("Host")" ""www.mycompany1.com""
- add rewrite policy URL1-rewrite-policy "http.req.header("Host").contains("www.test1.com") && client.ip.src.in_subnet(147.1.0.0/16)" URL1-rewrite-action
- add rewrite action URL2-rewrite-action replace "http.req.header("Host")" ""www.mycompany2.com""
- add rewrite policy URL2-rewrite-policy "http.req.header("Host").contains("www.test2.com") && client.ip.src.in_subnet(10.202.0.0/16)" URL2-rewrite-action

注意

上述示例是您在 Citrix ADC 命令行界面 (CLI) 中键入的命令,因此,每个引号的前面必须有反斜杠 (\)。有关更多信息,请参阅在策略中配置高级策略表达式

IPv4 地址和 IP 子网的前缀

下表描述了返回 IPv4 地址和子网以及 IPv4 地址段的前缀。您可以使用这些前缀特定于 IPv4 地址的数字运算符和运算符。有关数字操作的更多信息,请参阅表达式前缀的基本操作数字的复合操作

表 1. 评估 IP 和 MAC 地址的前缀

前缀 说明
CLIENT.IP.SRC 以 IP 地址或数字形式返回当前数据包的源 IP。
CLIENT.IP.DST 以 IP 地址或数字形式返回当前数据包的目标 IP。
SERVER.IP.SRC 以 IP 地址或数字形式返回当前数据包的源 IP。
SERVER.IP.DST 以 IP 地址或数字形式返回当前数据包的目标 IP。

IPv4 地址的操作

IPv4 操作的前缀表描述了可用于返回 IPv4 地址的前缀的运算符。

关于 IPv6 表达式

IPv6 地址格式比较旧的 IPv4 格式具有更大的灵活性。IPv6 地址采用十六进制格式 (RFC 2373)。在以下示例中,示例 1 是 IPv6 地址,示例 2 是包含 IPv6 地址的 URL,示例 3 包含 IPv6 地址和端口号。

示例 1:

9901:0ab1:22a2:88a3:3333:4a4b:5555:6666

示例 2:

http://[9901:0ab1:22a2:88a3:3333:4a4b:5555:6666]/

示例 3:

https://[9901:0ab1:22a2:88a3:3333:4a4b:5555:6666]:8080/

在示例 3 中,括号将 IP 地址与端口号 (8080) 分开。

请注意,您只能使用 ‘+’ 运算符将 IPv6 表达式与其他表达式相结合。输出是从各个表达式返回的字符串值的连接。您不能将任何其他算术运算符与 IPv6 表达式结合使用。下面的语法是一个示例:

client.ipv6.src + server.ip.dst

例如,如果客户端源 IPv6 地址为ABCD:1234::ABCD,服务器目标 IPv4 地址为10.100.10.100,则返回前面的表达式"ABCD:1234::ABCD10.100.10.100"

请注意,Citrix ADC 设备收到 IPv6 数据包时,它会从未使用的 IPv4 地址范围分配临时 IPv4 地址,并将数据包的源地址更改为此临时地址。在响应时,传出数据包的源地址将替换为原始 IPv6 地址。

注意

除了生成布尔结果的表达式之外,您可以将 IPv6 表达式与任何其他表达式组合在一起。

IPv6 地址的表达式前缀

下表中的表达式前缀返回的 IPv6 地址可视为文本数据。例如,前缀 client.ipv6.dst 返回目标 IPv6 地址作为可以评估为文本的字符串。

下表描述了返回 IPv6 地址的表达式前缀。

表 3. IPv6 表达式前缀返回文本

前缀 说明
CLIENT.IPV6 使用当前数据包在中的 IPv6 地址上运行。
CLIENT.IPV6.DST 返回 IP 标头的目标字段中的 IPv6 地址。
CLIENT.IPV6.SRC 返回 IP 标头的源字段中的 IPv6 地址。下面是示例:client.ipv6.src.in_subnet(2007::2008/64) client.ipv6.src.get1.le(2008)
SERVER.IPV6 使用当前数据包在中的 IPv6 地址上运行。
SERVER.IPV6.DST 返回 IP 标头的目标字段中的 IPv6 地址。
SERVER.IPV6.SRC 返回 IP 标头的源字段中的 IPv6 地址。下面是示例:server.ipv6.src.in_subnet(2007::2008/64) server.ipv6.src.get1.le(2008)

IPv6 前缀的操作

下表描述了可用于返回 IPv6 地址的前缀的运算符:

表 4. 评估 IPv6 地址的操作

IPv6 操作 说明
<ipv6>.EQ(<IPv6_address> 如果 IP 地址值与<IPv6_address> 参数相同,则返回布尔值 TRUE。下面是一个示例:client.ipv6.dst.eq(ABCD:1234::ABCD)
<ipv6>.GET1. . .GET8 以数字形式返回 IPv6 地址的段落。以下示例表达式从 IPv6 地址 1000:1001:CD10:0000:0000:89AB:4567:CDEF client.ipv6.dst.get5 extracts 0000 中的第五组位检索段。client.ipv6.dst.get6 extracts 89AB. client.ipv6.dst.get7 extracts 4567. 您可以对这些段执行数字操作。请注意,您无法在检索整个 IPv6 地址时执行数字操作。这是因为返回整个 IPv6 地址(如客户端 .IPV6.SRC)的表达式以文本格式返回该地址。
<ipv6>.IN_SUBNET(<subnet>) 如果 IPv6 地址值位于<subnet> 参数指定的子网中,则返回布尔值 TRUE。下面是一个示例:client.ipv6.dst.eq(1000:1001:CD10:0000:0000:89AB:4567:CDEF/60)
<ipv6>.IS_IPV4 如果这是 IPv4 客户端,则返回布尔值 TRUE,如果不是,则返回布尔值 FALSE。
<ipv6>.SUBNET(<n>) 应用指定为参数的子网掩码后返回 IPv6 地址。子网掩码可以采用介于 0 到 128 之间的值。例如: CLIENT.IPV6.SRC.SUBNET(24)

MAC 地址的表达式

MAC 地址由以冒号分隔的十六进制值组成,格式为 ##:##:##:##:##:##, 其中每个“#”表示 0 到 9 的数字或 A 到 F 的字母。默认语法表达式前缀和运算符可用于评估源和目标 MAC 地址。

MAC 地址的前缀

下表描述了返回 MAC 地址的前缀。

表 5. 评估 MAC 地址的前缀

前缀 说明
client.ether.dstmac 返回以太网标头的目标字段中的 MAC 地址。
client.ether.srcmac 返回以太网标头的源字段中的 MAC 地址。

MAC 地址的操作

下表描述了可用于返回 MAC 地址的前缀的运算符。

表 6. MAC 地址上的操作

前缀 说明
<mac address>.EQ(<address>) 如果 MAC 地址值与 <address> 参数相同,则返回布尔值 TRUE。
<mac address>.GET1. . .GET4 返回从 GET 操作中指定的 MAC 地址段中提取的数值。例如,如果 MAC 地址是 12:34:56:78:9a:bc,则以下内容返回 34:client.ether.dstmac.get2

数字客户端和服务器数据的表达式

下表介绍了用于处理数字客户端和服务器数据(包括吞吐量、端口号和 VLAN ID)的前缀。

表 7. 用于评估数字客户端和服务器数据的前缀

前缀 说明
client.interface.rxthroughput 返回一个整数,表示前七秒内的原始接收流量吞吐量(以千字节/秒 (KBPS) 为单位)。
client.interface.txthroughput 返回一个整数,表示前七秒内的原始传输流量吞吐量(KBPS)。
client.interface.rxtxthroughput 返回一个整数,表示前七秒内的原始接收和传输流量吞吐量(KBPS)。
server.interface.rxthroughput 返回一个整数,表示前七秒内的原始接收流量吞吐量(KBPS)。
server.interface.txthroughput 返回一个整数,表示前七秒内的原始传输流量吞吐量(KBPS)。
server.interface.rxtxthroughput 返回一个整数,表示前七秒内的原始接收和传输流量吞吐量(KBPS)。
server.vlan.id 返回当前数据包进入 Citrix ADC 的 VLAN 数字 ID。
client.vlan.id 返回当前数据包进入 Citrix ADC 的 VLAN 的数字 ID。

高级策略表达式:IP 和 MAC 地址、吞吐量、VLAN ID