使用vsftpd搭建FTP Server

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入站: