问题描述
我们需要搭建 FTP 服务进行文件的上传下载。
该笔记将记录:如何使用 vsftpd 搭建 FTP 服务,实现文件上传与下载。
解决方案
第一步、系统环境、路径等相关信息
创建 FTP 根目录:/mnt/ftp
install -v -d -m 0755 /mnt/ftp
第二步、配置文件修改(vsftpd.conf)
添加公共配置到vsftpd.conf中:
cat >> /usr/local/vsftpd/vsftpd.conf << "EOF" # 后台运行vsftpd服务。 background=YES # vsftpd独立运行 listen=YES # vsftpd无需访问文件系统时,使用此文件夹 secure_chroot_dir=/usr/local/vsftpd/empty EOF
第三步、有关本地用户的配置
要启用本地登录,按照如下说明进行配置:
# 添加组,并创建本地用户,然后设置登录密码。 groupadd ftp useradd -s /bin/false -c "FTP Local User" -d /mnt/ftp -g ftp ftp-localuser passwd ftp-localuser # 修改配置,允许本地用户登录,并且允许写入 cat >> /usr/local/vsftpd/vsftpd.conf << "EOF" # 允许本地用户登录 local_enable=YES # 允许本地用户写入 write_enable=YES # 本地用户登录后,将其限制在家目录中。 chroot_local_user=YES # 允许写入。(我不知道为什么手册里没有介绍这个参数,如果不加该参数,chroot_local_user=YES后,本地用户无法登录) allow_writeable_chroot=YES EOF # 修改访问权限,允许ftp-localuser创建、修改、查看文件。 chmod g+rwx /mnt/ftp
第四步、设置虚拟用户
创建/usr/local/vsftpd/vsftpd.vuser.conf文件
该文件保存了虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。比如:
cat >> /usr/local/vsftpd/vsftpd.vuser.conf << "EOF" ftp-virtualuser ftp-virtualuser-passwd EOF
生成虚拟用户口令认证文件
# 生成口令文件需要用到db-util软件包。 # Ubuntu 16.04 TLS中安装如下: apt-get install db-util db5.3-util # 运行命令,生成口令认证文件 db_load -T -t hash -f /usr/local/vsftpd/vsftpd.vuser.conf /usr/local/vsftpd/vsftpd.vuser.db
修改 PAM 认证文件:/etc/pam.d/vsftpd-user
#!/bin/sh cat >> /etc/pam.d/vsftpd-user << "EOF" auth required /lib/security/pam_userdb.so db=/usr/local/vsftpd/vsftpd.vuser account required /lib/security/pam_userdb.so db=/usr/local/vsftpd/vsftpd.vuser EOF # 注意事项: # /lib/security/pam_userdb.so 的路径可能是错误的。 # 因为在不同的发行版中 pam_userdb.so 文件的位置使不相同的。 # 在 Ubuntu 16.04 TLS 中:/lib/x86_64-linux-gnu/security/pam_userdb.so
创建本地映射用户(ftp-virtualuser):
#!/bin/sh # 这个用户为一个映射用户,所有的虚拟用户都会被映射到这个用户上。 useradd -d /mnt/ftp -s /bin/false ftp-virtualuser
修改 vsftpd.conf 配置:
cat >> /usr/local/vsftpd/vsftpd.conf << "EOF" # 开启虚拟用户 guest_enable=YES # FTP虚拟用户对应的系统用户 guest_username=ftp-virtualuser # PAM认证文件 # #设置PAM使用的名称,该名称就是/etc/pam.d/目录下vsfptd文件的文件名 pam_service_name=vsftpd-user EOF
第五步、重启 vsftpd 服务
附加说明
该笔记只涉及简单配置,更多配置参数查看 +vsftpd.conf 中的说明。
常见问题汇总
在搭建服务过程中,我们遇到很多问题:
(1)服务(FTP)根目录,如果为root:root所有(默认用户),其他用户不能具有写入权限,否则将会产生500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误
(2)服务根目录,如果属于ftp用户,任何人都不能具有写入权限
(3)基于前两点,这就意味着匿名用户无法在根目录上传
参考文献
LFS / vsftpd-3.0.3
鳥哥的 Linux 私房菜 / 第二十一章、檔案伺服器之三: FTP 伺服器
两种方式建立Vsftpd虚拟用户