FTP(File Transfer Protocol)文件传输协议
FTP 是 TCP/IP 协议组中的协议之一。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上传(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。
两类连接:
命令连接:传输命令
数据连接:传输数据
两种模式:
主动模式:PORT
Server: 20/tcp连接客户端的命令连接使用的端口向后的第一个可用端口
被动模式:PASV
Server:打开一个随机端口,并等待客户端连接
主动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 <- 服务器 20端口
被动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 -> 服务器 >1023端口
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。
PAM(Pluggable Authentication Modules )可插拔认证模块:
PAM是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
PAM支持的四种管理界面:
1、认证管理(authenticationmanagement)
主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密 信息。
2、帐户管理(accountmanagement)
主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的 限制等等。
3、密码管理(passwordmanagement)
主要是用来修改用户的密码。
4、会话管理(sessionmanagement)
主要是提供对会话的管理和记账(accounting)。
vsftpd
vsftpd (very secure FTP daemon),安全性是它的一个最大的特点。vsftpd 是一个UNIX类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
vsftpd以ftp用户的身份运行进程,默认认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
程序环境:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
Systemd Unit File(系统单元文件):/usr/lib/systemd/system/vsftpd.service
[root@localhost ~]#yum -y install vsftpd (安装vsftpd)[root@localhost ~]#systemctl start vsftpd.service (启动)[root@localhost ~]#ps auxroot 5808 0.0 0.0 52708 564 ? Ss 07:42 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf[root@localhost ~]#ss -tnl (查看端口)LISTEN 0 32 :::21 :::*
配置vsftpd
用户类别:
匿名用户:anonymous –> ftp,/var/ftp
系统用户:禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd)
虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd)
匿名用户:
[root@localhost ~]#yum -y install lftp (安装lftp)[root@localhost ~]#lftp 172.16.250.149 (主机1)lftp anonymous@172.16.250.149:/> lftp -u ftp 172.16.250.149lftp 172.16.250.149:/> lftp -u anonymous 172.16.250.149lftp 172.16.250.149:~> ls口令:lftp ftp@172.16.250.149:~> lsdrwxr-xr-x 2 0 0 6 Nov 05 2016 pub [root@localhost ~]#cp /etc/issue /var/ftp/pub/[root@localhost ~]#cd /var/ftp/pub/[root@localhost /var/ftp/pub]#chown ftp.ftp issue [root@localhost ~]#lftp -u rookie 172.16.250.149 主机2Password:lftp rookie@172.16.250.149:~> cd /var/ftp/pub/lftp rookie@172.16.250.149:/var/ftp/pub> ls-rw-r--r-- 1 14 50 23 Jun 06 02:08 issuelftp rookie@172.16.250.149:/var/ftp/pub> rm issuerm: Access failed: 550 Delete operation failed. (issue) (删除操作失败)注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集(默认情况下匿名用户只有下载和查看的权限,无删除权限)
lftp rookie@172.16.252.245:~> lftp -u rookie 172.16.250.149 (主机2)口令:lftp rookie@172.16.250.149:~> pwd (查看家目录) ftp://rookie@172.16.250.149/%2F/home/rookie[root@localhost ~]#yum -y install finger[root@localhost ~]#finger rookieLogin: rookie Name:Directory: /home/rookie Shell: /bin/bashNever logged in.No mail.No Plan.
配置文件:/etc/vsftpd/vsftpd.conf
directive value
注意:directive之前不能有多余字符
匿名用户:
anonymous_enable=YES (是否支持启用匿名账号)
anon_upload_enable=YES (特定条件下上传文件)
anon_mkdir_write_enable=YES (一定条件下创建新目录)
anon_other_write_enable=YES (上传和删除目录)
anon_world_readable_only=YES (是否全局只读)
系统用户:
local_enable=YES (是否启用本地用户)
write_enable=YES (是否本地用户使用写权限)
local_umask=022
[root@localhost ~]#useradd rookie (主机1)[root@localhost ~]#echo qwer | passwd --stdin rookie更改用户 rookie 的密码 。passwd:所有的身份验证令牌已经成功更新。 [root@localhost /etc]#lftp -u rookie 172.16.250.149 (主机2)口令:lftp rookie@172.16.250.149:~> lslftp rookie@172.16.250.149:~> pwd ftp://rookie@172.16.250.149/%2Fhome/rookie root@localhost ~]#yum -y install finger (主机1)[root@localhost ~]#finger rookieLogin: rookie Name:Directory: /home/rookie Shell: /bin/bashNever logged in.No mail.No Plan.[root@localhost /etc]#su - rookie[rookie@localhost ~]$ touch hi.rookie (创建hi.rookie) lftp rookie@172.16.250.149:~> ls (主机2)-rw-rw-r-- 1 1001 1001 0 Jun 06 00:53 hi.rookie [root@localhost /var/ftp]#mkdir upload (主机1)[root@localhost /var/ftp]#chown ftp.ftp upload/[root@localhost /etc/vsftpd]#vim vsftpd.conf (上传文件)
[root@localhost /etc/vsftpd]#systemctl restart vsftpd.service
[root@localhost ~]#lftp 172.16.250.149 (主机2)lftp 172.16.250.149:~> lsdrwxr-xr-x 2 0 0 19 Jun 06 02:08 pubdrwxr-xr-x 2 14 50 6 Jun 06 02:23 uploadlftp 172.16.250.149:/> cd upload/lftp 172.16.250.149:/upload> put /etc/issue23 bytes transferred lftp 172.16.250.149:/upload> rm issuerm: Access failed: 550 Permission denied. (issue) (上传的文件无法删除) [root@localhost /etc/vsftpd]#ls /var/ftp/upload/ (主机1)issue
[root@localhost /etc/vsftpd]#vim vsftpd.conf (主机1)(添加创建和删除目录权限)
[root@localhost /etc/vsftpd]#systemctl restart vsftpd.service [root@localhost ~]#lftp 172.16.250.149 (主机2)lftp 172.16.250.149:~> cd upload/lftp 172.16.250.149:/upload> mkdir test (创建test目录)mkdir ok, `test' createdlftp 172.16.250.149:/upload> cd test/lftp 172.16.250.149:/upload/test> put /etc/fstab (将fstab考到test目录下)541 bytes transferredlftp 172.16.250.149:/upload/test> ls (自己不可见)lftp 172.16.250.149:/upload/test> rm fstab (但是可以删除)rm ok, `fstab' removedlftp 172.16.250.149:/upload/test> cd ..lftp 172.16.250.149:/upload> rmdir test (将test目录删除)rmdir ok, `test' removedlftp 172.16.250.149:/upload> rm issue (将issue删除)rm ok, `issue' removed
FTP协议是明文的,因此并不安全[root@localhost ~]#lftp -u rookie 172.16.250.149Password:lftp rookie@172.16.250.149:~> ls lftp rookie@172.16.250.149:~> [root@localhost /etc]#tcpdump -i ens33 -nn -XX tcp port 2122:14:10.133030 IP 172.16.251.163.58862 > 172.16.250.149.21: Flags [P.], seq 21:34, ack 134, win 229, options [nop,nop,TS val 16566583 ecr 8458676], length 130x0000: 000c 29d1 9c19 000c 29e1 d9c5 0800 4500 ..).....).....E.0x0010: 0041 9f1a 4000 4006 4d42 ac10 fba3 ac10 .A..@.@.MB......0x0020: fa95 e5ee 0015 55b9 564e 4985 9628 8018 ......U.VNI..(..0x0030: 00e5 4e8e 0000 0101 080a 00fc c937 0081 ..N..........7..0x0040: 11b4 5553 4552 2072 6f6f 6b69 650d 0a ..USER.rookie..(用户名)22:14:10.135448 IP 172.16.251.163.58862 > 172.16.250.149.21: Flags [P.], seq 34:45, ack 168, win 229, options [nop,nop,TS val 16566585 ecr 8458679], length 110x0000: 000c 29d1 9c19 000c 29e1 d9c5 0800 4500 ..).....).....E.0x0010: 003f 9f1b 4000 4006 4d43 ac10 fba3 ac10 .?..@.@.MC......0x0020: fa95 e5ee 0015 55b9 565b 4985 964a 8018 ......U.V[I..J..0x0030: 00e5 4e8c 0000 0101 080a 00fc c939 0081 ..N..........9..0x0040: 11b7 5041 5353 2071 7765 720d 0a ..PASS.qwer..(密码)
列在此文件中的用户均禁止使用ftp服务
辅助配置文件/etc/vsftpd/ftpusers
[root@localhost /etc/vsftpd]#echo rookie >> ftpusers (主机1)[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#lftp -u rookie 172.16.250.149 (主机2)Password:lftp rookie@172.16.250.149:~> ls ls: Login failed: 530 Login incorrect. (登录失败)
禁锢所有本地用户于其家目录,需要事先去除用户对家目录的写权限
chroot_local_user=YES
禁锢列表中文件存在的用户于其家目录中,需要事先去除用户对家目录的写权限
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost ~]#yum -y install ftp (主机2)[root@localhost ~]#ftp 172.16.250.149Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie (用户名)331 Please specify the password.Password: (密码)230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> pwd257 "/home/rookie" (家目录)ftp> cd /etc/ (切换到/etc下)250 Directory successfully changed. (可成功切换) [root@localhost /etc/vsftpd]#for i in {1..5}; do useradd rookie$i; echo 'qwer' | passwd --stdin rookie$i; done (主机1)更改用户 rookie1 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 rookie2 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 rookie3 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 rookie4 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 rookie5 的密码 。passwd:所有的身份验证令牌已经成功更新。[root@localhost /etc/vsftpd]#chmod a-w /home/rookie1 (去掉写权限)[root@localhost /etc/vsftpd]#chmod a-w /home/rookie2 (去掉写权限)[root@localhost /etc/vsftpd]#vim chroot_listrookie1rookie2
[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#ftp 172.16.250.149 (主机2)Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie1331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> pwd257 "/"ftp> cd /etc/550 Failed to change directory. (无法切换目录)
控制可登录vsftpd服务的用户列表:
userlist_enable=YES
启用/etc/vsftpd/user_list文件来控制可登录用户
userlist_deny=
YES:意味着此为黑名单
NO:白名单
[root@localhost ~]#vim /etc/vsftpd/vsftpd.conf (改为白名单)
[root@localhost /etc/vsftpd]#vim user_list (准许登录的用户)
[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#ftp 172.16.250.149 (主机2)Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie1331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> ls227 Entering Passive Mode (172,16,250,149,60,44).150 Here comes the directory listing.226 Directory send OK. [root@localhost ~]#ftp 172.16.250.149Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie3530 Permission denied.Login failed.ftp> ls530 Please login with USER and PASS.Passive mode refused.
传输日志:
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
守护进程的类型:
standalone:独立守护进程;由服务进程自行监听套按字,并接收用户访问请求
transient:瞬时守护进程;由受托管方代为监听套按字,服务进程没有访问请求时不启动,当托管方收到访问请求时,才启动服务进程
CentOS 6:xinetd独立守护进程, /etc/xinetd.d/
CentOS 7:由systemd代为监听
上传下载速率:
anon_max_rate=0
local_max_rate=0
并发连接数限制:
max_clients=2000
max_per_ip=50
原创文章,作者:Linux.rookie,如若转载,请注明出处:http://www.178linux.com/77685