Linux vsftpd 服务

Posted m-zhuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux vsftpd 服务相关的知识,希望对你有一定的参考价值。

ftp的数据连接模式

主动模式:服务器主动发起数据连接
被动模式:服务器被动等待数据连接

主动模式(Active Mode):

在主动模式下,FTP客户端首先与FTP服务器的默认端口(通常是端口21)建立控制连接。
当需要进行数据传输时,客户端会随机选择一个未使用的端口(通常是大于1024的端口)作为源端口,
然后告知服务器使用该端口进行数据连接。服务器通过控制连接将数据连接请求发送到客户端的指定端口,
建立数据连接并进行数据传输。

被动模式(Passive Mode):

在被动模式下,FTP客户端首先与FTP服务器的默认端口(通常是端口21)建立控制连接。
当需要进行数据传输时,服务器会随机选择一个未使用的端口(通常是大于1024的端口)作为源端口,
并将该端口告知客户端。客户端通过控制连接向服务器指定的端口发起数据连接,建立数据连接并进行数据传输。

区别:

主动模式和被动模式在数据连接的建立方式上有所区别,主要涉及客户端和服务器之间数据连接的建立和传输。
在网络环境复杂或存在防火墙的情况下,被动模式通常更容易穿越防火墙,因此在实际应用中被广泛使用。

1. 配置vsftpd服务

检查是否安装vsftpd,若未安装,使用本地yum源进行下载安装

[root@localhost ~]# rpm -q vsftpd
未安装软件包 vsftpd 
[root@localhost ~]# yum -y install vsftpd

2. 匿名用户访问ftp服务

(1)下载

① 服务器配置

服务器ip地址为 192.168.23.5

# 备份配置文件 vsftpd.conf
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp -a vsftpd.conf vsftpd.conf.bak20230519

# 修改配置文件 vsftpd.conf
[root@localhost vsftpd]# vim vsftpd.conf
	anonymous_enable=YES	# 匿名用户访问权限

# 重启 vsftpd 服务
[root@localhost vsftpd]# systemctl restart vsftpd

# 关闭服务器防火墙、selinux安全机制
[root@localhost vsftpd]# systemctl stop firewalld.service 
[root@localhost vsftpd]# setenforce 0


② 打开window10主机,下载服务器中的/var/pub/file1.txt文件

下载默认路径 C:\\Users\\用户名\\

ftp 192.168.23.5
	ftp
	按回车键
cd pub
get file1.txt


(2)上传

① 服务器配置

# 修改配置文件 vsftpd.conf
[root@localhost vsftpd]# vim vsftpd.conf
	anonymous_enable=YES	# 匿名用户访问权限
	write_enable=YES		# 开放服务器写权限,若要上传必须开启
	local_umask=022			# 反掩码 文件的权限控制
	anon_umask=022			# 匿名用户上传文件的权限反掩码(需要手动添加)
	anon_upload_enable=YES			# 匿名用户可以创建上传文件
	anon_mkdir_write_enable=YES		# 匿名用户可以创建上传目录
	anon_other_write_enable=YES		# 匿名用户可以删除、覆盖文件、重命名(需要手动添加)
[root@localhost vsftpd]# systemctl restart vsftpd


② 将windows10客户机中的 C:\\Users\\admin\\file2.txt文件上传至服务器 /var/ftp/pub/目录下

ftp 192.168.23.5
	ftp
	按回车键
cd pub
put file2.txt


3. 本地用户访问ftp服务

(1)下载

① 服务器配置

设置本地用户可以访问ftp,禁止匿名用户访问

[root@localhost vsftpd]# vim vsftpd.conf
	anonymous_enable=NO	# 将匿名用户访问权限关闭
	local_enable=YES		# 本地用户访问权限
	
[root@localhost vsftpd]# systemctl restart vsftpd


② 打开window10主机,下载服务器中的/home/user1/file3.txt文件

本地用户登录的位置默认在该用户的家目录下

ftp 192.168.23.5
	user1
	000(user1密码)
get file3.txt

(2)上传

① 服务器配置

[root@localhost vsftpd]# vim vsftpd.conf
	local_enable=YES		# 本地用户访问权限
	local_umask=002			# 设置本地用户创建上传文件的权限反掩码

[root@localhost vsftpd]# systemctl restart vsftpd


② 将windows10客户机中的 C:\\Users\\admin\\file2.txt文件上传至服务器 /var/ftp/pub/目录下

ftp 192.168.23.5
	user1
	000(user1密码)
put file4.txt


(3)禁锢用户访问目录

由于本地用户可以随意切换目录,权限较大,有很大安全隐患。

将用户访问禁锢在宿主的家目录中

[root@localhost vsftpd]# vim vsftpd.conf
	local_enable=YES		# 本地用户访问权限
	local_umask=002			# 设置本地用户创建上传文件的权限反掩码
	chroot_local_user=YES	# 打开用户访问禁锢在宿主家目录设置
	allow_writeable_chroot=YES	# 添加用户在禁锢的宿主家目录中有可写权限
	
[root@localhost vsftpd]# systemctl restart vsftpd



4. 黑名单与白名单

名单配置文件位置: /etc/vsftpd/user_list

在配置文件 /etc/vsftpd/vsftpd.conf 中

将 userlist_enable=YES 启用user_list用户列表设置打开

当 userlist_deny=YES 时 user_list 用户列表是黑名单

当 userlist_deny=NO 时 user_list 用户列表是白名单

(1)黑名单

在黑名单上的用户都不可以访问服务器的ftp服务

[root@localhost vsftpd]# vim vsftpd.conf
	local_enable=YES		# 本地用户访问权限
	userlist_enable=YES		# 启用user_list用户列表
	userlist_deny=YES		# 将user_list用户列表设置为黑名单

[root@localhost vsftpd]# systemctl restart vsftpd






(2)白名单

在白名单上的用户都可以访问服务器的ftp服务

[root@localhost vsftpd]# vim vsftpd.conf
	local_enable=YES		# 本地用户访问权限
	userlist_enable=YES		# 启用user_list用户列表
	userlist_deny=NO		# 将user_list用户列表设置为白名单

[root@localhost vsftpd]# systemctl restart vsftpd




5. 使用软件访问ftp服务

(1)软件访问服务器ftp服务

[root@localhost vsftpd]# vim vsftpd.conf
	#chroot_local_user=YES	# 关闭用户访问禁锢在宿主家目录设置
		
[root@localhost vsftpd]# systemctl restart vsftpd



(2)下载与上传

[root@localhost vsftpd]# vim vsftpd.conf
	anonymous_enable=NO	# 将匿名用户访问权限关闭
	local_enable=YES		# 本地用户访问权限
	local_enable=YES		# 本地用户访问权限
	local_umask=002			# 设置本地用户创建上传文件的权限反掩码
	
[root@localhost vsftpd]# systemctl restart vsftpd

① 下载

将服务器中/data 目录下载到 客户机 C:\\Users\\admin\\ 文件夹下



② 上传

将客户机刚刚下载的data文件夹上传到服务器 /home/user1目录下




Linux 安装 vsftpd 服务并配置

Linux 安装 vsftpd 服务并配置

  1. 服务器下载安装 vsftpd
# 安装
yum install -y vsftpd

# 查看版本
vsftpd -v

#启动服务
service vsftpd start

# 修改配置后重新启动
service vsftpd restart

vsftp 配置

配置文件 /etc/vsftpd/vftpd.conf

  1. 匿名用户

匿名用户登陆,默认用户名为 ftp,密码任意,默认访问根目录为 /var/ftp

匿名用户上传的文件及文件夹默认属主为 ftp:ftp

anonymous_enable=YES  # 允许匿名用户登录 | NO
anon_upload_enable=YES # 允许匿名用户上传文件 |NO
anon_mkdir_write_enable=YES # 允许创建文件夹 | NO
anon_other_write_enable=YES # 允许删除,重命名等权限
anon_root=$root # 设置匿名用户访问的根目录

# 修改匿名用户上传文件的用户归属者 
chown_uploads=yes
chown_username=$user
# 注意,只能更改文件 owner,不能改变 group,同时此条指令对 创建的文件夹无效
一些说明

如果开启匿名用户,将 /var/ftp/ 文件夹的 w 权限取消,chmod a-w /var/ftp,同时创建一个 文件夹并给与全部权限,这样就可以让匿名用户在这个文件夹内进行操作

cd /var/ftp; mkdir pub; chmod 777 pub

另外,修改 anon_umask=022 用来保证让匿名用户对文件夹有读写权限,这样可以让用户下载

如果不修改anon_umask,默认会消除文件及文件夹的读权限,导致文件不可读

如果出现问题,请注意权限

  1. 服务端用户

默认情况下,除了被锁定的用户外,普通用户是可以通过 ftp 登录到系统的

/etc/vsftpd 下的 ftpusersuser_list 文件

相关配置
local_enable=YES # 是否允许
local_umask=022 # 新建文件权限管理

默认情况下,使用服务端用户登录是可以访问到 系统的 / 目录的

限制用户访问目录

chroot_local_user=YES # 允许本地用户登录
allow_writeable_chroot=YES # 允许对顶级目录进行修改
# 如果不用上面那条指令,请关闭 用户对其家目录的 写权限
# 这样就会让用户无法在根目录下进行写操作,只能在二级目录下进行操作

相关信息可以看配置文件的相关说明

  1. 虚拟用户登录

参考链接,写的很棒,很详细

配置虚拟用户及密码,新建一个文件用来存放 账号密码

每两行对应账号与密码,例如 touch vuser.txt,然后写入信息

hello
123456
jack
abcd

接着配置

# 转换数据库 修改权限
db_load -T -t hash -f vuser{,.db}
chmod 600 vuser{,.db}

# 创建用户,用于虚拟账户登录
useradd -d /opt/vuser -s /sbin/nologin vuser

# 配置验证模块
vim /etc/pam.d/vsftpd.vu
# 写入一下内容 注意之前生成文件的位置
auth required pam_userdb.so db=/etc/vsftpd/vuser ##识别转换过的数据库文件
account required pam_userdb.so db=/etc/vsftpd/vuser ##连接的密码服务

# 修改配置文件
#pam_service_name=vsftpd ##注释
##添加下面三行内容,下面可能会出现问题,可以把 注释删除,不要留有多余的空格
guest_enable=YES  ##开启来宾用户访问
guest_username=vuser ##使用vuser用户名
pam_service_name=vsftpd.vu ##pam模块

接下来就可以用 虚拟用户登录了

登陆之后,会发现可以上传文件,但是无法查看根目录的文件 (根目录下的一级目录不可读)

这时可以修改 vuser的家目录的权限 chmod o+r ~vuser 给与权限

因为我之前设置的 anon_umask=022,所以可以进入自己创建的文件夹,如果不设置,或者权限更严格,可能会造成文件夹读不出


为用户制定权限

mkdir vu_dir
# 修改 /etc/vsftpd/vsftpd.conf 添加 => 指定配置文件路径
user_config_dir=/etc/vsftpd/vu_dir

然后在vu_dir 中创建以用户名为名称的文件

echo anon_umask=000 > hello # 修改 hello 用户的权限
echo local_root=$path >> hello # 修改 hello 用户的根目录
# 因为 hello 的操作实际是由 vuser 进行的,所以需要保证 vuser 对 $path 有相应的操作权限

ftp 服务运行模式

  1. 主动模式

这种模式下,简述而言,就是在服务端与客户端连接完成,完成认证之后。客户端告知服务端自身服务监听的端口号,在传输数据与命令时,服务端主动去连接客户端指定的并发送数据。

主动模式下,由于是服务端主动访问客户端,所以需要保证客户端能够暴露端口号,然而客户机一般在内网之内,服务端无法穿过内网与客户端建立连接,这种情况下可以使用下面的被动模式

  1. 被动模式

这种模式可以解决 客户端 在内网内的问题,ftp 服务主进程负责接收新的连接请求,然后开启子进程去处理单个连接。也就是说对于每个外部连接,ftp都会单独建立一个通道,并告知客户端,在之后的数据传输过程中,客户端只需要将数据和命令发送到新的通道上(不同端口上建立的 tcp 连接),这样只需要让服务端暴露端口与 ip即可,服务端一般拥有公网 ip,可以解决上述内网访问问题

服务器 ftp 访问

本机访问服务器,需要使用 被动模式,但是由于服务器也在内网之内,(网络这里理解的不够好,应该就是在服务器外层加一层防护,这应该也是 安全组作用的地方,然后访问公网 ip,对应端口转发到内部服务器即可)

基本配置就是让 vsftpd 开启被动模式,同时设置端口范围,注意服务器一定要在服务器安全组开放指定端口

如果开启了防火墙,也要打开指定端口

pasv_enable=YES
# 端口范围
pasv_min_port=30000 
pasv_max_port=31000

如果只这样设置的话,ftp 服务交互时,通过 wireshark 可以发现,服务端确实新开了一个通道,但是通知客户端时,返回的 ip 是其内网地址,导致客户端去尝试连接,却始终失败

所以需要指定 服务器地址,让服务端向客户端通知时,使用这个 ip

pasv_address=$ip # $ip 是服务器的外网 ip

# 另外 开启 ipv4 关闭 ipv6 ,这个方面不是很理解
listen=YES
#listen_ipv6=YES

其他知识

chroot => 修改根目录 参考

umask => 掩码 设置文件权限

selinux 安全相关

netstat -anp | grep vsftpd => 观察 vsftpd 启动的端口,被动模式下,如果文件传输很快,观察不到新开的通道

wireshrak 可以分析下 客户端与服务端通信的过程

以上是关于Linux vsftpd 服务的主要内容,如果未能解决你的问题,请参考以下文章

Linux 安装 vsftpd 服务并配置

Linux文件服务器Vsftpd安装

vsftpd嵌入式linux简易配置vsftpd服务

vsftpd嵌入式linux简易配置vsftpd服务

自学鸟哥linux服务-vsftpd

linux开通vsftpd服务过程