FTP基础知识
FTPFile Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTPFTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。


FTP的主动Active,被动Passive是以服务器为主观出发,以下两段话为摘抄。

主动方式的FTP是这样的:客户端从一个任意的非特权端口NN>;1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。 PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:我打开了XXXX端口,你过来连接我。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N>; 1024N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。 PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:我打开了XXXX端口,你过来连接我。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。


以非常著名的开源FTP软件FileZilla为例进行配置,首先确认下服务器上是否已经安装了其他ftp服务器端,以避免ftp端口冲突,确保要配置的端口为空余状态,FTP默认端口为21。filezilla安装很简单,正常点击下一步就可以,安装后启动服务运行。

用FileZillaServer Interface.exe登录后,然后在主界面选择 edit-user。
在 general 选项卡中选择 add,输入账号并点击ok。

然后将password选项勾选,并输入密码。

然后点击左侧 shared folders 设置 ftp 目录,点击 add。

选中本地要作为 ftp 目录的文件夹,确定后按照图中显示将读写等权限添加,添加后点击 ok。

完成配置。ftp可以正常登录。


这时就可以用客户端连接服务器了

下面重点说说发生下列错误服务器应如何配置

响应: 227Entering Passive Mode (115,47,46,131,5,180)

状态: 服务器发回了不可路由的地址。被动模式失败。

错误: 读取目录列表失败

网上说的解决方法:

解决方法:更改Filezilla设置,编辑-设置-连接-FTP-被动模式,将“使用服务器的外部ip地址来代替”改为“回到主动模式”即可。

上面的解决方法不完全,服务器端也需要进行配置


点击edit-settings


选择 Passive mode settings,设置 pasv 模式的端口范围,如果不手动设置分配的是随机端口。设置其他端口,需要保证端口畅通,即确保端口可以使用,并能通过你的防火墙。

如果你的Server端在内网,在路由中设置了DMZ主机或把21号端口映射到公网IP上,那么同样在公网IP上的Client可以使用Active主动Passive被动访问。但如果Client在内网那很有可能无法链接到Server,这个时候就要用Passive被动方式,但如果Server只映射了21号端口,那么Clent虽然可以登陆Server但无法获得列表(LISTPWD)。

为了限制对外开放的PORT端口,主要还是为了方便你映射已知的端口,你需要在FTP服务器上开启“User Custom PortRange”。注意如果服务器在内网,IPv4specific页不要选择Default,可以指定IP或选择Retrieve external IPaddress from: http://ip.filezilla-project.org/ip.php

184730297.jpg这里比如开放8000-8020这么多端口,相应的还要在路由配置,转发规则”->“虚拟服务器中对这几个端口做如21端口一样的映射。

184802739.jpg

图中21端口被我改为了8021,而8000-8020因为只有我一个人在用,所以只开放了8020

这样做之后你的Client不论主动还是被动都可正常访问到。



FTP客户端的注意事项

请注意:选择用PASV方式还是PORT方式登录FTP服务器,选择权在FTP客户端。

一、客户端只有内网IP,没有公网IP

从上面的FTP基础知识可知,如果用PORT方式,因为客户端没有公网IPFTP将无法连接客户端建立数据链路。因此,在这种情况下,客户端必须要用PASV方式,才能连接FTP服务器。大部分人登录不上,典型的错误原因就是因为客户端没有公网IP,但用了IE作为FTP客户端来登录(IE默认使用PORT方式)。

二、客户端有公网IP,但安装了防火墙

如果用PASV方式登录FTP服务器,因为建立数据链路的时候,是由客户端向服务器发送连接请求,没有问题。反过来,如果用PORT方式登录FTP服务器,因为建立数据链路的时候,是由服务器向客户端发送连接请求,此时连接请求会被防火墙拦截。如果要用PORT方式登录FTP服务器,请在防火墙上打开1024以上的高端端口。

三、常见的FTP客户端软件PORT方式与PASV方式的切换方法。

大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。

在大部分FTP客户端的设置里,常见到的字眼都是“PASV”被动模式,极少见到“PORT”主动模式等字眼。因为FTP的登录方式只有两种:PORTPASV,取消PASV方式,就意味着使用PORT方式。

IE
工具 -> Internet选项 -> 高级 -> “使用被动FTP”(需要IE6.0以上才支持)。如果找不到这个选项,请看图片。

CuteFTP
Edit -> Setting -> Connection -> Firewall -> “PASV Mode”

File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode”

FlashGet
工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式

FlashFXP
选项 -> 参数选择 -> 代理/防火墙/标识 -> “使用被动模式

站点管理 -> 对应站点 -> 选项 -> “使用被动模式

快速连接 -> 切换 -> “使用被动模式

LeechFTP
Option -> Firewall -> Do not Use

请尽量不要用IE作为FTP客户端

IE只是个很粗糙的FTP客户端工具。首先,IE6.0以下的版本不支持PASV方式;其次,IE在登录FTP的时候,看不到登录信息。在登录出错的时候,无法找到错误的原因。