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千字节/秒。