vsftpd工作原理和使用详解

devopsec 等级 571 1 2

vsftpd工作原理和使用详解

简介

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。

vsftpd工作原理

vsftpd基于C/S模式,有两种传输模式,分别是主动模式、被动模式。

主动模式

ftp client 端从一个任意的大于1024的端口P连接到ftp server 端的21端口。然后ftp client 端开始监听端口P+N,并发送FTP命令“port P+N”到ftp server 端。接着ftp server 端会从它自己的数据端口(20)连接到ftp client 端指定的数据端口P+N。

  1. ftp client端启用大于1024端口P连接ftp server端口21,通过tcp三次握手建立连接
  2. ftp client 端发送PORT请求告诉ftp server 端自己开启了P+N端口接收数据
  3. ftp server 端用20端口和ftp client 端的P+N端口通过tcp三次握手后开始传输数据 vsftpd工作原理和使用详解

被动模式

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

  1. ftp client端启用大于1024端口P连接ftp server端口21,通过tcp三次握手建立连接
  2. ftp client 端发送PASV请求告诉ftp server 端自己处于被动模式
  3. ftp server 端监听端口S>1024,告知ftp client 端
  4. ftp client 端用P+N端口和ftp server 端的S端口通过tcp三次握手后开始传输数据 vsftpd工作原理和使用详解

vsftpd安装和配置

介绍完原理我们开始实战。安装一般有rpm安装和源码编译安装,我们选择yum安装,简单快捷。

  1. 安装vsftpd
yum install -y vsftpd

查看目录结构
rpm -ql vsftpd
  1. 启动
systemctl start vsftpd.service
systemctl enable vsftpd.service
  1. 配置日志
vim /etc/vsftpd/vsftpd.conf
# 表明FTP服务器记录上传下载的情况
xferlog_enable=YES
# 表明将记录的上传下载情况写在xferlog_file所指定的文件中, 即xferlog_file选项指定的文件中
xferlog_std_format=YES
xferlog_file=/var/log/xferlog


# 启用双份日志。在用xferlog文件记录服务器上传下载情况的同时,
# vsftpd_log_file所指定的文件,即/var/log/vsftpd.log也将用来 记录服务器的传输情况
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
  1. 配置主动被动模式
主动模式:
connect_from_port_20=YES
被动模式:
pasv_enable=YES
pasv_min_port=60000   #被动模式最小端口
pasv_max_port=60100   #被动模式最大端口

注意:主动模式和被动模式可以同时配置,也可以只配置一种。但决定使用主动和被动模式的是ftp client。

vsftpd账号设置

vsftpd 匿名账号

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

与匿名用户相关的配置:

#启用匿名用户访问
anonymous_enable=YES

#允许匿名用户上传文件
anon_upload_enable=YES

#允许匿名用户创建文件
anon_mkdir_write_enable=YES

#允许匿名用户其它写入权限
anon_other_write_enable=YES

#匿名用户上传下载速率
anon_max_rate=5000000000

#匿名用户上传文件掩码
anon_umask=022

vsftpd系统账号

匿名用户配置会造成所有都上传、下载、删除和修改的权限,比较危险,对于存放私密文件匿名用户模式不适用。使用vsftpd系统用户方式验证登陆,相对来说比较安全,可以保障文件或目录专属于属主。系统账号即linux系统的账号。

创建虚拟账号并配置:

#增加账号
useradd test
echo 'test123' | passwd --stdin test

#vsftpd配置
local_enable=YES
write_enable=YES
local_umask=022

测试

ftp localhost
Connected to localhost (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (localhost:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (127,0,0,1,109,125).
150 Here comes the directory listing.
226 Directory send OK.
ftp> lcd /etc
Local directory now /etc
ftp> put issue
local: issue remote: issue
227 Entering Passive Mode (127,0,0,1,220,210).
150 Ok to send data.
226 Transfer complete.
23 bytes sent in 1.7e-05 secs (1352.94 Kbytes/sec)
ftp> dir
227 Entering Passive Mode (127,0,0,1,189,222).
150 Here comes the directory listing.
-rw-r--r--    1 1000     1000           23 Nov 15 07:55 issue
226 Directory send OK.
ftp> pwd
257 "/home/test"
ftp> 

vsftpd虚拟账号

linux系统用户太多毕竟不安全,我们只是想要vsftpd软件的用户,因此可以试用虚拟用户来登录vsftpd,多个虚拟用户可以映射到一个非登录的系统用户上。 创建虚拟用户文件,把这些用户名和密码存放在一个文件中。该文件内容格式是:用户名占用一行,密码占一行。

cd /etc/vsftpd/

cat login.txt 
testuser
testuserpass

这个文件的账号密码不能直接被使用,需要使用db_load命令生成密码数据库文件,命令如下:
db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

虚拟用户相关配置


#启动虚拟用户PAM认证
pam_service_name=vsftpd 
#启动虚拟用户
guest_enable=YES 
#映射账号到本地的用户test
guest_username=test 
#设置虚拟用户的配置文件存放路径
user_config_dir=/etc/vsftpd/vsftpd_user_conf  
#虚拟用户使用与本地用户相同的权限
virtual_use_local_privs=YES 
#允许上传修改属主
chown_uploads=YES
#属主设置为本地用户test
chown_username=test
#允许虚拟用户对配置目录有写权限
allow_writeable_chroot=YES
#设置虚拟用户上传下载的目录
local_root=/data/testuser

为了使服务器能够使用上述生成的数据库文件,对客户端进行身份验证,需要调用系统的PAM模块。PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。

vim /etc/pam.d/vsftpd   #只有下面三行

#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login 
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login 

测试

ftp localhost           
Connected to localhost (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (localhost:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (127,0,0,1,100,75).
150 Here comes the directory listing.
-rw-r--r--    1 1000     1000           23 Nov 15 08:58 issue
226 Directory send OK.
ftp> pwd
257 "/data/testuser"
ftp> delete issue
250 Delete operation successful.

案例

1. 打造企业级ftp

  1. 启用SSL证书配置
  2. 只允许虚拟账号上传下载,不允许删除文件
  3. 账号输入3次密码锁定100s,root每次都锁定

创建证书

yum install -y openssl
mkdir /etc/ssl/private
openssl req -newkey rsa:2048 -nodes -keyout /etc/ssl/private/vsftpd.key -x509 -days 365 -out /etc/ssl/private/vsftpd.crt

配置pam认证,账号输入3次密码锁定100s,root每次都锁定

cat /etc/pam.d/vsftpd
auth    required    pam_tally2.so    deny=3    unlock_time=100 even_deny_root root_unlock_time=200
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login

配置vsftpd

anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO

local_enable=YES
write_enable=YES
local_umask=022
connect_from_port_20=YES



#设置ftp client 链接限制
max_clients=10
max_per_ip=2
anon_max_rate=0
local_max_rate=500000
idle_session_timeout=600

#日志设置
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
log_ftp_protocol=YES


nopriv_user=nobody
async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
chroot_local_user=YES
ls_recurse_enable=YES
listen=YES

chown_uploads=YES
chown_username=test
guest_enable=YES
guest_username=test
virtual_use_local_privs=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES

# 限制ftp目录
local_root=/home/test

# 强制ftl走ssl协议
ssl_enable=YES
debug_ssl=YES
ssl_tlsv1=YES
ssl_tlsv1_2=YES
ssl_sslv2=YES
ssl_sslv3=YES

# SSL证书位置
ca_certs_file=/etc/ssl/private/vsftpd.crt
rsa_cert_file=/etc/ssl/private/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key

# 禁止匿名用使用SSL
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES

# 加强安全设置
require_ssl_reuse=NO
ssl_ciphers=HIGH
port_enable=NO
pasv_enable=YES
# pasv_enable为NO下列2个配置不生效
pasv_min_port=4000
pasv_max_port=4500

# 禁止删除,只允许虚拟账号上传下载,不允许删除文件
cmds_denied=RMD,DELE
收藏
评论区

相关推荐

vsftpd工作原理和使用详解
vsftpd工作原理和使用详解 简介 FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程
微信小程序验证url地址
笔记类 var that this that.optional()是验证是否为空方法 url(value) { return that.optional(value) || /^(?:(?:(?:https?|ftp):)?//)(?:S(?::S)?@)?(?:
HTTP协议与TCP,DNS , IP 协议的关系
在TCP/IP协议族中与HTTP密不可分的有3个协议,分别是IP、TCP和DNS。下面简单介绍下这3种协议。 1、IP协议         IP(Internet Protocol)网际协议位于网络层,几乎所有使用网络的系统都会用到 IP 协议。TCP/IP 协议族中的 IP 指的就 是网际协议,"IP"和"IP地址"是不同的,"IP"其实是一种协
TCP/IP网络协议
1、  简述osi七层模型和TCP/IP五层模型 一、OSI参考模型         今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。  1、OSI的来源         OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,
记一次基于ECS搭建FTP服务_红烧土豆泥的博客-CSDN博客
基于ECS搭建FTP服务简介: FTP(File Transfer Protocol):即文件传输协议,是TCP/IP协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器
阿里二面,面试官居然把 TCP 三次握手问的这么细致
TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度。看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了。本文会围绕,三次握手和四次挥手相关的一些列核心问题,分享如何更准确的回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了。 面试TCP的意义
聊聊dubbo协议
协议协议通俗易懂地解释就是通信双方需要遵循的约定。我们了解的常见的网络传输协议有tcp、udp、http等。再到我们常用的基础组件,一般来说client端与server端也有相应的协议,如redis、mysql、zookeeper等都是各自约定的私有协议,同样今天标题中的dubbo协议也是一种私有协议,他们都是应用层协议,基于tcp或udp设计。
tcp的三次握手四次挥手
tcp的三次握手流程: 在tcp/ip协议中,tcp协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送SYN包【synj】到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到SYN包,必须确认客户的SYN(ackj1),同时自己也发送一个SYN包(syn
关于根据颜色刷选图像内容的问题
在CSDN本人博文《OpenCVPython图像处理:用inRange刷选图像中指定颜色对象案例》(请点击文章底部最下方的“阅读原文”跳转CSDN阅读原文)中介绍了根据颜色刷选图像内容相关的概念及实现,介绍了通过使用inRange在HSV颜色空间中识别制定颜色的图像内容,文中概要介绍了HSV颜色空间中进行制定颜色对象识别的要点,使用的inRange函数的语法
肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁
系列导读 本文是 【网络知识扫盲】专栏的第三篇。今天要给大家介绍的一个 Unix 下的一个 网络数据采集分析工具 \ Tcpdump,也就是我们常说的抓包工具。与它功能类似的工具有 wireshark ,不同的是,wireshark 有图形化界面,而 tcpdump 则只有命令行。由于我本人更习惯使用命令行的方式进行抓包,因此今天先跳过
Qt使用QSocket做tcp简单客户端
首先要在工程文件.por中添加network添加新文件在头文件中导入qtcpsocket之后定义成员函数用于发送和接收数据Qt封装的socket使用的是信号槽监听接收到的数据所以需要添加监听使用的传输格式 报文长度8字节字符串 + base64转码的json报文头文件cppifndef TCPSOCKETHdefine TCPSOCKETHinclude<Q
盘点一款强大的网络工具集------netwox
大家好,我是Python进阶者,今天给大家分享一个网络工具netwox。前言 netwox 是由 lauconstantin 开发的一款网络工具集,适用群体为网络管理员和网络黑客,它可以创造任意的 TCP、UDP 和 IP 数据报文,以实现网络欺骗,并且可以在 Linux 和 Windows 系统中运行。 可以说,对平时我们用来测试网络的性能和网站压力测试很
Java面试真题解析火爆全网,讲的太透彻了
8.15 一面 (60min) 自我介绍,为什么投客户端 python和java有什么区别 java内存模型 gc讲讲 http https区别 cookie,session https握手过程 对称非对称加密算法?哪个效率高? tcp握手要三次,挥手要几次,为什么 进程和线程,描述一下 进程通信方式 线程同步
BAT这种大厂履历意味着什么?面试篇
8.15 一面 (60min) 自我介绍,为什么投客户端 python和java有什么区别 java内存模型 gc讲讲 http https区别 cookie,session https握手过程 对称非对称加密算法?哪个效率高? tcp握手要三次,挥手要几次,为什么 进程和线程,描述一下 进程通信方式 线程同步
网络知识扫盲:扒开 TCP 的外衣,我看清了 TCP 的本质
后台回复关键字 “黑魔法”,即可获取明哥整理的《Python黑魔法指南》大家好,我是明哥。从上周开始,我开始了一个新的文章专栏:网络知识扫盲并写下了第一篇文章:从阅读和在看数来看,大家对这个系列还是比较期待的,所以这周我全身心地投入本篇文章的编写,用了整整 4个晚上的时间梳理了这篇关于 TCP 的重点知识,另外还参考 小林 coding 的文章配图,用了一天