背景介绍
工作的原因,需要搭建一台 VSFTP 服务器。听说 VSFTP 是最经常用的的 FTP 工具。于是预定使用该工具进行搭建,真正到搭建的过程中才发现,这玩意的配置还是蛮复杂的。我的需求是需要使用一个专门的目录提供 FTP 服务,往上搜索配置的时候发现 FTP 提供服务的两种不同模式,简单记录一下进行扫盲。
需要注意的是 VSFTP 默认工作在被动模式下。
FTP 服务的主动模式与被动模式
FTP 是仅基于 TCP 的服务,不支持 UDP。 与众不同的是 FTP 使用 2 个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是 21(命令端
口)和 20(数据端口)。但 FTP 工作方式的不同,数据端口并不总是 20。这就是主动与被动 FTP 的最大不同之处。
FTP 主动模式
主动方式的 FTP 是这样的:客户端从一个任意的非特权端口 N(N>1024)连接到
FTP 服务器的命令端口,也就是 21 端口。然后客户端开始 监听端口 N+1,
并发送 FTP 命令 “port N+1” 到 FTP 服务器。接着服务器会从它自己的数据端口
(20)连接到客户端指定的数据端口(N+1)。
针对 FTP 服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式 FTP:
- 任何大于 1024 的端口到 FTP 服务器的 21 端口。(客户端初始化的连接)
- FTP 服务器的 21 端口到大于 1024 的端口。 (服务器响应客户端的控制端口)
- FTP 服务器的 20 端口到大于 1024 的端口。(服务器端初始化数据连接到客户端的数据端口)
- 大于 1024 端口到 FTP 服务器的 20 端口(客户端发送 ACK 响应到服务器的数据端口)
简明概括:
PORT(主动)方式的连接过程是:客户端向服务器的 FTP 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,
客户端在命令链路上用 PORT 命令告诉服务器:“我打开了 XXXX 端口,你过来连接我”。于是服务器从 20 端口向客户端的 XXXX 端口发送连接请求,
建立一条数据链路来传送数据。
开启主动模式:
pasv_enable=no
若设置为 YES,则使用 PASV 工作模式;若设置为 NO,则使用 PORT 模式。默认值为 YES,即使用 PASV 工作模式。
主动模式下:
SecureFX 工具去连接 ftp,客户没有允许开放端口,服务器没法与客户端相连接,关闭客户端防火墙
FTP 被动模式
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的 FTP 连接方式。这就是所谓的被动方式,或者叫做 PASV,当客户端通知服务器它处于
被动模式时才启用。
在被动方式 FTP 中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口(N > 1024 和 N+1)。第一个端口连接服务器的 21 端口,但与主动方式的 FTP 不同,
客户端不会提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024)
,并发送 PORT P 命令给客户端。然后客户端发起从本地端口 N+1 到服务器的端口 P 的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的 FTP:
- 从任何大于 1024 的端口到服务器的 21 端口 (客户端初始化的连接)
- 服务器的 21 端口到任何大于 1024 的端口 (服务器响应到客户端的控制端口的连接)
- 从任何大于 1024 端口到服务器的大于 1024 端口 (客户端初始化数据连接到服务器指定的任意端口)
- 服务器的大于 1024 端口到远程的大于 1024 的端口(服务器发送 ACK 响应和数据到客户端的数据端口)
简明概括:
PASV(被动)方式的连接过程是:客户端向服务器的 FTP 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,
服务器在命令链路上用 PASV 命令告诉客户端:“我打开了 XXXX 端口,你过来连接我”。于是客户端向服务器的 XXXX 端口发送连接请求,建立一条数据
链路来传送数据。
开启被动模式
默认是开启的,但是要指定一个端口范围,打开 vsftpd.conf 文件,在后面加上
pasv_enable=yes
若设置为 YES,则使用 PASV 工作模式;若设置为 NO,则使用 PORT 模式。默认值为 YES,即使用 PASV 工作模式。
pasv_min_port=30000
在 PASV 工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为 0。
pasv_max_port=30999
在 PASV 工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为 0。
表示端口范围为 30000~30999,这个可以随意改。改完重启一下 vsftpd
由于指定这段端口范围,iptables 也要相应的开启这个范围,所以像上面那样打开 iptables 文件。
也是在 21 上下面另起一行,更那行差不多,只是把 21 改为 30000:30999, 然后: wq 保存,重启下 iptables。这样就搞定了。
总结
主动 FTP 对 FTP 服务器的管理有利,但对客户端的管理不利。因为 FTP 服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的
防火墙阻塞掉。被动 FTP 对 FTP 客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端
口,而这 个端口很有可能被服务器端的防火墙阻塞掉。
幸运的是,有折衷的办法。既然 FTP 服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动 FTP。我们可以通过为 FTP 服务器指定
一个有 限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的
危险,但它大大减少了危险。
简而言之:
主动模式(PORT)和被动模式(PASV)。主动模式是从服务器端向客户端发起连接;被动模式是客户端向服务器端发起连接。两者的共同点是都使
用 21 端口进行用户验证及管理,差别在于传送数据的方式不同,PORT 模式的 FTP 服务器数据端口固定在 20,而 PASV 模式则在 1025-65535 之间随机。