vsftpd 是一个 UNIX 类操做系统上运行的服务器的名字,它能够运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持不少其余的 FTP 服务器不支持的特征。
vsftpd 的名字表明"very secure FTP daemon", 安全是它的开发者 Chris Evans 考虑的首要问题之一。
好比:linux
FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道。shell
FTP协议中,控制链接均有客户端发起,而数据链接有两种工做方式:PORT方式和PASV方式数据库
FTP 客户端首先和FTP Server的TCP 21端口创建链接,经过这个通道发送命令,客户端须要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端经过本身的TCP 20端口发送数据。 FTP server必须和客户端创建一个新的链接用来传送数据。centos
在创建控制通道的时候和PORT模式相似,当客户端经过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口而且通知客户端在这个端口上传送数据的请求,而后FTP server 将经过这个端口进行数据的传送,这个时候FTP server再也不须要创建一个新的和客户端之间的链接传送数据。
若是从C/S模型这个角度来讲,PORT对于服务器来讲是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤为是在使用防火墙的企业里,这一点很是关键,若是设置错了,那么客户将没法链接。安全
vsftpd运行有两种模式,在RPM包管理的系重审统,大可能是由Fedora/Redhat 开发而来,对于这样的系统有xinted服务器一说;对于非RPM包管理的系统,通常没有xinted这一说。为了保证本文档的统一,咱们都不要用xinetd模式,而用initd运行模式来启动和管理服务器,也就是独立运行模式。
像其它守护程序同样,vsftpd提供了standalone和inetd(inetd或xinetd)两种运行模式。简单解释一下, standalone一次性启动,运行期间一直驻留在内存中,优势是对接入信号反应快,缺点是损耗了必定的系统资源,所以常常应用于对实时反应要求较高的专业FTP服务器。inetd偏偏相反,因为只在外部链接发送请求时才调用FTP进程,所以不适合应用在同时链接数量较多的系统。此外,inetd模式不占用系统资源。除了反应速度和占用资源两方面的影响外,vsftpd还提供了一些额外的高级功能,如inetd模式支持per_IP(单一IP)限制,而 standalone模式则更有利于PAM验证功能的应用。服务器
文件 | 说明 |
---|---|
/etc/vsftpd/vsftpd.conf | 主配置文件 |
/usr/sbin/vsftpd | Vsftpd的主程序 |
/etc/pam.d/vsftpd | PAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户) |
/etc/vsftpd/ftpusers | 禁止使用vsftpd的用户列表文件。记录不容许访问FTP服务器的用户名单,管理员能够把一些对系统安全有威胁的用户帐号记录在此文件中,以避免用户从FTP登陆后得到大于上传下载操做的权利,而对系统形成损坏。(注意:linux-4中此文件在/etc/目录下) |
/etc/vsftpd/user_list | 禁止或容许使用vsftpd的用户列表文件。这个文件中指定的用户缺省状况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅容许user_list中指定的用户访问FTP服务器。(注意:linux-4中此文件在/etc/目录下) |
/var/ftp | 匿名用户主目录;本地用户主目录为:/home/用户主目录,即登陆后进入本身家目录 |
/var/ftp/pub | 匿名用户的下载目录,此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后没法删除) |
首先来简化一下主配置文件:session
[root@centos7 ~]# cp /etc/vsftpd/vsftpd.conf{,.bak} #备份主配置文件 [root@centos7 ~]# egrep "^[a-z]|^#[a-z]" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
说明app
[root@centos7 ~]# cat /etc/vsftpd/vsftpd.conf anonymous_enable=YES 说明:是否容许匿名登陆FTP服务器,默认设置为YES容许 local_enable=YES 说明:是否容许本地用户(即linux系统中的用户账号)登陆FTP服务器,默认设置为YES容许本地用户登陆后会进入用户主目录,而匿名用户登陆后进入匿名用户的下载目录/var/ftp/pub write_enable=YES 说明:是否容许本地用户对FTP服务器文件具备写权限,默认设置为YES容许 local_umask=022 说明:缺省掩码,本地用户默认掩码为077 #anon_upload_enable=YES 说明:是否容许匿名用户上传文件,须将全局的write_enable=YES。默认为YES #anon_mkdir_write_enable=YES 说明:是否容许匿名用户建立新文件夹 dirmessage_enable=YES 说明:是否激活目录欢迎信息功能;当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息默认状况下,欢迎信息是经过该目录下的.message文件得到的 xferlog_enable=YES 说明:是否让系统自动维护上传和下载的日志文件;默认状况该日志文件为/var/log/vsftpd.log,也能够经过下面的xferlog_file选项对其进行设定 connect_from_port_20=YES 说明:是否设定FTP服务器将启用FTP数据端口的链接请求;ftp-data数据传输,21为链接控制端口 #chown_uploads=YES 说明:设定是否容许改变上传文件的属主,与下面一个设定项配合使用 #chown_username=whoever 说明:设置想要改变的上传文件的属主 #xferlog_file=/var/log/xferlog 说明:设定系统维护记录FTP服务器上传和下载状况的日志文件 xferlog_std_format=YES 说明:是否以标准xferlog的格式书写传输日志文件 #idle_session_timeout=600 说明:设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒 #data_connection_timeout=120 说明:设置数据链接超时时间 #nopriv_user=ftpsecure 说明:运行vsftpd须要的非特权系统用户,缺省是nobody #async_abor_enable=YES 说明:是否识别异步ABOR请求。 #ascii_upload_enable=YES #ascii_download_enable=YES 说明:是否以ASCII方式传输数据。默认状况下,服务器会忽略ASCII方式的请求。 #ftpd_banner=Welcome to blah FTP service. 说明:登陆FTP服务器时显示的欢迎信息 #deny_email_enable=YES 说明:黑名单设置 #banned_email_file=/etc/vsftpd/banned_emails 说明:当上面的deny_email_enable=YES时,能够利用这个设定项来规定哪些邮件地址不可登陆vsftpd服务器 #chroot_local_user=YES #chroot_list_enable=YES 说明:用户登陆FTP服务器后是否具备访问本身目录之外的其余文件的权限;设置为YES时,用户被锁定在本身的home目录中 #chroot_list_file=/etc/vsftpd/chroot_list 说明:被列入此文件的用户,在登陆后将不能切换到本身目录之外的其余目录 #ls_recurse_enable=YES 说明:是否容许递归查询。默认为关闭,以防止远程用户形成过量的I/O listen=NO 说明:是否容许监听IPv4 listen_ipv6=YES 说明:设定是否支持IPV6 pam_service_name=vsftpd 说明:设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件 userlist_enable=YES 说明: 是否容许ftpusers文件中的用户登陆FTP服务器;若此项设为YES,则user_list文件中的用户容许登陆FTP服务器 tcp_wrappers=YES 说明:是否使用tcp_wrappers做为主机访问控制方式。
在FTP服务器的管理中,不管对本地用户仍是匿名用户,对于FTP服务器资源的使用都须要进行控控制,避免因为负担过大形成FTP服务器运行异常,能够添加如下配置项对FTP客户机使用FTP服务器资源进行控制:异步
max_client 说明:设置项 用于设置FTP服务器所容许的最大客户端链接数,值为0时表示不限制。例如max_client=100表示FTP服务器的全部客户端最大链接数不超过100个。 max_per_ip 说明:设置项 用于设置对于同一IP地址容许的最大客户端链接数,值为0时表示不限制。例如max_per_ip=5表示同一IP地址的FTP客户机与FTP服务器创建的最大链接数不超过5个。 local_max_rate 说明:设置项 用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s. anon_max_rate 说明:设置项 用于设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。例如ano_max_rate=200000,表示FTP服务器的匿名用户最大传输速率设置为200KB/s.
数字 | 含义 |
---|---|
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 | 未执行请求的的命令,名称不正确 |
虚拟用户是指在FTP服务器上拥有帐号,而且该帐号只能用于文件传输服务的用户,也称做Guest用户。该类用户能够经过输入帐号以及口令来进行受权登陆。登陆入系统后,其登陆目录为指定的目录。通常状况下,该类用户既能够下载也能够上传文件。
vsftpd的虚拟用户采用单独的用户名/口令保存方式,与系统帐号(passwd/shadow)分离,这大大加强了系统的安全性。vsftpd能够采用数据库文件来保存用户/口令,如hash;也能够将用户/口令保存在数据库服务器中,如MySQL等。vsftpd验证虚拟用户,则采用PAM方式。因为虚拟用户的用户名/口令被单独保存,所以在验证时,vsftpd需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正如同匿名用户也须要有一个系统用户ftp同样。固然,guest用户也能够被认为是用于映射虚拟用户。async
[root@centos7 ~]# yum -y install vsftpd
[root@centos7 ~]# rpm -qa | grep vsftpd vsftpd-3.0.2-22.el7.x86_64
[root@centos7 ~]# systemctl start vsftpd [root@centos7 ~]# systemctl status vsftpd ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2017-11-13 04:13:02 CST; 9min ago Process: 1633 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS) Main PID: 1634 (vsftpd) CGroup: /system.slice/vsftpd.service └─1634 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Nov 13 04:13:02 centos7 systemd[1]: Starting Vsftpd ftp daemon... Nov 13 04:13:02 centos7 systemd[1]: Started Vsftpd ftp daemon.
[root@centos7 ~]# mkdir -p /data/user1 /data/user2 [root@centos7 ~]# ls /data/ user1 user2
[root@centos7 ~]# useradd vsftpd -s /sbin/nologin
[root@centos7 ~]# cat > /etc/vsftpd/user_passwd <<EOF user1 123456 user2 123456 EOF
[root@centos7 ~]# db_load -T -t hash -f /etc/vsftpd/user_passwd /etc/vsftpd/login.db 在/etc/pam.d/vsftpd文件中注释原有条目并添加如下两行: auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
[root@centos7 ~]# echo "vsftpd" > /etc/vsftpd/chroot_list
[root@centos7 ~]# grep -v "#" /etc/vsftpd/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 chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES guest_enable=YES guest_username=vsftpd user_config_dir=/etc/vsftpd/user_conf
[root@centos7 ~]# mkdir -p /etc/vsftpd/user_conf
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user1 local_root=/data/user1 write_enable=YES anon_umask=022 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@centos7 ~]# cat /etc/vsftpd/user_conf/user2 local_root=/data/user2 write_enable=YES anon_umask=022 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
[root@centos7 ~]# systemctl restart vsftpd