这些日子网络上病毒闹得特别厉害,IDC的2000 adv server的服务器有的经不起病毒木马折腾的也都罢了工。把一批服务器系统升级到2003为了安全启动了Windows 防火墙,在此情况下装了SERV-U就出现了问题,每次连接FTP服务器的时候就会提示“打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。”这是什么问题呢?把Windows 防火墙关闭后尝试连接没有问题,一旦启用防火墙就会出现上面的提示。我判断问题应该出现在防火墙的设置上面,于是我进行了如下的两步操作:
1、在Windowns 防火墙的例外选项卡中添加了TCP的21和20端口。
2、在例外选项卡中把ServUAdmin.exe这个程序添加了进去。
结果都没有效果,我开始有些糊涂了,我做的有什么不对的吗?再用WFetch察看了连接FTP服务器的过程发现每次连接实际上都已经通过了身份验证但就是无法进行比如list的指令,也就进入不了用户目录。应该从FTP的原理或者FTP协议上找找原因了。
FTP文件传送协议(File Transfer Protocol,简称FTP)。
在一个FTP会话中,该用户必须提供正确的账户信息才能访问远程的FTP服务器。用户通过一个FTP用户代理工具(常用的CuteFTP、LeapFTP、IE甚至系统自带的命令行下的FTP工具)与FTP服务器端交互。首先提供一个远程主机的主机名,这使得本地主机中的FTP客户进程建立一个与远程主机中的FTP服务器进程之间的连接。用户接着提供用户名和口令,这些信息将作为FTP命令参数经由TCP连接传送到服务器。服务器批准之后,该用户就在本地文件系统和远程文件系统之间拷贝文件。
HTTP和FTP都是文件传送协议,它们有许多共同的特征,譬如说都运行在TCP之上。不过这两个应用层协议之间存在重要的差别。最重要的差别是FTP使用两个并行的TCP连接来传送文下一节件,一个是控制连接,一个是数据连接。控制连接用于在客户主机和服务器主机之间发送控制信息,例如用户名和口令、改变远程目录的命令、取来或放回文件的命令。数据连接用于真正发送文件。既然TCP使用一个独立的控制连接,FTP在带外(out-of-band)发送控制信息的。另外,用于控制音频和视频等持续媒体数据之传送的RTSP协议也是在带外发送控制信息的。HTTP中,同一个TCP连接既用于承载请求和响应头部,也用于承裁所传送的文件,因此我们说HTTP在带内(in-band)发送控制信息。一句话FTP是有状态的而HTTP是无状态的。
当用户启动与远程主机间的一个FTP会话时,FTP客户首先发起建立一个与FTP服务器端口号21之间的控制TCP连接,然后经由该控制连接把用户名和口令发送给服务器。客户还经由该控制连接把本地临时分配的数据端口告知服务器,以便服务器发起建立一个从服务器端口号20到客户指定端口之间的数据TCP连接;为便于绕过防火墙,较新的FTP版本允许客户告知服务器改由客户来发起建立到服务器端口号20的数据TCP连接。用户执行的一些命令也由客户经由控制连接发送给服务器,例如改变远程目录的命令。当用户每次请求传送文件时(不论哪个方向),FTP将在服务器端口号20上打开一个数据TCP连接(其发起端既可能是服务器,也可能是客户)。在数据连接上传送完本次请求需传送的文件之后,有可能关闭数据连接,到再有文件传送请求时重新打开。因此在FTP中,控制连接在整个用户会话期间一直打开着,而数据连接则有可能为每次文件传送请求重新打开一次(即数据连接是非持久的)。
在整个会话期间,FTP服务器必须维护关于用户的状态。具体地说,服务器必须把控制连接与特定的用户关联起来,必须随用户在远程目录树中的游动跟踪其当前目录。为每个活跃的用户会话保持这些状态信息极大地限制了FTP能够同时维护的会话数。无状态的HTTP却不必维护任何用户状态信息。
协议结构
命令 描述
ABOR 中断数据连接程序
ACCT <account> 系统特权帐号
ALLO <bytes> 为服务器上的文件存储器分配字节
APPE <filename> 添加文件到服务器同名文件
CDUP <dir path> 改变服务器上的父目录
CWD <dir path> 改变服务器上的工作目录
DELE <filename> 删除服务器上的指定文件
HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目录则列出文件列表
MODE <mode> 传输模式(S=流模式,B=块模式,C=压缩模式)
MKD <directory> 在服务器上建立指定目录
NLST <directory> 列出指定目录内容
NOOP 无动作,除了来自服务器上的承认
PASS <password> 系统登录密码
PASV 请求服务器等待数据连接
PORT <address> IP 地址和两字节的端口 ID
PWD 显示当前工作目录
QUIT 从 FTP 服务器上退出登录
REIN 重新初始化登录状态连接
REST <offset> 由特定偏移量重启文件传递
RETR <filename> 从服务器上找回(复制)文件
RMD <directory> 在服务器上删除指定目录
RNFR <old path> 对旧路径重命名
RNTO <new path> 对新路径重命名
SITE <params> 由服务器提供的站点特殊参数
SMNT <pathname> 挂载指定文件结构
STAT <directory> 在当前程序或目录上返回信息
STOR <filename> 储存(复制)文件到服务器上
STOU <filename> 储存文件到服务器名称上
STRU <type> 数据结构(F=文件,R=记录,P=页面)
SYST 返回服务器使用的操作系统
TYPE <data type> 数据类型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系统登录的用户名
标准 FTP 信息如下:
响应代码 解释说明
110 新文件指示器上的重启标记
120 服务器准备就绪的时间(分钟数)
125 打开数据连接,开始传输
150 打开连接
200 成功
202 命令没有执行
211 系统状态回复
212 目录状态回复
213 文件状态回复
214 帮助信息回复
215 系统类型回复
220 服务就绪
221 退出网络
225 打开数据连接
226 结束数据连接
227 进入被动模式(IP 地址、ID 端口)
230 登录因特网
250 文件行为完成
257 路径名建立
331 要求密码
332 要求帐号
350 文件行为暂停
421 服务关闭
425 无法打开数据连接
426 结束连接
450 文件不可用
451 遇到本地错误
452 磁盘空间不足
500 无效命令
501 错误参数
502 命令没有执行
503 错误指令序列
504 无效命令参数
530 未登录网络
532 存储文件需要帐号
550 文件不可用
551 不知道的页类型
552 超过存储分配
553 文件名不允许
下面是我用CuteFTP 6.0 Professional登陆到一台启用了Windows 防火墙的Windows Server 2003 EE+SERV-U 6.0的过程。可以看出整个客户端和服务器之间的交互会话过程。
*** CuteFTP Pro 6.0 - build Mar 25 2004 ***
状态:> 正在获取列表“”...
状态:> 正在连接到 FTP 服务器 220.194.59.155:21 (ip = 220.194.59.155)...
状态:> Socket 已连接。正在等候欢迎消息...
220 Serv-U FTP Server v6.0 for WinSock ready... //服务器准备就绪
状态:> 已连接。正在验证...
命令:> USER psychcn //CuteFTP发送用户名到服务器
331 User name okay, need password. //检测用户名存在,需要口令
命令:> PASS ***** //CuteFTP发送口令到服务器
230 User logged in, proceed. //用户通过身份验证,登陆到服务器
状态:> 登录成功。
命令:> PWD //显示当前用户的工作目录
257 '/' is current directory. //路径名建立
状态:> Home directory: /
命令:> FEAT
211-Extension supported //系统状态恢复
CLNT
MDTM
MDTM YYYYMMDDHHMMSS[+-TZ];filename
SIZE
SITE PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSG
REST STREAM
XCRC filename;start;end
MODE Z
211 End //系统状态恢复
状态:> 该站点支持 features。
状态:> 该站点支持 XCRC。
状态:> 该站点支持 SIZE。
状态:> 该站点可以续传中断的下载。
命令:> REST 0
350 Restarting at 0. Send STORE or RETRIEVE. //文件行为暂停
命令:> PASV //使用被动方式连接
227 Entering Passive Mode (220,194,59,155,13,20)
命令:> LIST
状态:> 正在连接 FTP 数据 socket 220.194.59.155:3348...
错误:> 由于错误或超时,连接失败。
1) 请核实目的 IP 地址是否正确。
2) 在“全局设置 | 连接”中增加连接超时限制。
3) 在“站点设置 | 类型”栏中切换为相对的数据连接类型 (PASV 或 PORT)。
4) 请试着换个服务器连接,以便核实不是本地的问题。
5) 如果使用了服务器名,请核实是否已解析为正确的地址。
6) 如果服务器名解析使用了本地服务器表,请检查以确认没有解析为废旧的地址。
7) 尝试 ping 地址。
8) 如果您正使用路由器,请核实路由器是否运行正确(ping 路由器,然后 ping 路由器的外部地址)。
9) 执行到目的地的跟踪程序,以核实所有路由器都延着连接路径运行。
10) 请核实您的子网掩码设置是否正确。
11) 请核实您的本地软件或硬件防火墙不拦截来自 CuteFTP 的外出连接源。
12) 请核实您的杀毒软件没有错误(试着将其禁用)。
错误:> PASV 已失败,正在尝试 PORT。
状态:> 正在等候 0 秒...
状态:> 正在获取列表“/”...
状态:> 正在连接到 FTP 服务器 220.194.59.155:21 (ip = 220.194.59.155)...
状态:> Socket 已连接。正在等候欢迎消息...
错误:> 无法从控制 Socket 读取。Socket 错误 = #10054。
问题很明显是Windows 防火墙在作祟,那么如何在启用防火墙的情况下使用FTP服务呢?