Modify by lyc at 2018-06-19
文件内容来自互联网整理。

1.FTP介绍

 FTP (File Transfer Protocol) 是在因特网上已行之多年的文件传输协议,透过这个通讯协议,可以将远程计算机的档案数据传送回本机端 (下载),也可以把本机的档案数据传输至远程计算机 (上传) ﹔而所谓的 FTP Server,就是一部专门提供给客户端进行档案上传与下载服务的服务器。

 我们都知道 Web Server 是用 http 来做数据传输的协议,其除了可让 Client 端浏览网页外,同时也提供档案上传与下载的服务,不过它比较适用于小档案的传输,而在对大文件传输时,所表现的稳定度及传输效率就不那么高了。所以想改善 http 传输档案上的缺失及效能,最好的方式就是架设一台 FTP Server 了。

 用来架设 FTP Server 的软件有好几种,其中最老牌的算是 wu-ftpd,不过也由于其树大招风的关系,使得在安全性方面会有比较大的隐忧。不过还好后来又陆续发展出一些安全性较佳的服务器软件,比方像 proftpd、vsftpd 及 pure-ftpd 等,而本章将会针对 pure-ftpd 及 vsftpd 这两个服务器软件来做介绍。

2.FTP 的联机流程

ftp主动与被动模式原理

 在还没开始介绍流程之前,要先来了解一下两台计算机间 TCP 联机建立的过程:

  当 Client 向 Server 提出主动联机请求时,会送出联机过程的第一个 TCP 封包给对方,而此时 TCP 封包中的 SYN (同步旗标) 位值设定为 1,代表的是一个联机的启动 ﹔接着 Server 端也必须启动自己的联机并做响应的确认,因此会向 Client 端送出联机过程的第二个封包,此时该封包的 SYN 及 ACK (回应确认旗标) 位值皆设定为 1 ﹔最后在 Client 端收到对方的封包后,必须做响应确认的动作,因此会送出联机过程的第三个封包给 Server,此时封包的 ACK 位值设定为 1。至此双方的联机才正式建立起来,这就是所谓的 TCP Three-Way Handshake ( TCP 三段式交握 )。

  了解了 TCP 联机建立的观念后,底下就来说明 FTP 联机的过程。不过在此之前,要先了解的是,FTP Client 能采取的联机模式有两种,分别是主动模式 (Active mode) 及被动模式 (Passive mode),所以接着会以这两种不同模式来叙述联机过程。

3.主动模式下的 FTP 联机

当 FTP Client 一开始要连上 FTP Server 时,会先随机产生一个大于 1024 的 port ( 假设 3000 port ),来主动对 FTP Server 的 21 port 做联机,等完成了 TCP 三段式交握后,联机才正式建立起来,而这个 3000 port 与 21 port 所建立的联机信道,就叫做命令信道 (command channel )。之所以会称其为命令通道,当然是只能执行一些基本指令而已。

  • 命令通道
1
2
graph LR
ftp_client:3000-->ftp_server:21

现在若是 Client 端想要下载或上传数据时,还要另外建立起一条数据信道 (data channel ) 来作为数据传输使用。由于 Client 是采取主动模式 (可以想象 Client 要求 Server 做主动联机,也就是 Server 主动连 Client ),因此本身会再开启另一个大于 1024 的 port ( 假设 5000 port ),然后透过命令通道通知 Server 已准备好这个 data channel 的端口,接着 Server 就以 20 port 来主动与 Client 端的 5000 port 建立联机,就在完成了另一次的三段式交握后,此 data channel 便建立起来,至此 Client 方可开始做数据传输。

  • 数据通道
1
2
graph LR
ftp_client:5000-->ftp_server:20

4.被动模式下的 FTP 联机

一开始命令通道(command channel)的建立,与上面所述相同,不再重复,这里只针对数据通道(data channel) 的建立做说明:

  • 由于此时Client是希望采取被动模式(可以想象 Client 要求 Server 做被动联机,也还是 Client 主动连 Server),所以会先通过命令通道(command channel)来通知 Server 这个讯息。

  • Sever 收到后就随机开启一个大于 1024 的 port (假设 8000 port),并经由命令通道(command channel)通知 Client 已准备好数据通道(data channel)的端口,接着 Client 也随机开启一个大于 1024 的 port (假设 9000 port) 来主动与 Server 建立联机,而完成的三段式交握后,此 8000 port 与 9000 port 之间的数据通道(data channel) 便建立起来了。

  • 数据通道

1
2
graph LR
ftp_client:8000-->ftp_server:9000

5.总结

主动模式和被动模式端口:

  • 主动模式:服务端21端口是命令通道端口,服务端20端口数据通道端口;客户端的命令通道和数据通道端口都是大于1024的一个随机端口。
  • 被动模式:服务端21端口是命令通道端口,服务端的数据通道端口是大于1024的随机端口;客户端的命令通道和数据通道端口都是大于1024的一个随机端口。

服务端防火墙策略:

  • 主动模式:开放20,21防火墙端口
  • 被动模式:配置ftp-server,指定被动模式数据通道端口在一个区间内,如4000-5000或8000-9000,然后开放这个端口区间的防火墙策略。