Serv-U FTP服务器10大经典问题.doc
文本预览下载声明
FTP 主动模式(active mode) 和 被動模式 (passive基础
FTP 是仅基于 TCP 的服务,不支持 UDP 。与众不同的是 FTP 使用 2 个端口,一个数据端口和一个命令端口(也可叫做控制端口) 。通常来说这两个端口是 21 -命令端口和 20 -数据端口 。但当我们发现根据( FTP 工作)方式的不同数据端口并不总是 20 时,混乱产生了 。
主动 FTP
主动方式的 FTP 是这样的:客户端从一个任意的非特权端口 N ( N1024 )连接到 FTP 服务器的命令端口,也就是 21 端口 。然后客户端开始监听端口 N+1 ,并发送 FTP 命令 “port N+1” 到 FTP 服务器。接着 服务器会从它自己的数据端口( 20 )连接到客户端指定的数据端口( N+1 ) 。
针对 FTP 服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式 FTP :
任何端口到 FTP 服务器的 21 端口 (客户端初始化的连接 S-C )
FTP 服务器的 21 端口到大于 1024 的端口( 服务器响应客户端的控制端口 S-C )
FTP 服务器的 20 端口到大于 1024 的端口( 服务器端初始化数据连接到客户端的数据端口 S-C )
大于 1024 端口到 FTP 服务器的 20 端口(客户端发送 ACK 响应到 服务器的数据端口 S-C )
画出来的话,连接过程大概是下图的样子:
在第 1 步中,客户端的命令端口与 FTP 服务器的命令端口建立连接,并发送命令 “PORT 1027” 。然后在第 2 步中, FTP 服务器给客户端的命令端口返回一个 ACK 。在第 3 步中, FTP 服务器发起一个从它自己的数据端口( 20 )到客户端先前指定的数据端口( 1027 )的连接,最后客户端在第 4 步中给 服务器端返回一个 ACK 。
主动方式 FTP 的主要问题实际上在于客户端 。FTP 的客户端并没有实际建立一个到 服务器数据端口的连接,它只是简单的告诉 服务器自己监听的端口号, 服务器再回来连接客户端这个指定的端口 。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的 。
主动 FTP 的例子
下面是一个主动 FTP 会话的实际例子 。当然 服务器名、 IP 地址和用户名都做了改动 。在这个例子中, FTP 会话从 (0) ,一个运行标准的 FTP 命令行客户端的 Linux 工作站,发起到 (0) ,一个运行 ProFTPd 1.2.2RC2 的 Linux 工作站 。debugging ( -d )选项用来在 FTP 客户端显示连接的详细过程 。红色的文字是 debugging 信息,显示的是发送到 服务器的实际 FTP 命令和所产生的回应信息 。服务器的输出信息用黑色字表示,用户的输入信息用粗体字表示 。
仔细考虑这个对话过程我们会发现一些有趣的事情 。我们可以看到当 PORT 命令被提交时,它指定了客户端 (0) 上的一个端口而不是 服务器的 。当我们用被动 FTP 时我们会看到相反的现象 。我们再来关注 PORT 命令的格式 。就象你在下面的例子看到的一样,它是一个由六个被逗号隔开的数字组成的序列 。前四个表示 IP 地址,后两个组成了用于数据连接的端口号 。用第五个数乘以 256 再加上第六个数就得到了实际的端口号 。下面例子中端口号就是 ( (14*256) + 178) = 3762 。我们可以用 netstat 来验证这个端口信息 。
testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to .
220 FTP server ready.
Name (testbox2:slacker): slacker
--- USER slacker
331 Password required for slacker.
Password: TmpPass
--- PASS XXXX
230 User slacker logged in.
--- SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp ls
ftp: setsockopt (ignored): Permission denied
--- PORT 192,168,150,80,14,178
200 PORT command successful.
-
显示全部