Linux 服务:从原理到实践的 FTP 协议与服务器配置详解

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_writeftpd_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. 用户访问控制

  • ftpusersuser_list文件默认禁用部分用户访问FTP。
  • 若仅允许特定用户访问,需在配置文件中添加userlist_deny=NO,并将允许的用户写入user_list文件。