FTP 协议

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值