可以根据 TLS 客户端 Hello 上的 SNI 扩展中的服务器名称对第 4 层应用程序进行负载均衡。DataScript 确保在具有足够的字节以检查 TLS 负载后调用该脚本。在负载均衡完成后,它停止为同一连接中的后续数据包调用 DataScript。
以下是使用 NSX Advanced Load Balancer UI 进行配置的步骤:
过程
- 导航到 。
- 单击创建。将显示新建 DataScript 集窗口。输入名称的值。
- 向下滚动以查看 L4 事件字段。您可以单击导入文件按钮以导入文件。您还可以在描述字段中指定描述。
- 在协议解析程序字段中,从下拉菜单中选择 Default-TLS。该解析程序需要附加到 DataScript,以便脚本可以利用 TLS 解析功能和 API 调用。
- 单击保存。
示例: 示例 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 名称选择池。