Vsftpd服务器原理及部署

   

FTP介绍

 

FTP:文件传输协议(File Transfer Protocol),基于该协议FTP客户端与服务端可以共享文件、上传下载文件。FTP 是基于TCP协议生成一个虚拟的连接,该协议的21端口用于控制FTP的TCP连接信息,20端口用于TCP连接FTP的数据传输。FTP服务是基于Client/Server(C/S)架构。

 

FTP传输模式

1、主动模式(port模式):

客户端从一个任意的大于1024(N)的端口连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:

1)   任何端口到FTP服务器的21端口 (客户端初始化的连接到FTP服务器)

2)   FTP服务器的21端口到大于1024的端口(服务器响应客户端的控制端口)

3)   FTP服务器的20端口到大于1024的端口(服务器端初始化数据连接到客户端的数据端口)

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

 

 

vsftp 被动模式 python demo_客户端

 

 

 

 

 

 

2、被动模式(PASV模式):

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

1)   从任何端口到服务器的21端口 (客户端初始化的连接)

2)   服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接 )

3)   从任何端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)

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

 

 

vsftp 被动模式 python demo_虚拟用户_02

 

对比主动模式,被动模式在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT N(N为端口号)",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。

被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP程序允许管理员指定FTP服务器使用的端口范围。

另外客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。

 

 

Vsftpd(Very Secure FTP daemon)是Unix/Linux使用较为广泛的FTP服务器软件,优点小巧轻快,安全易用、稳定高效、满足企业跨部门使用、多用户。

Vsftpd是基于GPL开源协议发布。

 

Vsftp的服务器部署

1、安装vsftpd软件

[root@yum ~]# yum install -y vsftpd*
[root@yum ~]# rpm -aq vsftpd
vsftpd-3.0.2-25.el7.x86_64

2、启动vsftp

[root@yum ~]# systemctl start vsftpd.service
[root@yum ~]# systemctl enable vsftpd.service

                                                                                             

vsftp 被动模式 python demo_客户端_03

 

3、Vsftpd.conf默认配置文件详解

Vim /etc/vsftpd/vsftpd.conf
 
#开启匿名用户访问
anonymous_enable=YES
#启用本地系统用户访问
local_enable=YES
#本地系统用户写入权限
write_enable=YES
#本地用户创建文件及目录默认权限掩码
local_umask=022
#打印目录显示信息,通常用于用户第一次访问目录,信息提示:
dirmessage_enable=YES
#启用上传/下载日志记录
xferlog_enable=YES
#FTP使用20端口进行数据传输
connect_from_port_20=YES
#日志文件将根据xferlog的标准格式写入
xferlog_std_format=YES
#vsftpd不以独立的服务启动,通过Xinetd服务管理,建立改为YES,默认NO
listen=NO
#启用IPV6监听
listen_ipv6=YES
#登陆FTP服务器,依据/etc/pam.d/vsftpd中的内容经行认证
pam_service_name=vsftpd
#vsftp.user_list和ftpusers配置文件里用户禁止访问FTP
userlist_enable=YES
#设置vsftpd与tcp wrapper结合进行主机的访问控制,Vsftpd服务器检查#/etc/hosts.allow和/etc/hosts.deny中的设置,来决定请求连接的主机,是否允许##访问改FTP服务器。
tcp_wrappers=YES
 
#以下配置为PASV模式
#pasv_enable=YES
#pasv_min_port=60000
#pasv_max_port=60100

 

启动vsftpd后在windows客户端访问

 

 

Vsftpd匿名用户配置

Vsftpd默认是以匿名用户访问,匿名用户访问的FTP服务器端路劲为:/var/ftp/pub,匿名用户只有查看权限,无法创建、删除和修改。如果要关闭匿名用户访问,需要修改/etc/vsftpd/vsftpd.conf,将anonymous_enable=YES改为anonymous_enable=NO,重启Vsftp服务。

给匿名用户添加上传、下载、删除权限,在/etc/vsftpd/vsftpd.conf中添加如下配置:

#允许匿名用户上传文件
anon_upload_enable=YES
#允许匿名用户创建文件
anon_mkdir_write_enable=YES
#允许匿名用户其它写入权限
anon_other_write_enable=YES

 

匿名用户完整vsftpd.conf配置文件如下

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

 

默认的匿名用户有2种:anonymous和ftp,所有匿名用户如果需要上传、下载、删除、修改等权限,需要ftp用户对/var/ftp/pub目录有写入权限,使用chown和chmod任意一种即可

chown -R ftp /var/ftp/pub/
chmod o+w /var/ftp/pub/

       

 

Vsftpd系统用户配置

匿名用户配置会造成所有都上传、下载、删除和修改的权限,比较危险。

使用Vsftpd系统用户方式验证登陆。

1、 创建系统用户king1 king2,密码设置为123456

[root@yum vsftpd]# for i in king1 king2 ;do useradd $i;echo 123456 |passwd --stdin $i;done
Changing password for user king1.
passwd: all authentication tokens updated successfully.
Changing password for user king2.
passwd: all authentication tokens updated successfully.

2、 修改vsftpd.conf配置文件代码如下

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

 

在windows客户端登陆

 

vsftp 被动模式 python demo_客户端_04

 

Vsftpd虚拟用户配置

系统用户太多的话,不利于系统的安全管理,因此我们使用虚拟用户来登陆FTP。

Vsftpd虚拟用户就是没有实际的真实系统用户,而是通过映射到其中一个真实用户以及设置相应的权限来实现访问验证,虚拟用户不能登陆Linux系统,从而让系统更加的安全。

Vsftpd的配置方案如下:

1、 安装Vsftp虚拟用户需要的软件

[root@yum ~]# yum install -y pam* libdb-utils libdb* --skip-broken

2、 创建虚拟用户临时文件/etc/vsftpd/ftpusers.txt,新建虚拟用户和密码,其中king3 king4为虚拟用户,123456为密码,如有多个用户,依次格式填写即可:

king3
123456
king4
123456

 

3、 生成Vsftpd虚拟用户数据库认真文件,设置权限为700

[root@yum ~]# db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
[root@yum ~]# chmod 700 /etc/vsftpd/vsftpd_login.db

 

4、 配置PAM认证文件,/etc/pam.d/vsftpd行首加入如下两行:

[root@yum ~]# vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login

 

5、 所有Vsftpd虚拟用户偶都映射到一个系统用户,改系统用户不需要密码,也不需要登录。

useradd ftpuser -s /sbin/nologin -M

 

6、 在/etc/vsftpd/vsftpd.conf下添加虚拟用户配置文件

#config virtual user FTP
#虚拟用户启用pam认证
pam_service_name=vsftpd
#启用虚拟用户
guest_enable=YES
#映射虚拟用户到系统用户ftpuser
guest_username=ftpuser
#设置虚拟用户配置文件所在目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#虚拟用户使用本地与本地用户相同的权限
virtual_use_local_privs=YES

 

   完整的/etc/vsftpd/vsftpd.conf文件

  

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#config virtual user FTP
pam_service_name=vsftpd
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=YES

 

7、 所有虚拟用户共同基于/home/ftpuser主目录实现文件上传与下载,可以在/etc/vsftpd/vsftpd_user_conf目录创建虚拟用户各自的配置文件,创建虚拟用户配置文件主目录

[root@yum ~]# mkdir -p /etc/vsftpd/vsftpd_user_conf

8、 分别为虚拟用户king3 king4创建配置文件,同时创建私有虚拟目录

vim /etc/vsftpd/vsftpd_user_conf/king3

local_root=/home/ftpuser/king3
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

vim /etc/vsftpd/vsftpd_user_conf/king4

local_root=/home/ftpuser/king4
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

 

虚拟用户配置内容详解

 

#king3虚拟用户私有虚拟目录
local_root=/home/ftpuser/king3
#允许登陆用户有写权限
write_enable=YES
#允许匿名用户下载,然后读取文件
anon_world_readable_only=YES
#允许匿名用户上传文件权限,只有在write_enable=YES时有效
anon_upload_enable=YES
#允许匿名用户创建目录权限,只有在write_enable=YES时有效
anon_mkdir_write_enable=YES
#允许匿名用户其它权限,例如删除、重命名等
anon_other_write_enable=YES

 

9、 创建虚拟用户各自虚拟目录,并重启vsftpd服务

[root@yum ~]# mkdir -p /home/ftpuser/{king3,king4}
[root@yum ~]# chown -R ftpuser:ftpuser /home/ftpuser
[root@yum ~]# systemctl restart vsftpd

在windows客户端测试

 

vsftp 被动模式 python demo_客户端_05

 

vsftp 被动模式 python demo_服务器_06

 

 

I have a dream so I study hard!!!