FTP简介
FTP(File Transport protocol),即文件传输协议,可有效地提高文件的共享和数据可靠高效地传输。FTP协议与前面几节介绍的Http协议更复杂,建立FTP连接时,需要同时开启两个端口,一个用于命令控制,另一个作为数据传输的端口,提高了效率。一般21端口作为命令控制的端口、20端口作为数据传输的端口。
命令控制端口:负责FTP命令发送、接收返回的响应信息。
数据端口:显示目录列表、上传、下载文件等有数据传输的操作。
下面简单介绍一下FTP的两种连接模式:主动模式、被动模式,其中的主动和被动都是针对服务器端来说的,主动模式下,服务器开启数据端口主动连接客户端,被动模式下,服务器端开启一个数据传输端口告诉客户端,然后服务器端被动地去连接这个端口。
FTP的主动模式【PORT】
主动模式下,客户端打开一个随机端口,向服务器端的21端口发起连接;同时客户端还会打开一个监听端口,并向服务器发送命令,服务器响应客户端命令主动开放20端口连接到客户端。
主动模式下,客户端告诉服务器端自己的端口号,让服务器的20端口主动连接客户端,这种方式是不安全的。因此客户端和服务器端都应该开启防火墙,对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。
【FTP协议的安全性分析,具体可以看一下网管小王的博客】防火墙对FTP主动和被动模式的影响.
FTP的被动模式【PASV】
被动模式下,当开启一个FTP连接时,客户端打开两个随机的端口,提交PASV命令,并用第一个端口去连接服务器的端口命令控制端口21,返回消息服务器的地址及开放的数据端口号,这是客户端的第二个端口去连接服务器的数据端口号,至此FTP的客户端和服务器端就建立了被动连接模式,进行后续的数据传输。
FTP包格式如下:
抓包实验
服务端:IP:192.168.67.136
系统:CentOS 6.8
ftp服务端:vsftpd-2.2.2-24.el6.x86_64
客户端:IP:192.168.67.131
系统:CentOS 6.8
ftp客户端:ftp-0.17-54.el6.x86_64
实验一:被动模式
服务端的被动模式配置为
pasv_enable=YES #开启被动模式
pasv_min_port=50000 #被动模式服务端数据连接端口范围最小值
pasv_max_port=50010 #被动模式服务端数据连接端口范围最大值
wireshark过滤条件
fpt || ftp-data
客户端登陆即操作过程
[root@localhost ~]# ftp
ftp> open 192.168.67.136 21
Connected to 192.168.67.136 (192.168.67.136).
220 Welcome to blah FTP service.
Name (192.168.67.136:root): virtual1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get 1.zip
local: 1.zip remote: 1.zip
227 Entering Passive Mode (192,168,67,136,195,89).
150 Opening BINARY mode data connection for 1.zip (54848 bytes).
226 Transfer complete.
54848 bytes received in 0.000889 secs (61696.29 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,67,136,195,89).
150 Here comes the directory listing.
-rw-r--r-- 1 500 500 54848 Sep 12 16:35 1.zip
-rw-r--r-- 1 500 500 14253627 Jun 07 16:11 11.zip
-rw-rw-r-- 1 500 500 0 Sep 12 13:17 test.txt
226 Directory send OK.
ftp> exit
221 Goodbye.
[root@localhost ~]#
代码 1
客户端和服务端两个系统为vmware里的两个虚拟机,我在我的物理主机上监听虚拟网卡vnet8网卡进行抓包,结果如下图
图 1
图 2
通过上面两图可以看到ftp协议以及tfp-data协议的交互过程,我们看第一个52号包,为什么先从服务端发起的,其实在进行ftp协议之前,还有其他的tcp协议,现在我们将过滤条件更改为如下,再来分析抓包
ip.addr == 192.168.67.136 && ip.addr == 192.168.67.131
如下图,是完整的tcp建立连接,登陆ftp,传输文件,退出ftp的详细过程。
图 3
图3已经很详细的标明了各个步骤,结合代码1的操作来看,就能对应起来了。
此外,我还要说几点
- 256号包里包含了详细目录信息如下
图 4
- 我们可以注意到,图3中控制连接和数据连接分别都经历了三次握手和四次挥手,且数据连接建立了两次,分别是传输文件和显示目录的时候,所以在ftp客户端进行的各种例如ls,pwd等命令操作,其返回信息都是通过数据连接来传输信息的。且每次建立数据连接之前,客户端都会发送主动或者被动的模式的指令告知服务端。
- 还有,服务端是如何告诉客户端服务端监听的数据端口号呢?
比如168号包,服务端返回 Response: 227 Entering Passive Mode (192,168,67,136,195,89),其中192,168,67,136,代表服务端IP 192.168.67.195,而后面两个数 195 * 256 + 89 = 50009,即告诉客户端服务端监听的数据端口为50009。
因为服务端的配置文件里限制了端口范围为50000-50010,所以也都会在这个范围内。因此,服务端的防火墙除了需要开启21号端口,也需要开启50000-50010这段的端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:50010 -j ACCEPT
正因为服务端的端口可控,因此在客户端和服务都开启了防火墙的情况下,被动模式更为适用。
- 还有就是图3中的四次挥手,有些时候只有三个包。其实是tcp为了优化,将中间两个包合并在一起发送了。
实验二:主动模式
说完被动模式,现在来说说主动模式。
服务端配置为关闭被动模式
pasv_enable=YES
服务端防火墙只需要开启21号端口即可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
客户端关闭iptables
同样,客户端的操作过程代码如下
[root@localhost ~]# ftp
ftp> open 192.168.67.136 21
Connected to 192.168.67.136 (192.168.67.136).
220 Welcome to blah FTP service.
Name (192.168.67.136:root): virtual1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode off.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 500 500 54848 Sep 12 16:35 1.zip
-rw-r--r-- 1 500 500 14253627 Jun 07 16:11 11.zip
-rw-rw-r-- 1 500 500 0 Sep 12 13:17 test.txt
226 Directory send OK.
ftp> get 1.zip
local: 1.zip remote: 1.zip
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 1.zip (54848 bytes).
226 Transfer complete.
54848 bytes received in 0.00319 secs (17172.20 Kbytes/sec)
ftp> exit
221 Goodbye.
[root@localhost~]#
整个过程的抓包结果如下
图 5
关于主动模式还有几点需要说明一下
- 被动模式是服务端发送自己监听的数据端口(包括IP),等待客户端来连接;而主动模式是客户端发送自己监听的数据端口(包括IP),等待服务端主动过来连接。被动模式下,服务端发送的端口范围可以在配置文件里控制,而主动模式下,客户端发送的端口是随机的,没有办法控制。因此在被动模式下,双方都可以开启防火墙,服务端在iptables上打开21和相应的数据端口即可;而在主动模式下,服务端iptables只需要开启21端口等待客户端的控制连接,客户端则不能打开防火墙,否则服务端的数据通道连接不上客户端监听的随机端口。
- 在linux下的ftp客户端,一般默认的连接模式是被动连接,所以这里我们在登陆FTP成功后,需要使用passive命令关闭被动模式(再执行一次又开启了)。
- 在182号包和243号包里,Response: 200 PORT command successful. Consider using PASV 其中的Consider using PASV到底是什么意思,此处我们服务端已经设定为主动模式了,且客户端也已经发送了自己监听的端口,为什么服务端还会显示"考虑使用PASV"呢,希望知道的大神指点一下。
总结
1.配置
一般,ftp服务搭建连接不通主要就是主被动没搞清楚,记住vsftpd中,与主被动相关的配置只有如下三个
pasv_enable=NO
pasv_min_port=50000
pasv_max_port=50010
当然,其他的文件目录权限不对,也是连接不上的。
参考:
https://www.cnblogs.com/Erma/p/10333127.html
https://blog.csdn.net/longyc2010/article/details/43113173
https://zh.wikipedia.org/wiki/FTP命令列表
https://blog.csdn.net/longyc2010/article/details/43113173