Linux部署FTP服务器
1. FTP简介
FTP 是 File Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具。
vsftpd 是 very secure ftp daemon 的缩写,它是 Linux 上使用最受欢迎、使用最广泛的 FTP 服务器之一,它具有安全,速度快,稳定的特点,很多重要的 FTP 站点比如 ftp.gnu.org、ftp.freebsd.org 都是使用 vsftpd 作为服务器的。
当前,FTP服务在日常工作中使用得也挺多,每次服务器版本更新都需要先打包,然后上传到线上的FTP服务器上,再从FTP服务器上下载服务器包到线上机器,进行MD5校验,然后就可以更新线上服务器了。
1.1 工作模式
服务器使用两个端口和客户端通信,一个是命令端口,也叫控制端口,默认是 21, 用于命令的传输 ;一个是数据端口,默认是 20 ,用于数据的传输。
1.1.1 主动模式 port
客户端向FTP服务器发送端口信息,由服务器主动连接该端口。
流程:客户端和FTP服务器的命令端口(21)建立TCP连接,当需要传输数据时,客户端新启动一个用于数据传输的端口,并在命令端口的连接上用 PORT 命令告诉服务器该端口号,服务器与该端口建立TCP连接,连接成功之后,客户端开始传输数据。
1.1.2 被动模式 pasv
FTP服务器开启并发送端口信息给客户端,由客户端连接该端口,服务器被动接受连接。
流程:客户端和FTP服务器的命令端口(21)建立TCP连接,当需要传输数据时,服务器侦听一个用于数据传输的端口,并在命令端口的连接上用 PASV 命令告诉客户端该端口号,客户端与该端口建立TCP连接,连接成功之后,客户端开始传输数据。
1.1.3 对比
-
在主动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的20端口,你就从这里把东西给我吧,服务器收到后就会连接客户端已打开的20端口把东西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件。
-
在被动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,服务器端知道后,就打开一个空闲的高端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧,于是客户端就从那个高端口进去拿文件了,这就是被动模式,可以理解为服务端被客户端拿走了东西。
1.2 用户认证模式
1.2.1 匿名用户认证模式(Anonymous Access)
原理:
- 无需身份验证:用户通过通用账户(如
anonymous
或ftp
)登录,无需密码或使用任意邮箱地址作为密码。 - 默认权限限制:通常只能访问指定目录(如
/var/ftp/
),禁止上传或删除文件(需手动配置权限)。
优缺点:
- 优点:适合公共资源下载(如软件镜像站)。
- 缺点:安全性极低,易遭恶意攻击或滥用。
适用场景:
- 公开文件分发(只读访问)。
- 临时共享无需身份验证的资源。
1.2.2 本地用户认证模式(Local System User)
原理:
- 系统用户登录:用户使用服务器操作系统的真实账户(如
/etc/passwd
中的用户)登录FTP。 - 权限继承:用户可访问其系统家目录,并拥有与系统账号相同的文件权限。
优缺点:
- 优点:管理简单,适合内部团队使用。
- 缺点:
- 系统用户可能拥有SSH等额外权限,扩大攻击面。
- 密码明文传输(未加密时)易被窃听。
适用场景
- 内部团队文件共享(需严格控制用户权限)。
- 需要直接使用现有系统账号的场景。
1.2.3 虚拟用户模式(Virtual User)
原理:
- 独立用户数据库:虚拟用户不与系统用户关联,仅用于FTP服务。
- 权限隔离:可自定义每个虚拟用户的访问目录和操作权限(读/写/删除)。
优缺点:
- 优点:
- 安全性高:虚拟用户无系统权限。
- 灵活管理:可针对不同用户设置不同权限。
- 缺点:配置复杂,需维护独立的用户数据库。
适用场景:
- 企业级FTP服务(需细粒度权限控制)。
- 对外提供用户专属空间(如客户文件上传)。
1.2.4 三种模式对比
模式 | 安全性 | 管理复杂度 | 适用场景 |
---|---|---|---|
匿名用户 | 低 | 简单 | 公开只读资源下载 |
本地用户 | 中 | 中等 | 内部团队共享(需权限控制) |
虚拟用户 | 高 | 复杂 | 企业级多用户安全访问 |
1.3 建议
-
大多数FTP客户端都在局域网中,没有独立的公网IP地址,且有防火墙阻拦,主动模式下FTP服务器成功连接到客户端比较困难。因此,如无特殊需求,都是将FTP服务器配置为被动模式,本文后面的FTP服务器配置也是以被动模式为例的。
-
被动模式下,命令端口和数据端口都是在FTP服务器端开启,也都可以通过启动配置来修改,由于默认的端口是公开的,安全性低,所以实际安装的时候都会修改默认端口。
2. VSFTPD安装步骤
2.1 安装前
安装前可以使用如下命令检测是否安装:
vsftpd -v #如未安装会出现如下提示: -bash: vsftpd: 未找到命令...
2.2 更新系统包(可选但推荐)
sudo yum update
2.3 安装vsftpd
sudo yum install vsftpd -y
安装完成后,可使用如下命令检测,如果输出版本号,代表安装成功。
vsftpd -v
2.4 创建用户
- 添加用户。
adduser -d /home/ftpuser ftpuser -s /sbin/nologin
- 修改ftpuser用户密码。
echo "123456" | passwd --stbin ftpuser #123456:ftpuser用户的密码
或者
passwd ftpuser
- 新建FTP目录,并且修改权限。
注意:/home/ftpuser/ftp 是 ftpuser用户的锁定目录,ftpuser登录之后,只能呆在此目录以及此目录的子目录中,不允许切换到其他目录。
sudo mkdir -p /home/ftpuser/ftp
sudo chown ftpuser:ftpuser /home/ftpuser/ftp
sudo chmod 750 /home/ftpuser/ftp # 禁止其他用户访问
2.5 配置服务器
vsftpd文件与目录:
/usr/sbin/vsftp: vsftp的主程序
/etc/rc.d/init.d/vsftp: vsftp的启动脚本
/etc/vsftpd/vsftpd.conf: vsftp的配置文件
/etc/pamd/vsftpd: PAM认证文件
/etc/vsftpd/ftpusers: 禁止使用FTP的用户
/var/ftp: ftp匿名主目录
/varftp/pub: ftp匿名上传主目录
安装完成之后,默认的配置位于 /etc/vsftpd/vsftpd.conf。
修改vsftpd.conf配置文件。
vim /etc/vsftpd/vsftpd.conf
#是否允许匿名登录,默认允许,如果允许,用户名 ftp 和 anonymous 都会被当做匿名登录
#为了安全,一般不允许匿名登录
anonymous_enable=NO
#是否允许匿名上传,默认不允许,如果允许 write_enable 选项需要设置为 YES
#为了安全,一般不允许
anon_upload_enable=NO
#是否允许本地用户登录,默认不允许,如果允许,在 ```/etc/passwd```中的用户都可以登录 FTP 服务器
#如果不予许匿名登录的话,这个选项需要设置为允许
local_enable=YES
#是否允许在FTP服务器上写入, 默认不允许,如果有上传文件、删除文件等需求,一般都是开启的/全局写入权限开启
write_enable=YES
#设置写入服务器文件的权限掩码值,如果值是八进制需要以 0 开头,否则会当作十进制
#值为 022,能满足大部分FTP的需求
local_umask=022
#默认为 NO, 如果设置为 YES,表示用户通过FTP客户端登录之后
#只能在FTP服务器指定的目录中,不允许切出目录,
chroot_local_user=YES
#允许用户具有主目录写权限,对vsftpd有用,否则,因home目录权限为root权限而无法登录
allow_writeable_chroot=YES
#定义用户 FTP 主目录,用户登录成功之后,vsftpd 服务器会切换到此目录,
#此时 FTP 客户端会位于此目录中,后续的上传以及下载都是针对这个目录的
local_root=/home/ftpuser/ftp
#如果设置为 YES ,vsftpd 将会从 userlist_file 选项指定的文件读取用户列表
userlist_enable=YES
#设置用户列表配置文件, 如果 /etc/vsftpd/user_list 不存在需要手工创建
userlist_file=/etc/vsftpd/user_list
#此选项检查 userlist_enable 选项,当 userlist_enable 为 YES 时
#如果 userlist_deny 设置为 NO , 表示只允许 userlist_file 中的用户登录
#如果 userlist_deny 设置为 YES, 表示禁止 userlist_file 中的用户登录,允许其他用户登录
userlist_deny=NO
#如果启用,vsftpd 将在独立模式下运行,vsftpd 本身将负责侦听和处理传入的连接
#设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默 认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd 服务的管控,功能上会受到限制。
# 是否监听ipv4
listen=NO
# 跟 listen 选型类似,但是此选项是侦听在 IPV6 上的 socket
# 而 listen 是 IPV4, 此选项和 listen 是互斥的,不能同时设置为 YES
listen_ipv6=YES
#服务器侦听端口,也是命令端口, 默认是21,修改之后, 防火墙需要做相应的调整
#同时 FTP 客户端登录的时候需要指定端口号
#为了增强安全性,配置的时候一般都会修改
listen_port=48888
#开启被动模式/二选一
pasv_enable=YES
#被动模式下,服务器的地址,默认是内网地址
#如果在云服务器上部署,需要修改成公网IP
#pasv_address=192.168.186.100
#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性
pasv_min_port=50000
#设置被动模式下,建立数据传输可使用的端口范围的最大值
pasv_max_port=50010
#开启主动模式/二选一
port_enable=YES
#当主动模式开启的时候 是否启用默认的20端口监听
Connect_from_port_20=YES
#上一选项使用NO参数是 指定数据传输端口
#Ftp_date_port=%portnumber%
#是否记录上传下载日志,默认是不记录,如果设置为记录
#默认日志文件位于 /var/log/vsftpd.log, 如果配置了 vsftpd_log_file 选项,会覆盖默认日志文件
xferlog_enable=YES
#记录上传下载的日志
xferlog_file=/var/log/xferlog
#是否按照标准格式记录日志
xferlog_std_format=YES
# vsftpd 使用的 PAM 服务名字
pam_service_name=vsftpd
#
tcp_wrappers=YES
2.6 设置防火墙
如果你部署的FTP服务器的机器上防火墙是关闭状态的话,可以跳过此步骤,或者你不想设置防火墙的话,可以通过 systemctl stop firewalld
命令关闭防火墙,这样也可以忽略此步骤。
上面配置中服务器侦听端口(也叫命令端口) listen_port 选项设置的是 48888,数据端口的范围是 50000-50010, 所以防火墙需要开放这些端口,执行以下命令即可设置。
firewall-cmd --add-port=48888/tcp --permanent
firewall-cmd --add-port=50000-50010/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports #查看端口是否开放
2.6 启动服务器
执行以下命令启动vsftpd服务器:
systemctl start vsftpd
systemctl status vsftpd
查看vsftpd占用的端口:
netstat -tunlp | grep vsftpd
2.7 测试(登录、上传、下载)
注:在测试前,记得把ftpuser用户添加到user_list文件中。
3. 常见的错误
3.1 530 Login incorrect
该错误通常由 认证失败 导致,可能涉及配置错误、权限问题或用户设置不当。
- 检查登录用户的账号密码是否正确。
- 检查
/etc/vsftpd/user_list
文件中是否添加登录用户。 - PAM认证配置错误。
-
问题:
/etc/pam.d/vsftpd
中的pam_shells.so
模块要求用户的登录 Shell 必须在/etc/shells
文件中,而 FTP 用户通常被设置为/sbin/nologin
或/bin/false
,导致认证失败。 -
解决步骤:
-
编辑 PAM 配置文件:
sudo vi /etc/pam.d/vsftpd
-
注释或替换
pam_shells.so
:# 注释此行 # auth required pam_shells.so # 或替换为: auth required pam_nologin.so
-