FTP


  • FTP概述

  • FTP原理和模式

  • vsftpd

  • vsftpd基础服务搭建

  • vsftpd基于数据库的实现虚拟用户

  • vsftpd基于mysql实现虚拟用户

  • 常见问题

FTP概述

什么是FTP?

FTP是File Transfer Protocol 文件传输协议的缩写,基于网络来传输文件的应用层通信协议。

FTP的功能是什么?

FTP能够通过网络来传输文件,因为工作在应用层所以不会受到平台的限制。

FTP原理和模式

原理与工作流程

 

  1. FTP的数据传输分为命令数据与文件数据,命令传输就是客户端要执行的命令,服务端收到后返回给客户端执行结果,如ls等。文件传输就是客户端要传输的数据,服务端与客户端数据连接来传输。

  2. FTP的服务端与客户端建立连接大体三个步骤,建立连接,传输数据,断开连接。

  3. FTP是基于tcp来传输可靠的数据,使用21号端口来建立认证通道,20号端口来建立数据通道。

  4. FTP是明文传输的。

  5. FTP的用户可分为实体用户(real user),匿名用户(anonymous user),访客用户(guest user)。


主动模式与被动模式

由于现在的网络架构中,都会有防火墙来阻止端口与高位端口被主动连接,特别是一般来说20端口是被禁止主动连接的,因为20端口是FTP的数据端口,所以为了解决客户端或者服务端的防火墙问题,FTP就有了主动和被动两种模式,通过墙内的一段来主动连接外端的一方,这样子就不会被防火墙阻挡。

主动模式:一般用于服务端存在防火墙的情况,客户端无法主动连接至服务端的20数据端口,需要由服务端主动连接至客户端的高位数据端口。
1. 两端在建立TCP通信通道后,客户端会发送port请求与服务端的21号端口认证连接并发送开放用来建立数据连接的高位端口号。
2. 服务端在收到后,会通过20号端口发送ACK响应请求
3. 服务端会通过20端口与客户端发送的高位端口建立数据连接通道。
被动模式:一般用于客户端存在防火墙的情况,服务端在收到连接请求后因为客户端防火墙而无法达到客户端高位端口,需要客户端主动连接服务端的数据传输端口。
1. 两端在建立TCP通信通道连接后,客户端会发送PASV请求给服务端。
2. 服务端在受到PASV端口后就会打开一个高位端口作为数据传输端口来响应给客户端等待客户端连接。
3. 客户端在收到响应后,就会去连接响应的端口建立数据连接通道。
我们可以看到以上两种方式,都是由墙内的一方来发出连接并允许另一端来连接指定端口,墙内的一方就类似是一间房子的主人,而另外一方是客人,客人去访问主要要实现得到主人的同意,并来给你”开门”你才可以进到这个屋子。

 

VSFTPD

vsftpD是什么?

vsftpd是基于ftp协议来对网络数据交换的一种实现,是一个开源的解决方案。

vsftp的功能是什么?

能够通过配置,搭建ftp服务器,完成基于网络的数据传输功能。

VSFTP的文件

/etc/pam.d/vsftpd               pam认证文件。
/etc/vsftpd/ftpusers                限制登陆用户文件。
/etc/vsftpd/user_list                    限制登陆用户文件。
/etc/vsftpd/vsftpd.conf                        vsftp的主配置文件。
/usr/sbin/vsftpd                主进程文件

vsftpd.conf的基本属性

local_root=/var/ftp                 指定实体FTP用户所使用的目录,如不指定,实体用户的默认目录为自己的家目录。
ftpd_banner=Welcome!!                登陆后的注释信息。  
xferlog_file=/var/log/xferlog          日志存放位置。
-----------------------------------------------------------------------------
listen_port=21                        监听的端口。
local_root=/var/ftp                 使用的ftp目录,全局。
write_enable=YES (NO)                是否允许写入,全局。
--------------------
local_enable=YES|NO                 是否允许实体用户登陆。
local_max_rate=#                     限制real user的传输速度,单位为Byte/s,如果为0则表示不限制。
allow_writeable_chroot=YES|NO         是否限制ftp文件夹对实体用户的W权限,如果为NO,则设置W权限时,会报错。
----------------------------------------------------------------------------
anonymous_enable=YES|NO                是否允许匿名用户登录,预设为YES,如果关闭则所有的匿名设置属性都将无效。
anon_root=/path/filename             指定匿名用户ftp目录
anon_world_readable_only=YES|NO       是否允许匿名用户具有下载的权限,预设为YES。

anon_other_write_enable=YES|NO       是否允许匿名用户具有写入(W)的权限,如删除与更改伺服器上的档案与档名等权限,预设为NO。
anon_mkdir_write_enable=YES|NO         是否允许匿名用户具有创建目录的权限 预设为NO。
anon_upload_enable=YES|NO             是否允许匿名用户上传文件,预设为NO
----------------------------------------------------------------------------
guest_enable=YES|NO                 所有的实体账号登陆都视为以guest的身份登陆。
guest_username=username             指定访客使用哪个用户的身份。

vsftpd基础服务搭建

[root@host1 ~]# yum install vsftpd -y            下载安装vsftpd。
[root@host1 ~]# service vsftpd start            启动vsftpd进程。
[root@host1 ~]# ss -tnl | grep -e '20' -e '21'        查看端口号20与21.
LISTEN     0      32      *:21       *:*             由于20端口是数据传输端口,所以并不会启动监听,20端口在收到请求后才会打开。  
[root@host1 ~]# lftp 192.168.1.1                本地使用lftp来尝试登陆
lftp 192.168.1.1:~> ls                          已匿名用户登录成功并尝试list
drwxr-xr-x    2 0        0            4096 Mar 22 18:26 pub            可以看到默认的pub目录。
lftp 192.168.1.1:/> cd pub                cd到pub目录。
lftp 192.168.1.1:/pub> ls                没有东西。。。
lftp 192.168.1.1:/pub> bye                退出。

vsftpd基于数据库文件来实现虚拟用户

搭建服务:
[root@aliyun ~]# yum install vsftpd -y            下载安装vsftpd。
[root@aliyun ~]# vim /etc/vsftpd/vsftpd.conf        编辑vsftpd的主配置文件。
local_enable=YES                                实体用户允许登陆。
guest_enable=YES                                允许来宾账号。
guest_username=virtual                            来宾账号使用virtual这个账号。
pam_service_name=vsftp.db                        指定认证文件。
user_config_dir=/etc/vsftpd/vuftp                指定虚拟用户的配置文件目录。
virtual_use_local_privs=YES                        虚拟用户拥有实体用户一样的权限。

[root@aliyun ~]# vim /etc/vsftpd/vftpuser.txt
upload 
redhat

[root@aliyun ~]# rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm        安装db4-until
[root@aliyun ~]# db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db  使用db_load命令生成虚拟用户口令认证文件。

[root@host1 ~]# vim /etc/pam.d/vsftp.db         创建并写入认证文件。
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser
类型为认证  设置为required  传递pam_userdb.so参数 数据库文件在/etc/vsftpd/vftpuser  无需加.db,默认的!
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser
其他都一样,类型为信息验证。

[root@aliyun ~]# useradd -s /sbin/nologin virtual        创建虚拟映射的实体账号,并不允许登陆。
[root@aliyun ~]# mkdir /etc/vsftpd/vuftp                创建虚拟用户设定存放目录。
[root@aliyun ~]# vim /etc/vsftpd/vuftp/upload            设定虚拟用户的设定文件。
local_root=/tmp/upload         upload的目录为/tmp/upload
write_enable=YES             允许写入。
[root@aliyun ~]# chown virtual:virtual /tmp/upload     更改属主属组为virtual。
[root@aliyun ~]# service vsftpd start                启动vsftpd
测试:
[root@host2 ~]# lftp upload@@172.16.0.1                以xiao的身份访问ftp服务器。
Password: 
lftp upload@@172.16.0.1:/> ls
-rw-r--r--    1 1001     1001           73 Apr 21 12:32 alias.sh
-rw-r--r--    1 1001     1001     75528192 Apr 02 23:14 boot.iso
-rw-r--r--    1 0        0        1048576000 Mar 11 21:23 checkfile
-rw-r--r--    1 1001     1001         1597 Apr 02 22:50 myos.cfg
lftp [email protected]:/> get named.src 
1050 bytes transferred    
lftp upload@@172.16.0.1:~> put /root/install.log        上传一个文件。
49565 bytes transferred

vsftpd基于mysql实现虚拟用户

######搭建服务:
[root@host1 ~]# yum install vsftpd -y            下载安装vsftpd。
[root@host1 ~]# vim /etc/vsftpd/vsftpd.conf        编辑vsftpd的主配置文件。
local_enable=YES                                实体用户允许登陆。
guest_enable=YES                                允许来宾账号。
guest_username=virtual                            来宾账号使用virtual这个账号。
pam_service_name=vsftp.mysql                    指定认证文件。
user_config_dir=/etc/vsftpd/vuftp                指定虚拟用户的配置文件目录。
virtual_use_local_privs=YES                        虚拟用户拥有实体用户一样的权限。

[root@host1 pam_mysql-0.7RC1]# ./configure --with-openssl        编译安装mysql的认证模块,遇到的错误请查看最后的总结。
[root@host1 pam_mysql-0.7RC1]# make && make install                


[root@host2 ~]# yum install mysql                host2安装mysql,因为采用的是远程数据库存储。
[root@host2 ~]# service mysqld start
[root@host2 ~]# mysql                            设定数据库。
mysql> create database vsftp;                    创建数据库。
mysql> use vsftp;                                
mysql> create table user(name char(20) not null primary key,password char(48) not null);        创建用户数据表。
mysql> insert into user values('xiao',password('redhat'));            写入信息。
mysql> grant select on vsftp.* to xiao@'%' identified by 'redhat';            授权并创建用户。
mysql> flush privileges        重载用户信息。
mysql> exit            退出。


[root@host1 ~]# vim /etc/pam.d/vsftp.mysql         创建并写入认证文件。
auth required  /lib64/security/pam_mysql.so  user=xiao  passwd=redhat   host=192.168.1.2    db=vsftp  table=user   usercolumn=name  passwdcolumn=password crypt=2        
设置类型为认证,并如果不通过就整个认证都不通过,但是还是要检查后续认证属性,指定认证文件库文件并赋予参数,DB账号是xiao 密码是redhat mysql服务器地址是192.168.1.2 数据库是vsftp 表是table 账号字段是name 密码字段是password 加密类型为mysql。

account required  /lib64/security/pam_mysql.so  user=xiao  passwd=redhat   host=192.168.1.2    db=vsftp  table=user   usercolumn=name  passwdcolumn=password crypt=2
其他都相同,只是设置类型为除了密码等认证以外的认证,如过期时间等。

[root@host1 ~]# useradd -s /sbin/nologin virtual        创建虚拟映射的实体账号,并不允许登陆。
[root@host1 ~]# mkdir /etc/vsftpd/vuftp                创建虚拟用户设定存放目录。
[root@host1 ~]# vim /etc/vsftpd/vuftp/xiao            设定虚拟用户的设定文件。
local_root=/tmp/xiao         xiao的目录为/tmp/xiao
write_enable=YES             允许写入。
[root@host1 ~]# chown virtual:virtual /tmp/xiao     更改属主属组为virtual。
[root@host1 ~]# service vsftpd start                启动vsftpd
测试:
[root@host2 ~]# lftp [email protected]                以xiao的身份访问ftp服务器。
Password: 
lftp [email protected]:~> ls                         list,然而并没有文件。
lftp [email protected]:~> put /root/install.log        上传一个文件。
49565 bytes transferred                             
lftp [email protected]:~> ls                            list,就有文件了。说明可以正常登陆与写入。
-rw-r--r--    1 502      503         49565 Apr 27 19:31 install.log
lftp [email protected]:~> bye

vsftpd.conf常用配置详解

vsftp.conf属性详解,作为查询使用。
[env]
local_root=/var/ftp                  指定ftp目录。
write_enable=YES|NO                  是否允许使用者上传,全局。
use_locatime=YES|NO                  是否启用本地时间。
listen_port=#                          指定vsftp所使用的端口。
ftpd_banner=text                      显示的文字说明。
banner_file=/path/file                 指定某个纯文字档案座位登陆时的vsftp欢迎字眼。

[env] [mode] 
listen=YES|NO                        是否以 standalone(主动) 方式启动,预设为NO。
connect_from_port=21                 主动式连线使用的FTP端口。
ftp_data_port=20                    主动式连线使用的FTP数据端口
connect_timeout=60                      主动模式下,在#秒后得不到回应就强制中断。

pasv_enable=YES|NO                     是否开启被动(passive)连线模式。
accept_timeout=120                     被动模式下,服务器等待客户端超过#秒就强制断线。
pasv_min_port=0,pasv_max_port=0     被动模式时,使用的port范围,0表示1-65535随机采用不限制。

data_connection_timeout=30            如果已经建立连接,但是因为线路问题导致在#秒被没有完成资料的传输,就强制踢除客户端。
idle_session_timeout=60                 如果使用者在#秒内都没有命令动作就强制断线。
max_clients=10                        同一时间最大的连接数。
max_per_ip=5                        同一IP同一时间可以允许多少连线。


[env] [message]
dirmessage_enable=YES|NO             当进入特定目录时会显示提示,显示内容为每一个目录下面的隐藏文件.message。
message_file=.message               显示的是.message就是这个选项来指定的。


[anonymous] [mod]
anonymous_enable=YES|NO                是否允许匿名用户登录,预设为YES,如果关闭则所有的匿名设置属性都将无效。
anon_root=/path/filename             指定匿名用户ftp目录
anon_world_readable_only=YES|NO       是否允许匿名用户具有下载的权限,预设为YES。

anon_other_write_enable=YES|NO       是否允许匿名用户具有写入(W)的权限,如删除与更改伺服器上的档案与档名等权限,预设为NO。
        如果要设置为YES,则需要调整开放给anonymous写入目录的权限,即开放对应PID(anonymous账户)的W权限。
anon_mkdir_write_enable=YES|NO         是否允许匿名用户具有创建目录的权限 预设为NO。
        如果anon_other_write_enable=NO 此属性则不能生效,必须更改为YES。
anon_upload_enable=YES|NO             是否允许匿名用户上传文件,预设为NO
        如果anon_other_write_enable=NO 此属性不能生效。    

[anonymous] [password check]
deny_email_enable=YES|NO             是否抵挡不允许的email登陆。
banned_email_file=/etc/vsftpd/banned_emails   拒绝登陆的email的list,需要deny_mail_enable设置为YES。
no_anon_passwd=YES|NO                 是否要略过密码check环节。

[anonymous] [other]    
anon_max_rate=#                     限制anonymous的传输速度,单位为Byte/s,如果为0则表示不限制。
anon_umask=077                         设置上传文件的默认掩码。


[real user]
local_enable=YES|NO                 是否允许实体用户登陆。
local_max_rate=#                     限制real user的传输速度,单位为Byte/s,如果为0则表示不限制。
allow_writeable_chroot=YES|NO         是否限制ftp文件夹对实体用户的W权限,如果为NO,则设置W权限时,会报错。

[real user] [change root]
chroot_local_enable=YES|NO             开启目录锁定功能。    
chroot_list_enable=YES|NO             开机目录锁定的list限制。

    chroot_list_enable                 result
         YES             所有用户都锁定目录,list中的用户不锁定。
          NO              所有用户都不锁定目录,list中的用户锁定。

chroot_list_file=/etc/vsftpd/chroot_list : 指定chroot list。

[real user] [userlist_deny]
userlist_enable=YES|NO                 是否开启访问限制功能。
userlist_deny=YES|NO                 是否开启list访问限制。

     userlist_deny                     result
          YES             所有用户都可以访问,list中的用户无法访问。
          NO              所有用户都无法访问,list中的用户可以访问。


userlist_file=/etc/vsftpd/user_list : 指定userlist。


[safe]
acsii_download_enable=YES|NO        是否指定用户使用acsii格式下载档案。
acsii_upload_enable=YES|NO            是否指定用户使用acsii格式上传档案。
one_process_model=YES|NO            设定为YES时,每一个连线都会拥有一个单独的precess负责,都够提升vsftp的性能,但是会占用系统资源,建议设置为NO
tcp_wrappers=YES|NO                 是否支援TCP Wrappers。
pam_service_name=vsftpd             pam模组的名称。

[safe] [log]
xferlog_enable=YES|NO                 是否在上传与下载档案时将信息记录在日志文件中。
xferlog_file=/var/log/xferlog         生成的日志文件存放的位置。
xferlog_std_format=YES|NO             日志文件通过标准的xferlog格式书写,难读。
dual_log_enable=YES|NO                 是否生成额外的一个log文档。
vsftpd_log_file=/var/log/vsftpd.log        额外log文档的存放位置。

[safe] [process user]
nopriv_user=username                 以指定的user作为process的user,防止被***时,仅仅只会获得指定user的低权限,不会对系统造成太大的伤害。    

[guest] 
guest_enable=YES|NO                 所有的实体账号登陆都视为以guest的身份登陆。
guest_username=username             指定访客使用哪个用户的身份。
virtual_use_local_privs=YES            为YES时,虚拟用户权限与实体用户一样。

常见问题:

  1. ftp无法登陆,请检查你的文件夹权限并检查主配置文件中的属性是否打开了,如anonymous_enable,local_enable等。

  2. 无法切换目录或者个别用户无法登陆,请检查chroot_list,ftpusers,user_list文件内容或者主配置文件中的配置是否正确。

  3. mysql存储无法登陆,请查看日志文件/var/log/secure,/var/log/message,/var/log/xferlog,并确认认证文件没有写错,仔细检查配置文件与目录和被映射的实体用户的权限。

  4. 如果遇到密码错误,检查密码文件,如mysql表中字段长度类型是否正确,数据库用户是否能远程登陆访问数据库user表。

  5. 如果遇到在编译安装pam_mysql模块中遇到configure: error: Your system doesn’t appear to be configured to use PAM. Perhaps you need to specify the correct location where the PAM modules reside. 情况,可以尝试添加一个选项 –with-pam-mods-dir=/lib/security/ 自己手动指明pam库的存放位置。

  6. 无法正常工作时,请检查端口是否开启,或检查防火墙和selinux是否有配置正确。

  7. 原地址:http://123.57.218.140/15668