FTP 基础及连接跟踪

一、FTP基本

 FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的"三次握手"的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp协议对话,并且能访问Internet, 你可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的FTP需要2个端口,一个端口是作为控制连接端口,也就是21这个端口,用于发送指令给服务器以及等待服务器响应;另一个端口是数据传输端口,端口号为20(仅PORT模式),是用来建立数据传输通道的,主要有3个作用  • 从客户向服务器发送一个文件。  • 从服务器向客户发送一个文件。  •  从服务器向客户发送文件或目录列表。 

    FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。

  1.ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。 

  但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。 

  2.二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。 

  如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。     

1、FTP模式

 FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。下面介绍一个这两种方式的工作原理:

1.1 Port模式  

 Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

PORT模式  当FTP客户以PORT模式连接服务器时,他动态的选择一个端口号连接服务器的21端口,注意这个端口号一定是1024以上的,因为1024以前的端口都已经预先被定义好,被一些典型的服务使用,当然有的还没使用,保留给以后会用到这些端口的资源服务。当经过TCP的三次握手后,连接(控制信道)被建立。现在用户要列出服务器上的目录结构(使用ls或dir命令),那么首先就要建立一个数据通道,因为只有数据通道才能传输目录和文件列表,此时用户会发出PORT指令告诉服务器连接自己的什么端口来建立一条数据通道(这个命令由控制信道发送给服务器),当服务器接到这一指令时,服务器会使用20端口连接用户在PORT指令中指定的端口号,用以发送目录的列表。当完成这一操作时,FTP客户也许要下载一个文件,那么就会发出get指令,请注意,这时客户会再次发送PORT指令,告诉服务器连接他的哪个"新"端口,你可以先用netstat -na这个命令验证,上一次使用的6044已经处于TIME_WAIT状态。当这个新的数据传输通道建立后就开始了文件传输的工作。

1.2 Pasv模式

 Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

PASV模式  ,当FTP客户以PASV模式连接服务器时,情况就有些不同了。在初始化连接这个过程即连接服务器这个过程和PORT模式是一样的,不同的是,当FTP客户发送ls、dir、get等这些要求数据返回的命令时,它不向服务器发送PORT指令而是发送PASV指令,在这个指令中,用户告诉服务器自己要连接服务器的某一个端口,如果这个服务器上的这个端口是空闲的可用的,那么服务器会返回ACK的确认信息,之后数据传输通道被建立并返回用户所要的信息(根据用户发送的指令,如ls、dir、get等);如果服务器的这个端口被另一个资源所使用,那么服务器返回UNACK的信息,那么这时,FTP客户会再次发送PASV命令,这也就是所谓的连接建立的协商过程。

  很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。    

2、FTP命令

2.1 命令列表

[root@www ~]# yum install ftp 安装ftp支持 redhat系列版本下命令 
[root@www ~]# ftp 
输入ftp命令 
FTP> open 连接 命令 
FTP> to 10.10.22.8 连接主机 
FTP> admin 登入名 
FTP> passwd   登入密码


连接成功

FTP> ! 从 ftp 子系统退出到外壳。 
FTP> ? 显示 ftp 命令说明。? 和 help 相同。 
FTP> append 使用当前文档类型配置将本地文档附加到远程电脑上的文档。 
FTP> ascii 将文档传送类型配置为默认的 ASCII。 
FTP> bell 转换响铃以在每个文档传送命令完成后响铃。默认情况下,铃声是关闭的。 
FTP> binary(或bi) 将文档传送类型配置为二进制。 
FTP> bye(或by) 结束和远程电脑的linux中ftp命令参数会话并退出linux中ftp命令参数。 
FTP> cd 更改远程电脑上的工作目录。 
FTP> close 结束和远程服务器的linux中ftp命令参数会话并返回命令解释程式。 
FTP> debug 转换调试。当调试打开时,发送到远程电脑的每个命令都打印,前面是字符串“>”。默认情况下,调试是关闭的。 
FTP> delete 删除远程电脑上的文档。 
FTP> dir 显示远程目录文档和子目录列表。 
FTP> disconnect 从远程电脑断开,保留linux中ftp命令参数提示。 
FTP> get 使用当前文档转换类型将远程文档复制到本地电脑。 
FTP >glob 转换文档名组合。组合允许在内部文档或路径名中使用通配符(*和?)。默认情况下,组合是打开的。 
FTP >hash 转换已传输的每个数据块的数字签名 (#) 打印。数据块的大小是2048 字节。默认情况下,散列符号打印是关闭的。 
FTP >help 显示linux中ftp命令参数命令说明。 
FTP >lcd 更改本地电脑上的工作目录。默认情况下,工作目录是启动linux中ftp命令参数的目录。 
FTP >literal 将参数逐字发送到远程linux中ftp命令参数服务器。将返回单个的linux中ftp命令参数回复代码。 
FTP >ls 显示远程目录文档和子目录的缩写列表。 
FTP >mdelete 删除远程电脑上的文档。 
FTP >mdir 显示远程目录文档和子目录列表。能够使用 mdir 指定多个文档。 
FTP >mget 使用当前文档传送类型将远程文档复制到本地电脑。
FTP >mkdir 创建远程目录。
FTP >mls 显示远程目录文档和子目录的缩写列表。
FTP >mput 使用当前文档传送类型将本地文档复制到远程电脑上。
FTP >open 和指定的linux中ftp命令参数服务器连接。
FTP >prompt 转换提示。假如关闭提示时 mget 及 mput 传送任何文档,linux中ftp命令参数在多文档传送过程中将提示允许您有选择地检索或存储文档。默认情况下,提示是打开的。
FTP >put 使用当前文档传送类型将本地文档复制到远程电脑上。
FTP >pwd 显示远程电脑上的当前目录。
FTP >quit 结束和远程电脑的linux中ftp命令参数会话并退出linux中ftp命令参数。
FTP >quote 将参数逐字发送到远程linux中ftp命令参数服务器。将返回单个的linux中ftp命令参数回复代码。
FTP >recv 使用当前文档传送类型将远程文档复制到本地电脑。Recv 和 get相同。
FTP >remotehelp 显示远程命令帮助。
FTP >rename 重命名远程文档。
FTP >rmdir 删除远程目录。
FTP >send 使用当前文档传送类型将本地文档复制到远程电脑上。Send 和put 相同。
FTP >status 显示linux中ftp命令参数连接和转换的当前状态。
FTP >trace 转换数据包跟踪。Trace 在运行linux中ftp命令参数命令时显示每个数据包的路由。
FTP >type 配置或显示文档传送类型。
FTP >user 指定远程电脑的用户。
FTP >verbose 转换 verbose 模式。假如打开,将显示任何 linux中ftp命令参数响应。在文档传送完成后,将同时显示和传送效率有关的统计信息。默认情况下,verbose 是打开的。

2.2  常用命令

2.2.1  连接ftp服务器

格式:ftp [hostname| ip-address]
a)在linux命令行下输入:

ftp 172.26.0.70

command:

root@linux:/home# ftp 172.26.0.70
Connected to 172.26.0.70.
220-FileZilla Server version 0.9.24 beta
220-written by Tim Kosse ([email protected])
220 Please visit http://sourceforge.net/projects/filezilla/

wireshark:


b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。

command:

Name (172.26.0.70:root): test
331 Password required for test
Password:
230 Logged on
Remote system type is UNIX.
ftp>

2.2.2  open and close

command:open

ftp> open
(to) 172.26.0.70
Connected to 172.26.0.70.
220-FileZilla Server version 0.9.24 beta
220-written by Tim Kosse ([email protected])
220 Please visit http://sourceforge.net/projects/filezilla/
Name (172.26.0.70:root): 

command:close

ftp> close
221 Goodbye
ftp>

2.3.3  list

command:

ftp> ls
200 Port command successful
150 Opening data channel for directory list.
drwxr-xr-x 1 ftp ftp              0 May 04  2015 $RECYCLE.BIN
-r--r--r-- 1 ftp ftp      750309984 Nov 09 13:56 22.rar
-r--r--r-- 1 ftp ftp       13389252 May 14  2015 66.rar
drwxr-xr-x 1 ftp ftp              0 Sep 15  2015 other
226 Transfer OK
ftp>

wireshark:


2.3.4 cd

command:

ftp> cd ftptest
250 CWD successful. "/ftptest" is current directory.
ftp>

2.3.5 下载文件

下载文件通常用get和mget这两条命令。
a) get 
格式:get [remote-file] [local-file]
将文件从远端主机中传送至本地主机中。

command:

ftp> get 66.rar /home/test.rar
local: /home/test.rar remote: 66.rar
200 Port command successful
150 Opening data channel for file transfer.
WARNING! 51495 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer OK
13389252 bytes received in 0.80 secs (15.9233 MB/s)
ftp>


b) mget      
格式:mget [remote-files]
从远端主机接收一批文件至本地主机。
如要获取服务器上/usr/your/下的所有文件,则

ftp> cd ftptest
250 CWD successful. "/ftptest" is current directory.
ftp> mget *
mget 66.rar? yes
200 Port command successful
150 Opening data channel for file transfer.
WARNING! 51495 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer OK
13389252 bytes received in 0.80 secs (15.9923 MB/s)
mget 77.rar? yes
200 Port command successful
150 Opening data channel for file transfer.
WARNING! 51495 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer OK
13389252 bytes received in 0.79 secs (16.1476 MB/s)
ftp>

wireshark:

FTP 基础及连接跟踪_第1张图片
此时每下载一个文件,都会有提示。如果要除掉提示,则在mget *.* 命令前先执行:prompt off

注意:文件都下载到了linux主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则文件都下载到了/usr/my下,虽然下载多个文件,但每个文件的下载使用的不同的数据连接,可以通过port 后的带的端口号看出。

2.3.6  上传文件

a) put
格式:put local-file [remote-file]
将本地一个文件传送至远端主机中。
ftp> put test.rar /99.rar

local: test.rar remote: /99.rar
200 Port command successful
150 Opening data channel for file transfer.
226 Transfer OK
13440574 bytes sent in 0.94 secs (13.6896 MB/s)
ftp>

wireshark:


b) mput
格式:mput local-files
将本地主机中一批文件传送至远端主机。
如要把本地当前目录下所有html文件上传到服务器/usr/your/ 下

ftp> cd /usr/your (回车)
ftp> mput *.htm (回车)

注意:上传文件都来自于主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则只有在/usr/my下的文件linux才会上传到服务器/usr/your 下。

2.3.7 断开连接

bye:中断与服务器的连接。

ftp> bye (回车)
221 Goodbye
root@linux:/home#

3、FTP端口

>>1.0<< FTP和TCP端口号
TCP使用端口号来标识所发送和接收的应用,端口号可以帮助TCP来分离字节流并且帮相应字节传递给正确的应用程序。TCP端口号可以是半永久的和暂时的。服务器端监听在半永久的端口上来让客户端访问。客户端使用暂时的端口在本地标识一个对话,客户端端口只在使用TCP服务时候才存在,而服务器端口只要服务器在运行就一直在监听。

TCP端口可以归为3类:
1、众所周知的端口来标识在TCP上运行的标准服务,包括FTP、HTTP、TELNET、SMTP等,这些端口号码范围为0-1023;
2、注册端口号用来标识那些已经向IANA(Internet Assigned Numbers Assigned Numbers Authority)注册的应用,注册端口号为1024-49151;
3、私有端口号是非注册的并且可以动态地分配给任何应用,私有端口为49152-65535;注册的端口号本来打算只给注册的应用使用,可近年来端口号已经陷入了到达极限的困境,你可能会看到本来应该是给注册应用使用的注册端口被非注册应用用做暂时的端口。

>>2.0<< FTP Port模式和FTP Passive模式
当你对一个FTP问题进行排错时候,你首先要问的一个问题是使用的是port模式的还是passive模式。因为这两种行为迥异,所以这两种模式引起的问题也不同;在过去,客户端缺省为active(port)模式;近来,由于Port模式的安全问题,许多客户端的FTP应用缺省为Passive模式。

>>2.1  FTP Port模式
Port模式的FTP步骤如下:
1、 客户端发送一个TCP SYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端 使用暂时的端口作为它的源端口;
2、 服务器端发送SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
3、 客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
4、 当用户请求一个列表(List)请求或者发起一个要求发送或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服务器在打开一个数据连接时候使用这个暂时端口;PORT命令也包含了一个IP地址,这个IP地址通常是客户自己的IP地址,而且FTP也支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接;
5、 服务器端发送一个SYN包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口号;
6、 客户端以源端口为暂时端口,目的端口为20发送一个SYN ACK包;
7、 服务器端发送一个ACK包;
8、 发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要  对方进行ACK确认。
9、 当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一 台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;
10、 客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。

下图图示了FTP PORT模式前几步步骤:
/====================================================================\
|                                                                    |
|       [ ftp Client ]                       [ ftp Server ]          |
|                                                                    |
|       (TCP:21 连接初始化,控制端口)                                    |
|                              SYN                                   |
|        Port xxxx   ---------------------->    Port 21       [TCP]  |
|                             SYN+ACK                                |
|        Port xxxx   <----------------------    Port 21              |
|                              ACK                                   |
|        Port xxxx   ---------------------->    Port 21              |
|                                                                    |
|       (控制操作: 用户列目录或传输文件)                                 |
|                                                                    |
|                       Port, IP, Port yyyy                          |
|        Port xxxx   <----------------------    Port 21              |
|                       Port Seccussful                              |
|        Port xxxx   <----------------------    Port 21              |
|                       List, Retr or Stor                           |
|        Port xxxx   ---------------------->    Port 21              |
|                                                                    |
|                                                                    |
|        (TCP:20 连接初始化,数据端口)                                   |
|                               SYN                                  |
|        Port yyyy   <----------------------    Port 20              |
|                            SYN+ACK                                 |
|        Port yyyy   ---------------------->    Port 20              |
|                               ACK                                  |
|        Port yyyy   <----------------------    Port 20              |
|                                                                    |
|                                                                    |
|        (数据操作: 数据传输)                                           |
|                           Data + ACK                               |
|        Port yyyy   <--------------------->    Port 20              |
|                               .                                    |
|                               .                                    |
|                               .                                    |
|                                                                    |
\====================================================================/

FTP Port模式会给网络管理人员在许多方面带来很多问题,首先,在PORT命令消息中的IP地址和端口号的编码不是直白地显示。另外,应用层的协议命令理论上不应该包含网络地址信息(注:IP地址),因为这打破了协议层的原则并且可能导致协同性和安全性方面的问题。

下图是WildPackets EtherPeek协议分析仪解码了PORT命令的地址参数,地址参数后是端口号,见PORT192,168,10,232,6,127;6,127部分的第一个阿拉伯数字乘以256,然后加上第2个阿拉伯数字就得到端口号,所以客户端指定了端口号为6*256+127=1663;
/====================================================================\
| IP Header - Internet Protocol Datagram                             |
|   Version:              4                                          |
|   Header Length:        5  (20  bytes)                             |
|                                                                    |
|   ...............                                                  |
|                                                                    |
|   Time To Live:         128                                        |
|   Protocol:             6  TCP - Transmission Control Protocol     |
|   Header Checksum:      0xAA36                                     |
|   Source IP Address:    192.168.0.1  DEMO                          |
|   Dest. IP Address:     192.168.0.3  VI                            |
|   No IP Options                                                    |
|                                                                    |
| TCP - Transport Control Protocol                                   |
|   Source Port:          2342  manage-exec                          |
|   Destination Port:     21  ftp                                    |
|   Sequence Number:      2435440100                                 |
|   Ack Number:           9822605                                    |
|   Offset:               5  (20  bytes)                             |
|   Reserved:             %000000                                    |
|   Flags:                %011000                                    |
|                         0. .... (No Urgent pointer)                |
|                         .1 .... Ack                                |
|                         .. 1... Push                               |
|                         .. .0.. (No Reset)                         |
|                         .. ..0. (No SYN)                           |
|                         .. ...0 (No FIN)                           |
|                                                                    |
|   Window:               65150                                      |
|   Checksum:             0x832A                                     |
|   Urgent Pointer:       0                                          |
|   No TCP Options                                                   |
|                                                                    |
| FTP Control - File Transfer Protocol                               |
|   Line  1:              PORT 192,168,0,1,9,39              |
|                                                                    |
| FCS - Frame Check Sequence                                         |
|   FCS (Calculated):     0xF4C04A4F                                 |
\====================================================================/

下图验证了服务器端的确从端口20打开到端口1663的TCP连接:
/====================================================================\
| TCP - Transport Control Protocol                                   |
|   Source Port:          20  ftp-data                               |
|   Destination Port:     1663                                       |
|   Sequence Number:      2578824336                                 |
|   Ack Number:           0                                          |
|   Offset:               6  (24  bytes)                             |
|   Reserved:             %000000                                    |
|   Flags:                %000010                                    |
|                         0. .... (No Urgent pointer)                |
|                         .0 .... (No Ack)                           |
|                         .. 0... (No Push)                          |
|                         .. .0.. (No Reset)                         |
|                         .. ..1. SYN                                |
|                         .. ...0 (No FIN)                           |
|                                                                    |
|   Window:               3731                                       |
|   Checksum:             0x8A4C                                     |
|   Urgent Pointer:       0                                          |
|   No TCP Options                                                   |
|                                                                    |
| TCP Options                                                        |
|   Options Type:         2   Maxinum Segment Size                   |
|   Length:               4                                          |
|   MSS:                  1460                                       |
|                                                                    |
| FCS - Frame Check Sequence                                         |
|   FCS (Calculated):     0x5A1BD023                                 |
\====================================================================/

当使用FTP时候,网络中的防火墙必须要声明相应的端口,防火墙必须要跟踪FTP对话然后检查PORT命令,防火墙必须要参与从服务器端到客户端在PORT命令中指定的端口连接的建立过程。如果网络中使用了NAT(注:网络地址翻译),那么NAT的网关同样也需要声明相应的端口,网关需要把在PORT命令中指定的IP地址翻译成分配给客户的地址,然后重新计算TCP的Checksum;如果网关没有正确地执行这个操作,FTP就失败了。

>>2.2  FTP Passive模式
下面的列表描述了Passive模式的FTP的步骤,步骤1到3和Port模式FTP相同,步骤9到11同样与Port模式FTP最后三步相同。

1、客户端发送一个TCP SYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;
2、服务器端发送SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
3、客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
4、当用户请求一个列表(List)或者发送或接收文件时候,客户端软件发送PASV命令给服务器端表明客户端希望进入Passive模式;
5、服务器端进行应答,应答包括服务器的IP地址和一个暂时的端口,这个暂时的端口是客户端在打开数据传输连接时应该使用的端口;
6、客户端发送一个SYN包,源端口为客户端自己选择的一个暂时端口,目的端口为服务器在PASV应答命令中指定的暂时端口号;
7、服务器端发送SYN ACK包给客户端,目的端口为客户端自己选择的暂时端口,源端口为PASV应答中指定的暂时端口号;
8、客户端发送一个ACK包;
9、发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行ACK确认;
10、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;
11、客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。

下图图示了Passive模式FTP的开始几个步骤:
/====================================================================\
|                                                                    |
|       [ ftp Client ]                       [ ftp Server ]          |
|                                                                    |
|       (TCP:21 连接初始化,控制端口)                                    |
|                              SYN                                   |
|        Port xxxx   ---------------------->    Port 21       [TCP]  |
|                             SYN+ACK                                |
|        Port xxxx   <----------------------    Port 21              |
|                              ACK                                   |
|        Port xxxx   ---------------------->    Port 21              |
|                                                                    |
|       (PASV操作: 被动连接数据端口初始化)                               |
|                                                                    |
|                             PASV                                   |
|        Port xxxx   ---------------------->    Port 21              |
|                     PASV OK, IP, Port yyyy                         |
|        Port xxxx   <----------------------    Port 21              |
|                               SYN                                  |
|        Port zzzz   ---------------------->    Port yyyy            |
|                            SYN+ACK                                 |
|        Port zzzz   <----------------------    Port yyyy            |
|                               ACK                                  |
|        Port zzzz   ---------------------->    Port yyyy            |
|                                                                    |
|                                                                    |
|        (数据操作: 数据传输)                                           |
|                       List, Retr or Stor                           |
|        Port xxxx   ---------------------->    Port 21              |
|                           Data + ACK                               |
|        Port zzzz   <--------------------->    Port yyyy            |
|                               .                                    |
|                               .                                    |
|                               .                                    |
|                                                                    |
\====================================================================/
一个PASV请求要求服务器在服务器选择的一个新的端口上接受数据连接,PASV命令没有任何参数,服务器端的回应只是一行显示服务器IP地址和服务器接受连接的TCP端口号。

下图显示了服务器对PASV命令的回应,服务器告诉客户端它在端口5365(192,168,179,100,20,245)上进行监听,计算端口的方法是20*256+245=5365;
/====================================================================\
| TCP - Transport Control Protocol                                   |
|   Source Port:          21  ftp                                    |
|   Destination Port:     1249                                       |
|   Sequence Number:      4239887193                                 |
|   Ack Number:           36925357                                   |
|   Offset:               5  (20  bytes)                             |
|   Reserved:             %000000                                    |
|   Flags:                %011000                                    |
|                         0. .... (No Urgent pointer)                |
|                         .1 .... Ack                                |
|                         .. 1... Push                               |
|                         .. .0.. (No Reset)                         |
|                         .. ..0. (No SYN)                           |
|                         .. ...0 (No FIN)                           |
|                                                                    |
|   Window:               8760                                       |
|   Checksum:             0x3EAB                                     |
|   Urgent Pointer:       0                                          |
|   No TCP Options                                                   |
|                                                                    |
| FTP Control - File Transfer Protocol                               |
|   Line  1:              PASV 192,168,0,1,100,20,245        |
|                                                                    |
| FCS - Frame Check Sequence                                         |
|   FCS (Calculated):     0xBED4346D                                 |
\====================================================================/
当收到PASV命令的回应后,客户端打开一个TCP连接,源端口为一个暂时的端口,目的端口为服务器提供的暂时端口。

下图显示了客户端的TCP连接建立过程,正如上面所说,目的端口为5365。
/====================================================================\
| TCP - Transport Control Protocol                                   |
|   Source Port:          1250                                       |
|   Destination Port:     5365                                       |
|   Sequence Number:      36931503                                   |
|   Ack Number:           0                                          |
|   Offset:               7  (28  bytes)                             |
|   Reserved:             %000000                                    |
|   Flags:                %000010                                    |
|                         0. .... (No Urgent pointer)                |
|                         .0 .... (No Ack)                           |
|                         .. 0... (No Push)                          |
|                         .. .0.. (No Reset)                         |
|                         .. ..1. SYN                                |
|                         .. ...0 (No FIN)                           |
|                                                                    |
|   Window:               8192                                       |
|   Checksum:             0x1A57                                     |
|   Urgent Pointer:       0                                          |
|   No TCP Options                                                   |
|                                                                    |
| TCP Options                                                        |
|   Options Type:         2   Maxinum Segment Size                   |
|   Length:               4                                          |
|   MSS:                  1460                                       |
|                                                                    |
| FCS - Frame Check Sequence                                         |
|   FCS (Calculated):     0x5A1BD023                                 |
\====================================================================/

大多数人认为在防火墙网络环境中Passive模式比Port模式的问题小,但我们注意到在Passive模式下,客户端打开一个暂时的目的端口连接,一些防火墙或者CISCO设备的访问列表(ACL)可能会阻止这种连接,同样服务器的回应也是从一个暂时的端口到一个暂时的端口,防火墙或者CISCO的访问列表也会阻止这种连接。在CISCO路由器上你可以用访问列表关键字"established"来避免第二个问题,"established"关键字告诉路由器允许带ACK字端的包通过,服务器端的SYN ACK包带有ACK字端。在新版本PIX IOS中也可以通过fixit关键字建立针对ftp协议的深层状态检测过滤,其他大多数状态检测防火墙例如LinuxNetfilters也支持ftp协议的状态检测,进行准确的PASV动态端口过滤。


>>2.3  用户名和口令的明文传输
FTP另一个声名狼藉的问题是它以明文方式发送用户名和口令,也就是不加密地发送。任何人只要在网络中合适的位置放置一个协议分析仪就可以看到用户名和口令;FTP发送的数据也是以明文方式传输,通过对ftp连接的监控和数据收集就可以收集和重现ftp的数据传输并实现协议连接回放。事实上很多用户把相同的用户名和口令用在不同的应用中,这样这个问题可能看起来更为糟糕;如果黑客收集到FTP口令,他们也可能就得到了你在线帐号或者其他一些机密数据的口令。

下面是通过tcpdump -- 一个著名的网络协议分析程序抓取的ftp的完整通讯过程。
/===============================================================================\
21:55:36.682402 IP 192.168.0.1.2323 > 192.168.0.3.21: S 2047626269:2047626269(0)
win 65535 (DF)
21:55:36.682792 IP 192.168.0.3.21 > 192.168.0.1.2323: S 3917547047:3917547047(0)
ack 2047626270 win 65535 (DF)
21:55:36.682855 IP 192.168.0.1.2323 > 192.168.0.3.21: . ack 1 win 65535 (DF)

21:55:36.854899 IP 192.168.0.3.21 > 192.168.0.1.2323: P 1:115(114) ack 1 win 65535
(DF)
0x0000  4500 009a d570 4000 8006 a398 c0a8 0003 E....p@.........
0x0010  c0a8 0001 0015 0913 e981 0628 7a0c 4c1e ...........(z.L.
0x0020  5018 ffff cd50 0000 3232 302d 5468 6973 P....P..220-This
0x0030  2073 6572 7665 7220 6973 2066 6f72 2070 .server.is.for.p
0x0040  7269 7661 7465 2075 7365 206f 6e6c 790d rivate.use.only.
0x0050  0a32                                    .2
21:55:37.016115 IP 192.168.0.1.2323 > 192.168.0.3.21: . ack 115 win 65421 (DF)
0x0000  4500 0028 b8d0 4000 8006 c0aa c0a8 0001 E..(..@.........
0x0010  c0a8 0003 0913 0015 7a0c 4c1e e981 069a ........z.L.....
0x0020  5010 ff8d 6f83 0000                     P...o...
21:55:37.016471 IP 192.168.0.3.21 > 192.168.0.1.2323: P 115:154(39) ack 1 win
65535 (DF)

0x0000  4500 004f d586 4000 8006 a3cd c0a8 0003 E..O..@.........
0x0010  c0a8 0001 0015 0913 e981 069a 7a0c 4c1e ............z.L.
0x0020  5018 ffff 074f 0000 3232 3020 506c 6561 P....O..220.Plea
0x0030  7365 2065 6e74 6572 2079 6f75 7220 6c6f se.enter.your.lo
0x0040  6769 6e20 6e61 6d65 206e 6f77 2e0d 0a   gin.name.now...
21:55:37.022282 IP 192.168.0.1.2323 > 192.168.0.3.21: P 1:12(11) ack 154 win 65382
(DF)
0x0000  4500 0033 b8d2 4000 8006 c09d c0a8 0001 E..3..@.........
0x0010  c0a8 0003 0913 0015 7a0c 4c1e e981 06c1 ........z.L.....
0x0020  5018 ff66 c4eb 0000 5553 4552 2065 6c6c P..f....USER.ell
0x0030  790d 0a                                 y..
<用户名:elly>
21:55:37.059430 IP 192.168.0.3.21 > 192.168.0.1.2323: P 154:188(34) ack 12 win
65524 (DF)
0x0000  4500 004a d58b 4000 8006 a3cd c0a8 0003 E..J..@.........
0x0010  c0a8 0001 0015 0913 e981 06c1 7a0c 4c29 ............z.L)
0x0020  5018 fff4 b343 0000 3333 3120 5061 7373 P....C..331.Pass
0x0030  776f 7264 2072 6571 7569 7265 6420 666f word.required.fo
0x0040  7220 656c 6c79 202e 0d0a                r.elly....
21:55:37.060301 IP 192.168.0.1.2323 > 192.168.0.3.21: P 12:27(15) ack 188 win
65348 (DF)
0x0000  4500 0037 b8db 4000 8006 c090 c0a8 0001 E..7..@.........
0x0010  c0a8 0003 0913 0015 7a0c 4c29 e981 06e3 ........z.L)....
0x0020  5018 ff44 e479 0000 5041 5353 2038 3838 P..D.y..PASS.888
0x0030  3838 3838 380d 0a                       88888..
<密码:88888888>
21:55:37.243954 IP 192.168.0.3.21 > 192.168.0.1.2323: . ack 27 win 65509 (DF)
0x0000  4500 0028 d59d 4000 8006 a3dd c0a8 0003 E..(..@.........
0x0010  c0a8 0001 0015 0913 e981 06e3 7a0c 4c38 ............z.L8
0x0020  5010 ffe5 6ec8 0000 0000 0000 0000      P...n.........
21:55:37.285586 IP 192.168.0.3.21 > 192.168.0.1.2323: . 188:1648(1460) ack 27 win
65509 (DF)
0x0000  4500 05dc d5a4 4000 8006 9e22 c0a8 0003 E.....@...."....
0x0010  c0a8 0001 0015 0913 e981 06e3 7a0c 4c38 ............z.L8
0x0020  5010 ffe5 0300 0000 3233 302d 5765 6c63 P.......230-Welc
0x0030  6f6d 6520 746f 2076 6920 4654 5020 7365 ome.to.vi.FTP.se
0x0040  7276 6572 0d0a 3233 302d 0d0a 3233 302d rver..230-..230-
0x0050  4375                                    Cu
<明文数据传输>
\===============================================================================/

>>3.0<<  改进: ftp安全扩展, SSL/TLS
在传统的ftp通讯和传输过程中可以看出,ftp协议提供了一种简单实用的网络文件传输方法,但是缺陷也是显而易见的。传统ftp服务缺乏对数据的机密性和完整性保护,对通讯双方也没有可靠的认证措施,同时还存在着明文信息传输的弱点 --在同一个网络上的任何用户都可能窃取到重要的信息。虽然近年来出现了很多种ftp的替代服务,例如ssh加密通道的sftp/scp,或使用IPSEC协议的VPN通道等等,但是在大多数情况下,ftp的通用性和易用性使得它在很长一段时间内必然无法被完全取代。所以如同其他一系列古董
服务(例如SMTP/HTTP)一样,近年来也出现了一些不需要对ftp协议自身做完全更改的协议扩展模块,能够良好的完成兼容性和功能扩展。ftp SSL/TLS Extension就是其中一种方式。

FTP安全扩展:   http://www.ietf.org/rfc/rfc2228.txt              http://www.ietf.org/rfc/rfc2246.txt
FTP安全扩展,SSL接口草案:http://www.ietf.org/internet-drafts/draft-murray-auth-ftp-ssl-13.txt

>>3.1  SSL/TLS简介
先说一下SSL/TLS协议,SSL(Secure Socket
Layer)最早是netscape公司设计的用于HTTP协议加密的安全传输协议,SSL工作于TCP协议的传输层(TCP层)和应用程序之间。作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证。SSL协议的当前版本为3.0,当SSL取得大规模成功后,IETF(www.ietf.org)将SSL作了标准化,规范为RFC2246,并将其称为TLS(TransportLayerSecurity)。从技术上讲,TLS1.0与SSL3.0的差别非常微小,SSL由于其历史应用的原因在当前的商业应用程序之中使用得更多一些。
TLS协议,RFC 2246:  http://www.ietf.org/rfc/rfc2246.txt

>>3.2  数据机密性和完整性
前面多次提到了数据的机密性和完整性两个方面,在此略微解释一下。数据的机密性确保数据信息机密可靠,不会被没有权限的对象所访问和浏览到,基本的机密性保护手段就是数据加密;而数据的完整性则是指数据在传输和存储过程中将保证数据的唯一和完整,不会被恶意篡改着所修改,保证数据完整性的基本手段主要有数字签名。

这里就牵扯到数据加密领域的两类算法,加密算法和散列算法。加密算法从数学原理上看可以
分为对称加密和非对称加密,从数据处理方法上可以分为流加密和分组加密,本文重点不在此
,不再赘述,只举例几种常用的加密算法: DES, 3DES, AES,
BlowFish,RC2-RC6等等。数据签名算法是加密领域的另一套方法,又叫数据散列算法,用于对
数据进行处理生成一个唯一的等长签名字符串,原数据的长度可能是任意的,而任意两个相似
但哪怕只有少许细微差别的数据集,都将产生差别非常大的等长签名字符串,这个字符串在一
般意义下被认为是极少会发生空间冲突(重复)的,因此数据散列算法对于确保数据的唯一性是
一种必要的手段;常见的数字散列算法有MD5,SHA-1,CAST-256等等。

可以看出,面对如此多种类的加密算法,应用程序处理起来是很繁琐的。SSL在这个层次中就
提供了一种自动的算法协商,密钥交换和数据加密过程。SSL协议分为两部分:Handshake
Protocol和Record
Protocol,HandShake部分用于处理通讯双方的算法协商和密钥交换过程,Record部分用于对
数据进行加密传输。

整个的SSL基本通讯过程如下:
/====================================================================\
|                                                                    |
|      [ SSL Client ]                        [ SSL Server ]          |
|                                                                    |
|      (TCP三步握手)                                                  |
|      (SSL套结字连接)                                                 |
|                               .                                    |
|                               .                    SSLSocket()     |
|                               .                         Bind()     |
|      SSLSocket()       ------------------->                        |
|                        <-------------------            Connect     |
|      (连接加密算法协商)                                               |
|      ClientHello()     ------------------->                        |
|                                            (服务器端算法确认和证书发送)|
|                                                    ServerHello     |
|                                                    Certificate*    |
|                                              ServerKeyExchange*    |
|                                             CertificateRequest*    |
|                        <-------------------    ServerHelloDone     |
|      (客户端证书验证与密钥交换)                                        |
|      Certificate*                                                  |
|      ClientKeyExchange                                             |
|      CertificateVerify*                                            |
|      [ChangeCipherSpec]                                            |
|      Finished          ------------------->   (数据加密算法协商)      |
|                                               [ChangeCipherSpec]   |
|                        <-------------------           Finished     |
|      (应用数据加密传输)                                              |
|      Application Data  <------------------>     Application Data   |
|                                 ...                                |
\====================================================================/

SSL套结字通讯过程如下:
1, Client和Server双方程序通过ssl socket系列函数替换BSD Socket系列函数;
2, Client通过TCP协议连接到Server端应用程序;
3, Client发起连接质询,发送自身所能实现的"安全集合",其中包含加密和签名算法协商;
4, Server回应连接,包含本次通讯所使用的算法集合,以及Server端证书;
5, Client收到证书后,使用Server端协商的算法,用Server端证书中包含的Server公钥加密一个
    随机序列,作为一个挑战质询发回Server;
6, Server收到加密密文,使用自身的私钥进行数据解密,如果成功,代表SA协商匹配,可以
    开始通讯;
7, 可选过程,继续发起Client端验证过程,Client端发出Client证书,进行Client端验证过程;
8, 可选过程,数据传输过程加密算法协商;
9, 协商完毕,开始加密数据传输;

可以看出,SSL Socket通讯过程相比正常的BSD Socket,只不过多了一个安全集合交换协商的过程,这个过程由SSL实现自身来完成,相对于应用程序,只要采用了SSL Socket,其他的过程都是透明的。SSL通讯过程中的第3-6步是必须操作,包含了Server端验证过程和加密算法协商,类似于TCP协议的三步握手过程,这个过程中通过公钥加密算法加密密钥(公钥)和解密秘钥(私钥)不同的功能,巧妙地实现了密钥交换和算法协商,并且由于解密秘钥不需要在网络上传输,这样就同时实现了数据通讯过程的保密性和内部应用程序协议的保密性。在第7步进行Client端证书的验证过程中,由于当前网络环境下PKI和CA体系尚不完善,并且由于SSL设计的工作环境相对对Client端的安全需求并不很高,所以Client端验证一般作为一种可选手段来实现,取决于应用程序的安全等级需求。

SSL数据通讯的机密性特性就是由上面的过程完成的,在算法协商过程中除了加密算法的协商外还会交换一个数据签名算法,用于对数据生成一个唯一的散列校验码,防止在传输过程中数据被篡改,数据签名过程实现了通讯过程的完整性保证。

对应于SSL所提供的两种安全特性,机密性和保密性,ssl定义了四个安全级别,分别是这两种特性的状态组合:
          'C' - Clear - 没有任何保护

          'S' - Safe - 完整性实现,但是没有机密性

          'E' - Confidential - 机密性实现,但是没有完整性

          'P' - Private - 同时实现机密性和完整性

ftp的ssl扩展使用了其中的两种状态
         1)Clear (requested by 'PROT C')
         2)Private (requested by 'PROT P')
在连接过程中通过ftp扩展指令PROT来完成状态的切换。

>>3.3  ssl FTP扩展
在RFC 2228中,ftp协议扩展了如下指令:
      AUTH (Authentication/Security Mechanism),
      ADAT (Authentication/Security Data),
      PROT (Data Channel Protection Level),
      PBSZ (Protection Buffer Size),
      CCC (Clear Command Channel),
      MIC (Integrity Protected Command),
      CONF (Confidentiality Protected Command), and
      ENC (Privacy Protected Command).

其中和SSL扩展相关的主要指令有以下几条:
      AUTH (协商扩展验证): 指定扩展认证方法,SSL或TLS;
      PBSZ (协商保护缓冲区): 制定保护缓冲区,SSL/TLS模式中必须为0;
      PROT (切换保护级别): 切换保护级别,可以为"C"无保护,或"P"保护级别;

在一个典型的ftp ssl通讯过程中指令序列如下:
/====================================================================\
|           Client                                 Server            |
|  control          data                   data            control   |
|====================================================================|
|                                                                    |
|                                                          socket()  |
|                                                          bind()    |
|  socket()                                                          |
|  connect()  -------------------------------------------> accept()  |
|             <-------------------------------------------  220      |
|  AUTH TLS   ------------------------------------------->           |
|             <-------------------------------------------  234      |
|  TLSneg()   <------------------------------------------> TLSneg()  |
|  PBSZ 0     ------------------------------------------->           |
|             <-------------------------------------------  200      |
|  PROT P     ------------------------------------------->           |
|             <-------------------------------------------  200      |
|  USER elly  ------------------------------------------->           |
|             <-------------------------------------------  331      |
|  PASS ****  ------------------------------------------->           |
|             <-------------------------------------------  230      |
|                                                                    |
\====================================================================/

一个SSL FTP的连接过程实例:
/====================================================================\
|                                                                    |
| WinSock 2.0 -- OpenSSL 0.9.7d 17 Mar 2004                          |
| [R] Connecting to 192.168.21.3 -> IP=192.168.21.3 PORT=2121        |
| [R] Connected to 192.168.21.3                                      |
| [R] 220 Please enter your login name now.                          |
| [R] AUTH TLS                                              (认证方法)|
| [R] 234 AUTH Command OK. Initializing SSL connection.              |
| [R] Connected. Negotiating SSL/TLS session..                       |
| [R] SSL/TLS negotiation successful...                     (协商关联)|
| [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits)
| [R] PBSZ 0                                                (PBSZ设置)|
| [R] 200 PBSZ Command OK. Protection buffer size set to 0.          |
| [R] USER elly                                           (ftp传统认证)|
| [R] 331 Password required for elly .                               |
| [R] PASS (hidden)                                                  |
| [R] 230 User elly logged in.                                       |
| [R] SYST                                                           |
| [R] 215 UNIX Type: L8 , CP:936                                     |
| [R] FEAT                                               (扩展指令测试)|
| [R] 211-Extensions supported:                                      |
| [R]  SIZE                                                          |
| [R]  MDTM                                                          |
| [R]  MDTM YYYYMMDDHHMMSS filename                                  |
| [R]  LIST -laT                                                     |
| [R]  STAT -laT                                                     |
|      ...                                                           |
| [R]  AUTH SSL                                                      |
| [R]  AUTH TLS                                                      |
| [R]  PROT                                                          |
| [R]  PBSZ                                                          |
| [R]  SSCN                                                          |
| [R]  UTF8                                                          |
| [R] 211 END                                                        |
| [R] CLNT FlashFXP 2.2.985                                          |
| [R] 213 client type set to FlashFXP 2.2.985.                       |
| [R] PWD                                                (传统通讯过程)|
| [R] 257 "/" is current directory                                   |
| [R] TYPE A                                                         |
| [R] 200 Type set to ASCII.                                         |
| [R] PROT P                                           (切换到保护模式)|
| [R] 200 PROT P accepted.                                           |
| [R] PASV                                                           |
| [R] 227 Entering Passive Mode (192,168,21,3,5,122)                 |
| [R] Opening data connection IP: 192.168.21.3 PORT: 1402            |
| [R] LIST -al                                                       |
| [R] Connected. Negotiating SSL/TLS session..           (加密通讯过程)|
| [R] 150 Opening ASCII data connection for ls / using SSL/TLS.      |
| [R] SSL/TLS negotiation successful...                              |
| [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits)
| [R] 226-free disk space under this directory : 101 mb              |
| [R] 226 Transfer finished successfully. Data connection closed .   |
| [R] List Complete: 181 bytes in 0.14 seconds (1.26 KBps)           |
|                                                                    |
\====================================================================/

在ssl ftp中,有以下几个特殊点:
1, AUTH是可选指令,因为ssl ftp实现的方式不同而存在,详见下一节explicit SSL 与implicit SSL;
2, PBSZ和PROT是必须指令,用于切换到保护通道模式;
3, AUTH,PBSZ和PROT指令是实现SSL认证方式的必须方法,但可以与传统的User/Password   模式共存,或只取其一;
4, SSL认证方法的SSL认证过程(AUTH/PBSZ)和传统模式认证并无严格的先后顺序关联,可能在用户名和密码之前,也可能在之后;但出于安全因素,最好在User/Password传输之前切换到安全模式,可以确保User/Password的传输安全;
5, 在explicit SSL模式中,可以在任何时间切换到保护模式,如第四条所述;在implicit
   SSL模式中,初始化连接将直接采用SSL Socket建立,不需要AUTH指令切换。

>>3.4  Explicit SSL和Implicit SSL
由于历史和软件兼容性因素,ssl FTP的实现有两种方式,分别是Explicit SSL和Implicit SSL,
上面的大部分数据都是以explicit SSL为范例。

Explicit SSL(外部SSL),又被称为AUTH SSL方式;Explicit SSL保持了与传统ftp服务的良好兼容性,以一个ftp服务扩展指令的方式存在。初始化连接可以采用与传统ftp兼容的连接模式,当需要传输加密信息时使用AUTH SSL指令切换到保护模式。使用Explicit SSL时Server必须完整地实现AUTH/PBSZ/PROT等指令。

Implicit SSL(隐含SSL),是一个全新的ftp实现方式,在TCP三步握手完成之后就直接使用SSL Socket进行协商和通讯,之后将全程采用SSL加密连接。在这种模式中一般ftp server将监听在一个新的服务端口,IANA指定ftps:tcp:990为implicit SSL ftp的默认端口。因为在连接初始阶段就自动由SSL实现完成了协商,因此implicit模式中AUTH指令是可选的。

在不考虑兼容性的因素下,在服务期端最好优先使用implicit SSL模式,可以获得更好的保密特性。

比较两种ssl ftp实现模式区别如下:
/======================================================================\
|           explicit                                 implicit          |
|   client            server                client            server   |
|======================================================================|
|                                     |                                |
|  connect() ------>           -+-明文 | sslConnect() ------>      加密 |
|            <------  220       |     |             <------  220 -+    |
|  AUTH SSL  ------>            |     |    USER *** ------>       |    |
|            <------  234      -+     |             <------  331  |    |
|  TLSneg()  <----->  TLSneg() -+-加密 |   PASS *** ------>        |    |
|            <------  200       |     |             <------  230  |    |
|  USER ***  ------>            |     |    LIST     <----->  ...  |    |
|            <------  331       |     |    RETR     <----->  ...  |    |
|  PASS ***  ------>            |     |              ...          |    |
|            <------  230       |     |                           |    |
|  LIST/RETR <----->  ...       |     |  sslClose() <-----> ...  -+    |
|  close()   <----->  ...      -+     |                                |
|                                     |                                |
\======================================================================/


>>3.5  一些杂乱图示
在3.3种引用了一个Explicit SSL连接指令序列,这里是对应的Implicit SSL连接过程:
/======================================================================\
| WinSock 2.0 -- OpenSSL 0.9.7d 17 Mar 2004                            |
| [R] Connecting to 192.168.21.3 -> IP=192.168.21.3 PORT=9909          |
| [R] Connected to 192.168.21.3                                        |
| [R] Connected. Negotiating SSL/TLS session..                         |
| [R] SSL/TLS negotiation successful...                                |
| [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) |
| [R] 220 Please enter your login name now.                            |
| [R] PBSZ 0                                                           |
| [R] 200 PBSZ Command OK. Protection buffer size set to 0.            |
| [R] USER elly                                                        |
| [R] 331 Password required for elly .                                 |
| [R] PASS (hidden)                                                    |
| [R] 230 User elly logged in.                                         |
| [R] SYST                                                             |
| [R] 215 UNIX Type: L8 , CP:936                                       |
| [R] PROT P                                                           |
| [R] 200 PROT P accepted.                                             |
| [R] PASV                                                             |
| [R] 227 Entering Passive Mode (192,168,21,3,5,122)                   |
| [R] Opening data connection IP: 192.168.21.3 PORT: 1402              |
| [R] LIST -al                                                         |
| [R] Connected. Negotiating SSL/TLS session..                         |
| [R] 150 Opening ASCII data connection for ls / using SSL/TLS.        |
| [R] SSL/TLS negotiation successful...                                |
| [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) |
| [R] List Complete: 181 bytes in 0.17 seconds (1.04 KBps)             |
\======================================================================/

Explicit SSL模式下ftp client <-- server的通讯数据,可以看到AUTH SSL之后的指令全部都已经加密,无法看到。对应2.3节中的传统通讯过程,这确保了传输过程中数据无法被窃听到。在Implicit SSL模式中,从初始化连接开始的数据将全部加密,无法分析,因此此处不摘录。
/======================================================================\
21:34:22.095241 IP 192.168.0.1.2279 > 192.168.0.3.999: S 1727744887:1727744887(0) win 65535 (DF)
0x0000  4500 0030 e6b7 4000 8006 92bb c0a8 0001 E..0..@.........
0x0010  c0a8 0003 08e7 03e7 66fb 4b77 0000 0000 ........f.Kw....
0x0020  7002 ffff 428a 0000 0204 05b4 0101 0402 p...B...........
21:34:22.095576 IP 192.168.0.3.999 > 192.168.0.1.2279: S 3598555607:3598555607(0) ack 1727744888 win 65535 (DF)
0x0000  4500 0030 8d9e 4000 8006 ebd4 c0a8 0003 E..0..@.........
0x0010  c0a8 0001 03e7 08e7 d67d 99d7 66fb 4b78 .........}..f.Kx
0x0020  7012 ffff d223 0000 0204 05b4 0101 0402 p....#..........
21:34:22.095639 IP 192.168.0.1.2279 > 192.168.0.3.999: . ack 1 win 65535 (DF)
0x0000  4500 0028 e6b8 4000 8006 92c2 c0a8 0001 E..(..@.........
0x0010  c0a8 0003 08e7 03e7 66fb 4b78 d67d 99d8 ........f.Kx.}..
0x0020  5010 ffff fee7 0000                     P.......
21:34:22.108439 IP 192.168.0.3.999 > 192.168.0.1.2279: P 1:115(114) ack 1 win 65535 (DF)
0x0000  4500 009a 8da4 4000 8006 eb64 c0a8 0003 [email protected]....
0x0010  c0a8 0001 03e7 08e7 d67d 99d8 66fb 4b78 .........}..f.Kx
0x0020  5018 ffff 5cb5 0000 3232 302d 5468 6973 P...\...220-This
0x0030  2073 6572 7665 7220 6973 2066 6f72 2070 .server.is.for.p
0x0040  7269 7661 7465 2075 7365 206f 6e6c 790d rivate.use.only.
0x0050  0a32                                    .2
21:34:22.257722 IP 192.168.0.1.2279 > 192.168.0.3.999: . ack 115 win 65421 (DF)
0x0000  4500 0028 e6c1 4000 8006 92b9 c0a8 0001 E..(..@.........
0x0010  c0a8 0003 08e7 03e7 66fb 4b78 d67d 9a4a ........f.Kx.}.J
0x0020  5010 ff8d fee7 0000                     P.......
21:34:22.257941 IP 192.168.0.3.999 > 192.168.0.1.2279: P 115:154(39) ack 1 win 65535 (DF)
0x0000  4500 004f 8da7 4000 8006 ebac c0a8 0003 E..O..@.........
0x0010  c0a8 0001 03e7 08e7 d67d 9a4a 66fb 4b78 .........}.Jf.Kx
0x0020  5018 ffff 96b3 0000 3232 3020 506c 6561 P.......220.Plea
0x0030  7365 2065 6e74 6572 2079 6f75 7220 6c6f se.enter.your.lo
0x0040  6769 6e20 6e61 6d65 206e 6f77 2e0d 0a   gin.name.now...
21:34:22.264587 IP 192.168.0.1.2279 > 192.168.0.3.999: P 1:11(10) ack 154 win 65382 (DF)
0x0000  4500 0032 e6c2 4000 8006 92ae c0a8 0001 E..2..@.........
0x0010  c0a8 0003 08e7 03e7 66fb 4b78 d67d 9a71 ........f.Kx.}.q
0x0020  5018 ff66 e88e 0000 4155 5448 2053 534c P..f....AUTH.SSL
0x0030  0d0a                                    ..
21:34:22.371140 IP 192.168.0.3.999 > 192.168.0.1.2279: P 154:205(51) ack 11 win 65525 (DF)
0x0000  4500 005b 8dac 4000 8006 eb9b c0a8 0003 E..[..@.........
0x0010  c0a8 0001 03e7 08e7 d67d 9a71 66fb 4b82 .........}.qf.K.
0x0020  5018 fff5 9a03 0000 3233 3420 4155 5448 P.......234.AUTH
0x0030  2043 6f6d 6d61 6e64 204f 4b2e 2049 6e69 .Command.OK..Ini
0x0040  7469 616c 697a 696e 6720 5353 4c20 636f tializing.SSL.co
0x0050  6e6e                                    nn
21:34:22.374945 IP 192.168.0.1.2279 > 192.168.0.3.999: P 11:141(130) ack 205 win 65331 (DF)
0x0000  4500 00aa e6c6 4000 8006 9232 c0a8 0001 [email protected]....
0x0010  c0a8 0003 08e7 03e7 66fb 4b82 d67d 9aa4 ........f.K..}..
0x0020  5018 ff33 f99a 0000 8080 0103 0100 5700 P..3..........W.
0x0030  0000 2000 0016 0000 1300 000a 0700 c000 ................
0x0040  0066 0000 0700 0005 0000 0405 0080 0300 .f..............
0x0050  8001                                    ..
21:34:22.375857 IP 192.168.0.3.999 > 192.168.0.1.2279: P 205:1071(866) ack 141 win 65395 (DF)
0x0000  4500 038a 8dad 4000 8006 e86b c0a8 0003 [email protected]....
0x0010  c0a8 0001 03e7 08e7 d67d 9aa4 66fb 4c04 .........}..f.L.
0x0020  5018 ff73 e356 0000 1603 0100 4a02 0000 P..s.V......J...
0x0030  4603 0140 8283 7da1 8821 775e 7765 a9ee F..@..}..!w^we..
0x0040  18ca e0ab 1b17 461e bf71 515f 6837 5c1a ......F..qQ_h7\.
\======================================================================/


>>4.0<<  总结
FTP的替代应用,如今,如果考虑到其他一些安全的文件传输选择,可能看起来没有理由再使用FTP了,如SCP或者SFTP,与FTP应用相似但运用SSH(注:SecureShell)来进行验证和加密,如果你使用一台基于UNIX的服务器,你可以在命令方式下调用SCP或者SFTP,如果你想获得更多的关于SSH的信息,参考如下URL:http://www.openssh.com
如果你只是用FTP来更新你的Web页面,有别的替代应用,称为WebDAV的新的协议,WebDAV是HTTP的扩展,它允许多个用户共同编辑和维护远程WEB服务器上的文件,如果想了解WebDAV的详细信息,参考:http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc2518.html

FTP是在70年代设计出来的,那个时候互联网还是一个封闭的网络,网络安全不是一个大的问题。当FTP在使用NAT网关、防火墙、CISCO访问列表的现代网络环境中运用的时候,不管你使用Port模式还是Passive模式,都可能产生一些问题,FTP在公网上作为一些关键应用的文件传输手段可能就是一个错误;当然近年很多人为了是FTP协议更加安全进行了不懈的努力,这些努力却使对于FTP的排错更加复杂,而且都没有解决FTP最大的问题,即明文传输用户名和口令。有许多应用可以替代FTP,如SCP,SFTP或者WebDAV。

以上为原文总结,本文下半部分补充了ftp自身的安全扩展,使用SSL/TLS进行ftp传输过程的验证和加密,良好的实现了与传统ftp协议的兼容性和优良的数据保密性与完整性。在无法使用替代服务的环境下,是一种非常好的ftp服务改进计划。

略有不足的是,由于历史兼容性因素,很多ftp client和server对ssl ftp扩展的实现都存在着各种缺陷,例如加密算法不足,指令顺序有错误等等,这可能会引起一些安全保护级别的削弱。
1, 由于没有良好的PKI体系支撑,很多ftp server的证书合法性无法得到验证,可能存在无法信任或被伪造的可能;
2, 由于Explicit SSL模式的历史兼容问题,AUTH指令和USER/PASS指令序列的优先级没有明确约定,可能存在指令序列错误造成信息泄露的问题;
3, 由于SSL自身体系的一些问题,可能受到证书泄露,伪造,或SSL中间人攻击;
4, 在不完整的CA或PKI体系下,只能够采用自签名证书,这时SSL ftp得到的安全性提高仅仅
   是通讯过程加密,并无法完成身份认证的功能。

当然,排除无法实现身份认证功能和略微的实现缺陷,ssl ftp仍然是一种优秀的ftp服务安全加强措施。

二、FTP连接跟踪





你可能感兴趣的:(Tcp/ip)