概述:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

FTP(File Transfer Protocol)文件传输协议,它能够在两个系统(可以是异构系统)之间传输文件,是比较古老的协议之一,客户端可以随时随地访问装有FTP服务的主机,它也是一种标准的C/S(客户端/服务器)模式,有自己的标准文件处理命令,唯一不同的是服务端工作时需开启两个进程(两个端口),标准数据控制端口为TCP协议的21口,而数据传输端口为TCP协议的20口。互联网上存在各种各样的工作平台,为使各平台能互相传输文件,就需要共同遵守一个约定,它就是协议,用于文件传输的协议叫"文件传输协议",由于这样的协议的存在,各平台之间就能相互传送文件,从本地传送文件到远程计算机上叫上传,从远程计算机上把文件传输到本地计算机叫下载,用户操作文件上传或下载之前必須登录远程计算机(服务器),也就是说必须授权后才能对服务器进行操作。那为什么很多FTP服务只要输入地址后就能上传或下载文件了呢?我没有登录也能下载文件啊?没错,互联网上有很多这样的服务器,它并不是不需要登录,而是默认连接的时候就用某个用户登录服务器,当然权限也受某个用户权限约束,一般情况下这个用户叫匿名用户(anonymous) ,多数时候匿名用户是不开放上传权限,只能下载指定的文件,它是发布共享软件的好方法。习惯上我们把这个匿名用户的密码写成自己的邮件地址(不写也行)

作用:

实现远程文件传输功能,跨平台工作而不受平台之间的差异约束,有自己一套标准处理命令结构

FTP文件的传输方式:ASCII传输模式和二进制数据传输模式。

1ASCII传输方式:传输ASCII字符组成的文件,由回车和换行符分开,主要用来传输文件文件

2、二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的,主要用来传输可执行文件、压宿文件等,它也可以传输ASCII字符

FTP的工作方式

一种方式叫做PORT(主动)方式

Port模式的客户端首先和FTP服务器的TCP 21端口建立控制连接,并通过此连接通道发送控制命令,当有数据传输时客户端通知服务器自己用什么端口(通常大于1024)接收数据,服务器收到命令后通过自己的TCP 20端口主动连接客户端的指定端口,简单地说就是服务器主动来连接客户端

一种方式叫做PASV(被动)方式

PASV建立控制连接的时候和Port模式类似,当控制连接发送控制命令时,会在服务器打开一个端口(通常大于1024)并通知客户端自己用此端口来传输数据,客户端连接FTP服务器的指定端口,然后就通过此端口传输数据,简单地说就是服务器被动等待客户端连接自己

很多位于防火墙后面的服务器都不支持PASV,因为客户端无法打开防火墙面的FTP服务器的端口,也有很多内网用户不能用PORT模式登录FTP服务器,因为FTP服务器的20端口无法通过防火墙与内部用户建立连接

FTP常用命令:

1FTP服务器的登陆

ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名

2、显示文件信息:ls/dir

3、下载文件:get 文件名 (下载到当前目录)

4、上传文件:put 文件名 (上传到当前目录)

5、多文件下载:mget

6、多文件上传:mput

7、退出:bye

8、帮助:help

原理:

安装FTP:

因为在LinuxVSFTP(very secure FTP daemon")非常安全文件传输,它本身目标定位在非常安全的基础上,同时具备高速与高性能特点,它的特色如下:

# Virtual users //支持虚拟用户

# Standalone or inetd operation //支持两种方式操作

# Powerful per-user configurability  //强大的单用户配置性

# Bandwidth throttling //宽带节流

# Per-source-IP configurability //单个源IP配置

# Per-source-IP limits //单个源IP限制

# IPv6 //支持IPv6

# Encryption support through SSL integration //支持SSL加密

# etc...

我们就选择VSFTP作为FTP服务器

首先挂载光盘:

mount -t iso9660 /dev/cdrom /mnt/cdrom

mount用法:

格式:mount [-参数] [设备名称] [挂载点]

其中常用的参数有:

-a 安装在/etc/fstab文件中类出的所有文件系统

-n 不把安装记录在/etc/mtab 文件中

-r 把文件系统安装为只读

-v 详细显示安装信息

-w 将文件系统安装为可写

ro 以只读方式挂载

rw 以读写方式挂载

remount 重新安装已经安装了的文件系统

-t <文件系统类型> 指定设备的文件系统类型,常见的有:

ext2  linux目前常用的文件系统

msdos   MS-DOSfat,就是fat16

vfat   windows98常用的fat32

nfs   网络文件系统

iso9660   CD-ROM光盘标准文件系统

ntfs   windows NT/2000/XP的文件系统

auto 自动检测文件系统

安装VSFTP:

如果以前有安装过VSFTP就不用再装了,如果是用rpm的方式安装的话,可以用如下方式删除再安装:

rpm -qa|grep vsftpd    //确定是否有安装过vsftpd

rpm -e vsftpd      //删除VSFTP

rpm -ivh /mnt/cdrom/Server/vsftpd-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.0.5-10.el5.i386.rpm  //安装VSFTP

启动FTP命令:

1service vsftpd start

2/etc/rc.d/init.d/vsftpd start

启动:

service vsftpd start

看到“OK”了没?说明成功启动了,也可以查看运行状确认

查看运行状态:

1netstat -anp |grep vsftpd //查看VSFTP运行端口和程序

2ps -qux |grep vsftpd  //查看运行进程是否有vsftpd

tcp     0   0 0.0.0.0:21    0.0.0.0:*        LISTEN      10791/vsftpd

tcp表示运行协议,0.0.0.0:21是本地地址和端口号,0.0.0.0:*是外部地址和端口号,LISTEN是协议状态,表示监听状态,10791/vsftpd表示vsftpd的进程号

 

既然成功运行了VSFTP服务器,我们就先看看它的运行效果吧

直接连接就可以看到FTP共享的文件,此时默认系统建立了一个叫pub的文件夹,它允许匿名用户的读取

至此这个简单的匿名FTP就建立好了,默认情况下匿名的权限是什么呢?我们上传文件、删除已有文件试试看

上传文件权限被拒绝

删除文件也被拒绝了

如何设置允许匿名用户呢?

/etc/vsftpd/vsftpd.conf里的匿名选项 anon_upload_enable=YES前面“#”去掉即允许匿名上传文件了,如果允许匿名用户建立文件夹,则把anon_mkdir_write_enable=YES前面的“#“去掉,也可以加入参数:anon_other_write_enable=YES来允许匿名用户执行如文件重命名、删除文件等操作,如下:

别忘记重启或重装载才生效啊!

再试试看能不能上传文件

还是不行,看看本地文件夹的权限

呵呵,果然是本地文件夹不允许其它用户写入操作 rwxr-xr-x  3 root root 4096 Jun  2 08:55 .,根文件夹属主、组都是root的,我们修改pub文件夹,允许其它用户上传文件

看到最后一行没,我把pub修改成757drwxr-xrwx)了

chmod 用法:

chmod XXX文件
×××(所有者组用户其他用户)
×=4 读的权限
×=2 写的权限
×=1 执行的权限
常用修改权限的命令:
sudo chmod 600 ××× (只有所有者有读和写的权限)
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)
sudo chmod 666 ××× (每个人都有读和写的权限)
sudo chmod 777 ××× (每个人都有读和写以及执行的权限)

 

再试试能不能上传文件了?

哈哈!上传成功了,不过我是操作pub文件夹的,在ftp下的根目录的安全属性(权限)没有改变,如果在ftp目录下上传文件是不成功的,还是适合安全要求:)

再删除刚才上传的文件试试看:

真该大笑三声哈哈哈,成功了!

 

开机自启动:

1chkconfig --level 345 vsftpd on

2ntsysv

chkconfig –list |grep vsftpd 查看是否设置成自启动,级别345都是on说明设置成功

 

配置文件:

listen=yes|no           //是否以独立模式运行vsftp

listen_address=192.168.2.126    //FTP主机的IP地址,如果不设置则默认监听所有IP地址(如果有多个IP的话)

listen_port=21          //FTP主机监听21号端口

write_enable=yes|no     //是否允许写操作

ascii_upload_enable=yes|no  //是否允许使用ascii模式上传文件

ascii_download_enable=yes|no    //是否允许使用ascii模式下载文件

port_enable=yes|no          //是否取消port模式

connect_from_port=20        //port模式进行数据传输时是否使用20端口

ftp_data_port=20        //ftp数据传输时的端口号

data_connection_timeout=300 //数据连接超时时间

accept_timeout=60       //接受连接时超时时间

connect_timeout=60          //响应连接超时时间

idle_session_timeout=300    //用户空闲超时时间

nopriv_user=vsftp       //设定服务执行者为vsftp,默认为nobody,推荐使用一个权限低的用户(useradd -g vsftpd -d /dev/null -s /sbin/nologin vsftpd)

max_clients=500         //同时允许500用户登录

max_per_ip=200          //每个IP同时允许200连接

pasv_enable=yes|no      //是否启用pasv模式

pasv_promiscuous=yes|no     //默认为no,是否关闭pasv模式的安全检查

pasv_min_port=5000

pasv_max_port=6000      //pasv模式的数据传输端口改在5000-6000之间

tcp_wrappers=yes|no     //是否在vsftpd中使用tcp_wrappers远程访问机制。默认为yes

Is_recurse_enable=yes|no    //是否允许用户遍历目录(如果开启会影响性能)

 

pam_service_name=vsftpd     //使用pam认证的PAM文件名

userlist_enable=yes|no      //是否限制用户访问FTP

userlist_deny=no        //userlist_file文件内的用户是否允许访问

userlist_file=/etc/vsftpd/userlist//指出用户列表

 

chroot_local_user=yes|no    //是否开启限制用户根目录功能

chroot_list_enable=yes|no   //是否限制具体用户

chroot_list_file=/etc/vsftpd/chroot_list//指出用户列表  

 

dirmessage_enable=yes|no    //是否开启切换目录提示信息功能

message_file=.message       //开启目录提示功能后,这里就是提示文件内容

ftpd_banner=welcome to here //登录时显示的欢迎语

banner_file=/directory/vsftpd_banner_file   //以文件形式显示用户登录时的欢迎语

xferlog_enable=yes|no       //是否记录使用者所有上传、下载信息

xferlog_std_format=yes|no   //是否使用标准xferlog格式记录

xferlog_file=/var/log/vsftpd.log//将上传、下载记录到/var/log/vsftpd.log

anonymous_enable=yes|no     //是否允许匿名用户登录

anon_upload_enable=yes|no   //是否允许上传文件(如果是,必须把write_enable设为yes

anon_mkdir_write_enable=yes|no  //是否允许新建目录

anon_other_write_enable=yes|no  //是否允许新建目录以外的操作(如删除、重命名)

anon_world_readable_only=yes|no //是否只允许用户下载文档、匿名浏览服务器的文件系统

anon_umask=022          //匿名用户上传文件后的权限

anon_root=/var/ftp      //匿名用户登录的根目录

anon_max_rate=30000     //匿名用户下载速率

no_anon_password=yes|no     //匿名用户是否需要密码

local_enable=yes|no     //是否允许本地用户登录

local_max_rate=500000       //本地用户下载速率

local_root=         //本地用户登录根目录(默认为无)

local_umask=033         //本地用户上传文件后的权限
guest_enable=yes|no     //是否允许虚拟用户登录

guest_username=ftp      //虚拟用户名为ftp(默认)

 

注意安全相关:

1/etc/vsftpd/ftpuser里的用户是默认不允许登录服务器的,可以把禁止的用户写入文件内

2userlist_enable=yes|no

   userlist_deny=yes|no

   userlist_file=/etc/vsftpd/user_list

如果userlist_enable=yes说明开启禁上某用户登录,如果userlist_deny=yes,说明userlist_file里的用户不能登录,为no时只允许userlist_file里的用户登录,userlist_file说明用户列表的存放位置

推荐使用只允许某用户登录(提高安全性),它是vsftpd自己的安全文件

3chroot_local_user=yes|no

   chroot_list_enable=yes|no

   chroot_list_file=/etc/vsftpd/user_list

设置是否允许用户离开家目录,一般设置只有某用户才能离开家目录。chroot_list_enable=yes开启限制用户不能离开家目录,chroot_list_user=yes时,指定的用户可以离开家目录,为no时,指定的用户不能离开家目录

推荐使用只允许某用户可以离开家目录,即:

chroot_list_enable=yes

chroot_local_user=yes

chroot_list_file=/etc/vsftpd/chroot_list

4、使用tcp_wrappers功能:

/etc/hosts.allow里加入:  vsftpd:192.168.2.0/255.255.255.0 202.173.237.26/255.255.255.252:allow

/etc/hosts.deny里加入:   vsftpd:all:deny

只允许上面两段地址登录vsftp服务器

5、把is_recurse设置为no

6、使用pam_service_name=vsftpd,即PAM认证

在使用时正确登录,但却遇到cannot change directory错误,因为是selinux关闭FTP,可以把selinux关闭

 

7、启用iptalbes规则允许FTP连接端口:

-A RH - Fireware -1 -INPUT -m state --state NEW -m -tcp --dport 21 -j ACCEPT

 

8virtual_use_local_privs=yes|no VSFTPD-1.2.0以后的版本添加了此参数,为yes时虚拟用户拥有与本地用户相同的权限,当为no时,虚拟用户拥有与匿名用户相同的权限

 

(virtual_use_local_privs=yes,write_enable=yes,虚拟用户具有上传、下载、删除、重命名权限,

virtual_use_local_privs=no,write_enable=yes,anon_world_readable_only=yes,anon_upload_enable=yes时,虚拟用户只能上传文件

virtual_use_local_privs=no,write_enable=yes,anon_world_readable_only=no,anon_upload_enable=no时,虚拟用户只能下载文件

virtual_use_local_privs=no,write_enable=yes,anon_world_readable_only=no,anon_upload_enable=no时,虚拟用户只能上传和下载文件

virtual_use_local_privs=no,write_enable=yes,anon_world_readable_only=no,anon_mkdir_write_enable=yes时,虚拟用户只能下载和创建文件

virtual_use_local_privs=no,write_enable=yes,anon_world_readable_only=no,anon_other_write_enable=yes时,虚拟用户只能下载、删除、重命名文件)

生成证书命令:

openssl req -new -x509 -nodes -out /etc/vsftpd/vsftpd.pem -keyout /etc/vsftpd/vsftpd.pem

 
   
 
   
 
   
 
   
 
   
 
   
 
   

简单例子:

利用虚拟账号提供文件下载服务,只允许下载不允许上传

建立虚拟用户对应的实体用户名

修改下载目录的权限

   

 

编辑主配置文件

设置虚拟用户

vi /etc/vsftpd/ftp_log

db_load -T -t hash -f /etc/vsftpd/ftp_log /etc/vsftpd/ftp_log.db

vi /pam.d/vsftpd.conf

重启

被拒绝了?看看配置文件,有这么一条userlist_deny=no,这条表示只有userlist_file=/etc/vsftpd/user_list列出的用户才能登录,OK,我们试试把test这个虚拟用户添加进去

再重启

登录

这一回OK了吧,哈哈

Maildir是系统用户默认的邮件目录,创建用户的时候自动创建的

上传文件试试

当然不能上传了,文件夹的本地权限为500,不是吗?还有一个地方限制了

最后一句anon_umask=022只有有写入权限时才有效,如果准备允许虚拟用户上传则把/var/ftp/public修改成有写权限,再将上面这个匿名允许上传即可,如图:

 

好了,这次到此结束,配置续跟着就要出来了

 
总结:对于新手而言经常会犯常见的错误,如:

参数写错,tcp_wrappers=yes却写成tcp_wrapper=yes

          idle_session_timeout=30写成idle-session_timeout=30

数据库文件路径写错

userlist_enable=yes

userlist_deny=no

userlist_file=/etc/vsftpd/user_list

userlist_deny=no时,就是只允许userlist_file=/etc/vsftpd/user_list指定的用户登录(能提高安全性),如果忘了把用户写进去,就登录不上FTP服务器了
本地权限限制用户写入文件,那么用FTP登录的时候是不可能上传的(除非你是神)

为提高安全性可以启用SSL支持,下篇做示范

适当使用tcp_wrappers来限制登录来源地址

错误日记:

Could not open location 'ftp://192.168.2.126'Unknow internal error while displaying this location,默认login.db放在/etc/vsftpd目录文件错设置内容也会出错: 如把anon_mkdir_write_enable=yes写成:anon_mkdir_enable=yes,就会出现下面的错误

Can't display localtion 'ftp://wuzh@192.168.2.126',Unknow internal error while displaying this location

The folder contents could not be displayed Sorry couldn't display all the contents of 'ftp://192.168.2.126'