本文以 centos 的Linux服务器为例,使用 Vsftpd 搭建被动模式的 FTP 服务。
FTP 的两种模式
FTP 存在两种模式,PORT(主动)模式和PASV(被动)模式。
主动模式
FTP服务器“主动”去连接客户端的数据端口来传输数据。 即客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的21端口。然后客户端开始监听N+1,并发送 PORT N+1 到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
被动模式
FTP服务器“被动”等待客户端来连接自己的数据端口。 即当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送 PORT P 命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(此模式下的FTP服务器不需要开启tcp 20端口)
两种模式比较
(1)PORT(主动)模式只要开启服务器的21和20端口,而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。
(2)从网络安全的角度来看的话似乎 PORT 模式更安全,而 PASV 更不安全,那么为什么 RFC 要在 PORT 基础再制定一个 PASV 模式呢?其实 RFC 制定 PASV 模式的主要目的是为了数据传输安全角度出发的,因为 PORT 使用固定20端口进行传输数据,那么作为黑客很容使用sniffer等探嗅器抓取 ftp 数据,这样一来通过 PORT 模式传输数据很容易被黑客窃取,因此使用 PASV 方式来架设 ftp server 是最安全绝佳方案。
安装 Vsftpd
1、安装
yum install vsftpd
2、设置开机启动
systemctl enable vsftpd
3、启动 vsftpd
systemctl start vsftpd
4、确认已经启动 vsftpd
systemctl start vsftpd
配置 Vsftpd
1、为 FTP 服务创建一个用户
useradd ftpuser
2、设置该用户的密码
passwd ftpuser
3、创建 FTP 服务使用的文件目录,并修改目录权限
mkdir /var/ftp/ftpupload
chown -R ftpuser:ftpuser /var/ftp/ftpupload
4、编辑配置文件 /etc/vsftpd/vsftpd.conf
- 修改 配置文件之前先备份
cp /etc/vsftpd.conf /etc/vsftpd.conf.back
- 修改以下配置参数,监听 IPv4 或 IPv6 只能选择开启一个
# 匿名用户的登录权限
anonymous_enable=NO
# 本地用户的登录权限
local_enable=YES
# 将所有用户限制在主目录
chroot_local_user=
# 启动限制用户的名单
chroot_list_enable=YES
# 例外用户列表文件的路径
chroot_list_file=/etc/vsftpd/chroot_list
# 开启监听 IPv4 sockets
listen=YES
# 关闭监听 IPv6
#listen_ipv6=YES
- 新增以下配置参数,开启被动模式
# 本地用户登录后所在目录
local_root=/var/ftp/upload
# 本地用户访问相关,需要开启
allow_writeable_chroot=YES
# 开启被动模式
pasv_enable=YES
# 被动模式地址,本服务器的 IP 地址
pasv_address=xxx.xx.xxx.xx
# 被动模式使用的最小、最大端口
pasv_min_port=40000
pasv_max_port=45000
- 创建并编辑配置中
chroot_list_file指定的例外用户列表文件
touch /etc/vsftpd/chroot_list
- 重启 FTP 服务
systemctl restart vsftpd