ftp详解

来源:互联网 发布:illustrator软件下载 编辑:程序博客网 时间:2024/06/05 17:09

                                 FTP

一、原理介绍

FTP(File Transfer Protocol,文本传输协议),可以在网络中传输文档、图像、音频、视频、以及应用程序等多种类型文件。一个完整的FTP文件传输需要建立两种类型的连接,一种是控制文件传输的命令,称为控制连接,另一种是实现真正的文件传输,称为数据连接。

控制连接:

客户端需要与FTP服务器建立上传下载的数据传输时,它首先向服务器TCP协议21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接建立过程。

数据连接:

FTP控制连接建立之后开始传输文件,传输文件的连接称为FTP数据连接,FTP数据连接就是FTP数据传输的过程。

 

FTP数据传输原理:

(1)FTP服务器会自动对默认端口21进行监听,当某个客户端向这个端口请求建立连接时,便激活了FTP服务器上的控制进程,通过这个控制进程对连接的用户名、密码以及连接权限等进行身份验证。

(2)FTP服务器完成对连接的身份验证之后,就会和客户端建立一条数据传输的专有连接。

(3)FTP服务器的控制进程在数据传输过程中一直工作,并不断发出指令控制整个FTP数据传输,数据传输完毕后控制进程给客户端发送结束指令。

 

二、FTP部署

实验环境:

系统:redhat6.5

软件:vsftpd-2.2.2-11.el6_4.1.x86_64

FTP服务器:192.168.122.17

端口:21

selinux :  Disabled

iptables: 关闭

(1)允许匿名用户上传、下载、创建目录、删除目录

 

man 5 vsftpd.conf                          #查看vsftpd的所有配置选项

anon_umask=077(默认)

anon_other_write_enable=NO(默认)          

#设置为YES时,允许匿名用户的写操作,例如删除目录和重命名等,但除了上传和创建目录。

anon_mkdir_write_enable=NO(默认)

#如果要设置为YES,允许匿名用户新建目录,首先设置write_enable=YES,并且父目录对于匿名用户可写

anon_upload_enable=NO(默认)

#如果要设置为YES,允许匿名用户上传,首先设置write_enable=YES,并且匿名用户在所在目录有写权限,这一设定对虚拟用户也有效。

anon_root=/XXX/XXX          #设置匿名用户的根目录,配置文件中没有需要自行添加

创建目录:

mkdir /mnt/ftp/pub/upload -p   #一般情况下目录权限如下

drwxr-xr-x 2 root root 4096 Mar  5 08:37 /mnt/ftp/pub/

drwxr-xr-x 2 root root 4096 Mar  5 08:38 /mnt/ftp/pub/upload   #作为上传目录

 

chown ftp.ftp /mnt/ftp/pub/ -R        #目录一定要有写权限,才能新建目录和上传文件

 

#默认配置的vsftpd服务允许匿名用户以ftp用户身份登陆FTP服务器,允许匿名用户下载,但不能新建目录、删除目录、上传文件。默认匿名用户的根目录在/var/ftp/下,并且匿名用户被锁定在自己的根目录下。

 

vim /etc/vsftpd/vsftpd.conf                #编辑vsftpd的配置文件

 

anonymous_enable=YES                  #允许匿名用户登陆

anon_root=/mnt/ftp/                       #设置匿名用户的根目录

anon_umask=022       #设置匿名用户的umask值,会受到chown_upload选项影响

write_enable=YES                         #允许用户有写入权限

anon_upload_enable=YES                 #允许匿名用户上传

anon_mkdir_write_enable=YES            #允许匿名用户新建目录

anon_other_write_enable=YES            

#允许匿名用户删除目录、删除文件、重命名等权限,配置选项为NO时,配置文件生效后,客户端退出,再次连接服务端才能看到效果。

 

xferlog_enable=YES                   #设置使用传输日志记录详细的下载和上传信息

xferlog_file=/var/log/xferlog           #设置传输日志的路径和文件名

connect_from_port_20=YES             

xferlog_std_format=YES               #设置传输日志文件使用xferlog格式

 

listen=YES                            #IPv4的环境中启用独立控制进程vsftpd

listen_address=192.168.122.17       #设置vsftpd服务监听的IP地址

tcp_wrappers=YES

max_clients=100                     #设置允许连接的客户端的最大值,0表示不限制

anon_max_rate=500000              #设置匿名用户传输数据最大速度,0表示不限制         

local_max_rate=5000000             #设置本地用户传输数据最大速度,0表示不限制

 

/etc/init.d/vsftpd restart                #重新加载vsftpd服务

 

cat /var/log/xferlog                     #可查看传输日志

 

 

 

Linux客户端测试:

yum install -y lftp  #lftp综合型文件传输工具,支持ftpftpshttphttpshftpfish

连接方式:

lftp IP地址或域名                            #匿名用户身份建立连接

lftp IP地址或域名 -u 用户名,密码              #账户、密码方式建立连接

 

FTP协议消息号:

331 :用户名正确,提示输入密码

230 :登陆成功

500 :语法错误,命令不可识别

530 :未登录,登录账号或密码错误

550 :权限问题,针对目录

553 :权限问题,针对文件

 

(2)限制用户目录、限制用户登录、使用非标准端口

vsftpd默认使用21端口建立控制连接,现在改为2017端口

 

echo user_ftp > /etc/vsftpd/chroot_list       #限制user_ftp只能在自己的主目录中

useradd user_ftp               #创建一个本地用户

passwd user_ftp                #给创建的本地用户一个密码

vim /etc/vsftpd/vsftpd.conf     #编辑vsftpd配置文件,如下

 

anonymous_enable=YES

local_root=/home                   #设置本地用户的根目录

local_enable=YES                   #允许本地用户登录

write_enable=YES                   #允许用户有写入权限

local_umask=022

 

connect_from_port_20=YES           

 

chroot_local_user=NO        #设置不将本地用户锁定在自己的主目录中,不建议这么做

chroot_list_enable=YES             #设置chroot_list_file选项生效

chroot_list_file=/etc/vsftpd/chroot_list   

#/etc/vsftpd/chroot_list中的用户被限制在主目录,可以理解为黑名单

#如果chroot_local_user=YES,则是白名单,则/etc/vsftpd/chroot_list中的用户可以离开主目录。

listen=YES

listen_address=192.168.122.17

listen_port=2017                      #将连接端口改为2017

pam_service_name=vsftpd

userlist_deny=NO               

#userlist_deny设置为NO时,可以将/mnt/ftp_allow理解为白名单,但/etc/vsftpd/ftpusers中的用户设置在白名单中也没用,除非将这个用户从/etc/vsftpd/ftpusers中删除。

#userlist_deny设置为YES时,可以将/mnt/ftp_allow理解为黑名单

 

userlist_enable=YES            #允许/mnt/ftp_allow文件中的用户登录vsftpd服务器

userlist_file=/mnt/ftp_allow     #userlist_enable激活时加载的文件名

 

tcp_wrappers=YES

 

/etc/vsftpd/vsftpd.conf restart     #重启vsftpd服务

 

(3)虚拟用户

匿名用户可以很好地保证vsftpd服务器的安全性,但是对匿名用户的权限管理不够灵活,但本地用户对于Linux系统来说是一个安全隐患。这时使用虚拟用户就很方便了,它可以在赋予FTP用户权限的前提下保证vsftpd服务乃至整个Linux系统的安全。

实现机制:

当用户连接上vsftpd服务器后,会被要求输入用户名和密码,vsftpd服务器拿到用户名和密码后,会调用相应的PAM认证模块对系统的FTP认证文件进行比较。如果拿到的用户名和密码与FTP认证文件中的某条记录相符就通过认证,该用户就被映射为Linux下的本地账户,然后以本地用户身份对FTP资源进行访问。

 

注:/lib64/security/pam_userdb.soPAM的认证模块

创建FTP认证文件

cd /etc/vsftpd/

vim /etc/vsftpd/virtual      #编辑如下,一行虚拟用户名,一行密码,用户名第一行开始

work

123456

study

abcd

 

db_load -T -t hash -f /etc/vsftpd/virtual /etc/vsftpd/virtual.db   #生成口令库文件

chmod 600 virtual.db

 

vim /etc/pam.d/pamftp       #编辑PAM配置文件

auth    required     /lib64/security/pam_userdb.so     db=/etc/vsftpd/virtual

account required     /lib64/security/pam_userdb.so     db=/etc/vsftpd/virtual

 

创建目录:

mkdir /mnt/ftpusers/work -p                  #创建work虚拟用户的家目录

mkdir /mnt/ftpusers/study -p

 

mkdir /mnt/ftpusers/work/upload             #work虚拟用户创建一个上传目录

chown ftp.ftp /mnt/ftpusers/work/upload        #给上传文件的目录写权限

mkdir /mnt/ftpusers/study/upload

chown ftp.ftp /mnt/ftpusers/study/upload      

 

mkdir /mnt/ftpconf      #虚拟用户各自的配置文件存放目录,优先权高于全局配置文件

 

vim /mnt/ftpconf/work      #编辑work虚拟用户的权限如下

anon_upload_enable=YES

anon_other_write_enable=YES

anon_umask=022

 

vim /mnt/ftpconf/study      #编辑study虚拟用户的权限如下

anon_upload_enable=YES

anon_umask=022

 

vim /etc/vsftpd/vsftpd.conf     #编辑vsftpd服务配置文件

 

anonymous_enable=YES

local_enable=YES

write_enable=YES

 

listen_address=192.168.122.17

listen_port=2017

pam_service_name=pamftp

guest_enable=YES                       #设置启用虚拟用户

guest_username=ftp                     #设置虚拟用户在系统中的真实用户名

local_root=/mnt/ftpusers/$USER          #设置本地用户主目录

user_sub_token=$USER   

user_config_dir=/mnt/ftpconf             #各个虚拟用户配置文件保存目录        

#需要在这个目录下建一个与虚拟用户名相同的文件,这个配置文件中设置的权限优先级高于全局配置文件。但不影响listen_addressmax_clients

tcp_wrappers=YES

 

/etc/init.d/vsftpd restart            #重启vsftpd服务

 

附:主动模式和被动模式原理图

以下内容来源http://limssb.blog.163.com/blog/static/14730437201312582915941/

 

主动模式:

在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送PORT命令,告诉服务器,客户端采用主动模式和开放的传输数据端口号。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的传输数据端口连接,最后客户端在第4步中给服务器端返回一个"ACK"。详细原理见下图:

主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

                                  主动模式原理图

 

 

 

被动模式:

 

在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。详细原理见下图:

                              被动模式原理图

 

主动模式和被动模式的优缺点:

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

 

既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞FTP服务器的数据端口范围限制可以用pasv_min_port和pasv_max_port这两个选项来配置。