我正在尝试通过浏览器访问我的 ftp 服务器,但遇到问题。
如果我使用 Filezilla 访问它,我可以很好地看到目录。但是使用浏览器我没有得到目录列表。
我已将此条目添加到 iptables 希望能解决问题,但它没有改变:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
答案1
简单的解决方案是在连接到该 FTP 服务器时将 Filezilla 切换为使用被动模式。
当您连接到 FTP 时,您使用端口 21,该端口称为控制通道。这是用于发送命令和接收有关所发出命令的结果的通知的连接。请注意,对于文件列表(输出到LIST
)、文件传输(获取文件RETR
和放入文件STOR
)以及其他实际需要传输数据的操作,将创建一个称为数据通道的单独通道。 FTP 可以以主动或被动两种模式操作该数据通道。这两个都指的是数据通道是如何建立的。
You issue a LIST (in active mode)
CLIENT FIREWALL FTP SERVER
_ (port 21) _
__ _ (port 21) |=| ---------- LIST command ---------> |=|
[__]|=| ----- LIST command issued -- > |=| |=|
/::/|_| . |_| <----- FTP server attempts to ---- |_|
`\___ now listening on arbitrary connect and gets denied
port for data channel say 8000 by firewall
在主动模式下,客户端通告它创建的任意侦听端口,并且FTP服务器连接到客户端计算机上的此公布的地址和端口。这通常是防火墙阻止流量的地方,因为它是到通告 FTP 数据通道的客户端主机上的随机(经常变化的)高阶端口号。 Filezilla 默认使用 6000 到 7000 之间的端口。如果防火墙没有阻止此连接,LIST
则命令的输出将通过此单独的通道传输。
You issue a LIST (in passive mode)
CLIENT FIREWALL FTP SERVER
_ (port 21) _
__ _ (port 21) |=| ---------- LIST command ---------> |=|
[__]|=| --- LIST command issued -- > |=| |=|
/::/|_| |_| <--- FTP server advertises the --- |_|
listening data port over \___ server with
the control channel listening data
channel
CLIENT FIREWALL FTP SERVER
_ (port 21) _
__ _ <--- open control channel ---> |=| ---- open control channel ----> |=|
[__]|=| |=| |=|
/::/|_| --- client establishes a ----> |_| ---- passive data channel ----> |_|
connection to the connection allowed
advertised data channel by firewall
在被动模式下,角色颠倒,FTP 客户端在命令PASV
之前发出命令LIST
。这FTP服务器然后创建一个侦听 TCP 端口并通告该端口以供客户端连接以建立数据通道。大多数防火墙通常允许这样做(因为客户端可以与任何端口建立出站连接)。
请注意,如果您的 FTP 服务器和 Internet 之间存在防火墙,则该防火墙还必须配置为打开这些端口以允许被动连接。大多数 FTP 服务器都能够设置公布这些端口的范围,并且可以打开这些端口以允许这些连接。
如果您受到限制并且拥有无法执行被动操作的客户端,Filezilla 提供了此功能(通过“编辑”->“设置...”->“连接/FTP/主动模式”来设置要使用的端口),然后您可以将这些端口添加到您的防火墙。