FTP全称: File Transfer Protocol,是一个用于文件传输的协议,本文主要讲解FTP协议。如果有不懂的地方可以查询FTP的定义文档: RFC 959 或者在评论中提出,同时有写错的地方也希望能提出来,大家一起进步。
FTP 是一个协议而不是一个服务,很多人把FTP理解为了一个服务,这里是不正确的,其实应用了FTP协议的服务也有很多,例如:vsftpd, pure-ftpd, Filezila Server等。
我这里主要讲解以下FTP的工作模式、FTP的命令和FTP应答代码的作用三个部分。以及在最后有一个ftp连接抓包作为讲解内容便于理解。
FTP工作模式
FTP的完整工作有2个TCP连接,分别用于命令传输和数据传输(文件传输)。其分开为2个连接主要就是为了防止传输二进制文件破坏了命令连接的终端,可以在命令连接中指定数据传输的模式,以此来降低程序开发的复杂性。
FTP 的工作模式分主动连接和被动连接,这两者的区别主要就在于数据连接的连接方式:
主动连接:服务器 20/TCP 端口主动发起连接到客户端指定的端口。
被动连接:客户端主动发起连接到服务器端指定端口。
这里也会有人问,主动模式和被动模式的意义何在? 这里我也就说以下:
现在大部分用户的网络其实都并不是公网地址,都是使用NAT转换过的内网地址,如果使用主动连接模式服务器不可能连接到客户端开启的端口。所以只能使用被动连接模式,让客户端主动连接服务器端口,以此来达到数据传输的目的。
主动连接的好处其实就在于便于配置防火墙规则,由服务器的20/TCP主动连接客户端端口,防火墙只需要配置出口允许20/TCP连接即可,不像被动连接需要开启多个TCP端口监听数据连接。
FTP命令
FTP的命令有很多,我这里也就不一一讲解了,主要讲解以下一些常用常见的命令:
接入命令
命令
解释
USER
输入用户名
PASS
输入用户密码
QUIT
退出用户登录
REIN
重新登入用户
ACCT
部分服务软件并不需要再一开始就认可,
可能再进入某个目录后开始要求用户认证
文件管理类命令
命令
解释
CWD
更改服务上的工作目录
CDUP
切换到父目录(上级目录)
DELE
删除服务器上的文件
LIST
列出当前目录的文件(UNIX形式)
NLST
列出当前目录下的文件(只包含文件名)
MKD
在服务器上创建一个目录
PWD
显示当前工作路径
RMD
从服务器上删除目录
RNFR
指定需要重命令的文件。(需要配合RNTO使用)
RNTO
更名为指定命令
传输时的数据模式
命令
解释
TYPE
定义文件类型。A(ASCII)、E(EBCDIC)、I(Image)、L(Local byte size)
STRU
数据组织类型。F(file)、R(record structure)、P(page structure)
MODE
定义传输方式。S(stream)、B(block)、C(compressed)
PASV
指定服务器开启被动连接模式
文件传送命令
命令
解释
RETR
下载文件
STOR
上传文件
STOU
与STOR类似,但是文件名称不由客户端控制,
由服务器端自动生成文件名,并且使用 250 代码返回文件名称。
STAT
放回服务器状态
ALLO
指定服务器需要预留的空间大小
ABORT
停止之前的所有命令,包括文件传输
APPE
如果文件不存在则创建文件,
如果文件以存在则以追加形式添加到文件中。
PORT
指定数据连接端口。共6位,按,分割。
前4位为IP位,后2位为端口为,端口位1*256+端口位2 = 指定开启的端口。
REST
类似于断点续传功能。
其他命令
命令
解释
HELP
查询服务器的帮助信息
NOOP
检测服务器允许状态
SITE
此命令用于查询特定于服务器的专有服务
SYST
查询服务器使用的操作系统
FTP应答代码
FTP 客户端是通过应答码来检测服务所表达的意思,除了几个特殊的应答码,大部分应答码后面的内容是给用户查看的。
FTP 应答码的分类:
第一个标志位:
1xx:服务器正在积极响应,但是还未准备完成。
2xx:命令已经正常启动。
3xx:命令被接收,需要等待进一步响应。
4xx:命令错误,无法接收该命令,客户端可以重新尝试命令。
5xx:命令无法被接收,客户端无需再次尝试该命令。
第二标志位:
x0x:有关语法是否正确。
x1x:对信息请求的回复。
x2x:连接状态信息。
x3x:认证和通过信息。
x4x:预留。
x5x:文件系统对于请求的回复。
响应代码
解释说明
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
请求操作终止,文件名不允许
FTP 命令抓包分析
这个是我用 wireshark 抓包抓到的命令连接的数据。
这里我干了3件事情,上传文件、下载文件和目录浏览(2次)。所以这里实际上完成了四次数据传输,我们待会一一查看。
眼尖的人应该已经发现了,是由客户端发送了 PORT 指令,所以是由服务器端连接客户端,也就是主动连接模式,这里需要注意!!
第一段:登入前的服务器配置
220 (vsFTPd 3.0.3) # 220,表示服务器准备完成,客户端客户发送命令了。 后面跟的是服务器的版本信息。
OPTS UTF8 ON # 表示服务器需要切换到UTF8字符集进行工作。
200 Always in UTF8 mode. #200,表示命令执行成功,后面的提示信息表示已经工作再UTF8模式下了。
第二段:用户认证
USER ftp # 指定用户ftp(匿名用户,anonymous也是匿名用户)
331 Please specify the password. # 331 表示需要输入密码
PASS # 表示输入密码,FTP规定匿名用户可以选择需要输入自己的邮箱,但是这里可以省略不写。
230 Login successful. # 230 表示用户登入成功
第三段内容:目录当前浏览
PORT 192,168,10,103,211,216 # PORT,这里用于指定客户端的IP地址和端口
200 PORT command successful. Consider using PASV. # 表示命令执行成功, 这里是端口连接成功
LIST # 表示列出当前工作目录下的文件
150 Here comes the directory listing. # 150 表示即将开始传输数据。
226 Directory send OK. # 226 表示文件传输成功。
PORT命令中的前四位为IP地址,后2位为端口,其中端口应该这样计算: 211 * 256 + 216 = 54232
这个是这条命令的返回结果(在数据连接中,所以这里当前的命令连接中是看不到的)
第四段内容:切换目录
CWD pub # CWD,表示切换到pub目录下。
250 Directory successfully changed. # 250 表示请求操作执行完成。
第五段内容:再次浏览当前目录
# 与第三段相同,不过多讲解。
PORT 192,168,10,103,211,217
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.
下图为返回内容:
第六段内容:上传文件
PORT 192,168,10,103,211,218
200 PORT command successful. Consider using PASV.
STOR test.c # STOP 表示上传文件,文件名为 test.c
150 Ok to send data. # 150,表示文件状态正常,开始传输数据。
226 Transfer complete. # 226,表示文件传输完毕。
第六段内容:下载文件
PORT 192,168,10,103,211,219
200 PORT command successful. Consider using PASV.
RETR test.file # RETR 下载文件。
150 Opening BINARY mode data connection for test.file (12 bytes). # 150,表示文件正常,开始传输文件,后面会提示文件名称和文件大小。
226 Transfer complete.
第六段内容:退出
QUIT # 退出
221 Goodbye. # 服务退出控制连接
本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【2MLRYL4K】获取授权信息。