您的位置:首页 > 编程语言 > PHP开发

FTP

2017-08-28 11:15 54 查看
图片更清晰,文字在最下面




FTP是TCP/IP的一种应用,使用TCP而不是UDP,所以是可靠的,面向连接的。

FTP全称文件传输协议,可以传输ASCII文件或二进制文件。

使用C-S方式。

端口需要两个:一个21用来控制连接,一个其他端口传输数据。

连接模式有两种,根据数据端口的设置方式不同划分。

**基本概念

**

FTP是TCP/IP的一种具体应用,它工作在应用层,使用***TCP*传输而不是**UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,它的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。

匿名FTP是这样一种机制,用户可通过它连接到远程主机上,并从其下载文件,而无需成为其注册用户。系统管理员建立了一个特殊的用户ID,名为anonymous,Internet上的任何人在任何地方都可使用该用户ID。当远程主机提供匿名FTP服务时,会指定某些目录向公众开放,允许匿名存放,系统中的其余目录则处于隐匿状态。

**工作原理

**

FTP的全称为“File Transfer Protocol”(文件传输协议),用于在Internet或Intranet的两台主机之间传输文件。利用FTP可以传输文本文件和二进制文件。

要使用FTP在两台计算机之间传输文件,两台计算机必须各自扮演不同的角色,即一台计算机必须是FTP客户端,而另一台则必须是FTP服务器。客户端与服务器端的区别在于计算机所安装软件的不同,安装FTP服务器软件的计算机为FTP服务器,安装FTP客户端软件(如:浏览器、CuteFTP)的计算机则为客户端。

**特点

**

FTP 使用客户服务器方式。一个FTP 服务器进程可同时为多个客户进程提供服务。FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。

FTP并不像HTTP协议那样,只需要一个端口作为连接(HTTP的默认端口是80)。FTP需要2个端口,一个端口是作为控制连接端口,也就是21这个端口,用于发送指令给服务器以及等待服务器响应;另一个端口是数据传输端口,端口号为20(仅PORT模式),是用来建立数据传输通道的

FTP**的连接模式**

**

FTP使用两个端口来建立这两种连接,一个是数据端口,一个是控制端口。控制端口一般为21,而数据端口不一定是20,这和FTP的连接模式有关。FTP的连接模式有两种,PORT和PASV。

PORT方式(主动模式)的连接过程是:客户机先用随机X端口与FTP服务器的21号端口建立连接,这是一条命令链路。在数据传输时客户端从与21号端口建立的连接中发送一个PORT命令要求建立主动式连接,并通知服务器自己的某个随机端口(如M)已经准备好了,接下来服务器从20端口向客户机的M端口发出连接请求。这种服务器主动发出连接请求的模式称为主动模式。

PASV方式(被动模式)的连接过程是:客户机先用随机
4000
X端口与FTP服务器的21号端口发送连接请求,服务器接受连接,建立一条命令链路。在数据传输时客户端从与21号端口建立的连接中发送一个PORT命令要求建立被动式连接,服务器选择一个随机端口N,并利用上一个连接通道通知客户机自己开放了N端口。客户机从随机M端口向服务器的N端口发出连接请求。这种客户机主动发出连接请求,服务器被动接受连接的模式称为被动模式。

若采用主动模式,就是FTP软件请求服务器来连它,使用的数据端口是20;若采用被动模式,如同是服务器告诉FTP软件“你来连接我” ,端口号由服务器端和客户端协商而定。(注意:有防火墙用户不能使用主动模式,这是因为防火墙不允许来自网外的主动连接,所以用户必须同使用被动模式。)几乎所有的FTP客户端软件都支持这两种方式。而IE默认采用的是PORT方式,要在IE里启用PASV方式,请打开IE,在菜单里选择:工具->Internet选项->高级,在“使用被动ftp”前面打上勾。

Linux**下的*FTP*服务器 **

**

目前,在Linux环境下常用的FTP服务器有3个,分别是:Wu-ftpd、ProFTPD和vsftpd。这几个FTP服务器都是基于GPL(General Public License)协议开发的。

**Wu-ftp

**

Wu-ftp(Washington University FTP)是一个著名的FTP服务器软件,它功能强大,适于吞吐量较大的FTP服务器的管理要求,能够很好地运行于众多的UNIX操作系统,例如:IBM AIX、FreeBSD、HP-UX、NeXTstep、Dynix、SunOS、Solaris等。Wu-ftp特点如下:

可以在用户下载文件的同时对文件做自动的压缩或解压缩操作。

可以对不同网络上的机器做不同的存取限制。

可以记录文件上载和下载时间。

可以显示传输时的相关信息,方便用户及时了解目前的传输动态。

可以设置最大连接数,提高了效率,有效地控制了负载。

**ProFTP

**

ProFTPD不是从其它FTP Server的既有原始码修改而产生的,它是完全独立而完整、重新改写的FTP

Server。ProFTP的主要特点如下:

单一主设置文件,其设置和Apache有类似之处,容易配置。

每个目录都可以定义一个“.ftpaccess”设置文件,就如同Apache的“.htaccess”文件一样可以设定该目录的存取权限。

可设定多个虚拟FTP server,而匿名FTP服务更是十分容易。

可根据系统的负载(load)选择以单独运作(stand-alone)方式或是由inetd启动。

匿名FTP的根目录不需要特定的目录结构、系统二进制执行文件或其它系统文件。

ProFTPD不执行任何外部程序以免造成安全漏洞。

具有隐藏目录或隐藏文件,源自于Unix形式的档案权限,或是user/group类型的档案权限设定。

能够以一般使用者在单独运作(stand-alone)模式下执行,以减少某些借由攻击方式取得root权的可能性。

强大的log功能,支持utmp/wtmp及wu-ftpd格式的记录标准,并支持扩展功能的记录。

**vsftpd

**

vsftpd

的名字代表“very secure FTP daemon”,

安全是它的开发者 Chris Evans 考虑的首要问题之一。

是一个安全、高速、稳定的FTP服务器。

支持带宽限制。

可以基于多个IP搭建虚拟FTP服务器。

方便匿名服务设置,支持虚拟用户,每个虚拟用户可以具有独立的属性配置。

支持PAP和/xinetd/tcp_wrappers两种认证方式。

不执行任何外部程序,减少了安全隐患

FTP**服务器的安装与启动**

**

$rpm –ivh

vsftpd-2.2.2-1.el6.i686.rpm

//vsftp服务器软件

$rpm -ivh ftp-0.17-51.1.el6.i686.rpm //ftp客户端命令

也可以使用yum命令在线安装,安装命令如下:

$

yum install vsftpd –y //安装服务器端软件

$

yum install ftp –y //安装ftp命令

设置vsftp服务开机启动:$ chkconfig vsftpd on

安装完毕后,使用下面的命令来进行FTP服务器的启动、停止和重启:

$service

vsftpd start //启动;

$service

vsftpd stop //停止;

$service

vsftpd restart //重启

使用下面的命令检查vsftpd服务的状态以及vsftpd是否被启动:

servicevsftpdstatus或pstree|grep

vsftpd

vsftpd**服务器的配置文件 **

**

vsFTP服务器的主要配置文件是/etc/vsftpd/vsftpd.conf。配置文件提供大量的参数设置以对服务器的运行模式、性能、安全属性、登录用户等具体配置。vsFTP有两种运行模式:一种是独立(standalone)运行模式;一种是xinetd(eXtended Internet Services Daemon,扩展的Internet服务守护进程)模式。

xinetd模式通过super daemon监听端口,当客户端有FTP连接请求时,首先会将连接传至super daemon,然后启动相应的vsftp服务进程。vsFTPD将用户分为三类:匿名用户(anonymous user)、本地用户(local user)以及虚拟用户(guest)。

(1)服务器设置

listen=YES

//使用standalone而不是xinetd模式启动vsftpd

pam_service_name=vsftpd //服务器的验证方式

设置服务器的port工作模式

port_enable=YES //若启用此选项(默认启用),表示允许使用PORT模式数据传输。

connect_from_port_20=YES //设置FTP数据端口的数据连接,控制以PORT模式进行数据传输时是否使用20端口。

listen_port=2121 //从2121端口进行数据连接

服务器的pasv工作模式

pasv_enable=yes|no

//是否将服务器设定为被动模式。

pasv_min_port=50000 //将服务器被动模式最小端口设在50000

pasv_max_port=50010 //将服务器被动模式最大端口改在50010

数据的传输模式

ascii_upload_enable=

YES|NO //允许使用ASCII模式上传文件,默认不允许。

ascii_download_enable=YES|NO

//控制是否允许使用ASCII模式下载文件。

性能与负载控制:

max_clients=200 //FTP的最大连接数

max_per_ip=4 //每IP的最大连接数

Idle_session_timeout=600 //用户会话空闲后的端口时间,单位秒,即10分钟断开

data_connection_timeout=120 //将数据连接空闲120秒,即2分钟后断开

accept_timeout=60 //被动模式时,客户端空闲1分钟后将断开

connect_timeout=60 //中断1分钟后又重新连接

local_max_rate=50000 //本地用户传输率50Kpbs

anon_max_rate=30000 //匿名用户传输率30Kbps

服务器的欢迎信息设置

dirmessage_enable=YES //是否定制欢迎信息,也就是我们登入有些FTP之后,会出现的一些信息,如:欢迎您来到LinuxSir FTP等提示。

message_file=.message

//定制.message文件作为登录后的显示信息。

服务器的日志设置

xferlog_enable=YES //激活上传和下传的日志

xferlog_std_format=YES //使用标准的日志格式

文件操作设置

hide_ids=YES|NO

//是否隐藏文件的所有者和组信息。

ls_recurse_enable=

YES|NO //是否可以使用ls –R命令。默认为no。

用户登录设置

pam_service_name=vsftpd //指出vsFTPD进行PAM(Pluggable

Authentication Modules)认证时所使用的PAM配置文件名,默认值是是/etc/pam.d/vsftpd。

userlist_enable=YES|NO //是否开启userlist来限制用户访问的功能,如果想限制某些账户不能登录,可以创建个名为user_list

的文件,将用户添加进去。

userlist_file=/etc/vsftpd/user_list //指出userlist_enable选项生效后,被读取的包含用户列表的文件。默认值是/etc/vsftpd/user_list。

userlist_deny=YES|NO

此选项在userlist_enable 选项启动后才生效。

(2)针对匿名用户的设置

anonymous_enable=yes //允许匿名用户登录

no_anon_password=no //匿名登录时是否需要输入密码,默认为NO

anon_world_readable_only=YES|NO

//控制是否只允许匿名用户下载可阅读文档。

anon_upload_enable=YES|NO

//控制是否允许匿名用户上传文件

write_enable=yes //赋写权限

anon_mkdir_write_enable=yes //允许匿名用户新建文件夹

anon_umask=022 //设定匿名用户的权限掩码

anon_other_write_enable=YES|NO

//控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等。默认值为NO。

chown_uploads=YES|NO //是否修改匿名用户所上传文件的所有权

chown_username=whoever

//指定拥有匿名用户上传文件所有权的用户。

anon_root=

//设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。

ftp_username=

//匿名用户所使用的系统用户名。主配置文件中默认无此项,默认ftp。

no_anon_password=YES|NO

//若值为YES,表示匿名用户登录时,vsFTP服务器不会要求用户输入密码。默认值为NO。

deny_email_enable=YES|NO

//此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户。

banned_email_file=/etc/vsftpd/banned_emails

//指定包含被拒绝的e-mail地址清单的文件,默认文件为/etc/vsftpd/banned_emails。

(3)本地用户设置

在使用FTP服务的用户中,除了匿名用户外,还有一类在FTP服务器所属主机上拥有账号的用户。vsFTP中称此类用户为本地用户(local users),等同于其他FTP服务器中的real用户。

local_enable=yes //本地帐户能够登陆

local_root=

//设定本地用户的FTP根目录,默认是其家目录

write_enable=no //是否具有写权限,如果为yes则允许删除和修改文件

local_umask=022 //设置本地用户的文件的掩码是022,默认值是077

(4)虚拟用户设置

pam_service_name= //服务器的验证方式,在虚拟用户中应添加相关的pam认证配置

guest_enable=YES|NO //默认不启用。若启用这项功能,所有的不以匿名登录的用户,都视为“guest”类型,而此类用户的实际权限就是“guest_username”选项中所指定的帐号。

guest_username=ftp //定义vsFTPD的guest用户登录时在系统中的帐号名称,默认为ftp。

user_config_dir=/etc/vsftpd/userconf //定义用户配置文件的目录

virtual_use_local_privs= YES|NO //$当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数

(5)SSL安全设置

ssl_enable=yes //打开SSL支持

allow_anon_ssl=yes //允许匿名用户使用SSL连接

force_local_data_ssl=yes //非匿名用户强制使用SSL连接,用于数据收发

force_local_logins_ssl=yes //对非匿名用户强制使用SSL连接,用于密码传送

ssl_tlsv1=yes //对SSL版本1支持,

ssl_sslv2=no //不支持SSL版本2

ssl_sslv3=no //不支持SSL版本3

rsa_cert_file=/etc/vsftpd/vsftpd.pem //rsa_cert_file指定安全证书的位置和文件名

**关于匿名上传下载的实现

**

任务说明:在开启防火墙和SElinux情况下,实现匿名用户的登录,可以上传下载,可以创建目录,创建权限掩码为022,可以删除文件,最大上传速度100KB/S

(1)首先是服务器端设置

第一步:修改配置文件开放匿名用户上传、下载及其他权限,请添加以下几项

$ vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

anon_upload_enable=yes

write_enable=YES

anon_mkdir_write_enable=yes

anon_other_write_enable=yes

anon_umask=022

anon_max_rate=102400 //再添加一句no_anon_password=no 这样就不用输入密码了

修改完毕后使用$service vsftpd restart重启服务。

第二步:修改上传目录的权限

查看ftp这个用户的登陆目录,$cat /etc/passwd|grep ftp //通过查看/etc/passwd这个文件中ftp用户相关的行。结果显示ftp的登录目录是/var/ftp。下面开放此目录的写权限:

$chmod 777 /var/ftp

重启服务,并在服务器上用ftp登录时,出现了以下的错误提示

[图片上传中。。。(1)]

这是因为/var/ftp的权限不对所致,这个目录的权限是不能打开所有权限的。需要在/var/ftp下再建一个目录,权限是777的就行了,注意不要直接修改/var/ftp的写权限。

$mkdir /var/ftp/pub

$chmod

777 /var/ftp/pub //这个文件夹的权限为777,而/var/ftp的权限为755 不要搞错

第三步:开启防火墙和SElinux

$ iptables -I INPUT -p tcp –dport 21 -j

ACCEPT

$ setsebool allow_ftpd_anon_write on

$ setsebool allow_ftpd_full_access on

(2)在客户机上验证:

$ ftp 192.168.0.60

[图片上传中。。。(2)]

**关于添加本地用户及打开读写权限示例

**

实现本地用户登录ftp时,位于自己的主目录

local_enable=YES //开启本地用户(真实用户)的登录功能

write_enable=YES //开启本地用户的上传功能

chroot_local_user=YES //将所有登录用户限制在自己的主目录

(1)限制用户在家目录

如果想限制部分用户,则使用chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list //位于/etc/vsftpd/chroot_list该文件的用户不能浏览主目录之外的目录

情况一:如果要将用户锁定在主目录,不允许切换到其他目录,但是除了指定的用户ftp1、ftp2以外。修改vsftpd.conf中的参数设置:

chroot_local_user=YES 并且 chroot_list_enable=YES

修改/etc/vsftpd/chroot_list列表名单如下:

ftp1

ftp2

也就说chroot_list名单里面添加的是要排除被锁定主目录的用户名单.

情况二:如果只禁止指定用户ftp1 跟ftp2切换到其他目录,允许其他用户切换到其他目录。修改vsftpd.conf中的参数设置:

chroot_local_user=NO 并且 chroot_list_enable=YES

修改/etc/vsftpd/chroot_list列表名单如下:

ftp1

ftp2

情况三:如果chroot_local_user=YES 并且 chroot_list_enable=NO 的时候,那列表名单也就不生效了。因此满足上面的条件时, 所有的FTP用户将全部锁定在主目录。

(2)限制部分本地用户登录ftp

情况一:禁止指定用户,如ftp1、ftp2登陆ftp,这时可以使用/etc/ftpusers文件或是管理员添加一个文件,此文件记录了所有不能登录ftp服务器的用户列表,俗称黑名单

修改vsftpd.conf如下:

pam_service_name=vsftpd //指出vsFTPD进行PAM(Pluggable

Authentication Modules)认证时所使用的PAM配置文件名,默认值是是/etc/pam.d/vsftpd。

userlist_enable=YES

//开启userlist来限制用户访问的功能

userlist_file=/etc/vsftpd/user_list //禁止登陆的用户列表文件

修改/etc/vsftpd/user_list为

ftp1

ftp2

情况二:只允许指定用户,如ftp1、ftp2登陆ftp

只需要在情况1的基础上,添加下面的选项:

userlist_deny= NO

**配置虚拟用户

**

vsftpd可以创建虚拟用户,使得其只能访问FTP服务器的资源。

vsftpd使用PAM验证虚拟用户,验证时VSFTPD使用一个系统用户(guest用户)来对虚拟用户进行验证。

VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而 VSFTPD的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合的。

对于虚拟用户的认证,VSFTPD采用PAM方式验证虚拟用户。由于虚拟用户的用户名/口令被单独保存,因此在验证 时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。

总之,对于虚拟用户的配置,要包括以下几部分:guest用户的创建、虚拟用户/口令的保存、PAM认证配置、vsftpd.conf文件设置等

配置要求:实现虚拟用户user1和user2登录,映射到vusers用户,并且user2 能够上传下载文件,创建目录,删除文件目录,而user1只能下载没有其它权限。

(1)创建本地账户vusers作为虚拟用户映射的帐号,它是虚拟用户在系统中的代表

$ useradd -d /etc/vsftpd/vusers -s /sbin/nologin

vusers

$ chmod 755 –R /etc/vsftpd/vusers //如果其他用户没有赋予rx的权限,登录后会出现无法查看目录的情况

(2)生成虚拟用户列表,将user1、user2加入到列表中

$ cd /etc/vsftpd/

$ vim vusers.list

user1

123456

user2

321456

说明:vusers.list文件中的奇数行为用户名,偶数行为上一行用户的密码。

(3)将虚拟用户列表导出为BDB数据库

$ db_load -T -t hash -f vusers.list vusers.db //创建虚拟用户需要db4-utils工具的支持,在rhel6中已经默认安装,rhel5默认没有安装。其中-T表示允许BerkeyDB的应用程序使用文本格式转换成DB数据文件;-t hash用来指定读取数据文件的基本方法;-f:指定要导出的用户密码文件

$ file vusers.db

vusers.db: Berkeley DB (Hash, version 8, native byte-order)

$ chmod 600 vusers.db

//为了安全性,只赋予管理员读取和修改这个数据库的权限

4)创建虚拟用户的身份验证模块-vsftpd.vu

$ cd /etc/pam.d

$ vim vsftpd.vu

$%PAM-1.0

auth

required pam_userdb.so db=/etc/vsftpd/vusers

account

required pam_userdb.so db=/etc/vsftpd/vusers

说明:其中第一行是身份必须经过pam_userdb.so模块用/etc/vsftpd/vusers的验证,第二行是帐户必须经过pam_userdb.so模块用/etc/vsftpd/vusers的验证

(5)修改vsftpd.conf配置文件

$ vim /etc/vsftpd/vsftpd.conf

anonymous_enable=no

local_enable=YES

write_enable=YES

local_umask=022

guest_enable=yes

guest_username=vusers

pam_service_name=vsftpd.vu //这是现在的pam验证配置文件

user_config_dir=/etc/vsftpd/vusers_conf

注意:要将原本的pam_service_name=vsftpd修改成vsftpd.vu,另外虚拟用户本质上是映射到本地用户身上的,所以本地用户一定要能登录local_enable=yes,同时其他控制虚拟用户权限的配置项借用了匿名用户的配置项。

(6)为user1和user2分别创建控制文件

$ mkdir /etc/vsftpd/vusers_conf

$ cd etc/vsftpd/vusers_conf

$ vim user1

anon_upload_enable=no

anon_mkdir_write_enable=no

anon_other_write_enable=no

$ vim user2

anon_upload_enable=yes

anon_mkdir_write_enable=yes

anon_other_write_enable=yes

anon_umask=022

注意:因为虚拟用户权限的配置项是借用了匿名用户的配置项,所以控制上传、创建、删除等权限的配置项都要写anon_*。

(7)调整SElinux和防火墙

$ setsebool ftp_home_dir on //允许改变ftp目录,否则会在登录时报500 OOPS: cannot change

directory:/vusers

$ setsebool allow_ftpd_full_access on //开发所有权限,否则会在上传文件时报553 Could not create

file.

$ iptables -I INPUT -p tcp –dport 21 -j ACCEPT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 文件传输