Linux 服务:从原理到实践的 FTP 协议与服务器配置详解
一、FTP基础信息
- 定义:文件传输协议(File Transfer Protocol,简称FTP),采用客户端/服务器(C/S)模式工作。
- 端口 :
- 控制端口:21(用于用户验证和管理)
- 数据端口:20(主动模式下使用)
二、FTP工作原理(两种模式)
1. 主动模式(Standard)

- 客户端从非特权端口N(N>1024)向服务器控制端口21发送PORT命令,包含版本号和客户端接收数据的端口N+1。
- 服务器通过数据端口20与客户端的N+1端口建立数据连接,传输数据需重新建立新连接。
2. 被动模式(Passive)

- 客户端从非特权端口N(N>1024)向服务器控制端口21发送PASV命令,包含客户端接收数据的端口N+1。
- 服务器随机开启高端口P(P>1024),并从21号端口向客户端N端口发送包含端口P的PORT命令。
- 客户端从N+1端口发起连接至服务器的P端口,建立数据连接,无需重新建立新连接。
两种模式的异同
- 不同点:数据连接发起方不同,主动模式由服务器向客户端发起,被动模式由客户端向服务器发起。
- 相同点:均使用21号控制端口进行用户验证和管理。
三、FTP服务器的部署与配置
1. 安装与基础文件
- 安装命令:
yum -y install vsftpd
- 主配置文件:
/etc/vsftpd/vsftpd.conf
- 匿名用户目录:
- 主目录:
/var/ftp/
- 下载目录:
/var/ftp/pub/
- 主目录:
2. 主配置文件关键参数(/etc/vsftpd/vsftpd.conf
)
参数 | 说明 |
---|---|
anonymous_enable=YES/NO |
控制匿名用户访问权限,YES表示允许 |
local_enable=YES/NO |
控制本地用户是否可登录,YES表示允许(RHEL7及以上vsftpd3.0版本无需调整ftp_home_dir 布尔值) |
write_enable=YES/NO |
控制用户对服务器的可写权限,YES表示可写 |
local_umask=022 |
本地用户创建目录/文件时的umask值(默认077,可改为022) |
anon_upload_enable=YES/NO |
控制匿名用户上传权限,YES表示允许(需配合SELinux布尔值ftpd_anon_write 和ftpd_full_access ) |
anon_mkdir_write_enable=YES/NO |
控制匿名用户创建目录权限,YES表示允许 |
dirmessage_enable=YES |
显示目录说明性信息 |
xferlog_enable=YES |
记录文件传输日志 |
connect_from_port_20=YES |
强制使用20端口传输数据 |
xferlog_std_format=YES |
采用标准FTP Xferlog日志模式 |
idle_session_timeout=600 |
空闲会话超时时长(秒),默认600秒 |
data_connection_timeout=120 |
数据连接无交互超时时长(秒),默认120秒 |
chroot_local_user=YES/NO |
控制本地用户是否被限制在主目录,YES表示禁止离开 |
chroot_list_enable=YES/NO |
控制列表中的用户是否被限制在主目录,YES表示生效 |
chroot_list_file=/etc/vsftpd/chroot_list |
限制目录的用户列表文件(每行一个用户名) |
listen=NO |
是否侦听IPv4套接字(与listen_ipv6 不可同时启用) |
listen_ipv6=YES |
是否侦听IPv6套接字(默认接受IPv4和IPv6连接) |
pam_service_name=vsftpd |
PAM认证文件名称 |
userlist_enable=YES |
启用/etc/vsftpd/user_list 用户列表 |
tcp_wrappers=YES |
启用/etc/hosts.allow 和/etc/hosts.deny 控制访问 |
四、配置示例
1. 匿名用户配置
(1)允许匿名访问(centos7默认允许,不用做修改;centos8修改如下)
bash
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES # 启用匿名登录
pasv_enable=YES # 启用被动模式
pasv_min_port=10000 # 被动模式最小端口
pasv_max_port=11000 # 被动模式最大端口
systemctl restart vsftpd
firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=10000-11000/tcp --permanent
firewall-cmd --reload
(2)允许匿名用户上传文件至/var/ftp/pub
bash
# 设置目录权限
setfacl -m u:ftp:rwx /var/ftp/pub
# 调整SELinux布尔值
setsebool -P ftpd_anon_write on
setsebool -P ftpd_full_access on
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_upload_enable=YES
systemctl restart vsftpd
(3)允许匿名用户创建目录
bash
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_mkdir_write_enable=YES
systemctl restart vsftpd
(4)允许匿名用户重命名/删除文件
bash
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd
2. 本地FTP用户配置
(1)创建用户
bash
useradd ftpuser1
useradd ftpuser2
useradd ftpuser3
echo redhat | passwd --stdin ftpuser1 # 设置密码
echo redhat | passwd --stdin ftpuser2
echo redhat | passwd --stdin ftpuser3
(2)允许本地用户访问
bash
vim /etc/vsftpd/vsftpd.conf
local_enable=YES # 默认已开启
write_enable=YES # 默认已开启
systemctl restart vsftpd
# 注意:默认可访问家目录及其他目录,支持上传、下载等操作
(3)限制所有本地用户在主目录(禁止访问其他目录)
此时必须将ftpd_full_access的bool值设置为on,
同时FTP用户对自己家目录不能有写入权限,
否则会提示登录失败 500 OOPS:vsftpd:refusing to run with writable root
inside chroot()从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod u-w /home/ftpuser1去除用户主目录的写权限,之后在/etc/vsftpd/vsftpd.conf写入allow_writeable_chroot=YES就可以使ftp用户被限制在家目录的状态下有写入权限
bash
# 调整SELinux布尔值
setsebool -P ftpd_full_access on
# 去除用户家目录写权限(vsftpd 2.3.5+安全限制)
chmod u-w /home/ftpuser1
chmod u-w /home/ftpuser2
chmod u-w /home/ftpuser3
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
allow_writeable_chroot=YES
systemctl restart vsftpd
(4)限制部分用户在主目录(如ftpuser1、ftpuser2)其他FTP用户仍然可以访问其他目录。
bash
setsebool -P ftpd_full_access on
chmod u-w /home/ftpuser1
chmod u-w /home/ftpuser2
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=YES # 注释掉全局限制
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
# 编辑限制列表
vim /etc/vsftpd/chroot_list
ftpuser1
ftpuser2
systemctl restart vsftpd
3. chroot
相关规则总结
chroot_local_user |
chroot_list_enable |
效果 |
---|---|---|
YES | YES | chroot_list 中的用户不受限,其他用户受限 |
YES | NO | 所有用户均受限 |
NO | YES | 仅chroot_list 中的用户受限 |
NO | NO | 所有用户均不受限 |
4. 用户访问控制
ftpusers
和user_list
文件默认禁用部分用户访问FTP。- 若仅允许特定用户访问,需在配置文件中添加
userlist_deny=NO
,并将允许的用户写入user_list
文件。