目 录CONTENT

文章目录

FTP文件传输服务

简中仙
2022-08-24 / 0 评论 / 0 点赞 / 75 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-12-18,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

一、基本概念

FTP 是 File Transfer Protocol 的缩写,中文意思是文件传输协议,用于在网络上进行文件传输的一套标准协议。VSFTP 是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,全称是 Very Secure FTP。

FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。20端口用于建立数据连接,并传输文件数据;21端口用于建立控制连接,并传输FTP控制命令。

1、优缺点

1、优点

  • 文件传输速度快:FTP协议传输文件时采用二进制方式,可以直接传送二进制数据,与其他传输协议相比,具有较高的传输速度。
  • 支持多平台:FTP是可跨平台的应用程序,支持Windows、Linux等操作系统。
  • 安全性好:FTP支持加密传输模式,能够有效地保证文件传输的安全性。
  • 易于使用:FTP有一个简单而直观的图形用户界面,容易使用,操作便捷。
  • 支持大文件传输:FTP支持大文件传输,可以处理大型文件的上传和下载。

2、缺点

  • 使用上不如网络共享方便:网络共享的文件可以像本地文件一样使用,而FTP必须是下载下来才能使用。
  • 安全性可能受到影响:尽管FTP支持加密传输模式,但在传输过程中仍然可能存在数据被截获或篡改的风险。
  • 性能可能受到网络带宽和服务器性能的影响:如果网络带宽不足或服务器性能较差,FTP的性能可能会受到影响。

2、VSFTP工作模式

1、主动模式(port)

  • FTP 客户端首先和服务器的 TCP 21 端口建立连接;用来发送命令,
  • 客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT 命令包含了客户端用什么端口接收数据。
  • 在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据。
  • FTP server 必须和客户端建立一个新的连接用来传送数据。

2、被动模式(passive)

  • FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来建立控制通道发送命令,
  • 但建立连接后客户端发送 Pasv 命令。
  • 服务器收到 Pasv 命令后,打开一个临时端口(端口大于 1023小于 65535)并且通知客户端在这个端口上传送数据的请求;
  • 客户端连接 FTP 服务器的临时端口,然后 FTP 服务器将通过这个端口传输数据。.
  • 注意:由于VSFTP的被动模式是随机端口进行数据传输,所以在设置防火墙时需要刻意放行–>这里一定要放心vsftp的服务。

3、vsftp主要配置文件

  • 主程序:/usr/sbin/vsftp
  • 启动脚本文件:/etc/rc.d/init.d/vsftpd
  • 系统服务单元目录:/usr/lib/systemd/system/vsftpd.service
  • 主配置文件:/etc/vsftp/vsftp.conf
  • /etc/pam.d/vsftpd:这是PAM(Pluggable Authentication Modules)认证文件,用于配置vsftpd的用户认证方式。在该文件中,可以指定使用哪种PAM模块进行用户认证,以及相关的认证参数和规则。
  • /etc/vsftpd/ftpusers:此文件用于记录不允许访问FTP服务器的用户名单。管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。
  • /etc/vsftpd/user_list:此文件用于指定允许或禁止使用vsftpd的用户列表。在默认情况下(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES),此文件中指定的用户也不能访问FTP服务器;而在设置了userlist_deny=NO时,则仅允许user_list中指定的用户访问FTP服务器。匿名用户数据根目录:/var/ftp
  • 匿名用户的下载上传目录:/var/ftp/pub此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后无法删除)
  • vsFTP的日志文件:/etc/logrotate.d/vsftpd.log

二、vsftp配置文件

1、实例配置文件

# 允许匿名登录。如果启用,用户名 ftp 和 anonymous 都可以以匿名身份登录。  
anonymous_enable=YES  

# 允许本地用户登录。必须启用此选项才能使任何非匿名登录正常工作,包括虚拟用户。  
local_enable=YES  

# 允许更改文件系统的 FTP 命令,如 STOR、DELE 等。  
write_enable=YES  

# 设置本地用户创建文件的权限掩码。022 表示默认创建新文件的权限为 755。  
local_umask=022  

# 允许匿名用户上传文件。必须激活 write_enable 选项,并且匿名 ftp 用户必须对所需上传位置具有写入权限。  
#anon_upload_enable=YES  

# 允许匿名用户创建新目录。必须激活 write_enable 选项,并且匿名 ftp 用户必须对父目录具有写权限。
#anon_mkdir_write_enable=YES

# 当 FTP 服务器的用户首次进入新目录时,显示消息。默认会扫描目录中的文件.message,但可以被配置设置 message_file 覆盖。
dirmessage_enable=YES

# 维护一个详细说明上传和下载的日志文件。默认文件位于 /var/log/vsftpd.log,但位置可以被配置设置 vsftpd_log_file 覆盖。  
xferlog_enable=YES

# 使用20端口进行数据传输。 
connect_from_port_20=YES

# 所有匿名上传的文件的所有权都将更改为 chown_username 中指定的用户。  
#chown_uploads=YES

# 被授予匿名上传文件所有权的用户的名称。仅当设置了 chown_uploads 时,此选项才相关。
#chown_username=whoever

# xferlog_file 指定了写入传输日志的文件路径。如果设置了 xferlog_enable 和 xferlog_std_format,或者设置了 Dual_log_enable,则会写入传输日志。  
xferlog_file=/var/log/xferlog  
  
# 启用 xferlog_std_format 将以 wu-ftpd 使用的标准格式写入传输日志。默认位置为 /var/log/xferlog,但可以使用 xferlog_file 选项进行更改。  
xferlog_std_format=YES  
  
# idle_session_timeout 定义了远程客户端在 FTP 命令之间可以花费的最长时间。如果超时触发,远程客户端将被断开连接。  
idle_session_timeout=600  
  
# data_connection_timeout 定义了数据传输可以停滞的最长时间。如果超时触发,远程客户端将被断开连接。  
data_connection_timeout=120  
  
# 使用指定的用户名作为 vsftpd 运行的低权限用户。此用户名应为专门用户,不是通用用户。  
nopriv_user=ftpsecure  
  
# 启用 async_abor_enable 后,将启用异步 ABOR FTP 命令。此功能可能对某些 FTP 客户端在取消传输时有用。  
async_abor_enable=YES  
  
# 启用 ascii_upload_enable 后,将遵循 ASCII 模式上传数据。  
ascii_upload_enable=YES  
  
# 启用 ascii_download_enable 后,将遵循 ASCII 模式下载数据。  
ascii_download_enable=YES  
  
# ftpd_banner 可覆盖 vsftpd 显示的问候横幅。  
ftpd_banner=Welcome to blah FTP service.  
  
# 当 deny_email_enable 设置为 YES 时,可以创建一个文件来保存禁止使用的电子邮件地址。使用此文件的用户将无法使用这些电子邮件地址进行匿名登录。  
deny_email_enable=YES  
  
# banned_email_file 指定包含不允许的匿名电子邮件密码的文件名。启用 deny_email_enable 后,将参考此文件。  
banned_email_file=/etc/vsftpd/banned_emails  
  
# chroot_local_user 控制 Linux 系统本地用户是否能够切换到用户 home 目录以外的目录。设置为 ON 时,本地用户只能在其用户目录内活动。  
chroot_local_user=YES  
  
# chroot_list_enable 允许使用 chroot_list 文件来限制用户只能在指定的目录范围内操作。设置为 YES 时,允许使用此文件。  
chroot_list_enable=YES  
  
# chroot_list_file 指定包含本地用户列表的文件名,这些用户将被限制在其主目录的 chroot() 监狱中。仅当启用 chroot_list_enable 时相关。  
chroot_list_file=/etc/vsftpd/chroot_list  
  
# ls_recurse_enable 允许使用“ls -R”命令进行递归目录列表。设置为 YES 时可用。  
ls_recurse_enable=YES  
  
# 当 listen 设置为 YES 时,vsftpd 将作为独立的服务器运行并监听指定的 IP 地址和端口等待客户端连接请求。设置为 NO 时,vsftpd 将不独立监听并依赖于其他方式(如 inetd 或 xinetd)来启动和处理连接请求。  
listen=NO  
  
# listen_ipv6 指定 vsftpd 将监听 IPv6 套接字而不是 IPv4 套接字。与 listen 参数互斥。  
listen_ipv6=YES  
  
# pam_service_name 指定 PAM 服务名称,用于 vsftpd 的身份验证和授权。  
pam_service_name=vsftpd

# 如果启用,vsftpd将从userlist_file提供的文件名加载用户名列表。如果用户试图使用此文件中的名称登录,则在要求用户输入密码之前,用户将被拒绝  
userlist_enable=YES  
  
# 每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务  
tcp_wrappers=YES

2、其他配置文件

下面选项皆为默认配置

# 只有当 SSL_able 设置为活动状态时才适用。如果设置为 YES,匿名用户将被允许使用安全的 SSL 连接。  
allow_anon_ssl=NO  
  
# 如果设置为YES,将允许匿名用户执行除上传和创建目录之外的写操作,例如删除和重命名。通常不建议这样做,但为了完整性而将其包括在内。  
# 注意:对于安全考虑,建议禁用此选项。  
anon_other_write_enable=NO  
  
# 当它为YES时,文件的其他人必须有读的权限才允许下载,而文件所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载。  
# 若为NO,则只要ftp用户对文件有读权限即可下载。  
# 注意:对于安全考虑,建议启用此选项。  
anon_world_readable_only=NO  
  
# 启用后,vsftpd在后台运行。这样可以在处理客户端请求的同时继续监听新的连接请求。  
# 注意:对于需要长时间运行的命令(例如上传或下载大文件),将其放到后台执行可能会导致一些问题。  
background=YES  
  
# 此选项仅对 vsftpd 的非 PAM 版本有效。如果禁用,vsftpd 将不会检查 /etc/shells 是否有本地登录的有效用户 shell。  
# 注意:为了安全考虑,建议启用此选项。  
check_shell=YES  
  
# 启用后,允许使用 SITE CHMOD 命令。这仅适用于本地用户。匿名用户永远无法使用 SITE CHMOD。  
chmod_enable=YES  
  
# 当启用此选项时,vsftpd将记录与OpenSSL连接相关的详细调试信息。  
# 注意:为了调试目的,建议启用此选项。  
debug_ssl=NO  
  
# 如果为 true,则删除所有失败的上传文件。  
delete_failed_uploads=NO  
  
# 当设置为yes时,允许用户列出服务器上的目录列表,而不是下载整个目录。  
dirlist_enable=YES  
  
# 如果设置为 NO,则拒绝所有下载请求。  
# 注意:为了安全性考虑,建议启用此选项。  
download_enable=YES  
  
# 如果启用,则会并行生成两个日志文件,默认情况下为 /var/log/xferlog 和 /var/log/vsftpd.log。前者是 wu-ftpd 风格的传输日志,可由标准工具解析。后者是vsftpd自己风格的日志。  
# 注意:为了日志管理和分析,建议启用此选项。  
dual_log_enable=NO

# 当设置为NO时,'.'和'..'不列出,只列出普通文件。而当设置为YES时,在指定'ls -a'时会列出所有以'.'开始的隐藏文件。  
force_dot_files=NO  
  
# 如果激活此选项,所有匿名登录都将强制使用安全SSL连接来发送和接收数据。  
force_anon_data_ssl=NO  
  
# 如果激活此选项,所有匿名登录都将强制使用安全SSL连接来发送密码。  
force_anon_logins_ssl=NO  
  
# 如果激活此选项,所有非匿名登录都将被迫使用安全SSL连接来发送和接收数据。  
force_local_data_ssl=YES  
  
# 如果激活此选项,所有非匿名登录都将强制使用安全SSL连接来发送密码。  
force_local_logins_ssl=YES  
  
# 如果启用此选项,所有非匿名登录都将被归类为“访客”登录。访客登录将重新映射到guest_username设置中指定的用户。  
guest_enable=NO  
  
# 如果启用此选项,目录列表中的所有用户和组信息将显示为“ftp”。  
hide_ids=NO  
  
# 启用此选项后,vsftpd将自动使用SSL加密来保护FTP连接。但请注意,这可能会对性能产生一定的影响,并且需要确保服务器和客户端都支持SSL加密并已正确配置了SSL证书。  
implicit_ssl=NO  
  
# 当用户上传文件时,如果启用此选项,上传的文件将被锁定,以防止其他用户在上传过程中访问或修改该文件。  
lock_upload_files=YES  
  
# 启用此选项后,如果未启用xferlog_std_format选项,则会记录所有FTP请求和响应。  
log_ftp_protocol=NO  
  
# 启用此选项后,可以设置MDTM以修改文件时间。  
mdtm_write=YES  
  
# 启用此选项后,vsftpd不会询问匿名密码,匿名用户将直接登录。  
no_anon_password=NO  
  
# 启用此选项后,VSFTPD在写入LOG文件时不会把文件锁住。请注意,这通常不推荐启用,因为它可能对某些工作区操作系统问题(如Solaris / Veritas文件系统共存时)有用。  
no_log_lock=NO  
  
# 当设置为YES时,vsftpd会为每个建立的连接分配一个独立的进程。这可以增加vsftpd的效能,因为每个连接都有自己的进程,可以并行处理请求。然而,这种设置也有一些风险。如果系统资源有限,或者硬件配备较低,那么为每个连接分配一个进程可能会导致系统资源耗尽。相反,当设置为NO时,vsftpd不会为每个连接分配独立的进程。这可以减少系统资源的消耗,但可能会降低vsftpd的性能。  
one_process_model=NO  
  
# 启用或禁用chroot_local_user功能。如果启用该功能,用户锁定的目录来自/etc/passwd每个用户指定的目录  
passwd_chroot_enable=NO  
  
# 如果设置为yes,那么vsftp会在被动模式下解析IP地址  
pasv_addr_resolve=NO  
  
# 启用或禁用被动模式。如果启用被动模式,FTP服务器的IP地址和端口将被客户机主动连接,而不是由服务器主动连接客户机  
pasv_enable=YES  
  
# 当该选项被开启时,服务器将不检查客户端的IP地址是否与数据连接的IP地址一致  
pasv_promiscuous=NO  
  
# 启用或禁用FTP数据连接的主动模式。当port_enable设置为YES时,FTP数据连接将使用主动模式,即服务器主动向客户端发起连接。而当port_enable设置为NO时,FTP数据连接将使用被动模式,即服务器等待客户端的连接请求  
port_enable=YES  
  
# 设置是否使用安全的传输模式。如果其值设为yes,表示允许在PASV模式下进行非安全传输,即不检验数据连接的目标IP地址是否是真正客户端的IP地址。反之,如果设为no(默认值即为no),则表示在PASV模式下进行安全传输,即会检验数据连接的目标IP地址是否是真正客户端的IP地址  
port_promiscuous=NO  
  
# 如果设置为 yes,则所有 SSL 客户端连接都需要提供客户端证书  
require_cert=NO  
  
# 是否要求SSL会话的重用。如果设置为YES,则要求所有SSL数据连接都会重用SSL会话。这样,它们会知道控制通道的主密码  
require_ssl_reuse=YES  
  
# 启用或禁用根据客户端IP反查DNS名的功能。如果启用该功能,vsftpd将尝试通过反向DNS查找客户端的IP地址,以确定客户端的主机名。如果将设置为NO,则vsftpd将不执行反向查找,从而可能加快登录速度。这也有助于减少对DNS服务器的依赖和减轻其负载。  
reverse_lookup_enable=YES  
  
# 用于确定vsftpd以哪个用户的身份运行。如果将此选项设置为YES,vsftpd将作为启动它的用户身份运行  
run_as_launching_user=NO  
  
# 用于启用或禁用安全电子邮件列表功能。当设置为YES时,vsftp将只接受以指定电子邮件地址作为密码的匿名用户登录。这意味着,匿名用户必须使用在email_password_file中指定的电子邮件地址作为密码才能登录。这个文件的格式是每行一个密码,没有额外的空格。默认的文件名是/etc/vsftpd/email_passwords。这个功能一般用于在不必要创建虚拟用户的情况下,以较低的安全限制去访问较低安全级别的资源。  
secure_email_list_enable=NO  
  
# 决定vsftpd是否保持会话。如果保持会话,会尝试更新utmp和wtmp。在PAM认证下,还会打开pam_session,直到登出。如果不需要保持登录会话,可以禁用此选项以减少进程和特权占用。  
session_support=NO  
  
# 在系统进程列表中显示会话状态信息。当这个选项启用时,进程报告将会显示每个vsftpd会话在做什么(闲置、下载等等)  
setproctitle_enable=NO  
  
# 如果启用,并且 vsftpd 是针对 OpenSSL 编译的,则 vsftpd 将支持通过 SSL 的安全连接  
ssl_enable=NO  
  
# 是否允许查看客户端证书。如果启用该选项,vsftpd会要求(但不一定需要)客户端提供一个证书来进行SSL连接  
ssl_request_cert=YES  
  
# 仅当 ssl_enable 被激活时才适用。如果启用,此选项将允许 SSL v2 协议连接。  
ssl_sslv2=NO  
  
# 仅当 ssl_enable 被激活时才适用。如果启用,此选项将允许 SSL v3 协议连接。  
ssl_sslv3=NO  
  
# 仅当 ssl_enable 被激活时才适用。如果启用,此选项将允许 TLS v1 协议连接。首选 TLS v1 连接  
ssl_tlsv1=YES  
  
# 如果启用该选项,SSL数据上传需要通过SSL终止,而不是套接字上的EOF。这个选项可以确保攻击者无法使用伪造的TCP FIN过早终止上传,从而提高上传的安全性。  
strict_ssl_read_eof=NO  
  
# 如果启用,SSL 数据下载需要通过 SSL 终止,而不是套接字上的 EOF  
strict_ssl_write_shutdown=NO  
  
# 如果启用,则任何本来会发送到 /var/log/vsftpd.log 的日志输出都会发送到系统日志  
syslog_enable=NO  
  
# 默认情况下,数字 ID 显示在目录列表的用户和组字段中。您可以通过启用此参数来获取文本名称  
text_userdb_names=NO  
  
# 用于启用或禁用对用户主目录的支持。如果启用该选项,用户可以通过在用户名前加上波浪线(~)来访问其主目录。例如,如果用户名为"john",则用户可以通过输入"~john"来访问其主目录。启用tilde_user_enable选项需要满足一些条件,例如必须启用chroot_local_user选项,并且必须禁用userlist_deny选项。此外,用户的主目录必须存在于FTP服务器上,并且具有适当的权限。  
tilde_user_enable=NO  
  
# 如果启用,vsftpd 将显示目录列表以及您本地时区的时间。默认显示 GMT  
use_localtime=NO  
  
# 当设置为YES时,vsftpd将尝试使用sendfile()系统调用来传输文件,从而提高文件传输的性能。当设置为NO时,vsftpd将使用传统的文件传输方式  
use_sendfile=YES  
  
# 如果已激活userlist_enable,则会检查此选项。如果将此设置设置为“否”,则将拒绝用户登录,除非用户明确列在userlist_file指定的文件中。当登录被拒绝时,拒绝会在用户被要求输入密码之前发出。  
userlist_deny=YES  
  
# 如果设置为yes,则接收到的所有SSL客户端证书都必须验证OK。自签名证书不构成OK验证。  
validate_cert=NO  
  
# 如果已激活userlist_enable,则会检查此选项。如果启用,则会记录基于用户列表的每次拒绝登录。  
userlist_log=NO  
  
# 如果启用,虚拟用户将使用与本地用户相同的权限。默认情况下,虚拟用户将使用与匿名用户相同的权限,这往往受到更多限制(特别是在写入访问方面)。  
virtual_use_local_privs=NO  
  
# 如果启用,请使用 CLONE_NEWNET 隔离不受信任的进程,以便它们无法执行任意 connect() 操作,而必须向特权进程请求套接字(必须禁用 port_promiscuous)  
isolate_network=YES  
  
# 如果启用,请使用 CLONE_NEWPID 和 CLONE_NEWIPC 将进程与其 ipc 和 pid 命名空间隔离。所以分离的进程不能互相交互。  
isolate=YES  
  
# 远程客户端与 PASV 样式数据连接建立连接的超时(以秒为单位)  
accept_timeout=60

# 报告登录失败之前暂停的秒数。
delay_failed_login=1

# 允许成功登录之前暂停的秒数。
delay_successful_login=0

# 创建上传文件的权限。Umask 应用于该值之上。如果您希望上传的文件可执行,您可能希望更改为 0777。0666表示用户、组用户和其他用户都具有读写权限,但没有执行权限
file_open_mode=0666

# PORT 样式连接源自的端口(只要启用了命名不当的 connect_from_port_20)
ftp_data_port=20

# 如果 vsftpd 处于独立模式,它将监听传入 FTP 连接的端口。
listen_port=21

# 本地经过身份验证的用户允许的最大数据传输速率(以字节/秒为单位)。
local_max_rate=0

# 如果 vsftpd 处于独立模式,这是可以连接的最大客户端数量。任何其他连接的客户端都会收到错误消息。值 0 关闭限制。
max_clients=2000

# 经过这么多次登录失败后,会话将被终止。
max_login_fails=3

# 如果 vsftpd 处于独立模式,则这是可以从同一源互联网地址连接的最大客户端数量。如果超过此限制,客户端将收到错误消息。值 0 关闭限制。
max_per_ip=50

# 为 PASV 样式数据连接分配的最大端口。0表示使用任何端口
pasv_max_port=0

# 分配给 PASV 样式数据连接的最小端口。
pasv_min_port=0

# 您可能不想更改此设置,但尝试将其设置为 8192 之类的值,以获得更平滑的带宽限制器。0表示让 vsftpd 选择一个合理的设置
trans_chunk_size=0

# 该选项代表匿名登录后 vsftpd 将尝试更改的目录
anon_root=(none)

# 此选项是包含有人连接到服务器时显示的文本的文件的名称。 如果设置,它将覆盖 ftpd_banner 选项提供的横幅字符串。
banner_file=(none)

# 此选项是从中加载证书颁发机构证书的文件的名称,用于验证客户端证书。 加载的证书也会通告给客户端,以满足 TLSv1.0 客户端(例如 z/OS FTP 客户端)的需求。 遗憾的是,由于 vsftpd 使用受限文件系统空间 (chroot),因此未使用默认的 SSL CA 证书路径。
ca_certs_file=(none)

# 此选项指定允许的 FTP 命令的逗号分隔列表(登录后。USER、PASS 和 QUIT 等始终允许登录前)
cmds_allowed=(none)

# 此选项指定拒绝的 FTP 命令的逗号分隔列表(登录后。USER、PASS、QUIT 等始终允许登录前)
cmds_denied=(none)

# 此选项可用于设置文件名(和目录名等)的模式,该模式不应以任何方式访问。示例:deny_file={*.mp3,*.mov,.private}
deny_file=(none)

# 此选项指定用于 SSL 加密连接的 DSA 证书的位置
dsa_cert_file=(none) # RSA 证书就足够了

# 此选项指定用于 SSL 加密连接的 DSA 私钥的位置。 如果未设置此选项,则私钥应与证书位于同一文件中。
dsa_private_key_file=(none)

# 此选项可用于提供备用文件以供 secure_email_list_enable 设置使用。
email_password_file=/etc/vsftpd/email_passwords

# 这是我们用于处理匿名 FTP 的用户名。 该用户的主目录是匿名FTP 区域的根目录。
ftp_username=ftp

# 此设置是访客用户映射到的真实用户名。
guest_username=ftp

# 此选项可用于设置文件名(和目录名等)的模式,该模式应在目录列表中隐藏。示例: hide_file={*.mp3,.hidden,hide*,h?}
hide_file=(none)
# 如果vsftpd运行在独立模式,此设置可以覆盖默认的所有本地接口的监听地址。  
# 需要提供一个数字IP地址。  
listen_address=(none)  
  
# 与listen_address类似,但专为IPv6设置。当启用了IPv6监听时,此设置指定默认的监听地址。  
# 格式为标准IPv6地址。  
listen_address6=(none)  
  
# 当本地用户登录后,vsftpd会尝试将此目录作为用户的根目录。  
local_root=(none)  
  
# 当用户进入一个新目录时,vsftpd会查找此文件名并显示其内容给用户。  
# 仅当dirmessage_enable选项启用时有效。  
message_file=.message  
  
# 此选项允许您覆盖vsftpd在响应PASV命令时通告的IP地址。  
# 可以提供一个数字IP地址。如果启用了pasv_addr_resolve,您也可以提供一个主机名,该主机名将在vsftpd启动时进行DNS解析。  
pasv_address=(none)  
  
# 指定用于SSL加密连接的RSA证书的路径。  
rsa_cert_file=/usr/share/ssl/certs/vsftpd.pem  
  
# 指定用于SSL加密连接的RSA私钥的路径。如果不设置,私钥应在证书文件中。  
rsa_private_key_file=(none)  
  
# 应该是一个空目录的名称,此目录不应被ftp用户写入。有时用作安全的chroot()监狱。  
secure_chroot_dir=/usr/share/empty  
  
# 允许您选择vsftpd用于SSL加密连接的密码套件。  
ssl_ciphers=DES-CBC3-SHA  
  
# 允许基于每个用户覆盖其他指定的配置选项。  
user_config_dir=(none)  
  
# 与虚拟用户结合使用时很有用。它可以根据模板自动为每个虚拟用户生成主目录。  
user_sub_token=(none)  
  
# 当userlist_enable选项启用时,此文件将用于加载用户列表。  
userlist_file=/etc/vsftpd/user_list  
  
# vsftpd的日志文件路径。仅当启用xferlog_enable选项并且未设置xferlog_std_format时才会写入。如果启用了Dual_log_enable,也会写入此日志。注意:如果启用了syslog_enable,则不会写入此文件,而是将日志发送到系统日志。  
vsftpd_log_file=/var/log/vsftpd.log

三、基于系统用户的FTP服务

# yum -y install vsftpd                 # 安装vsftp服务
# systemctl enable vsftpd
# systemctl start vsftpd
# setenforce 0                 			# 关闭安全服务

1、匿名访问的FTP服务

# tar zcf /var/ftp/vsftpdconf.tar.gz /etc/vsftpd/                 # 创建测试文件
# chown ftp /var/ftp/pub/                # 使匿名用户ftp对该目录拥有写入权限
# chmod 755 /var/ftp/pub/
# vim /etc/vsftpd/vsftpd.conf           # 开放匿名用户配置
anonymous_enable=YES                    # 是否允许匿名访问
local_enable=NO                 		# 不启用本地用户
write_enable=YES                        # 开放服务器的写权限
local_umask=022                         # 设置匿名用户所上传文件的默认权限掩码值
anon_upload_enable=YES                  # 是否允许匿名用户上传文件
anon_mkdir_write_enable=YES             # 是否允许匿名用户有创建目录的写入权限
anon_root=/var/ftp 						# 匿名用户的 FTP 根目录
anon_other_write_enable=YES 			# 开放其他写入权(删除、覆盖、重命名)
anon_max_rate=0 						# 限制最大传输速率(0 为不限速,单位:bytes/秒)
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES                     # 启用本用户列表
tcp_wrappers=YES
# systemctl restart vsftpd              # 重启vsftpd服务
# netstat -anpt | grep vsftpd
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      51154/vsftpd   

windows主机操作

在这里插入图片描述

Linux操作:

# yum -y install ftp
# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.2)
Name (192.168.1.10:root): ftp                    				# 用户名为ftp或anonymous
331 Please specify the password.
Password:                 										# 密码可任意输入,或直接按Enter键
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls                 										# 查看FTP服务器中的内容
227 Entering Passive Mode (192,168,1,10,50,169).
150 Here comes the directory listing.
drwxr-xr-x    2 14       0               6 Apr 01 04:55 pub
-rw-r--r--    1 0        0            2825 Jun 26 08:32 vsftpdconf.tar
-rw-r--r--    1 0        0            2825 Jun 26 08:32 vsftpdconf.tar.gz
226 Directory send OK.
ftp> lcd /opt                 									# 将本地目录切换到/opt/
Local directory now /opt
ftp> get vsftpdconf.tar.gz                 						# 将文件下载到本地(/opt/目录)
local: vsftpdconf.tar.gz remote: vsftpdconf.tar.gz
227 Entering Passive Mode (192,168,1,10,112,156).
150 Opening BINARY mode data connection for vsftpdconf.tar.gz (2825 bytes).
226 Transfer complete.
2825 bytes received in 2e-05 secs (141250.00 Kbytes/sec)
ftp> lcd /root                 									# 将本地目录切换到/root/
Local directory now /root
ftp> cd pub                 									# 将FTP目录切换到/pub/
250 Directory successfully changed.
ftp> put initial-setup-ks.cfg                  					# 将文件上传到服务器(/pub/目录)
local: initial-setup-ks.cfg remote: initial-setup-ks.cfg
227 Entering Passive Mode (192,168,1,10,143,15).
150 Ok to send data.
226 Transfer complete.
1797 bytes sent in 0.000324 secs (5546.30 Kbytes/sec)
ftp> ls                 										# 查看所上传文件的权限
227 Entering Passive Mode (192,168,1,10,67,123).
150 Here comes the directory listing.
-rw-------    1 14       50           1797 Jun 26 08:53 initial-setup-ks.cfg
226 Directory send OK.
ftp> quit                 										# 断开ftp连接并退出
221 Goodbye.

如果已经知道要下载文件的完整URL地址的情况下,也可以

# wget ftp://192.168.1.10/vsftpdconf.tar.gz
--2020-06-26 17:26:31--  ftp://192.168.1.10/vsftpdconf.tar.gz
           => “vsftpdconf.tar.gz”
正在连接 192.168.1.10:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。==> 不需要 CWD。
==> SIZE vsftpdconf.tar.gz ... 2825
==> PASV ... 完成。 ==> RETR vsftpdconf.tar.gz ... 完成。
长度:2825 (2.8K) (非正式数据)

100%[====================================================================>] 2,825       --.-K/s 用时 0s      

2020-06-26 17:26:31 (688 MB/s) - “vsftpdconf.tar.gz” 已保存 [2825]

2、用户验证的FTP服务

1、基本的本地用户验证

修改vsftp配置文件

# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES                	 		# 启用本地用户
write_enable=YES
local_umask=077                 			# 仅属主用户拥有权限
local_root=/var/ftp 						# 设置本地用户的 FTP 根目录
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES                 		# 将FTP本地用户禁锯在宿主目录中
listen=NO
listen_ipv6=YES
allow_writeable_chroot=YES                 	# 允许被限制用户的主目录具有写权限
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

用户lisi登录到FTP服务器192.168.1.10,并进行上传文件测试

# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.2)
Name (192.168.1.10:root): lisi                 	# 以lisi用户登录
331 Please specify the password.
Password:                 						# 以lisi用户的密码验证
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put uptest.txt                  			# 将文件上传到服务器
local: uptest.txt remote: uptest.txt
227 Entering Passive Mode (192,168,1,10,74,192).
150 Ok to send data.
226 Transfer complete.
122 bytes sent in 5e-05 secs (2440.00 Kbytes/sec)
ftp> ls                 						# 查看上传文件的权限
227 Entering Passive Mode (192,168,1,10,207,245).
150 Here comes the directory listing.
-rw-------    1 1000     1000          122 Jun 26 09:41 uptest.txt
226 Directory send OK.
ftp> quit
221 Goodbye.

2、使用user_list用户列表文件

# vim /etc/vsftpd/user_list                 //编辑用户列表
lisi
wangwu
zhangliu
# vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES                 # 启用user_list用户列表文件
userlist_deny=NO                 # 不禁用user_list列表中的用户
# systemctl restart vsftpd                 //重新加载配置

3、vsftpd服务的其他常用配置

1、修改vsftpd服务的监听地址、端口

# vim /etc/vsftpd/vsftpd.conf
listen=YES                 # 允许独立监听服务
listen_address=192.168.1.10                 # 只在一个接口监听服务
listen_port=2121                 # 监听端口改为2121
listen_ipv6=NO
# systemctl restart vsftpd  
# netstat -anpt | grep vsftpd
tcp        0      0 192.168.1.10:2121       0.0.0.0:*               LISTEN      51996/vsftpd    

2、允许使用FTP服务器的被动模式

# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=24500                 # 指定被动模式的下限端口
pasc_max_port=24600                 # 指定被动模式的上限端口
#pasv_enable=NO                 	# 禁用被动模式(版本默认幵启)
# systemctl restart vsftpd  

3、限制FTP连接的并发数、传输速度

# vim /etc/vsftpd/vsftpd.conf
max_clients=20                 		# 限制并发客户连接最多20个
max_per_ip=2                 		# 限制每个IP地址的连接数最多两个
local_max_rate=200000               # 限制本地用户传输速率为200kB/s
# systemctl restart vsftpd  

四、基于虚拟用户的FTP服务

1、建立虚拟用户的账号数据库

1、创建文本格式的用户名/密码列表

# vim /etc/vsftpd/vusers.list
mike
123
john
456

2、创建Berkeley DB格式的数据库文件

# cd /etc/vsftpd/
# db_load -T -t hash -f vusers.list vusers.db
# file vusers.db 
vusers.db: Berkeley DB (Hash, version 9, native byte-order)
# chmod 600 /etc/vsftpd/vusers.*
# ls -lh /etc/vsftpd/vusers.*
-rw-------. 1 root root 12K 6月  26 18:54 /etc/vsftpd/vusers.db
-rw-------. 1 root root  18 6月  26 18:53 /etc/vsftpd/vusers.list

3、添加虚拟用户的映射账号、创建FTP根目录

# useradd -d /var/ftproot -s /sbin/nologin virtual
# chmod 755 /var/ftproot/

2、为vsftpd服务添加虚拟用户支持

1、为虚拟用户建立PAM认证文件

# vim /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth     required  pam_userdb.so db=/etc/vsftpd/vusers
account  required  pam_userdb.so db=/etc/vsftpd/vusers

2、修改vsftpd配置,添加虚拟用户支持

# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES                 				# 启用本地用户(映射本地用户)
write_enable=YES                 				# 启用上传写入支持
local_umask=022
anon_umask=022                 					# 指定上传权限掩码
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
allow_writeable_chroot=YES
pam_service_name=vsftpd.vu                 		# 指定新的PAM认证文件
tcp_wrappers=YES
guest_username=virtual                 			# 指定映射的系统用户名称
guest_enable=YES
user_config_dir=/etc/vsftpd/vusers_dir          # 指定用户独立配置文件

3、为不同的虚拟用户建立独立的配置文件

# mkdir /etc/vsftpd/vusers_dir                 	# 创建用户配置文件夹
# cd /etc/vsftpd/vusers_dir/
# vim john           # 为用户john建立独立的配置文件
anon_upload_enable=YES                 			# 允许上传文件
anon_mkdir_write_enable=YES                 	# 允许创建目录
# touch mike         # 用户mike只有默认的权限
# systemctl restart vsftpd

五、使用SSL证书加密数据传输FTP

1、使用OpenSSL生成自签证书

# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650
Generating a 2048 bit RSA private key
..+++
..................................+++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ZH                 				# 国家
State or Province Name (full name) []:BJ                 			# 省
Locality Name (eg, city) [Default City]:CP                 			# 市
Organization Name (eg, company) [Default Company Ltd]:CSDN          # 机构
Organizational Unit Name (eg, section) []:CSDN                 		# 部门
Common Name (eg, your name or your server's hostname) []:CSDN.COM   # 域名
Email Address []:123456@qq.com                 						# 邮箱
参数说明
req是 X.509(CSR,证书签名请求)管理的一个命令
x509X.509 证书数据管理
days定义证书的有效日期
newkey指定证书密钥处理器
keyout设置密钥存储文件
out设置证书存储文件(证书和密钥都保存在一个相同的文件)

2、创建证书文件存放目录

# mkdir /etc/vsftpd/.sslkey
# cp vsftpd.pem /etc/vsftpd/.sslkey/
# chmod 400 /etc/vsftpd/.sslkey/vsftpd.pem 

3、修改配置文件,支持SSL

# vim /etc/vsftpd/vsftpd.conf
......
listen=YES
# config ssl
# 启用SSL支持
ssl_enable=YES
allow_anon_ssl=NO
# 强制匿名用户使用加密登陆和数据传输
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
# 指定vsftpd支持TLS v1
ssl_tlsv1=YES
# 指定vsftpd支持SSL v2
ssl_sslv2=NO
# 指定vsftpd支持SSL v3
ssl_sslv3=NO
# 不重用SSL会话,安全配置项
require_ssl_reuse=NO
# 允许用于加密SSL连接的SSL算法
ssl_ciphers=HIGH
# 定义SSL证书和密钥文件的位置
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem
......
# systemctl restart vsftpd

注意:上面的配置项不要添加到vsftpd.conf 文件最后,否则启动报错

六、FTP数字代码意义

代码说明
110重新启动标记应答
120服务在多久时间内ready
125数据链路埠开启,准备传送
150文件状态正常,开启数据连接端口
200命令执行成功
202命令执行失败
211系统状态或是系统求助响应
212目录的状态
213文件的状态
214求助的讯息
215名称系统类型
220新的联机服务ready
221服务的控制连接已关闭,可以注销
225数据连接开启,但无传输动作
226关闭数据端口,请求的文件操作成功
227进入passive mode
230使用者登入
250请求的文件操作完成
257显示目前的路径名称
331用户名称正确,需要密码
332登入时需要账号信息
350请求的操作需要进一步的命令
421无法提供服务,关闭控制连接
425无法开启数据链路
426关闭联机,终止传输
450请求的操作未执行
451命令终止,有本地的错误
452未执行的命令,磁盘空间不足
500格式错误,无法识别命令
501参数语法错误
502命令执行失败
503命令顺序错误
504命令所接的参数不正确
530未登入
532储存文件需要账户登入
550未执行请求的操作
551请求的命令终止,类型未知
552请求的文件终止,储存位溢出
553未执行请求的命令,名称不正确
0

评论区