本主题将详细介绍 DataScript 实用程序函数的规范。

DataScript 中提供了以下实用程序函数:

函数

描述

avi.utils.base64_decode( string )

解码内容

avi.utils.base64_encode( string )

编码内容

avi.utils.get_geo_from_ip(ip_string, [flag])

用于提取地理位置数据库信息

avi.utils.ip.netaddr (ipaddr, netmask)

接受 IP 地址和网络掩码并返回网络地址

avi.utils.murmur_hash ( string)、avi.utils.sha1_hash (string)、avi.utils.md5_hash (string)

对内容执行哈希处理

avi.utils.rand_bytes( num_bytes )

生成加密的安全随机字节

avi.utils.get_ip_reputation

用于检查给定 IP 地址的 IP 信誉

avi.utils.ip_in_subnet

用于求值 IP 地址网络掩码。

注:

DataScript 可以使用支持相应命名哈希方法的三个函数之一对任意数据进行哈希处理:MurmurHash、SHA-1 和 MD5。有关更多信息,请参阅 DataScript:avi.utils.murmur_hash ( string)、avi.utils.sha1_hash (string) 和 avi.utils.md5_hash (string)

avi.utils.base64_decode

函数

avi.utils.base64_decode( string )

描述

DataScript 可以使用 base64 对任意数据进行编码和解码。这可用于修改通过线路发送的数据,或者用于检查和安全用例。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

string 是要解码的字符串。

返回

已解码的字符串

相关

avi.utils.base64_encode()

示例

以下示例将获取 HTTP 基本身份验证用户名,并将其作为用户 ID 标记添加到 VMware NSX Advanced Load Balancer 中,可用于日志搜索、持久性或访问控制。

if string.beginswith(avi.http.get_header("Authorization"), "Basic ") then
  auth = string.sub(avi.http.get_header("Authorization"), 7)
  decoded = avi.utils.base64_decode(auth)
  username = string.sub(decoded, 0, string.find(decoded, ":") - 1)
  avi.http.set_userid(username)
end

avi.utils.base64_encode

函数

avi.utils.base64_encode( string )

描述

DataScript 可以使用 base64 对任意数据进行编码和解码。这可用于修改通过线路发送的数据,或者用于检查和安全用例。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

string 是要编码的字符串。

返回

已编码的字符串

相关

avi.utils.base64_decode()

avi.utils.get_geo_from_ip

NSX Advanced Load Balancer 包括一个地理位置数据库以确定客户端的来源。此固定数据库基于 MaxMind IP-countryIP-autonomous system 编号 (ASN) 数据。该数据库是在 NSX Advanced Load Balancer 控制器 上维护的,并在升级控制器时合并数据库更新。

DataScript 函数 avi.utils.get_geo_from_ip 用于检索所查询 IP 地址的地理位置信息、自治系统 (autonomous system, AS) 编号、国家/地区代码以及位置(纬度、经度、区域和城市)。

注:
  • 用于此 API 的数据库相当于 NSX Advanced Load Balancer 控制器 上维护的默认数据库,无法使用 IP 组进行覆盖或扩充,如“地理位置数据库”中所述。

  • 必须将 System-GeoDB 配置文件附加到使用函数 get_geo_from_ip 的虚拟服务 Datascript。

  • 包含使用此函数的 DataScript 的 VSDataScriptSet 必须引用地理位置数据库。

函数

  • avi.utils.get_geo_from_ip (ip_string, [flag])

  • avi.utils.get_geo_from_ip(ip_string,"COUNTRY")

  • avi.utils.get_geo_from_ip(ip_string,"ASN")

  • avi.utils.get_geo_from_ip(ip_string,"LOCATION")

  • avi.utils.get_geo_from_ip(ip_string,"ALL")

描述

对于给定的 IP 地址,将根据标记返回给定 IPv4/v6 地址 ip_string 的地理位置值。此值从地理位置数据库中检索。

必备条件

服务引擎中至少具有 4GB RAM

必须在使用它的服务引擎组上配置至少 100 MB 的额外共享内存。此内存量可以通过 SE 组中的 extra_shared_config_memory 参数进行设置,如下所示:

[admin:example-ctrl]: > configure serviceenginegroup Default-Group extra_shared_config_memory 100
[admin:example-ctrl]: serviceenginegroup > save

需要重新启动此组中的 SE 才能使内存更改生效。

如果未设置此内存,则配置了使用此函数的 DataScript 的任何虚拟服务都将被置于故障状态。在 NSX Advanced Load Balancer UI 中,错误消息如下所示:



事件

所有 HTTP 事件

参数

  • ip_string 是一个字符串,其中包含查询其地理数据库信息的查询 IPv4/v6 地址。

  • flag 是一个字符串,可以设置为“COUNTRY”、“ASN”、“LOCATION”或“ALL”,如果未提供值,默认设置为“COUNTRY”。

返回

  1. 在以下情况下返回 nil:

    • ip_string 包含 IPv6、内部/无效地址或

    • ip_string 不在地理位置数据库中(未分配的地址),或者

    • flag 设置不正确(“COUNTRY”、“ASN”、“LOCATION”或“ALL”以外的内容),或者

  2. 如果 flag 设置为“COUNTRY”或者如果缺少 flag 参数,则返回 string,其中包含 ISO 3166-1 alpha-2 国家/地区代码(例如,“AU”表示澳大利亚)。

  3. 如果 flag 设置为“ASN”,则返回 32 位 ASN 代码(例如,1449 表示 AS1449 PayPal, Inc)。

  4. 如果 flag 设置为“LOCATION”,则返回一个表,其中包含四个字符串元素,即纬度、经度、区域和城市(例如 ["44.9566", "34.1116", "Crimea", "Simferopol"])

  5. 如果将标记设置为“ALL”,则返回一个表,其中包含目标 IP 的所有可用地理信息以及任何用户映射匹配项

注:

用于此函数的数据库相当于 NSX Advanced Load Balancer 控制器 上维护的默认数据库。如地理位置数据库文章中所述,无法使用 IP 组进行覆盖或扩充。

示例 1

下面的 DataScript 将添加类似于以下内容的地理标头:

  • 如果在地理位置数据库中找不到 IP 地址,则添加“Geo: not found”,或者

  • 如果找到了 IP 地址,则添加“Geo: <ASN>”。

client_ip = avi.vs.client_ip()
asn = avi.utils.get_geo_from_ip(client_ip, "ASN")
geo_header = "not found"
if asn ~= nil then
geo_header = asn
end
avi.http.add_header("Geo", geo_header)

示例 2

    { [“ATTRIBUTE_COUNTRY_CODE“] = “US“,
      [“ATTRIBUTE_COUNTRY_NAME“] = “United States“,
      [“ATTRIBUTE_CONTINENT_NAME“] = “North America“,
      [“ATTRIBUTE_CONTINENT_CODE“] = “NA“,
      [“ATTRIBUTE_LATITUDE“] = “37.3583“,
      [“ATTRIBUTE_LONGITUDE“] = “-122.1081“,
      [“ATTRIBUTE_USER_DEFINED_MAPPING“] = { [1] = “Example Mapping 1“, [2] = “Example Mapping 2", etc. }
    }  

国家/地区代码的长度精确限制为 2 个字符,区域/城市的上限分别为 36 个字符。

avi.utils.ip.netaddr

函数

avi.utils.ip.netaddr(ip_addr, netmask))

描述

接受 IPv4 或 IPv6 IP 地址和网络掩码,并返回网络地址。

事件

HTTP_REQ

HTTP_RESP

参数

  • ip_addr 是包含 IP 地址的字符串。

  • netmask 是包含网络掩码的整数。

返回

If

  • ip_addr 或 mask 为 nil

  • ip_addr 包含“NIL”,或

  • ip_addr 包含无效的 IPv6 或 IPv4 地址,

则函数返回 NIL

否则,函数会返回网络的 IPv6 或 IPv4 地址。

示例

avi.utils.ip.netaddr ("43.225.52.40", 24) 将返回 43.225.52.0

avi.utils.ip.netaddr ("2001:0db8:85a3:0000:0000:8a2e:0370:7334", 53) 将返回 1:2001:db8:85a3::

avi.utils.murmur_hash ()、avi.utils.sha1_hash () 和 avi.utils.md5_hash ()

函数

avi.utils.murmur_hash ( string )avi.utils.sha1_hash ( string )avi.utils.md5_hash ( string )

描述

DataScript 可以使用支持相应命名哈希方法的三个函数之一对任意数据进行哈希处理:MurmurHashSHA-1MD5

事件

HTTP_REQ

HTTP_RESP

参数

string 是要进行哈希的字符串。

返回

已哈希的字符串

示例

请考虑以下 5 行代码片段:

if avi.http.get_path() == "/echo_listen_port" then
 avi.vs.log("Murmur-hash = " .. avi.utils.murmur_hash("How is the weather?"))
 avi.vs.log("SHA1-hash = " .. avi.utils.sha1_hash("How is the weather?"))
 avi.vs.log("MD5-hash = " .. avi.utils.md5_hash("How is the weather?"))
end

curl -vvv http://10.160.33.200/echo_listen_port 的输出如下所示:

[string "DS1"]:2: Murmur-hash = 2050936584
[string "DS1"]:3: SHA1-hash = 0171e8d98bf187af83fe7a9dbbb34ebc6629dcbe
[string "DS1"]:4: MD5-hash = c4150a2ad26a0c6345041f11ba914661

avi.utils.rand_bytes

函数

avi.utils.rand_bytes(num_bytes)

描述

允许用户生成加密安全的随机数据字节。

事件

全部

参数

num_bytes 是介于 0 和 1024 之间的整数。

返回

包含 num_bytes 随机数据字节的字符串。

注:

Lua 将字符串定义为字节序列。因此,对 ASCII 范围内字节有效的操作同样对 ASCII 范围之外的字节有效。打印这些随机字节很可能会显示无法识别的字符。不能依赖诸如 math.random 之类的替代方法来返回加密安全的随机值,例如在创建 UUID 时可能需要的随机值。

示例

在 VS 应用程序日志中记录 8 个随机字节:

random_bytes = avi.utils.rand_bytes(8)
avi.vs.log(random_bytes)

avi.utils.get_ip_reputation

可以通过 Lua 函数在 L7 DataScript 中使用 Webroot 数据库进行 IP 信誉检查。

is_good, reputation_type = avi.utils.get_ip_reputation(ip_addr) 

is_good 的第一个返回值为 true/false。此值指示给定 IP 的信誉是否良好。

第二个返回的值为 IP 信誉类型的位图,只有在 is_goodfalse 才有效。例如,值 1 表示垃圾邮件源(第 0 位集合),值 17 表示 Spam Source and Scanner(第 0 位和第 4 位集合)。

有关更多信息,请参阅VMware NSX Advanced Load BalancerWAF 指南》中的“IP 信誉”主题。

该函数将使用为 VSDataScriptSet 配置的 IP 信誉数据库。

注:

您可以使用 API 或 CLI 将 VSDataScriptSet 配置为使用 IPReputationDB

Lua 函数同时接受 IPv4 和 IPv6 地址。但是,它将始终为 IPv6 地址返回 true,因为 IP 信誉数据库当前仅包含 IPv4 地址信息。

ip_addr 参数的格式应为 avi.vs.client_ip() 返回的格式,这是一种表示格式,例如,1.2.3.4。

message VSDataScriptSet {
  ...
  optional string ip_reputation_db_uuid = 58 [
    (refers_to) = "IPReputationDB",
    ...
  ]
  ...
}

配置工作流

当脚本使用新的 avi.utils.get_ip_reputation(ip_addr) 函数时,应该在 VSDataScriptSet 级别配置 IPReputationDB