XX项目中对接系统之间传输文件常使用FTP,本文描述CentOS8.2环境下使用vsftpd搭建FTP server并配置虚拟用户的过程。
注:本文同样适用于RHEL7环境。
FTP用户有匿名用户、实体用户、虚拟用户之分,生产环境中推荐配置并使用虚拟用户。
1 环境
# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
# rpm -qa | grep vsftpd
vsftpd-3.0.3-34.el8.x86_64
2 需求
ftp目录:/data/ftp
ftp用户(虚拟用户):vusera
实际映射用户:ftpuser
3 操作步骤
3.1 安装vsftpd
# yum -y install vsftpd
3.2 配置虚拟账号vusera
# vim /etc/vsftpd/vusers.list
输入如下内容:
vusera
123456
保存并退出。
说明:奇数行是用户名,偶数行是用户密码。
使用db_load工具生成db文件
# cd /etc/vsftpd/
# db_load -T -t hash -f vusers.list vusers.db
出于安全考虑,修改vusers.*文件为600权限
# chmod 600 /etc/vsftpd/vusers.*
3.3 创建ftp目录及映射账号ftpuser
# mkdir -p /data/ftp
# useradd -d /data/ftp -s /sbin/nologin ftpuser
3.4 对ftp目录设置权限
# setfacl -m u:ftpuser:rwx /data/ftp/
备注:
可通过如下方式设置权限:
方式一:使所有用户都对目录具有rwx权限,chmod 777 /app/ftpdata
此种方法安全性较低,不建议采用。
方式二:目录的所有者设置为ftpuser,chown ftpuser /app/ftpdata
方式三:设置访问控制列表ACL,赋予ftpuser用户rwx权限,setfacl -m u:ftpuser:rwx /app/ftpdata
推荐采用此种方法。
方式四:将ftpuser加入到ftp目录属组中,例如要在/app/ftpdata目录(假设此目录属组为yun)中上传文件,将ftpuser加入到组yun中
# usermod -a -G yun ftpuser
3.5 设置PAM验证
# vim /etc/pam.d/vsftpd.vu
输入如下内容:
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
保存并退出。
3.6 创建针对vusera的虚拟用户配置文件
# mkdir /etc/vsftpd/vusers_conf
# cd /etc/vsftpd/vusers_conf
# vim vusera
输入如下内容:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
保存并退出。
备注:上传文件的默认权限为644(anon_umask=022),要改变默认权限,可增加如下配置项:
anon_umask=002 //设置后上传文件默认权限为664
或
anon_umask=000 //设置后上传文件默认权限为666
3.7 修改配置文件vsftpd.conf
(1)备份配置文件:
# cp /etc/vsftpd/vsftpd.conf{,.bak}
(2)修改配置文件vsftpd.conf,内容如下:
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
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
guest_username=ftpuser
guest_enable=YES
user_config_dir=/etc/vsftpd/vusers_conf
allow_writeable_chroot=YES
anon_world_readable_only=NO
anon_other_write_enable=YES
pasv_min_port=30000
pasv_max_port=30010
保存并退出。
说明:
vsftpd默认为PASV模式(数据连接默认打开随机端口),服务端与客户端都有防火墙的环境下,建议vsftpd配置成打开指定端口范围XXXX-YYYY的PASV模式,这样服务端只需开放21、XXXX-YYYY端口即可。
上述配置为指定端口范围30000-30010的PASV模式。
3.8 启动vsftpd
# systemctl start vsftpd
# systemctl enable vsftpd
至此安装vsftpd并配置虚拟用户完毕。
备注:若要增加虚拟用户vuserb,在/etc/vsftpd/vusers.list文件中增加此用户及密码,并使用db_load工具生成db文件,同时在/etc/vsftpd/vusers_conf/目录中创建vuserb配置文件,设置相关权限即可。
附录1 ftp 101.132.148.72若出现如下提示:
# ftp 101.132.148.72
Connected to 101.132.148.72 (101.132.148.72).
500 OOPS: tcp_wrappers is set to YES but no tcp wrapper support compiled in

解决:主配置文件配置项tcp_wrappers=YES修改为tcp_wrappers=NO
附录2 ftp 101.132.148.72若出现如下提示:
# ftp 101.132.148.72
Connected to 101.132.148.72 (101.132.148.72).
220 (vsFTPd 3.0.3)
Name (101.132.148.72:root): vusera
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 (172,25,193,197,117,48).
ftp: connect: Connection timed out

原因:报错信息中的地址172.25.193.197为内网IP,外网设备发起连接的地址应该是公网IP(101.132.148.72),很显然在ftp连接建立之后,服务器返回了自己真实的IP给客户端,但是客户端无法通过这个私有IP(172.25.193.197)发起数据传输请求,所以导致timeout。
解决:主配置文件添加如下配置项:
pasv_address=101.132.148.72
附录3 ftp 101.132.148.72若出现如下提示:
C:\Users\davidliu>ftp 101.132.148.72
连接到 101.132.148.72。
220 (vsFTPd 3.0.3)
用户(101.132.148.72:(none)): vusera
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
ftp> quote PASV
227 Entering Passive Mode (101,132,148,72,117,51).
ftp> ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
ftp>

解决:Windows FTP命令行客户端(ftp.exe)不支持被动模式,请改用其他第三方Windows FTP命令行客户端。
或者设置Windows防火墙允许ftp.exe入站:
