本节介绍了配置 NSX Advanced Load Balancer 虚拟服务以对被动 FTP 进行负载均衡。

在被动 FTP 中,客户端在端口 21 上向服务器发送 PASV 命令。服务器使用要连接到的服务器 IP 地址数据端口(大于 1023)进行响应。在将负载均衡器上的虚拟 IP 用于被动 FTP 时,必须将服务器 IP 更改为负载均衡器上的虚拟 IP,以便客户端连接到负载均衡器而不是直接连接到服务器。可以使用一个 DataScript 将服务器 IP 更改为服务器响应的 FTP 负载中配置的虚拟 IP。

配置 NSX Advanced Load Balancer

要配置 NSX Advanced Load Balancer 以对被动 FTP 进行负载均衡,请执行以下步骤:

  1. 为 FTP 配置运行状况监控器

  2. 使用所需的 FTP 服务器配置池

  3. 为 FTP 配置第 4 层响应 DataScript

  4. 为第 4 层虚拟服务配置数据通道的端口配置

配置运行状况监控器

要为 FTP 配置外部运行状况监控器,请在 NSX Advanced Load Balancer UI 上导航到模板 > 配置文件 > 运行状况监控器,然后单击创建

  • 输入运行状况监控器的名称。

  • 单击类型下拉菜单,然后选择“外部”。

  • 发送间隔字段中输入相关的值。

外部设置下面:

  • 运行状况监控器端口字段中输入端口号 21。

  • 脚本代码部分中,为 FTP 运行状况监控器粘贴以下 Bash 脚本。

#!/bin/bash
    curl -s ftp://$IP/$path --ftp-pasv -u $user:$pass
  • 脚本变量部分中,输入用户名密码文件路径



文件路径是要在运行状况监控器中检查的文件的绝对路径。curl 使用向池中的服务器提供的用户名和密码打开 FTP 连接,并请求提供的路径中的目录列表。curl 以静默模式运行(由 -s 选项指定);只有在文件路径中存在文件并且运行状况监控器通过检查时,才会返回目录列表输出。如果在文件路径中不存在文件,运行状况监控器将失败。路径是可选的;如果未指定,curl 将检索根目录列表。

配置池

要配置具有所需 FTP 服务器的池,请在 NSX Advanced Load Balancer UI 上导航到应用程序 > ,然后单击创建池

  • 输入池的名称。

  • 在“默认服务器端口”字段中输入端口号 21。

  • 负载均衡下面,选择一致哈希 > 源 IP 地址

可以选择具有源 IP 地址的一致哈希以作为负载均衡算法,从而避免在将虚拟服务扩展到多个服务引擎时每个 SE 选择不同的服务器。

  • 单击 + 添加主动监控器,然后从下拉菜单中选择在上一步中配置的运行状况监控器 - FTP。



  • 导航到服务器选项卡并添加相关的服务器。

  • 导航到高级选项卡。

  • 其他设置下面,单击禁用端口转换复选框以启用该选项。

将在临时端口上建立 FTP 数据通道,并且必须使用该端口将流量发送到服务器,而不进行任何修改。因此,必须启用 禁用端口转换

配置 DataScript

要配置第 4 层响应 DataScript,请在 NSX Advanced Load Balancer UI 上导航到模板 > 脚本 > DataScript,然后单击创建

将以下 DataScript 添加到 VS Datascript 事件 L4 响应事件脚本部分中,然后单击保存

-- Handle passive FTP 227 response rewrite (server IP to VIP)
function string.tohex(str)
	return (str:gsub('.', function (c)
    	return string.format('%02X', string.byte(c))
	end))
end
-- Do not run DS for data ports
if avi.vs.port() ~= '21' then
	avi.l4.ds_done()
end
-- Read entire payload (assumption that entire response we are looking for is a single packet)
local payload = avi.l4.read()
local p1, p2 = string.match(payload, '227 Entering Passive Mode %(%d+,%d+,%d+,%d+,(%d+),(%d+)%)%.\r\n')
if p1 ~= nil then
	local vip_ip = string.gsub(avi.vs.ip(), '%.', ',')
	local rewrite = '227 Entering Passive Mode (' .. vip_ip .. ',' .. p1 .. ',' .. p2 ..').\r\n'
	avi.l4.modify(string.tohex(rewrite))
	rewrite_len = rewrite:len()
	payload_len = payload:len()
	if rewrite_len < payload_len then
    	avi.l4.discard(payload_len-rewrite_len, rewrite_len)
	end
end


配置虚拟服务

要在 NSX Advanced Load Balancer UI 上为 FTP 配置第 4 层虚拟服务,请执行以下操作:

  1. 导航到应用程序 > 虚拟服务,单击创建虚拟服务,然后选择高级设置

  2. 配置文件下面:

    1. 对于应用程序配置文件,单击下拉列表并选择 System-L4-Application。

    2. 对于 TCP/UDP 配置文件,单击下拉列表并选择 System-TCP-Proxy。

  3. 服务端口下面,单击切换到高级

  4. 服务下面,输入端口范围 1024-65534。

    注:

    从安全角度看,建议指定在 FTP 服务器上配置的特定被动端口范围,并在“虚拟服务”下面配置该端口范围,而不是配置完整范围的高端口。

  5. 下面,单击下拉列表并选择配置的池 - FTP。



  6. 单击下一步

  7. 策略选项卡中的 DataScript 下面,单击 + 添加 DataScript。从下拉列表中,选择在上一节中配置的 DataScript - FTP-DataScript。

  8. 单击保存 DataScript



  9. 单击下一步以导航到下两个选项卡,并保存配置。

附加配置

FTP 服务器可以强制控制和数据连接源自同一 IP。因此,对控制流量和数据流量进行负载均衡的服务引擎必须是相同的。可以在活动/备用高可用性模式下部署服务引擎以实现该目的。

对于具有本机第 2 层扩展的活动/活动模式部署,为了确保相同的服务引擎使用 FTP 服务器对流量进行负载均衡,请使用 CLI 在虚拟服务上配置以下内容:

[admin:10-10-10-1]: > configure virtualservice virtual-service-name
[admin:10-10-10-1]: virtualservice> flow_dist consistent_hash_source_ip_address
[admin:10-10-10-1]: virtualservice> save
注:

在使用 BGP/ECMP 扩展时,就像在 Azure 或 GCP 上的 FTP 负载均衡部署中一样,流量将根据在上游设备上完成的路由哈希到达服务引擎。因此,上述 CLI 配置不适用于 BGP/ECMP 扩展。

虚拟服务现已准备好对 FTP 进行负载均衡。客户端的 FTP 服务器 IP 将是在 FTP 虚拟服务上配置的 VIP。