![无法从外部主机连接到 FTP 服务器](https://linux22.com/image/1227658/%E6%97%A0%E6%B3%95%E4%BB%8E%E5%A4%96%E9%83%A8%E4%B8%BB%E6%9C%BA%E8%BF%9E%E6%8E%A5%E5%88%B0%20FTP%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我在 Linux 机器(Ubuntu 服务器)上设置了一个 FTP 服务器(vsftpd)。当我尝试连接到同一网络上的计算机时,一切都按预期正常进行。
但是一旦 IP 是外部的,它就不会连接..
我首先认为端口被阻塞了,但是后来:
localserver:$ sudo tail -f /var/log/vsftpd.log
Wed Jan 13 14:21:17 2010 [pid 2407] CONNECT: Client "xxx.xxx.107.4"
remotemachine:$ netcat svn-motion.no-ip.biz 21
220 FTP Server
然后它就挂在那里了。除了 21 之外,还有其他端口需要打开吗?
答案1
当将 FTP 服务器置于 NAT 之后时,您不仅需要将端口 21/TCP 转发到服务器,还需要一个具有 FTP自适应网格网关支持 NAT 后面的 FTP 服务器(注意:这是一个罕见的功能,很少在包装盒或技术规格页面甚至手册中宣传),并且知道监视 FTP 控制数据流以获取来自客户端的命令,这些命令表明客户端希望 FTP 服务器使用被动模式(FTP 服务器开始侦听另一个端口上的数据 TCP 连接,将该端口号发送给客户端,并被动等待客户端启动与服务器的数据 TCP 连接)。FTP ALG 必须监视服务器告诉客户端连接的端口,然后自动创建临时端口转发条目以允许该连接到达服务器。
基本上,被动模式 FTP,当客户位于 NAT 后面,当服务器位于 NAT 后面。如果事实证明您的客户端不在 NAT 后面,则告诉您的客户端使用传统的“主动”模式 FTP,并且您不需要在 NAT 网关中安装复杂的“NAT 后面的服务器”FTP ALG。
另一个选择是将 FTP 服务器设为 DMZ 主机(又称“默认主机”、“堡垒主机”)。由于所有意外传入的连接尝试都会转发到 DMZ,因此所有这些被动模式 FTP 数据 TCP 连接都会自动转到您的 FTP 服务器。
答案2
如果服务器位于任何类型的防火墙后面,您可能需要确保远程机器正在使用 FTP 被动模式。
答案3
您是否尝试从内部计算机连接到服务器的外部 IP?如果是这样,并且您正在使用 NAT 配置中的典型家用路由器,那么问题实际上可能出在路由器上。
假设您已将路由器配置为将 FTP 转发到 Ubuntu 服务器,并且您正在尝试测试这是否有效。但是当您直接从内部网络测试外部 IP 时,您的路由器必须支持“发夹”路由。您的路由器必须从内部的主持人,通过外部的IP,回到外部的IP,最后转发回你的服务器的内部的IP——全部位于同一设备上。大多数消费级路由器都无法正确处理这种情况。
因此您需要从真实的外部主机进行测试。您有几种选择:
- 使用互联网端口测试服务,例如你可以看到我吗。
- 通过代理发送测试流量。
- 让朋友从他们的网络进行测试。
- 找到一家有 WiFi 的当地咖啡店并在那里进行测试。