ftp虚拟账号配置



   在使用FTP时,如果客户端机器和FTP服务器双方之间的所有端口都是开放的,那连接不存在问题。如果客户端与服务器之间有防火墙,如果没配置好防火策略和采用合适的连接模式,会导致登录成功,但无法List列表的问题。要避免出现这样的问题,首先要了解FTP的工作模式。

    1.FTP的PORT(主动模式)和PASV(被动模式)

    (1) PORT(主动模式)

    PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据

spacer.gif

    (2) PASV(被动模式)

    PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输

spacer.gif 

    2.两种模式的比较

     从上面的运行原来看到,主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。

  主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。

  被动模式只需要服务器端开放端口给客户端连接就行了。

    3.不同工作模式的网络设置

    我在实际项目中碰到的问题是,FTP的客户端和服务器分别在不同网络,两个网络之间有至少4层的防火墙,服务器端只开放了21端口, 客户端机器没开放任何端口。FTP客户端连接采用的被动模式,结果客户端能登录成功,但是无法LIST列表和读取数据。很明显,是因为服务器端没开放被动模式下的随机端口导致。

    由于被动模式下,服务器端开放的端口随机,但是防火墙要不能全部开放,解决的方案是,在ftp服务器配置被动模式下开放随机端口在 50000-60000之间(范围在ftp服务器软件设置,可以设置任意1024上的端口段),然后在防火墙设置规则,开放服务器端50000-60000之间的端口端。

    主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段。


    4.如何设置 工作模式?

    有人可能会问FTP服务器如何设置工作模式?实时上FTP服务器一般都支持主动和被动模式,连接采用何种模式是有FTP客户端软件决定。


     FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。 


   (一)主动FTP  
        主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

     针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:    

     1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)  
     2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口) 
     3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)

     4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口) 

    (二)被动FTP  
    为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。

    在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

    当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。  
    对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:     

    1. 从任何大于1024的端口到服务器的21端口(客户端初始化的连接)  
    2. 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接) 
    3. 从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)

    4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

     以上关于主动和被动FTP的解释,可以简单概括为以下两点:

    1、主动FTP:  
            命令连接:客户端 >1024端口 -> 服务器 21端口  
            数据连接:客户端 &gt;1024端口 <- 服务器 20端口 
    2、被动FTP: 
            命令连接:客户端 >1024端口 -&gt; 服务器 21端口 
            数据连接:客户端 &gt;1024端口 -&gt; 服务器 &gt;1024端口

  (三)主动与被动FTP优缺点:       

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

来源: http://blog.csdn.net/huanggang028/article/details/41248663


        ftp在数据传输的过程中采用的是明文传输,所以会存在一定的安全问题,除非是学校等一些教育机构共享一些不重要的资源可以采用ftp,否则要少用

        现在常用的ftp软件是vsftpd





虚拟账号配置:

说明:

虚拟账号:shencj

密码:123456

根目录:/data/ftp

参考:http://my.oschina.net/HankCN/blog/116127?fromerr=qhQiTgzD

注意:

ftp默认是以明文进行传输的

tcpdump port 21 -nA:可以抓取账号和密码


1、安装vsftpd:

yum -y install vsftpd

    安装客户端:

yum -y install ftp lftp

2、安装db4(用于生成虚拟用户的用户名密码的db文件):

yum install db4 db4-utils

3、修改配置文件:

grep -v ^# /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=NO
local_umask=022
dirmessage_enable=YES

xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES

chroot_local_user=YES
listen=YES
listen_port=21

local_max_rate=307200
max_clients=20

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/vuser_conf

注意:

anonymous_enable=NO    #不允许匿名访问

local_enable=YES       #本地用户可以访问(采用虚拟账号访问时,这个参数也要开启(虚拟账号要寄宿本地账号),虽然开启但是本地账号是不可以登陆的)

write_enable=NO        #不可写(不可上传)

 

xferlog_enable=YES

xferlog_file=/etc/vsftpd/vsftpd.log

xferlog_std_format=YES

#这3项设置log日志

chroot_local_user=YES  #锁定家目录

#chroot_list_enable=YES      #启用不锁定用户家目录的名单(chroot_local_user=YES)

#chroot_list_file=/etc/vsftpd.chroot_list  #当chroot_list_enable=YES时,此列表生效,列表中的用户将不受锁定限制,格式为一行一个用户名

#chroot_local_user=NO  #不锁定家目录

#chroot_list_enable=YES      #启用锁定用户家目录的名单(chroot_local_user=NO)

#chroot_list_file=/etc/vsftpd.chroot_list  #当chroot_list_enable=YES时,此列表生效,列表中的用户将受锁定限制,格式为一行一个用户名

connect_from_port_20=YES     #通过20端口传输数据

listen_port=21               #监听的端口

local_max_rate=307200        #本地账号最高的下载速度300k(1024*300)

max_clients=20               #客户端最大连接数

#max_per_ip=5                #每个ip最大连接数

 

guest_enable=YES       #启用虚拟用户

guest_username=ftp     #虚拟用户寄宿的系统本地用户名(安装vsftpd后会自动创建ftp账号),虚拟账号要寄宿在一个本地的系统账号上(local_enable=YES)

user_config_dir=/etc/vsftpd/vuser_conf  #虚拟用户的配置文件路径

4、配置虚拟用户:

mkdir -p /etc/vsftpd/vuser_conf         #创建虚拟用户的配置文件路径
cd /etc/vsftpd/vuser_conf

vim shencj             #创建虚拟账号配置文件(文件名一定要和虚拟账号名(shencj)一致)
local_root=/data/ftp
write_enable=NO
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

5、创建密码文件:

vim /etc/vsftpd/vuser_passwd.txt            #奇数行为账号,偶数行为密码(可写多个)
shencj
123456
#scj
#123456
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db     #生成db文件

6、编辑认证文件:

vim /etc/pam.d/vsftpd
将原来的全部注释掉,加入:
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd

7、启动:

/etc/init.d/vsftpd start

8、客户端:

下载FileZilla

下载地址:https://filezilla-project.org/download.php?type=client



9、使用ssl加密传输(不再使用明文传输):

mkdir /etc/vsftpd/sslkey
cd /etc/vsftpd/sslkey

openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
Generating a 2048 bit RSA private key
.......................................................................................+++
...+++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanghai
Locality Name (eg, city) [Default City]:shanghai
Organization Name (eg, company) [Default Company Ltd]:jinzhuanch
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:192.168.247.135
Email Address []:
vim /etc/vsftpd/vsftpd.conf
#在最后面添加:
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
ssl_ciphers=HIGH
require_ssl_reuse=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/sslkey/vsftpd.pem

注意:

ssl_sslv3=NO                     #openssl3.0有漏洞,不再使用

ssl_tlsv1=YES                    #使用tls协议

ssl_ciphers=HIGH                 #required by FileZilla(客户端使用FileZilla工具时,要使用此参数)

require_ssl_reuse=NO             #required by WinSCP

force_local_logins_ssl=YES       #强制使用ssl

/etc/init.d/vsftpd  restart




登录ftp:

lftp shencj:123456@172.48.1.18