在CentOS系统上,使用yum包管理器快速安装VSFTP(Very Secure FTP Daemon):
sudo yum update -y && sudo yum install vsftpd -y
安装完成后,通过rpm -qa | grep vsftpd验证是否安装成功。
VSFTP的主配置文件为/etc/vsftpd/vsftpd.conf,修改以下关键参数以实现安全、可控的FTP服务:
# 禁止匿名用户登录(提升安全性)
anonymous_enable=NO
# 允许本地系统用户登录
local_enable=YES
# 开启写权限(允许上传/删除文件)
write_enable=YES
# 限制用户只能访问其主目录(防止越权)
chroot_local_user=YES
# 允许chroot目录可写(若需用户上传文件)
allow_writeable_chroot=YES
# 启用被动模式(解决NAT/防火墙环境下的连接问题)
pasv_enable=YES
pasv_min_port=10000 # 被动模式最小端口
pasv_max_port=20000 # 被动模式最大端口
# 记录FTP操作日志(便于审计)
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
修改完成后,使用sudo systemctl restart vsftpd重启服务使配置生效。
为避免使用root账户登录FTP,创建专用系统用户并设置密码:
sudo useradd -m ftpuser -s /sbin/nologin # -s指定无登录shell,增强安全性
sudo passwd ftpuser # 设置强密码
其中,-m参数创建用户主目录(默认路径为/home/ftpuser),-s /sbin/nologin禁止用户通过SSH登录系统。
确保FTP用户对其主目录有正确的读写权限:
sudo chown ftpuser:ftpuser /home/ftpuser # 修改目录所有者
sudo chmod 755 /home/ftpuser # 设置目录权限(所有者可读写执行,其他用户可读执行)
若需用户上传文件到子目录(如/home/ftpuser/upload),需额外设置:
sudo mkdir -p /home/ftpuser/upload
sudo chown ftpuser:ftpuser /home/ftpuser/upload
sudo chmod 775 /home/ftpuser/upload
若需进一步限制用户只能访问特定目录,可通过chroot_list文件实现:
# 编辑配置文件,启用chroot列表
sudo vi /etc/vsftpd/vsftpd.conf
# 添加以下内容(若已存在则修改)
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
# 将需要限制的用户添加到列表中
echo "ftpuser" | sudo tee -a /etc/vsftpd/chroot_list
此配置会强制ftpuser只能访问其主目录。
CentOS默认使用firewalld防火墙,需开放FTP相关端口(控制通道21、被动模式端口范围10000-20000):
sudo firewall-cmd --permanent --add-service=ftp # 开放FTP服务(自动包含21端口)
sudo firewall-cmd --permanent --add-port=10000-20000/tcp # 开放被动模式端口范围
sudo firewall-cmd --reload # 重新加载防火墙规则
若使用传统iptables,需添加对应规则:
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10000:20000 -j ACCEPT
sudo service iptables save
SELinux可能会阻止FTP访问用户主目录,需调整相关策略:
# 允许FTP访问用户主目录
sudo setsebool -P ftp_home_dir on
# 若需用户上传文件,还需允许写入
sudo setsebool -P allow_ftpd_full_access on
通过getsebool -a | grep ftp可查看SELinux与FTP相关的布尔值。
为防止数据传输被窃听,建议启用SSL/TLS加密。首先生成自签名证书(生产环境建议使用CA签发证书):
# 生成CA私钥和证书
sudo openssl genrsa -out /etc/vsftpd/ca.key 2048
sudo openssl req -new -x509 -days 365 -key /etc/vsftpd/ca.key -out /etc/vsftpd/ca.crt
# 生成服务器私钥和证书签名请求(CSR)
sudo openssl genrsa -out /etc/vsftpd/server.key 2048
sudo openssl req -new -key /etc/vsftpd/server.key -out /etc/vsftpd/server.csr
# 使用CA签名服务器证书
sudo openssl x509 -req -days 365 -in /etc/vsftpd/server.csr -CA /etc/vsftpd/ca.crt -CAkey /etc/vsftpd/ca.key -CAcreateserial -out /etc/vsftpd/server.crt
然后修改VSFTP配置文件,启用SSL/TLS:
# 启用SSL/TLS
ssl_enable=YES
# 指定证书和私钥路径
rsa_cert_file=/etc/vsftpd/server.crt
rsa_private_key_file=/etc/vsftpd/server.key
# 强制使用TLS(可选,提升安全性)
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# 允许客户端选择加密方式(兼容性更好)
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
重启VSFTP服务使配置生效:
sudo systemctl restart vsftpd
通过/etc/vsftpd.user_list文件控制允许或禁止登录的用户:
# 编辑配置文件,设置用户列表模式
sudo vi /etc/vsftpd/vsftpd.conf
# 若只想允许列表中的用户登录,设置为NO
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
# 将允许登录的用户添加到列表中
echo "ftpuser" | sudo tee -a /etc/vsftpd/user_list
此配置仅允许/etc/vsftpd/user_list中的用户登录FTP。
使用FileZilla或其他FTP客户端连接服务器,输入以下信息:
ftpuserupload目录,验证写权限。若连接失败,通过以下命令查看VSFTP日志,定位问题:
sudo tail -f /var/log/vsftpd.log
日志中会记录连接尝试、权限错误等信息,帮助快速排查问题。