由于协议的实现方式,为 FTP 启用 Spectrum 并不简单。本指南概述了 FTP 的复杂性以及在什么情况下您可以为您的 FTP 服务启用 Spectrum。
FTP 利用两个不同的套接字,一个用于发出命令,另一个用于实际数据传输。控制套接字负责用户登录和发送命令,数据套接字则是实际传输目录列表和文件的地方。
客户端和服务器可以通过两种方式建立数据套接字:主动(active)和被动(passive)。在主动模式下,服务器返回连接到客户端指定的端口,这可能会在客户端位于 NAT 后面时产生问题。另一种选择是被动模式,服务器打开一个额外的端口,然后客户端连接到该端口。有关主动与被动 FTP 的概述,请参阅 Active FTP vs. Passive FTP, a Definitive Explanation ↗。
在被动模式下,FTP 服务器通过控制套接字上的 PASV 命令传送客户端应该连接的端口。默认情况下,FTP 服务器以其监听的 IP 地址进行响应。这种情况对于直接运行在面向公众的 IP 上的服务器来说是可以的,但是当服务器位于 NAT、防火墙或 Cloudflare Spectrum 后面时,就会产生问题。
或者,更现代的 FTP 服务器软件支持 FTP 扩展 ↗,其中引入了 EPSV 命令,省略了客户端应连接的 IP 地址。相反,客户端会连接到控制平面连接的同一 IP。
Spectrum 仅能够在被动模式下保护提供 FTP 流量的服务器。不支持主动模式,因为源服务器将 Spectrum IP 视为客户端,而不是实际客户端 IP。当客户端使用自己的 IP 发出 PORT 命令时,FTP 服务器会拒绝,因为这两个地址不匹配。
与 EPSV 结合使用的被动模式无需进行源站配置即可开箱即用。请注意,客户端也必须支持 EPSV 才能起作用。具有 PASV 的传统被动模式是可行的,只需最少的源站侧配置(请参阅下文,使用 Spectrum 保护 FTP 服务器)。
配置 Spectrum 以保护您的 FTP 服务器需要创建一组指向源站的 Spectrum 应用程序,以及 FTP 服务器上的一些配置。
默认情况下,控制平面在端口 21 上运行,并且不需要进行任何特殊操作来保护 FTP 服务器的这一部分。在以下示例中,将 198.51.100.1 替换为源服务器的 IP。
此配置将入站连接代理到源站。但是,如果客户端发出 PASV 命令,他们仍将收到实际源站 IP 以进行数据连接。这是不可取的,因为这会将源站 IP 暴露给客户端,而不是隐藏在 Spectrum 后面。阻止这种情况的步骤记录在下面的部分中。
大多数 FTP 服务器允许配置服务器将用于打开数据连接的端口范围。建议指定端口范围以防止意外暴露服务器上的其他端口。对于范围内的每个端口,创建映射到该端口的相应 Spectrum 应用程序。
此外,需要配置 FTP 服务器,以便在客户端发出 PASV 命令时公开正确的 IP。此 IP 应与 Spectrum 应用程序的 IP 匹配。
某些 FTP 服务器还允许动态解析主机名。在这种情况下,建议使用 Spectrum 应用程序 URL 而不是 IP。
vsftpd ↗ 的示例配置:
pasv_min_port=20000 pasv_max_port=20020 pasv_enable=YES pasv_address=ftp.example.com pasv_addr_resolve=YES pasv_promiscuous=YES
要使用 Spectrum TCP 代理和保护 FTPS(尤其是 ProFTPD),建议使用以下示例配置:
- 控制端口:端口 21
- 数据端口:端口范围 50000-50500
在 ProFTPD 服务器端使用以下示例配置:
MasqueradeAddress:www.example.comAllowForeignAddress:您可以使用选项on来允许所有 IP,但建议仅允许 Cloudflare IP。PassivePorts:50000-50500
有关更多详细信息,请参阅 ProFTPD 文档 ↗。
与 FTP 或 FTPS 不同,为 SFTP 启用 Spectrum 不需要额外的配置。在设置 SSH 的 Spectrum 应用程序时,选择端口 22 和 TCP。
参阅 Microsoft Windows IIS 文档 ↗以配置静态数据端口范围和与您的 Spectrum 应用程序匹配的外部 IP。
此外,IIS 要求 FTP 控制连接和数据连接的源 IP 是相同的。但是,当使用 Spectrum 时,可能无法满足此要求,因为两个连接通常在不同的服务器上终止,这些服务器具有各自唯一的出口 IP。为确保功能正常,还需设置 dataChannelSecurity/matchClientAddressForPasv = false。参阅 Microsoft Windows IIS FTP 官方指南 ↗以了解更多详细信息。