我刚刚使用最新版本的 FileZilla 服务器设置了一个 FTP 服务器。我设置了一个用户并为他们提供了一个主目录。如果我通过 127.0.0.1:21 或 192.168.1.42:21(我的本地 IP)连接到服务器,则可以上传和下载文件,并且一切正常。但是,当我通过我的外部域名 www.suchipi.com:21 连接时,服务器连接成功但目录列表失败。我以为这可能是我设置 A 记录的方式错误,但通过 75.70.128.37:21 连接到我的外部 IP 也会导致同样的问题。端口 21 是唯一转发的端口。我需要进一步添加其他端口吗?
答案1
您还需要打开端口 20/TCP 以允许数据连接的流量。配置为使用被动模式时,FTP 客户端将使用此端口。
答案2
如果您的防火墙具有 FTP 协议连接跟踪功能(如ip_conntrack_ftp
来自ip_nat_ftp
netfilter),那么您只需加载适当的模块和/或指定您允许 FTP 协议(不仅仅是端口 21)。
如果防火墙不支持 FTP 协议,那么唯一的选择就是配置 FTP 服务器以允许被动模式客户端。为此,您需要允许 TCP 端口 21 用于控制连接,TCP 端口 20 用于数据连接。数据连接用于列出文件夹和进行文件传输。
答案3
我还需要进一步访问其他端口吗?
是的,你需要 - 而且没有静态列表。FTP 有一个非常严重的问题:在主动模式下,服务器将通过随机 (!) 端口连接到 (!) 客户端。你需要从命令流中获取端口号。基本上,你说“列表”,服务器就会尝试通过随机端口打开与客户端的 TCP 连接以发送列表。哎哟。
这就是为什么您可以将客户端置于被动模式,这意味着所有连接都是从客户端打开的,但即便如此,您仍然需要转发其他端口号。
一般来说,FTP 诞生于没有人考虑过防火墙的时代 - 并且有人做出了错误的决定,让服务器与客户端建立了主动连接。
如果您不使用 PORT FORWARD,而是使用知道如何转发 FTP(即不仅仅是 TCP 会话,还处理 TCP 会话的内容并转换端口号等)的适当路由器/防火墙,效果会好得多。几乎每个合理的防火墙都应该能够做到这一点 - 即使是 Linux 防火墙,您只需要远离“愚蠢的”tcp 转发。
有一些解释,也针对可能出现的问题——正如你所看到的,要实现这一点很麻烦。
一般来说,很抱歉,在这种情况下最好不要使用 FTP。
答案4
启用被动模式。将它们设置为一组端口范围(一些随机的高端口,20000-22000 fe)。不要忘记在防火墙上打开这些端口,并将它们与端口 20 一起转发到路由器上。