安装vsftpd
大多数Linux发行版可通过包管理器安装vsftpd(以CentOS为例):
sudo yum install vsftpd -y
安装完成后,启动服务并设置开机自启:
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
安装必要工具
用于创建虚拟用户数据库的db_load工具(属于db4-utils或db-util包):
sudo yum install db4-utils -y # CentOS
sudo apt install db-util -y # Ubuntu/Debian
准备用户信息文件
创建文本文件(如/etc/vsftpd/virtual_users.txt),格式为奇数行用户名、偶数行密码(每行一个用户):
sudo vi /etc/vsftpd/virtual_users.txt
示例内容:
user1
password1
user2
password2
生成数据库文件
使用db_load将文本文件转换为哈希格式的数据库(避免明文存储密码):
sudo db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
设置数据库文件权限(仅root可读写):
sudo chmod 600 /etc/vsftpd/virtual_users.db
创建PAM配置文件
新建虚拟用户专属PAM文件(如/etc/pam.d/vsftpd.virtual),内容如下(注意路径中的.db后缀需省略):
sudo vi /etc/pam.d/vsftpd.virtual
示例内容:
auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
修改vsftpd主配置
编辑/etc/vsftpd.conf,指定PAM服务名:
sudo vi /etc/vsftpd.conf
添加/修改以下行:
pam_service_name=vsftpd.virtual # 指向自定义PAM文件
创建虚拟宿主用户
虚拟用户需映射到系统用户(仅用于权限控制,无登录权限):
sudo useradd -d /home/ftp_virtual -s /sbin/nologin ftp_virtual
sudo chmod 700 /home/ftp_virtual # 限制目录权限
配置vsftpd虚拟用户映射
在/etc/vsftpd.conf中启用虚拟用户功能,并关联宿主用户:
guest_enable=YES # 启用虚拟用户
guest_username=ftp_virtual # 虚拟用户映射的系统用户
virtual_use_local_privs=YES # 虚拟用户继承宿主用户权限
开启chroot限制
在/etc/vsftpd.conf中添加以下配置,将用户限制在自己的主目录:
chroot_local_user=YES # 禁锢所有本地用户(包括虚拟用户)
allow_writeable_chroot=YES # 允许chroot目录可写(避免权限问题)
设置用户专属主目录
为每个虚拟用户创建主目录(以user1为例):
sudo mkdir -p /home/ftp_virtual/user1
sudo chown ftp_virtual:ftp_virtual /home/ftp_virtual/user1
sudo chmod 700 /home/ftp_virtual/user1
配置用户专属设置(可选)
若需为不同用户设置不同权限(如禁止上传),可创建用户专属配置文件:
sudo mkdir /etc/vsftpd/vsftpd_user_conf
sudo vi /etc/vsftpd/vsftpd_user_conf/user1
示例内容(禁止上传):
local_root=/home/ftp_virtual/user1
write_enable=NO
在/etc/vsftpd.conf中指定用户配置目录:
user_config_dir=/etc/vsftpd/vsftpd_user_conf
重启vsftpd服务
应用所有配置变更:
sudo systemctl restart vsftpd
测试虚拟用户登录
使用FTP客户端(如FileZilla)或命令行工具测试:
ftp localhost
输入虚拟用户名(如user1)和密码(如password1),验证是否能成功登录并访问对应目录。
问题1:登录时报错“500 OOPS: cannot change directory”
原因:SELinux阻止ftp访问用户目录。解决方法:
sudo setsebool -P ftpd_disable_trans 1 # 关闭SELinux对ftp的转换检查
问题2:被动模式无法连接
原因:未配置被动模式端口或安全组未放行。解决方法:
在/etc/vsftpd.conf中添加:
pasv_enable=YES
pasv_min_port=30100
pasv_max_port=30200
pasv_address=服务器公网IP # 云服务器需指定公网IP
并在安全组中放行30100-30200端口。
通过以上步骤,即可完成Linux VSFTP虚拟用户的配置,实现安全、隔离的FTP服务。