一、ftp含义
FTP(File Transfer Protocol)文件传输协议,主要目的使得主机之间可以共享文件。监听在tcp的21端口,是一个文件共享服务,主要工作在应用层;FTP使用tcp生成一个虚拟连接用于控制消息,然后再生成一个单独的tcp连接用于数据传输。控制连接(命令连接)使用类似telnet协议在主机间交换命令和消息。ftp客户端可以给服务器端发出命令来下载文件、上传文件、创建或删除服务器上的目录。
二、ftp连接方式
1. 数据连接
数据连接属于按需打开,按需关闭,对于ftp服务器而言,有两种模式;
1.1主动模式:
服务器端主动连接客户端,此时服务器端监听在21/tcp,而对于客户端来讲,监听端口打开一个随机端口(端口号大于1024,在这里,我们称它为x),客户端开始打开监听端口(x+1),同时向服务器端发送一个端口命令,此命令是告诉客户端正在监听的端口号并准备好端口接受数据,服务器端打开20号端口并建立数据端口的连接。
1.2被动模式:
在被动方式中,命令连接和数据连接都是由客户端发起的,客户端打开两个任意的非特权本地端口(n>1024和n+1),第一个端口连接服务器的21端口,但与主动方式的ftp不同,客户端不会提交PORT命令并允许服务器来回连接它的数据端口,而是提交PASV命令。服务器会开启一个任意的非特权端口(P>1024),并发送命令给客户端,然后客户端发起本地端口n+1到服务器的端口的连接用来传送数据。
2.控制连接
控制连接也称为命令连接,监听在20/tcp
三、ftp服务器端服务程序vsftpd
在生产环境中主要会用到服务程序vsftpd,下面我主要对vsftpd程序的文件目录结构做个简单了解

目录
说明
/usr/sbin/vsftpd
vsftpd的主程序
/etc/rc.d/init.d/vsftpd
启动vsftpd的脚本
/etc/vsftpd/vsftpd.conf
主配置文件
/etc/pam.d/vsftpd
PAM认证文件
/var/ftp                  
匿名用户主目录
/var/ftp/pub
匿名用户的下载目录
/etc/vsftpd/ftpusers
禁止使用vsftpd的用户列表文件
/etc/vsftpd/user_list
禁止或允许使用vsftpd的用户列表文件

四、ftp用户分类
匿名用户(anonymous):主要用到的用户是ftp和anonymous用户,但最终映射为一个系统用户,同时也要注意,匿名用户登录ftp服务器时也要写上匿名用户名称
系统用户:也称为本地用户,对于系统用户来说,一般要禁锢在其家目录下
虚拟用户:虚拟用户最终也要映射为一个系统用户登录ftp服务器
五、分析vsftpd的主配置文件
##################定义匿名用户#####################
anonymous_enable={YES|NO}:是否启动匿名用户
anon_upload_enable={YES|NO}:控制是否允许匿名用户上传文件
anon_mkdir_write_enable={YES|NO}:控制是否允许匿名用户创建目录
anon_other_write_enable={YES|NO}:控制是否允许匿名用户可以执行其它操作,比如:删除目录
dirmessage_enable=yes:定义进入匿名用户的家目录下时,是否开启目录显示提示功能
message_file=.message:定义提示信息的文件名,该项只有在dirmessage_enable激活后才可以使用,一般要在匿名用户的家目录下创建一个.message文件,在此文件中定义提示信息内容
说明:为了演示效果,我将选项都设置为YES
##################################################################

以ftp匿名用户名登录ftp服务

  1. [root@ftp ~]# ftp 172.16.52.2  
  2. Connected to 172.16.52.2.  
  3. 220 (vsFTPd 2.0.5)  
  4. 504 Unknown AUTH type.  
  5. 504 Unknown AUTH type.  
  6. KERBEROS_V4 rejected as an authentication type  
  7. Name (172.16.52.2:root): ftp  
  8. 331 Please specify the password.  
  9. Password:  
  10. 230 Login successful.  
  11. Remote system type is UNIX.  
  12. Using binary mode to transfer files.  
创建目录

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议

 上传文件

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_02 

ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_03

删除文件
ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_04
 
  1. #vim /var/ftp/upload/.message    ####在文件中可以自己定义提示信息,这个过程略过 

ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_05

#########################定义系统用户############################
local_enable={YES|NO}:是否启动系统用户
write_enable={YES|NO}:是否定义系统用户上传文件
chroot_list_enable={YES|NO}:是否禁锢指定用户在其家目录下
chroot_list_file=/etc/vsftpd/chroot_list:把禁锢用户写在定义的文件中,这个文件事先不存在,一般这个选项与上一条一起使用
chroot_local_user={YES|NO}:表示是否定义所有用户都被禁锢在家目录下
userlist_enable={YES|NO}:表示是否使用控制用户登录的用户列表,如果用户出现在此列表中,则在登录ftp服务器时被vsftpd禁止使用
userlist_deny={YES|NO}:是否允许此文件中的用户登录ftp服务,当为no时表示仅允许user_list文件中的用户登录
在/etc/vsfptd目录下有个ftpuser文件,定义在此文件中的用户都被禁止登录ftp服务,主要这个文件起作用
在/etc/vsfptd目录下还有个user_list文件,是否允许用户登录ftp可以自己定义,写在这个文件中的用户都不能登录
##################################################################
系统用户上传文件
  1. #useradd luo  
  2. #echo “luo” | passwd –stdin luo  

ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_06

禁锢所有用户都在自己的家目录下
  1. [root@ftp ~]# ftp 172.16.52.2  
  2. Connected to 172.16.52.2.  
  3. 220 (vsFTPd 2.0.5)  
  4. 530 Please login with USER and PASS.  
  5. 530 Please login with USER and PASS.  
  6. KERBEROS_V4 rejected as an authentication type  
  7. Name (172.16.52.2:root): luo  
  8. 331 Please specify the password.  
  9. Password:  
  10. 230 Login successful.  
  11. Remote system type is UNIX.  
  12. Using binary mode to transfer files.  
  13. ftp> pwd  
  14. 257 "/" 
不允许user_list文件中的用户登录ftp服务
  1. 设置userlist_deny=YES,并在/etc/vsftpd/user_list文件中添加系统用户luo      
  2. [root@ftp ~]# ftp 172.16.52.2  
  3. Connected to 172.16.52.2.  
  4. 220 (vsFTPd 2.0.5)  
  5. 530 Please login with USER and PASS.  
  6. 530 Please login with USER and PASS.  
  7. KERBEROS_V4 rejected as an authentication type  
  8. Name (172.16.52.2:root): luo  
  9. 530 Permission denied.  
  10. Login failed.  
允许user_list文件中的用户登录ftp服务
  1. 设置userlist_deny=NO,表示除了user_list文件中的用户都不可以访问ftp服务  
  2. [root@ftp ~]# ftp 172.16.52.2  
  3. Connected to 172.16.52.2.  
  4. 220 (vsFTPd 2.0.5)  
  5. 530 Please login with USER and PASS.  
  6. 530 Please login with USER and PASS.  
  7. KERBEROS_V4 rejected as an authentication type  
  8. Name (172.16.52.2:root): luo       
  9. 331 Please specify the password.  
  10. Password:  
  11. 230 Login successful.  
  12. Remote system type is UNIX.  
  13. Using binary mode to transfer files.  
  14. ###此时的系统用户luo还在user_list文件中,大家可以多设置几个系统用户测试一下  
开启日志功能,使用系统用户上传、下载文件
上传文件到系统用户的家目录下
  1. ftp> lcd /etc  
  2. Local directory now /etc  
  3. ftp> put fstab  
  4. local: fstab remote: fstab  
  5. 227 Entering Passive Mode (172,16,52,2,41,90)  
  6. 150 Ok to send data.  
  7. 226 File receive OK.  
  8. 608 bytes sent in 0.0002 seconds (2.9e+03 Kbytes/s)  
  9. ftp> ls  
  10. 227 Entering Passive Mode (172,16,52,2,151,90)  
  11. 150 Here comes the directory listing.  
  12. -rw-r--r--    1 2531     2531          608 Apr 21 08:04 fstab  
下载文件到/var目录下
  1. ftp> pwd  
  2. 257 "/" 
  3. ftp> lcd /var  
  4. Local directory now /var  
  5. ftp> get fstab  
  6. local: fstab remote: fstab  
  7. 227 Entering Passive Mode (172,16,52,2,74,110)  
  8. 150 Opening BINARY mode data connection for fstab (608 bytes).  
  9. 226 File send OK.  
  10. 608 bytes received in 0.00036 seconds (1.6e+03 Kbytes/s)  
  11. ftp> ls  
  12. 227 Entering Passive Mode (172,16,52,2,57,76)  
  13. 150 Here comes the directory listing.  
  14. -rw-r--r--    1 2531     2531          608 Apr 21 08:04 fstab  
查看上传、下载日志的记录信息

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_07

六、ftps安全通信的实现
1.生成CA私钥
  1. #cd /etc/pki/CA  
  2. CA#(umask 077; openssl genrsa –key private/cakey.pem 2048)  
2.生成CA自签证书

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_08

3.创建文件和目录
  1. CA#mkdir newcerts certs crl  
  2. CA#touch index.txt  
  3. CA#echo 01 > serial  
4.在/etc/vsftpd/目录下创建ssl目录,并在目录下生成密钥
  1. #cd /etc/vsftpd  
  2. vsftpd#mkdir ssl  
  3. vsftpd#cd ssl  
  4. ssl#(umask 077; openssl genrsa -out vsftpd.key 2048)  

5.vsftpd签署申请证书请求,同时在配置文件/etc/pki/tls/openssl.cnf修改指定的目录

  1. #vim /etc/pki/tls/openssl.cnf  
  2. dir             = /etc/pki/CA  

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_09

6.CA机构为vsftpd服务签署请求的证书

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_10

7.在vsftpd配置文件中添加内容

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_11

8.测试非认证用户

ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_12

还可以使用openssl模拟客户端连接ftp服务器

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_13

9.安装客户端软件

我这里使用的是FlashFXP.zip压缩包,大家可以下载一下

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_14

ftp文件传输协议的匿名用户、系统用户的实现详解过程_ftp文件传输协议_15

ftp文件传输协议的匿名用户、系统用户的实现详解过程_linux_16

关于ftp服务器的这几个操作是很常用的,也是在生产环境中非常重要的操作,所谓小小的操作,会制造出大大的效果;如果在这次演示中有什么不太完整的地方,希望好朋友们提出来,这也算是一种进步吧!