1. 项目概述
最近在CentOS-Stream-10上尝试搭建支持虚拟用户访问的FTP服务器时遇到了不少问题,网上的各种解决方案都没能成功。经过多次尝试,最终在CentOS 7系统上实现了稳定可靠的FTP虚拟用户访问方案。本文将详细介绍完整的搭建过程,包括软件安装、虚拟用户数据库创建、PAM认证配置、防火墙设置等关键步骤。
2. 环境准备
2.1 系统选择与说明
虽然CentOS-Stream-10是最新版本,但在实际测试中发现其与vsftpd的兼容性存在问题。因此我们选择使用CentOS 7的最终稳定版本:
code复制系统版本:CentOS-7-x86_64-Everything-2009
注意:CentOS 7虽然已停止官方更新,但对于内部网络环境下的FTP服务仍然是一个稳定可靠的选择。如果必须使用新版本系统,可以考虑Rocky Linux或AlmaLinux等替代方案。
2.2 软件包安装
首先安装必要的软件包:
bash复制yum install pam* libdb-utils libdb* vsftpd -y
这里安装的软件包包括:
pam*:PAM认证相关模块libdb-utils和libdb*:Berkeley DB工具库,用于虚拟用户数据库vsftpd:FTP服务器软件
3. 虚拟用户配置
3.1 创建虚拟用户数据库
虚拟用户数据库的创建是FTP安全访问的关键。我们使用Berkeley DB格式存储用户名和密码:
- 创建用户密码文本文件:
bash复制vim /etc/vsftpd/vuser_login
文件格式为每行一个用户名,下一行对应密码,例如:
code复制test1
password1
test2
password2
- 生成数据库文件并设置权限:
bash复制db_load -T -t hash -f /etc/vsftpd/vuser_login /etc/vsftpd/vuser_login.db
chmod 600 /etc/vsftpd/{vuser_login,vuser_login.db}
安全提示:务必设置600权限,防止其他用户读取密码文件。
3.2 配置PAM认证
创建PAM认证配置文件:
bash复制vim /etc/pam.d/vsftpd.pam
文件内容应为:
code复制auth required pam_userdb.so db=/etc/vsftpd/vuser_login
account required pam_userdb.so db=/etc/vsftpd/vuser_login
4. FTP目录与权限设置
4.1 创建虚拟用户共享目录
bash复制useradd -s /sbin/nologin -d /home/vftpdir vftpuser
这个命令创建了一个系统用户vftpuser,其主目录设置为/home/vftpdir,并且禁止了shell登录。
4.2 配置vsftpd主配置文件
备份原始配置文件后修改:
bash复制cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
vim /etc/vsftpd/vsftpd.conf
关键配置参数如下:
code复制anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd.pam
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=vftpuser
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_min_port=30000
pasv_max_port=30999
4.3 创建虚拟用户独立配置
为每个虚拟用户创建独立的配置文件:
bash复制mkdir /etc/vsftpd/vsftpd_user_conf
mkdir -p /home/vftpdir/{test1,test2}
为test1用户创建配置文件:
bash复制vim /etc/vsftpd/vsftpd_user_conf/test1
内容示例:
code复制local_root=/home/vftpdir/test1
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
复制配置给test2用户:
bash复制cp /etc/vsftpd/vsftpd_user_conf/test1 /etc/vsftpd/vsftpd_user_conf/test2
5. 系统安全设置
5.1 关闭SELinux
bash复制setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
注意:在生产环境中,建议配置SELinux策略而不是完全禁用,但为了简化初次配置过程,这里选择禁用。
5.2 防火墙配置
开放FTP服务所需端口:
bash复制firewall-cmd --add-port={21,30000-30999}/tcp --permanent
firewall-cmd --reload
6. 服务启动与验证
6.1 启动vsftpd服务
bash复制systemctl restart vsftpd
systemctl enable vsftpd
6.2 验证FTP服务
创建测试文件验证服务:
bash复制touch /home/vftpdir/test1/搭建成功.txt
然后使用FTP客户端以test1用户登录,检查是否能正常看到和操作该文件。
7. 常见问题与解决方案
7.1 连接超时问题
如果客户端连接时出现超时,可能是以下原因:
- 防火墙未正确配置
- 被动模式端口范围未开放
- vsftpd配置文件中listen参数设置错误
解决方案:
- 检查防火墙规则
- 确认pasv_min_port和pasv_max_port设置
- 确保listen=YES且listen_ipv6=NO
7.2 认证失败问题
如果登录时提示认证失败:
- 检查/etc/vsftpd/vuser_login.db文件是否存在且权限正确
- 确认PAM配置文件路径和名称正确
- 确保vsftpd.conf中pam_service_name指向正确的PAM文件
7.3 文件权限问题
如果上传或创建文件失败:
- 检查虚拟用户目录的权限
- 确认虚拟用户配置文件中相关写权限已启用
- 检查SELinux状态(如果未完全禁用)
8. 性能优化建议
8.1 连接数限制
在vsftpd.conf中添加:
code复制max_clients=50
max_per_ip=5
8.2 传输速率限制
限制单个用户的传输速率:
code复制local_max_rate=1024000
anon_max_rate=512000
8.3 日志记录优化
启用详细日志记录:
code复制log_ftp_protocol=YES
xferlog_file=/var/log/vsftpd.log
9. 安全加固措施
9.1 定期更换密码
建议定期更新虚拟用户密码:
- 修改/etc/vsftpd/vuser_login文件
- 重新生成数据库文件
- 重启vsftpd服务
9.2 使用SSL/TLS加密
配置FTPS增强安全性:
code复制ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
9.3 IP访问限制
可以通过以下方式限制访问IP:
code复制tcp_wrappers=YES
然后在/etc/hosts.allow中添加允许的IP规则。
10. 维护与管理技巧
10.1 批量添加虚拟用户
使用脚本批量添加用户:
bash复制#!/bin/bash
for i in {1..10}; do
echo "user$i" >> /etc/vsftpd/vuser_login
echo "password$i" >> /etc/vsftpd/vuser_login
mkdir -p /home/vftpdir/user$i
cp /etc/vsftpd/vsftpd_user_conf/test1 /etc/vsftpd/vsftpd_user_conf/user$i
done
db_load -T -t hash -f /etc/vsftpd/vuser_login /etc/vsftpd/vuser_login.db
10.2 定期备份配置
建议定期备份以下内容:
- /etc/vsftpd/目录
- /home/vftpdir/目录结构
- PAM配置文件
10.3 监控FTP服务
设置监控脚本检查服务状态:
bash复制#!/bin/bash
if ! pgrep vsftpd >/dev/null; then
systemctl restart vsftpd
echo "vsftpd restarted at $(date)" >> /var/log/vsftpd_monitor.log
fi
可以添加到crontab中定期执行。