3.5. 配置 FTP
文件传输协议(FTP)是一款老旧且复杂的多端口协议,对负载平衡器环境构成了一系列截然不同的挑战。要了解这些挑战的性质,您必须首先了解 FTP 如何工作的一些关键事项。
3.5.1. FTP 的工作原理
对于大多数其他服务器客户端关系,客户端计算机会打开与特定端口上的服务器的连接,然后服务器在该端口上响应客户端。FTP 客户端连接到 FTP 服务器时,它会打开与 FTP 控制端口 21 的连接。然后,客户端告知 FTP 服务器是建立 主动连接还是 被动连接。客户端选择的连接类型决定了服务器如何响应以及将发生哪些端口事务。
两种类型的数据连接是:
- 活跃连接
- 建立活动连接时,服务器会打开与客户端的数据连接,从端口 20 到客户端计算机上的高范围端口。然后,服务器中的所有数据都会通过此连接传递。
- 被动连接
- 建立被动连接时,客户端会询问 FTP 服务器建立被动连接端口,该端口可以位于超过 10,000 的端口上。服务器随后为此特定会话绑定到此高编号的端口,并将该端口号转发回客户端。然后,客户端打开用于数据连接的新绑定端口。客户端发出的每一项数据请求都会产生独立的数据连接。大多数现代 FTP 客户端在从服务器请求数据时尝试建立被动连接。
注意
客户端决定连接的类型,而非服务器。这意味着有效集群 FTP,您必须配置 LVS 路由器以处理主动和被动连接。
FTP 客户端-服务器关系可能会打开 Keepalived 的大量端口。
3.5.2. 这如何影响负载平衡器路由
IPVS 数据包转发仅允许基于该集群的端口号或其防火墙标记来回连接。如果来自集群外部的客户端试图打开一个端口 IPVS 未配置为处理,它会丢弃连接。同样,如果实际服务器尝试在端口 IPVS 上打开回互联网的连接,它会丢弃连接。这意味着,来自 Internet 上的 FTP 客户端的所有连接 都必须分配有相同的防火墙标记,并且所有来自 FTP 服务器的连接都必须使用网络包过滤规则正确转发到 Internet。
注意
要启用被动 FTP 连接,您必须加载
ip_vs_ftp
内核模块。在 shell 提示符下以管理用户身份运行以下命令来载入此模块,并确保模块在重启时载入:
echo "ip_vs_ftp" >> /etc/modules-load.d/ip_vs_ftp.conf systemctl enable systemd-modules-load systemctl start systemd-modules-load
3.5.3. 创建网络数据包过滤规则
在为 FTP 服务分配任何 iptables 规则前,请查看 第 3.4 节 “多端口服务和负载平衡器 ” 中有关多端口服务和用于检查现有网络数据包过滤规则的技术中的信息。
以下是将同一防火墙标记
21
分配给 FTP 流量的规则。
3.5.3.1. Active Connections 规则
活跃连接的规则告诉内核接受并转发到端口
20
(FTP 数据端口)上 内部 浮动 IP 地址的连接。
以下 iptables 命令允许 LVS 路由器接受来自 IPVS 不知道的实际服务器的传出连接:
/usr/sbin/iptables -t nat -A POSTROUTING -p tcp -s n.n.n.0/24 --sport 20 -j MASQUERADE
在 iptables 命令中,n.n.n 应替换为
keepalived.conf
文件定义了 virtual_server
部分的 NAT 接口内部网络接口的前三个值。
3.5.3.2. 被动连接规则
被动连接的规则为从互联网到服务浮动 IP 地址的连接分配适当的防火墙标记:10,000 到 20,000。
警告
如果要限制被动连接的端口范围,还必须配置 FTP 服务器
vsftpd
以使用匹配的端口范围。这可以通过在 /etc/vsftpd.conf
中添加以下行来实现:
pasv_min_port=10000
pasv_max_port=20000
不应使用将 pasv_address
设置为覆盖实际 FTP 服务器地址,因为它已更新为 LVS 的虚拟 IP 地址。
有关其他 FTP 服务器的配置,请参阅相应的文档。
这个范围应该足以满足大多数情况的影响。但是,您可以通过在以下命令将
10000:20000
改为 1024:65535
,将这个数字增加到包含所有可用的非安全端口。
以下 iptables 命令效果为为相应端口上浮动 IP 地址分配任何流量,其防火墙标记为
21
,后者由 IPVS 识别并适当转发:
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n/32 --dport 21 -j MARK --set-mark 21
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n/32 --dport 10000:20000 -j MARK --set-mark 21
在 iptables 命令中,n.n.n.n.n 应替换为
keepalived.conf
文件的 virtual_server
子部分中定义的 FTP 虚拟服务器的浮动 IP。
上述命令将立即生效,但不会在系统重启后继续生效,除非已保存。要保存更改,请输入以下命令:
# iptables-save > /etc/sysconfig/iptables
要确保 iptables 服务在系统启动时启动,请输入以下命令:
# systemctl enable iptables
您可以运行以下命令来验证更改是否在重启后保留,并检查更改是否仍然存在:
# systemctl restart iptables