1. 项目概述
在Linux系统中搭建FTP服务是运维工程师的常见任务之一。FTP(File Transfer Protocol)作为一种经典的文件传输协议,至今仍广泛应用于企业内部文件共享、网站内容更新等场景。本次我们将在CentOS 7系统上部署vsftpd服务,实现基于本地系统用户的文件传输功能。
选择vsftpd(Very Secure FTP Daemon)作为服务端软件,主要基于其安全性高、性能稳定、配置灵活的特点。相比其他FTP服务软件,vsftpd在安全机制上做了更多考虑,如支持chroot环境、细粒度的权限控制等,特别适合生产环境使用。
本次搭建将实现以下核心功能:
- 禁止匿名登录,仅允许授权的本地用户访问
- 用户登录后被限制在自己的家目录中(chroot)
- 支持文件上传下载操作
- 同时兼容Linux客户端和Windows客户端访问
2. 环境准备
2.1 系统环境配置
实验环境采用三台设备:
- FTP服务端:CentOS 7,IP 192.168.110.102
- FTP客户端:CentOS 7,IP 192.168.110.105
- Windows客户端:Windows系统,IP 192.168.110.100
提示:在实际生产环境中,建议使用独立的服务器作为FTP服务端,并配置静态IP地址。如果是在虚拟机中实验,确保网络模式设置为桥接或NAT,保证各设备间网络互通。
2.2 基础系统检查
在开始安装前,我们需要确认yum源配置正常:
bash复制# 清除yum缓存并重新生成
[root@ftp-server ~]# yum makecache
# 查看可用的仓库列表
[root@ftp-server ~]# yum repolist
这两个命令确保我们能够正常从软件仓库安装所需的软件包。如果遇到仓库不可用的情况,可能需要先配置正确的baseurl或检查网络连接。
3. vsftpd服务安装与配置
3.1 安装vsftpd服务
使用yum命令安装vsftpd非常简单:
bash复制[root@ftp-server ~]# yum -y install vsftpd
-y参数表示自动确认安装,避免交互式确认。安装完成后,vsftpd的主要文件会分布在以下位置:
- /usr/sbin/vsftpd:主程序文件
- /etc/vsftpd:配置文件目录
- /var/ftp:匿名用户的默认根目录
3.2 服务启动与防火墙设置
为了简化实验环境,我们先关闭防火墙和SELinux:
bash复制# 停止防火墙服务
[root@ftp-server ~]# systemctl stop firewalld
# 重启vsftpd服务
[root@ftp-server ~]# systemctl restart vsftpd
# 临时关闭SELinux
[root@ftp-server ~]# setenforce 0
注意:在生产环境中,不建议直接关闭防火墙和SELinux。正确的做法是添加防火墙规则放行FTP服务:
bash复制firewall-cmd --permanent --add-service=ftp firewall-cmd --reload同时配置SELinux策略允许FTP相关操作。
3.3 主配置文件详解
vsftpd的主配置文件位于/etc/vsftpd/vsftpd.conf。在修改前,建议先备份原始配置:
bash复制[root@ftp-server vsftpd]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
然后清空原配置文件并写入以下内容:
bash复制anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
listen_port=21
chroot_local_user=YES
allow_writeable_chroot=YES
local_root=/home/ftpuser6
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
tcp_wrappers=YES
关键配置项解析:
anonymous_enable=NO:禁用匿名登录,提高安全性local_enable=YES:允许本地系统用户登录write_enable=YES:允许上传文件chroot_local_user=YES:将用户限制在其家目录内allow_writeable_chroot=YES:允许在chroot环境中写入文件userlist_deny=NO:user_list文件作为白名单使用
配置完成后,重启vsftpd服务使配置生效:
bash复制[root@ftp-server vsftpd]# systemctl restart vsftpd
4. 用户与权限管理
4.1 创建FTP专用用户
为FTP服务创建专用用户是个好习惯,避免使用现有系统用户:
bash复制# 创建用户并指定家目录
[root@ftp-server ~]# useradd -m -d /home/ftpuser6 ftpuser6
# 设置用户密码
[root@ftp-server ~]# passwd ftpuser6
-m参数确保创建用户的家目录,-d参数明确指定家目录路径。设置密码时,建议使用足够强度的密码组合。
4.2 目录权限配置
正确的权限设置对FTP服务至关重要:
bash复制# 设置家目录权限为755
[root@ftp-server ~]# chmod 755 /home/ftpuser6
# 创建测试文件并设置权限
[root@ftp-server ~]# touch /home/ftpuser6/test.txt
[root@ftp-server ~]# echo "FTP Test File" > /home/ftpuser6/test.txt
[root@ftp-server ~]# chown ftpuser6:ftpuser6 /home/ftpuser6/test.txt
权限设置说明:
- 家目录需要755权限,否则用户无法访问
- 测试文件的所有权应属于FTP用户
- 文件默认权限由local_umask=022决定(777-022=755)
4.3 用户白名单配置
vsftpd通过/etc/vsftpd/user_list文件控制用户访问。我们将ftpuser6加入白名单:
bash复制[root@ftp-server vsftpd]# echo "ftpuser6" >> /etc/vsftpd/user_list
由于我们设置了userlist_deny=NO,只有在user_list中的用户才能登录FTP服务。这种白名单机制比黑名单更安全。
5. 客户端连接测试
5.1 Linux客户端测试
在另一台CentOS 7客户端上安装ftp命令行工具:
bash复制[root@client ~]# yum -y install ftp
然后连接FTP服务器:
bash复制[root@client ~]# ftp 192.168.110.102
Connected to 192.168.110.102 (192.168.110.102).
220 (vsFTPd 3.0.2)
Name (192.168.110.102:root): ftpuser6
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,110,102,148,95).
150 Here comes the directory listing.
-rw-r--r-- 1 1008 1008 14 Jan 25 14:56 test.txt
226 Directory send OK.
ftp>
连接成功后,可以尝试上传下载文件测试功能是否正常。
5.2 Windows客户端测试
Windows系统可以使用FileZilla等图形化FTP客户端。连接时输入:
- 主机:192.168.110.102
- 用户名:ftpuser6
- 密码:之前设置的密码
- 端口:21(默认)
连接成功后,应该能看到test.txt文件,并能进行文件传输操作。
6. 常见问题排查
6.1 连接被拒绝
如果连接时收到"Connection refused"错误,可能原因:
- vsftpd服务未运行:检查
systemctl status vsftpd - 防火墙阻止连接:检查防火墙规则或临时关闭防火墙测试
- SELinux阻止访问:检查
getenforce状态或查看/var/log/audit/audit.log
6.2 登录失败
常见登录问题包括:
- 用户名/密码错误:确认用户名和密码正确
- 用户不在白名单中:检查/etc/vsftpd/user_list文件
- 用户被列入黑名单:检查/etc/vsftpd/ftpusers文件
6.3 文件传输问题
上传或下载失败的可能原因:
- 目录权限不正确:确保目标目录有写权限
- chroot配置问题:检查allow_writeable_chroot设置
- 磁盘空间不足:使用
df -h检查磁盘使用情况
7. 安全加固建议
虽然我们已经配置了基本的安全措施,但还可以进一步加固:
-
启用SSL/TLS加密:
生成证书并配置vsftpd支持FTPS,防止密码和数据明文传输。 -
限制用户登录IP:
使用TCP Wrappers(/etc/hosts.allow和/etc/hosts.deny)限制允许连接的客户端IP。 -
日志监控:
vsftpd的日志默认在/var/log/xferlog,可以配置日志轮转和监控。 -
定期更新:
保持vsftpd软件更新到最新版本,修复已知漏洞。 -
资源限制:
在/etc/security/limits.conf中限制FTP用户的系统资源使用。
在实际生产环境中部署FTP服务时,建议根据具体需求和安全要求调整这些配置。对于高安全性要求的场景,可以考虑使用SFTP(基于SSH的文件传输)替代FTP。