我正在尝试在 Fedora 25 上设置一个可通过互联网访问的加密 FTP 服务器,使用 VSFTPD 作为服务器程序。尽管一切设置似乎都正确无误,但当启用加密时,我永远无法从 LAN 外部连接到服务器。但是,如果我禁用加密或从 LAN 内部连接,则可以连接。
我遇到的问题是 VSFTPD 服务器在收到来自客户端的 AUTH 命令后无法完成 SSL 握手。使用 Wireshark,我可以看到服务器正在尝试多次发送看起来像握手响应的内容。
如果有帮助,以下是 Wireshark 的客户端尝试连接服务器的报告:
From Info
------ ----
Client 64423 → 21 [ACK] Seq=1 Ack=1 Win=13952 Len=0 TSval=996262 TSecr=3062736173
Server Response: 220 (vsFTPd 3.0.3)
Client 64423 → 21 [ACK] Seq=1 Ack=21 Win=13952 Len=0 TSval=996281 TSecr=3062736371
Client Request: AUTH TLS
Server 21 → 64423 [ACK] Seq=21 Ack=11 Win=29056 Len=0 TSval=3062736436 TSecr=996282
Server Response: 234 Proceed with negotiation.
Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062736822 TSecr=996282
Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282
Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282
Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282
...
其他信息:我已将 VSFTPD 配置为使用 TLSv1 或更高版本,以被动模式和显式 FTPS 工作,并使用自签名 RSA 证书。我认为我的证书没有问题,因为我可以使用相同的证书来托管带有 httpd 的 https 服务器,我可以从 LAN 外部正常访问该服务器。因此,问题一定与 VSFTPD 有关。
我还设置了路由器和防火墙,以转发和接受端口 21 以进行 ftp 控制端口连接。我还设置了 VSFTPD,以将端口 2048 设置为唯一的 PASV 数据端口,但出于某种原因,我不需要在路由器上转发该端口以让未加密的 FTP 连接正常工作……此外,我遇到的故障发生在数据端口参与之前。
有人知道如何解决这个问题吗?我在这里遗漏了什么明显的东西吗?
答案1
Server Response: 234 Proceed with negotiation. Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062736822 TSecr=996282
您看到的不是 TLS 握手。TLS 握手将由客户端启动,但这里的情况并非如此。您看到的是服务器的最后一个响应的重新传输,即234 Proceed with negotiation.\r\n
正好是 31 个字节。
这意味着服务器没有收到客户端对此响应的任何 ACK,因此它正在重新传输它,即 TCP 连接在丢失 ACK 时的常见行为。
问题是为什么服务器没有收到 ACK。从您的问题中无法清楚看出数据包捕获是在客户端还是服务器端完成的,但我假设是在服务器端完成的。在这种情况下,我猜想客户端和服务器之间有防火墙篡改了连接:
由于 FTP 是一种以动态端口为特征的数据传输协议,并且这些动态端口在控制连接内交换,因此防火墙需要以明文形式访问控制连接,以便找出使用了哪些动态端口并打开这些端口。如果控制连接已加密(AUTH TLS),则不再可能,因此某些防火墙会尝试明确或无意地阻止使用 TLS。您看到的结果可能是此操作的结果。