可以根据 TLS 客户端 Hello 上的 SNI 扩展中的服务器名称对第 4 层应用程序进行负载均衡。DataScript 确保在具有足够的字节以检查 TLS 负载后调用该脚本。在负载均衡完成后,它停止为同一连接中的后续数据包调用 DataScript。

以下是使用 NSX Advanced Load Balancer UI 进行配置的步骤:

过程

  1. 导航到模板 > DataScript
  2. 单击创建。将显示新建 DataScript 集窗口。输入名称的值。
  3. 向下滚动以查看 L4 事件字段。您可以单击导入文件按钮以导入文件。您还可以在描述字段中指定描述。
  4. 协议解析程序字段中,从下拉菜单中选择 Default-TLS。该解析程序需要附加到 DataScript,以便脚本可以利用 TLS 解析功能和 API 调用。
  5. 单击保存

示例: 示例 DataScript

需要选择 Default-TLS 协议解析程序。通过将该 DataScript 与虚拟服务相关联,DataScript 将检查来自客户端的第一个 TLS 数据包(理想情况下是客户端 Hello)。

local avi_tls = require "Default-TLS"
-- Buffer minimum of 20 bytes of data
buffered = avi.l4.collect(20)
-- Read the gathered payload
payload = avi.l4.read()
-- Obtain the length of the payload
len = avi_tls.get_req_buffer_size(payload)
if ( buffered < len ) then
-- Wait till len bytes are collected at TCP layer
  avi.l4.collect(len)
end
-- Verify if client hello and handshake.
if ( avi_tls.sanity_check(payload) ) then
-- Parse the TLS payload
   local h = avi_tls.parse_record(payload)
-- Obtain the SNI name
   local sname = avi_tls.get_sni(h)
   if sname == nil then
      avi.vs.log('SNI not present')
      avi.vs.close_conn()
   else
      avi.vs.log("SNI=".. sname)
      avi.vs.persist(sname)
   end
else
   avi.vs.close_conn()
end
-- Stop invoking DataScript after the first payload.
avi.l4.ds_done()
avi_tls = nil

例如,SNI 名称是通过解析 TLS 负载获取的。

avi_tls.parse_record 解析负载,并使用帮助程序 API avi_tls.get_sni(h) 获取 SNI 名称。该 SNI 名称现在可用于选择池服务器或进行负载均衡,并为其创建一个持久性条目。或者,也可以使用该名称通过 avi.pool.select("pool_name") 选择特定的池。

注:

池名称和 SNI 名称不必相同,但对于某些用例,SNI 名称可能与池名称相同以根据 SNI 名称选择池。