FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。
我们这次使用的是VSFTP。vsftpd是 “very secure FTP deamon”的缩写,是一个完全免费,开源的ftp服务器软件。 特点 小巧轻快,安全易用,支持虚拟用户、支持带宽限制等功能。

工作方式

主动模式:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始 监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
被动模式:当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

vsftp三种认证模式

annoymous 匿名用户 #无虚输入密码即可访问
local user 真实用户 #服务器上存在的用户
guest user 虚拟用户 #映射到ftp服务器的用户

配置源的部分就不说了

安装

 [root@localhost ~]# yum install vsftpd -y
已加载插件:langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
正在解决依赖关系
--> 正在检查事务
---> 软件包 vsftpd.x86_64.0.3.0.2-9.el7 将被 安装
--> 解决依赖关系完成

----------------省略部分----------------
已安装:
  vsftpd.x86_64 0:3.0.2-9.el7                                                                                                           

完毕!

匿名用户

配置

在配置文件/etc/vsftpd/vsftpd.conf中修改

anonymous_enable=YES                   开启匿名用户登录
anon_root=/var/ftp/pub                      设置匿名用户登录目录
anon_upload_enable=YES               允许匿名用户上传文件

启动

 [root@localhost ~]# systemctl start vsftpd.service

测试

连接到 10.2.5.100。
220 (vsFTPd 3.0.2)
用户(10.2.5.100:(none)): anonymous
331 Please specify the password.
密码:
230 Login successful.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> put
本地文件 test.txt
远程文件 test.txt
200 PORT command successful. Consider using PASV.
553 Could not create file.
ftp>

这里无法上传,是因为我们指定的匿名用户上传目录的所属者是root组中的root用户而匿名用户是以ftp用户登录的。

[root@localhost ftp]# ls -l
总用量 0
drwxr-xr-x. 2 root root 6 3月   7 2014 pub
[root@localhost ftp]# chown -Rf ftp pub    

chown将指定文件的拥有者改为指定的用户或组。
-c 显示更改的部分的信息
-f 忽略错误信息
-h 修复符号链接
-R 处理指定目录以及其子目录下的所有文件
-v 显示详细的处理信息

再试一次就可以上传了

ftp> put
本地文件 test.txt
远程文件 test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 4 字节,用时 0.01秒 0.44千字节/秒。
ftp>

本地用户

配置

在配置文件/etc/vsftpd/vsftpd.conf中修改

local_enbale=YES                        开启本地用户登录
write_enable=YES                        允许本地用户可写
local_root=/var/ftp/user                 设置本地用户登录目录
[root@localhost ~]# mkdir /var/ftp/user

创建一个测试用户

[root@localhost ~]# useradd test
[root@localhost ~]# echo 123 | passwd test --stdin
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
禁止test用户远程登录到linux服务器
[root@localhost ~]# vim /etc/passwd
test:x:1001:1001::/home/test:/sbin/nologin
[root@localhost ~]# chown -Rf test /var/ftp/user/

启动

[root@localhost ~]# systemctl restart vsftpd.service

测试

连接到 10.2.5.100。
220 (vsFTPd 3.0.2)
用户(10.2.5.100:(none)): test
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/var/ftp/user"
ftp> put test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 4 字节,用时 0.01秒 0.33千字节/秒。

虚拟用户

配置

在配置文件/etc/vsftpd/vsftpd.conf中修改

pam_service_name=vsftpd                             指定PAM文件
guest_enable=YES                                            开启虚拟用户模式
guest_username=virtual                                  指定虚拟用户账户
user_config_dir=/etc/vsftpd/vusers                     指定虚拟用户配置文件所在的目录
allow_writeable_chroot=YES                             允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
[root@localhost ~]# cd /etc/vsftpd
[root@localhost vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost vsftpd]# mkdir /var/ftproot/test1
[root@localhost vsftpd]# chown virtual -Rf /var/ftproot
 [root@localhost vsftpd]# vim fuser 
test1
test1
创建一个用于虚拟用户认证的数据库文件,奇数行账号,偶数行密码。
[root@localhost vsftpd]# db_load -T -t hash -f fuser  fuser.db
[root@localhost vsftpd]# chmod 600 fuser.db
[root@localhost vsftpd]# rm –r fuser

db_load命令用哈希算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限。

[root@localhost vusers]# vim /etc/pam.d/vsftpd
#%PAM-1.0
#$session    optional     pam_keyinit.so    force revoke
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth       required    pam_shells.so
#auth       include     password-auth
#account    include     password-auth
#session    required     pam_loginuid.so
#session    include     password-auth
auth        required        pam_userdb.so    db=/etc/vsftpd/fuser
account     required        pam_userdb.so    db=/etc/vsftpd/fuser   

我们用默认的PAM文件来实现虚拟用户的认证功能


[root@localhost vsftpd]# mkdir /etc/vsftpd/vusers
[root@localhost vsftpd]# cd /etc/vsftpd/vusers
[root@localhost vuser]# vim test1
local_root=/var/ftproot/test1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

创建存放虚拟用户配置文件的目录

创建test1用户的配置文件

启动

 [root@localhost ~]# systemctl restart vsftpd.service

测试

连接到 10.2.5.100。
220 (vsFTPd 3.0.2)
用户(10.2.5.100:(none)): test1
331 Please specify the password.
密码:
230 Login successful.
ftp> mkdir test
257 "/test" created
ftp> put test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
test
test.txt
226 Directory send OK.
ftp: 收到 16 字节,用时 0.00秒 16000.00千字节/秒。