安装vsftpd
根据系统选择安装命令(以CentOS为例):
sudo yum install vsftpd pam db4 -y
(Ubuntu/Debian使用sudo apt install vsftpd pam db-util -y)
创建系统用户(虚拟用户宿主)
虚拟用户需映射到一个系统用户,用于限定访问目录和权限:
sudo useradd -d /home/ftpsite -s /sbin/nologin virtual_user
sudo chmod 755 /home/ftpsite # 设置目录权限,允许虚拟用户访问
安装必要工具
确保db_load工具可用(用于生成虚拟用户数据库):
sudo yum install db4-utils -y # CentOS
sudo apt install db-util -y # Ubuntu/Debian
准备虚拟用户账号文件
创建文本文件(如/etc/vsftpd/virtusers.txt),格式为奇数行用户名、偶数行密码(每行一个用户):
sudo vim /etc/vsftpd/virtusers.txt
示例内容:
user1
password1
user2
password2
生成虚拟用户数据库
使用db_load将文本文件转换为Berkeley DB格式(vsftpd可识别的加密格式):
sudo db_load -T -t hash -f /etc/vsftpd/virtusers.txt /etc/vsftpd/virtusers.db
设置数据库权限(仅root可读,防止密码泄露):
sudo chmod 600 /etc/vsftpd/virtusers.db
编辑PAM配置文件(/etc/pam.d/vsftpd),添加虚拟用户认证规则(替换原有内容或新增以下两行):
sudo vim /etc/pam.d/vsftpd
示例内容:
auth required pam_userdb.so db=/etc/vsftpd/virtusers
account required pam_userdb.so db=/etc/vsftpd/virtusers
说明:
auth行:指定虚拟用户的认证方式(通过数据库验证用户名/密码);account行:验证虚拟用户的账户状态(如是否有效)。编辑/etc/vsftpd.conf,启用虚拟用户功能并调整相关参数:
sudo vim /etc/vsftpd.conf
关键配置项(删除注释并修改为以下内容):
anonymous_enable=NO # 禁用匿名登录
local_enable=YES # 允许本地用户登录(虚拟用户依赖此选项)
write_enable=YES # 允许上传文件
local_umask=022 # 设置文件权限掩码
chroot_local_user=YES # 将用户限制在自己的主目录(增强安全性)
allow_writeable_chroot=YES # 允许chroot目录可写(避免上传失败)
guest_enable=YES # 启用虚拟用户
guest_username=virtual_user # 虚拟用户映射的系统用户(需提前创建)
pam_service_name=vsftpd # 指定PAM配置文件(需与步骤三一致)
user_config_dir=/etc/vsftpd/vconf # 虚拟用户个性化配置目录(可选,用于定制用户权限)
若需要为不同虚拟用户设置不同权限(如限制某用户只能下载),需创建个性化配置文件:
创建个性化配置目录:
sudo mkdir /etc/vsftpd/vconf
为每个虚拟用户创建配置文件(文件名需与虚拟用户名一致):
sudo vim /etc/vsftpd/vconf/user1
示例内容(限制user1只能下载,不能上传):
local_root=/home/ftpsite/user1 # 用户专属目录(需提前创建并设置权限)
write_enable=NO # 禁止上传
anon_upload_enable=NO # 禁止匿名上传
idle_session_timeout=300 # 空闲会话超时(秒)
max_clients=5 # 最大并发连接数
创建用户专属目录并设置权限:
sudo mkdir -p /home/ftpsite/user1
sudo chown virtual_user:virtual_user /home/ftpsite/user1 # 所有权归映射的系统用户
sudo chmod 755 /home/ftpsite/user1
重启服务:
sudo systemctl restart vsftpd
sudo systemctl enable vsftpd # 设置开机自启
测试登录:
使用FTP客户端(如FileZilla)或命令行工具测试:
ftp localhost
输入虚拟用户名(如user1)和密码(如password1),若提示230 Login successful则表示登录成功。
无法登录:
virtusers.db权限是否为600;/var/log/vsftpd.log)定位错误。无法上传文件:
write_enable=YES;755或775,且所有者为映射的系统用户);chroot,确认allow_writeable_chroot=YES。虚拟用户无法切换目录:
local_root路径是否存在;chroot_local_user=YES是否与local_root冲突(需配合allow_writeable_chroot使用)。