vsftpd 服务常用配置说明

环境信息

  • Centos 7
  • vsftpd 3.0.2

FTP(File transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,
其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端发出的相关 FTP 命令与参数。

FTP 有两种工作模式:

  • 主动模式(PORT) - 服务器主动向客户端发起连接请求.
  • 被动模式(PAVS) - FTP 服务器打开协商好的端口,等待客户端发起连接请求(默认工作模式).

FTP 协议需要用到两个 TCP 连接:

  • 命令连接 - 用来在 FTP 客户端与服务器之间传递命令。
  • 数据连接 - 用来在服务器和客户端进行文件传输。

无论是主动模式还是被动模式,其要进行文件传输都必须依次建立两个连接,分别为命令连接与数据连接。而主动模式与被动模式的差异主要体现在数据连接通道上。[1]

服务配置文件

通用配置

vsftpd.conf
# 匿名用户和本地用户是否能登录,匿名用户使用的登陆名为ftp或anonymous,口令为空,匿名用户不能离开匿名 用户家目录/var/ftp,且只能下载不能上传。
# 本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。
# 默认写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。
anonymous_enable=YES
local_enable=YES

# 否允许登录用户有写权限。属于全局设置,默认值为YES。
write_enable=YES

# 如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES。
download_enable=YES/NO

匿名用户(anonymous)设置

vsftpd.conf
# 若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
no_anon_password=YES/NO

# 定义匿名登入的使用者名称。默认值为ftp。
ftp_username=ftp

# 使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。
anon_root=/var/ftp

# 如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_upload_enable=YES/NO

# 如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
anon_world_readable_only=YES/NO

# 如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_mkdir_write_enable=YES/NO

# 如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。
# 如果anon_upload_enable=NO,则匿名用户 不能上传文件,但可以删除或者重命名已经存在的文件;
# 如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但 可以删除或者重命名已经存在的文件夹。)默认值为NO。
anon_other_write_enable=YES/NO

# 设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。
chown_uploads=YES/NO

# 设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。
chown_username=username

# 设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700。
anon_umask=077

# 若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。
deny_email_enable=YES/NO

# 此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。
banned_email_file=/etc/vsftpd/banner_emails

本地用户设置

vsftpd.conf
# 控制是否允许本地用户登入,默认值为YES。
local_enable=YES/NO

# 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录
local_root=/home/username

# 本地用户新增档案时的umask 值。默认值为077。
local_umask=022

# 本地用户上传档案后的档案权限,与chmod 所使用的数值相同。默认值为0666。
file_open_mode=0755

欢迎语设置

vsftpd.conf
# 如果启动这个选项,那么使用者第一次进入一个目录时,会检查该目录下是否有.message这个档案
# 如果有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。
dirmessage_enable=YES/NO

# 设置目录消息文件,可将要显示的信息写入该文件。默认值为.message。
message_file=.message

# 当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。如果欢迎信息较多,则使用该配置项。
banner_file=/etc/vsftpd/banner

# 这里用来定义欢迎话语的字符串,banner_file是档案的形式,而ftpd_banner 则是字符串的形式。预设为无。
ftpd_banner=Welcome to BOB's FTP server

控制用户是否允许切换到上级目录

vsftpd.conf
# 是否将用户限制在用户主目录。默认值为NO。
chroot_local_user=YES/NO

# 在默认配置下(chroot_local_user=NO),本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患。
# 设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO。
chroot_list_enable=YES/NO

# 用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。
chroot_list_file=/etc/vsftpd.chroot_list

### 通过搭配能实现以下几种效果:
# 1. 当chroot_local_user=YES, chroot_list_enable=YES时,
# 在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
# 2. 当chroot_local_user=YES, chroot_list_enable=NO时,
# 所有用户被限制在主目录,不启用chroot_list_file白名单,没有例外
# 3. 当chroot_local_user=NO, chroot_list_enable=YES时
# 所有用户不限制在主目录,chroot_list_file中的用户例外,限制切换到主目录之外
# 4. 当chroot_local_user=NO, chroot_list_enable=NO时
# 所有用户不限制在主目录,不启用chroot_list_file,没有任何例外

数据传输模式设置

vsftpd.conf
# FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。
# 设置是否启用ASCII 模式上传数据。默认值为NO。
ascii_upload_enable=YES/NO

# 设置是否启用ASCII 模式下载数据。默认值为NO。
ascii_download_enable=YES/NO

访问控制设置

vsftpd.conf
# 两种控制方式:一种控制主机访问,另一种控制用户访问。
# 设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。
# 如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。
# 比如:若要仅允许192.168.0.1—192.168.0.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:
# vsftpd:192.168.0. :allow
# all:all :deny

# 对于用户的访问控制可以通过/etc目录下的vsftpd.user_list和ftpusers文件来实现。
# 控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。
userlist_file=/etc/vsftpd.user_list

# 是否启用vsftpd.user_list文件。
userlist_enable=YES/NO

# 决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。userlist_enable=YES 才有效
# 若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,为黑名单,其他用户可以访问
# 若设置为NO,则vsftpd.user_list文件中的用户能访问FTP,为白名单,其他用户不能访问
userlist_deny=YES/NO

# /etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表,不受任何配置文件影响,里面的用户始终不允许方法vsftpd
# 默认情况下vsftpd.user_list和ftpusers,这两个 文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。

访问速率设置

vsftpd.conf
# 设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。
anon_max_rate=0

# 本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度。预设值为0。
local_max_rate=0

超时时间设置

vsftpd.conf
# 设置建立FTP连接的超时时间,单位为秒。默认值为60。
accept_timeout=60

# PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60。
connect_timeout=60

# 设置建立FTP数据连接的超时时间,单位为秒。默认值为120。
data_connection_timeout=120

# 设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒。默认值为300 。
idle_session_timeout=300

日志文件设置

vsftpd.conf
# 是否启用上传/下载日志记录。如果启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的档案中。预设为开启
xferlog_enable= YES/NO

# 设置日志文件名和路径,默认值为/var/log/vsftpd.log。
xferlog_file=/var/log/vsftpd.log

# 如果启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般。默认值为关闭。
xferlog_std_format=YES/NO

# 如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。
# 启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。
log_ftp_protocol=YES|NO

# 登录日志
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

# 日志中的时间与系统时间保持一致
use_localtime=YES

FTP 的工作方式与端口设置

vsftpd.conf
# FTP有两种工作方式:PORT FTP(主动模式)和 PASV FTP(被动模式)
# 设置FTP服务器建立连接所监听的端口,默认值为21。
listen_port=21

# 指定FTP使用20端口进行数据传输,默认值为YES。
connect_from_port_20=YES/NO

# 设置在PORT方式下,FTP数据连接使用的端口,默认值为20。
ftp_data_port=20

# 若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。
# 默认值为YES,即使用PASV工作模式。
pasv_enable=YES/NO(YES)

# 在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。
pasv_max_port=0

# 在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。
pasv_min_port=0

与连接相关的设置

vsftpd.conf
# 设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默认值。
# 建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd 服务的管控,功能上会受到限制。
listen=YES/NO

# 设置vsftpd允许的最大连接数,默认值为0,表示不受限制。
# 若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。
max_clients=0

# 设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。
max_per_ip=0

# 设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。
listen_address=IP地址

# 设置每个与FTP服务器的连接,是否以不同的进程表现出来。
# 默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。
# 若设置为YES,则每个连接都会有一个vsftpd的进程。
setproctitle_enable=YES/NO

虚拟用户相关配置

vsftpd 虚拟用户配置过程参考
vsftpd.conf
# 使用虚拟用户功能,必须允许本地用户登录
local_enable=YES

# 启用虚拟用户配置,所有非匿名用户登录将视为游客,将被映射为guest_username
guest_enable=YES

# 虚拟用户映射的本地用户
# 主配置文件中必需有,否则报错
# 500 OOPS: vsftpd: cannot locate user specified in 'guest_username':ftp
guest_username=virftp

# 虚拟用户独立配置文件目录
user_config_dir=/etc/vsftpd/virtual_user_conf

# 虚拟用户使用本地用户的权限
# 默认为NO,虚拟用户具有和匿名用户一样的权限
virtual_use_local_privs=YES | NO

# 虚拟用户加载的 pam 模块,默认为 /etc/pam.d/vsftpd
# pam_service_name=vsftpd_vu

虚拟用户配置文件

每个虚拟用户都需要一个单独的配置文件,虚拟用户配置文件在 vsftpd 配置中 user_config_dir 对应的目录 (/etc/vsftpd/virtual_user_conf) 下
文件名必须和用户名一样

user1
# 指定虚拟用户根目录
local_root=/home/ftpsite/user1

# 虚拟用户是和本地用户有相同权限;NO:虚拟用户和匿名用户权限相同
virtual_use_local_privs=YES

# 虚拟用户对应的系统用户
guest_username=virftp

write_enable=YES
lock_upload_files=NO
anon_umask=022
# download_enable=NO
# anon_upload_enable=YES
# anon_mkdir_write_enable=YES
# anon_other_write_enable=YES
# chown_uploads=YES
# chown_username=nono
# allow_anon_ssl=YES

# force_anon_logins_ssl=YES
# force_anon_data_ssl=YES
# cmds_allowed=CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RETR,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

# 虚拟用户将被锁定在自己的宿主目录
# chroot_local_user=YES

常用配置参考

nginx 反代 FTP 服务

Nginx 服务常用配置说明

脚注