热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vsftp服务搭建(虚拟账号+被动访问)

关于vsftp全部文章:1、vsftp服务搭建(虚拟账号被动访问)2、通过公网登录vsftp服务3、vsftp容器搭建go开发web用户管理界面

关于vsftp全部文章:
1、vsftp服务搭建(虚拟账号+被动访问)
2、通过公网登录vsftp服务
3、vsftp容器搭建+go开发web用户管理界面(更新于2022.02.23)

需求

搭建一个上传下载文件服务
1.A公司分配三个用户,B公司分配3个用户
2.A、B公司文件隔离,不能相互影响
3.每一个用户都有上传下载权限

先了解下ftp两种访问模式
1、主动模式PORT
主动模式的逻辑图

如上图所示,在主动模式下,FTP客户端从任意端口5150(端口号>1023)发起一个FTP请求,并携带自己监听的端口号5151(发送的端口号+1=监听端口号);随后服务器返回确认,然后从服务器本地的20端口主动发起连接请求到客户端的监听端口5151,最后客户端返回确认。
这种模式缺点在于服务器带客户端的FTP连接很容易被传输过程中的路由器、防火墙所影响或拦截。

2、被动模式PASV
在这里插入图片描述

为了主动模式所面临的服务器到客户端的连接会被拦截阻塞的问题,FTP发展出了被动模式。在被动模式中,命令连接和数据连接都由客户端来发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙拦截的问题。
如上图所示,客户端用随机命令端口5150向服务器的21命令端口发送一个PASV请求,然后服务器返回数据端口3267,告诉客户端我在哪个端口监听数据连接。然后客户端向服务器的监听端口3268发起数据连接,最后服务器回复确认ok。

1、搭建vsftp服务

yum install vsftpd -y

2、创建虚拟账户

2.1、创建用户名单文件vsftpd_virtualuser.txt

vim /etc/vsftpd/vsftpd_virtualuser.txt

新增:

a-1
123456
a-2
123456
a-3
123456
b-1
123456
b-2
123456
b-3
123456

2.2、加密用户名密码,不加密ftp服务是读取不到的


db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db解释:-T:转化 -t:转换方式为hash

2.3、修改数据库文件权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

2.4、修改 vsftpd 对应的 PAM 配置文件/etc/pam.d/vsftpd,将默认配置使用“#”全部注释,添加刚才生成好的数据库文件

vim /etc/pam.d/vsftpd
注释之前的所有配置
新增:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_virtualuser
account required pam_userdb.so db=/etc/vsftpd/vsftpd_virtualuser

2.5、创建系统账号,这里的系统账号下面会与虚拟账号关联起来

mkdir /ftp/company -p
useradd -d /ftp/company/a company-a
chmod -R 700 /ftp/company/auseradd -d /ftp/company/b company-b
chmod -R 700 /ftp/company/b

3、配置服务

3.1修改服务全局配置文件,由于vsftp参数很多,简单说明

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO #关闭匿名用户功能
local_enable=NO #关闭本地登录功能
listen_port=10021 #新增字段。修改默认端口号为10021
xferlog_std_format=YES
use_localtime=YES #时间与本地同步
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log #开启日志
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=yes # 开启被动模式,默认打开
pasv_max_port=10090 # 数据连接使用的最大端口
pasv_min_port=10080 # 数据连接使用的最小端口
user_config_dir=/etc/vsftpd/vuserconfig # 设置虚拟帐号的主目录为vuserconfig

我的全部有效配置:

[root@otrs-server ~]# cat /etc/vsftpd/vsftpd.conf |grep ^[^#]
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=007
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
listen_port=10021
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=yes
pasv_max_port=10090
pasv_min_port=10080
user_config_dir=/etc/vsftpd/vuserconfig

3.2、修改服务虚拟账户配置文件

在 user_config_dir 指定路径下,建立与虚拟帐号同名的配置文件并添加相应的配置字段,必须与全局配置文件位置一致。

mkdir /etc/vsftpd/vuserconfig

这里的ftp名称需要与虚拟账户名称一致,也就是/etc/vsftpd/vsftpd_virtualuser.txt文件中的名称一致

举例a公司虚拟账户配置文件:

vim /etc/vsftpd/vuserconfig/a-1

# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号为ftpuser,虚拟账户将具有ftpuser系统用户的权限
guest_username=company-a
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/company/a
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

以此类推,b公司虚拟账户配置文件

vim /etc/vsftpd/vuserconfig/b-1

# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号为ftpuser,虚拟账户将具有ftpuser系统用户的权限
guest_username=company-b
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/company/b
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

附上ftp报错码解释
500 #文件系统权限过大
530 #用户认证失败
550 #服务本身功能未开放,服务本身的错误
553 #本地文件系统权限过小

日志解释

Mon Mar 29 23:18:08 2021 1 ::ffff:192.168.84.1 15 /a/123.txt a _ o g a-2 ftp 0 * c

Mon Mar 29 23:18:08 2021 时间
15 大小 (b字节)
/a/123.txt 路径
a a以ASCII方式传输;b以二进制(binary)方式传输
_ 特俗字符,不做任何标准
o "i"上传;"o"下载
g 用户访问模式:"a"匿名用户;"g"访客模式;"r"系统中用户
a-2 登录用户名
ftp 服务名称,一般都是ftp
0 认证方式:"0"无;"1"RFC931认证;
* 认证用户id,"*"表示无法获取id
c 完成状态:"i"传输未完成;"c"传输已完成;

参考:http://blog.dothinkings.com/wp/?p=1014






进阶配置

1、FTP服务信息


IP地址端口号
172.16.100.710021

1.1连接方式

xftp6等

1.2功能模块

1、支持热更新账户信息

2、针对指定用户限制访问目录、上传和下载

3、针对指定用户限制上传速率

4、登录点相互隔离

1.3方案

根据VSFTP服务,虚拟账户绑定系统用户原理,只要控制系统用户权限即可,初步划分如下表

系统用户名称目录系统用户组系统用户权限虚拟账户名称
FTPcompany/companyFTPcompany、FTPcompanyA、FTPcompanyB、FTPcompanyC770company
FTPcompanyA/ftp/company/AFTPcompanyA770companyA
FTPcompanyB/ftp/company/BFTPcompanyB770companyB
FTPcompanyC/ftp/company/CFTPcompanyC770companyC

1.4目录结构

主目录:/company

A公司分配目录为/ftp/company/A,分配虚拟账户companyA绑定系统用户FTPcompanyA,设置系统用户FTPcompanyA为目录/ftp/company/A所属主,设置系统用户FTPcompany为目录/ftp/company/A所属组,其他用户无权访问,并各公司文件目录相互隔离,不能进入其他公司目录。其他公司设置以此类推。

2、测试结果

当虚拟用户company登录FTP服务时,可看到所有公司文件,拥有A、B、C公司文件目录所有权(上传、下载、修改);

当虚拟用户-companyA登录FTP服务时,不能看到其他公司文件,只拥有A公司文件目录所有权(上传、下载、修改);

当虚拟用户companyB登录FTP服务时,不能看到其他公司文件,只拥有B公司文件目录所有权(上传、下载、修改);

当虚拟用户companyC登录FTP服务时,不能看到其他公司文件,只拥有C公司文件目录所有权(上传、下载、修改)。

3、管理员操作


3.1手动新增公司

例如新增D公司,配置虚拟账户FTP-companyD,新增系统用户companyD与之关联

3.1.1编辑虚拟用户名单

vim /etc/vsftpd/vsftpd_virtualuser.txt
追加:
companyD
123456

注释:格式不可更改,用户名:companyD,密码:123456

新增用户信息

3.1.2转换文件

db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

3.1.3修改权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

3.1.4新增系统用户

useradd -d /ftp/ftp/company/D FTPcompanyD

解释:新增系统用户companyD,指定家目录为/ftp/company/D

3.1.5赋予权限

chmod 770 /ftp/ftp/company/D -R

3.1.6添加所属组

gpasswd -a FTPcompany FTPcompanyD

注释:把用户FTPcompany新增组FTPcompanyD

3.1.7配置虚拟账户信息

vim /etc/vsftpd/vuserconfig/companyD
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号FTPcompanyD,虚拟账户将具有FTPcompanyD系统用户的权限
guest_username=FTPcompanyD
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/ftp/company/D
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

3.2删除公司

例如,删除D公司

3.2.1编辑虚拟用户名单

vim /etc/vsftpd/vsftpd_virtualuser.txt
删除:
companyD
123456

注释:格式不可更改,用户名:FTP-companyD,密码:123456

3.2.2转换文件

db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

3.2.3修改权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

3.2.4删除虚拟用户

rm -rf /etc/vsftpd/vuserconfig/companyD

3.2.5删除系统用户所属组

gpasswd -d FTPcompany FTPcompanyD

3.2.6删除系统用户

(1)系统用户与家目录一起删除

userdel -r FTPcompanyD

(2)只删除系统用户

userdel FTPcompanyD

4、开发规划

第一阶段:编写脚本,提供使用者输入用户名密码即可创建用户、删除用户

#!/bin/bash
echo "----------------------------------"
echo -e "\033[35m FTP用户管理\033[0m"
echo "(1) 新增用户"
echo "(0) 删除用户"
echo "----------------------------------"
read -p "请输入序列号:" input
case $input in1)
read -p "请输入用户名称:" addftpuser
sleep 1
grep $addftpuser /etc/vsftpd/vsftpd_virtualuser.txt >> /dev/null
if [ $? -eq 0 ]; then
echo "用户已存在" && exit
fiecho $addftpuser >> /etc/vsftpd/vsftpd_virtualuser.txt
read -p "请输入密码:" addftpuserpasswd
echo $addftpuserpasswd >> /etc/vsftpd/vsftpd_virtualuser.txtecho "----------------------------------"echo "(1) 确认"
echo "(0) 退出程序"
echo "----------------------------------"
read -p "请输入序列号:" input1
#-------------------------------
case $input1 in
1)
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
useradd -d /ftp/company/$addftpuser FTP$addftpuser -s /sbin/nologin
chmod 770 /ftp/company/$addftpuser -R
gpasswd -a FTPcompany FTP$addftpuser >> /dev/null
cat>/etc/vsftpd/vuserconfig/$addftpuser<<EOF
# 开启虚拟帐号登录
guest_enable&#61;yes
# 设置 ftp 对应的系统帐号companyD&#xff0c;虚拟账户将具有companyD系统用户的权限
guest_username&#61;FTP$addftpuser
# 允许在文件系统写入权限
write_enable&#61;yes
# 允许创建文件夹
anon_mkdir_write_enable&#61;yes
# 限定传输速率为 50KB/s
anon_max_rate&#61;50000
# 如果设置了可写权限&#xff0c;要加上配置项
allow_writeable_chroot&#61;yes
# 默认家目录&#xff0c;可以修改
local_root&#61;/ftp/company/$addftpuser
# 下载文件和目录权限
anon_world_readable_only&#61;NO
# 创建文件和目录权限
anon_upload_enable&#61;YES
# 上传覆盖文件和目录权限
anon_other_write_enable&#61;YES
EOF
echo "$addftpuser ftp用户已创建成功"
;;
0)
sed -i &#39;$d&#39; /etc/vsftpd/vsftpd_virtualuser.txt
sed -i &#39;$d&#39; /etc/vsftpd/vsftpd_virtualuser.txt
exit
;;
esac
;;
0)
read -p "请输入要删除的用户:" delftpusergrep $delftpuser /etc/vsftpd/vsftpd_virtualuser.txt >> /dev/null
if [ $? -ne 0 ]; then
echo "用户不存在" && exit
fi
echo "(1) 只删除用户&#xff0c;保留用户上传数据"
echo "(2) 彻底删除用户所有信息 "
read -p "请选择:" delftpuser1
case $delftpuser1 in
2)
sed -i "/$delftpuser/,&#43;1d" /etc/vsftpd/vsftpd_virtualuser.txt
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
rm -rf /etc/vsftpd/vuserconfig/$delftpuser
gpasswd -d FTPcompany FTP$delftpuser >> /dev/null
userdel -r FTP$delftpuser
echo "已删除用户$delftpuser"
;;
1)
sed -i "/$delftpuser/,&#43;1d" /etc/vsftpd/vsftpd_virtualuser.txt
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
rm -rf /etc/vsftpd/vuserconfig/$delftpuser
gpasswd -d FTPcompany FTP$delftpuser >> /dev/null
userdel FTP$delftpuser
chmod 000 /ftp/company/$delftpuser
echo "已删除用户$delftpuser,保留用户数据"
;;
esac;;
esac

第二阶段&#xff1a;集成web界面网页配置用户&#xff0c;记录增删公司数据、统计数据上传数据库
vsftp容器版&#43;web管理界面


推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
author-avatar
手机用户2502904457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有