无法连接到 Vsftpd 服务器-使用不可路由的地址进行被动回复

无法连接到 Vsftpd 服务器-使用不可路由的地址进行被动回复

我在 ubuntu 服务器上安装了 Vsftpd 服务器,监听端口 21。我在路由器中转发了一个端口,将外部端口 8500 转发到 vsftpd 服务器正在监听的内部端口 21。但是,当我尝试使用 ftp 客户端进行连接时,我在 filezilla 中看到以下消息:

“服务器发送了带有不可路由地址的被动回复。改用服务器地址”

我读到过,这与路由器后面有关。但我从未遇到过其他路由器的问题。为什么我使用一个路由器时可以从外部访问 ftp,而使用另一个路由器时却不能?

答案1

听起来您的路由器设置为执行网络地址转换 (NAT)。简单来说,NAT 所做的就是更改 IP 数据包报头中的 IP 地址。大多数 NAT 实现还执行端口地址转换,其中 UDP 和 TCP 报头中的端口号也会被修改。即使我假设端口地址转换也在进行中,我也会单独使用 NAT 这个术语。

NAT 本身无法很好地支持某些协议。FTP 就是一个可以被 NAT 破坏的协议。路由器被设置为一种启用了 NAT 的防火墙是很常见的。一些路由器为其 NAT 添加了功能,使其能够使用通常不支持 NAT 的协议(再次强调,例如 FTP)。

FTP 和简单的基本 NAT 的问题:

使用您的示例,您的 ftp 客户端将 FTP 数据包发送到路由器的 IP 地址作为其目的地(在您的例子中,端口 8500 是目标端口)。您的路由器接收该数据包并转换目标 IP 地址以匹配您的 vsftpd 服务器 IP,然后将数据包发送到您的 vsftpd 服务器。这很好。对于从您的 vsftpd 服务器返回 ftp 客户端的数据包,情况正好相反(在这种情况下,路由器通过删除您的 vsftpd 服务器的 IP 并插入其自己的 IP 来修改源 IP 地址,然后将数据包发送到客户端)。当您使用必须传输数据的 FTP 命令时,就会出现问题(例如 put 或 get - 我不确定 filezilla 将这些命令称为什么)。当您尝试传输数据时(在被动模式下 - 这非常流行),服务器会将其 IP 地址和端口号发送到 FTP 客户端。此信息是 FTP 连接中数据的一部分,而不是 TCP/IP 标头本身的一部分。因此,一个简单的基本 NAT 路由器将允许此信息从服务器发送到客户端。然后,客户端将看到此信息,但无法理解服务器所说的 IP 地址。通常,这会完全中断 FTP 传输,但是 filezilla 似乎试图弥补这个问题(您的回答中没有明确 filezilla 是否成功传输)。

现在,一个可以执行 NAT 并支持某些非 NAT 友好协议(如 FTP)的路由器实际上会检查 FTP 命令连接内的数据并修改其中的 IP 和端口号。这实际上是一个额外的功能,是 NAT 的扩展,但许多路由器和防火墙都支持此功能。我猜你的路由器要么不支持此功能,要么没有配置此功能。

一些命令行 FTP 客户端允许您通过激活“调试”功能查看部分信息交换。这对于尝试了解这一切的工作原理非常有帮助。

相关内容