VSFTP 服务器搭建(Centos)

VSFTP 服务器搭建

  • 采用虚拟用户模式
  • 被动模式(passive mode)
  • 操作系统版本:centos7/8 及其对齐版本
  • 备注:请关闭 selinux

vsftpd 英文全称:very secure ftp daemon,中文:非常安全的 FTP 守护进程,它是一款完全开源且免费、运行在 Linux 操作系统上的 FTP 服务程序。

vsftpd 支持 3 种认证模式登录 FTP 服务器,它们分别是:

认证模式

虚拟用户模式

虚拟用户模式是更安全地一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供 FTP 服务器认证使用。这样,即便黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响,一般采用该模式。

匿名开放模式

匿名开放模式是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到 FTP 服务器,默认的用户名是:anonmous;十分不推荐使用。

本地用户模式

本地用户模式是通过 Linux 系统本地的账户密码信息进行认证的模式,对比匿名开放模式更安全。但是如果黑客破解了账户的信息,就可以畅通无阻地登录 FTP 服务器,从而完全控制该服务器,一般不推荐。

1、安装 vsftpd

安装 vsftpd,此处采用 yum 安装 vsftpd:

bash 复制代码
yum install vsftpd

生成虚拟用户,虚拟用户配置文件存放至 /etc/vsftp/virtrl-user.pag(备注 centos8)或者 /etc/vsftp/virtrl-user.db(备注 centos7)中。

(1)centos8 及其对齐版本,需要使用 gdbmtool 生成虚拟用户

bash 复制代码
gdbmtool
# 进入 gdbmtool 模式

open /etc/vsftp/virtrl-user.pag
# 打开 /etc/vsftp/virtrl-user.pag 数据库

store testUser testUser
# 创建所需用户,密码

list
# 查看账号密码

(2)centos7 及其对齐版本,需要使用 db_load 生成虚拟用户

创建密码文本,单数行账号,双数行密码:

bash 复制代码
cat >> /etc/vsftpd/virtrl-user.txt <<EOF
testUser
testUser
EOF

# 生成数据库文件
db_load -T -t hash -f virtrl-user.txt virtrl-user.db

# 删除原始明文文件
rm -f vu.txt

3、创建 vsftpd 服务程序用于存储文件的根目录及虚拟用户映射的系统本地用户

创建 vsftpd 服务程序用于存储文件的根目录 /data/ftp 以及用于虚拟用户映射的系统本地用户 testUser。此外,为了安全起见,将 ftpadmin 系统本地用户设置为不允许登录该服务器。(根目录和本地用户可根据实际情况创建)

bash 复制代码
# 创建系统本地用户 ftpadmin 及所属目录并禁用该用户登录服务器
useradd -d /data/ftp -s /sbin/nologin testUser

# 创建虚拟用户 ftp 的目录,原则上一个虚拟账号一个目录;
# 如果多个虚拟账号共用一个目录,创建一个即可;
# 如果一个账户需要访问多个目录,此处只记录上级目录即可
mkdir /data/ftp/testUser

# 修改虚拟用户 ftp 的所属组和所属用户
chown -R testUser:testUser /data/ftp/testUser

# 修改 /data/ftp/ 的权限
chmod -Rf 755 /data/ftp/

4、编辑用于支持虚拟用户的 PAM 文件

备注:不用写数据库文件 .db/.pag 的后缀

bash 复制代码
vi /etc/pam.d/vsftpd
复制代码
#%PAM-1.0
auth     sufficient /lib64/security/pam_userdb.so  db=/etc/vsftpd/virtrl-user
account  sufficient /lib64/security/pam_userdb.so  db=/etc/vsftpd/virtrl-user

5、创建虚拟用户权限目录 /etc/vsftpd/vu_perm

创建目录 /etc/vsftpd/vu_perm 用于存放为不同虚拟用户设置不同的权限的文件。

备注:目录可自行命名,此处为示例,示例虚拟用户为 testUser

bash 复制代码
# 创建目录 /etc/vsftpd/vu_perm
mkdir /etc/vsftpd/vu_perm

创建虚拟用户 testUser的权限文件 testUser,使其具备上传、下载、创建目录、删除和移动文件的权限,且能访问 zhengzhougj 目录:

bash 复制代码
cat >> /etc/vsftpd/vu_perm/ftp <<EOF
local_root=/data/ftp/testUser
# 用户的根目录设置为 /data/ftp/testUser
anonymous_enable=NO
# 禁止匿名登录
anon_upload_enable=YES
# 允许上传
anon_world_readable_only=NO
# 有读权限即可下载,必须配置
anon_other_write_enable=YES
# 允许删除
anon_mkdir_write_enable=YES
# 允许创建目录
write_enable=YES
# 写权限
local_umask=022
idle_session_timeout=600
# 空闲会话超时时间为 600 秒。如果客户端在该时间内没有发送任何数据或命令,服务器将会关闭与客户端的连接
data_connection_timeout=120
# 数据连接超时时间为 120 秒。在建立数据连接后,如果在该时间内未进行任何数据传输,服务器将会关闭数据连接。
local_max_rate=204800
# 最大传输速率为 204800 bits
EOF

创建虚拟用户 testUser的权限文件 testUser,使其具备上传、下载、创建目录、删除和移动文件的权限。

配置文件配置同上,仅需修改目录即可:

复制代码
local_root=/data/ftp/testUser
bash 复制代码
# 为了安全起见,递归修改 /etc/vsftpd/vu_perm 的权限
chmod -R 600 /etc/vsftpd/vu_perm/

6、配置 vsftpd 服务程序的主配置文件

bash 复制代码
# 备份 vsftpd 服务程序的主配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk

# 修改如下
vim /etc/vsftpd/vsftpd.conf
ini 复制代码
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=YES
listen_ipv6=NO
xferlog_enable=YES
xferlog_file=/var/log/xferlog
guest_enable=YES
# 启用虚拟用户
guest_username=ftpadmin
# 指定虚拟用户绑定的系统用户名
user_config_dir=/etc/vsftpd/vu_perm
# 虚拟用户的配置文件目录
allow_writeable_chroot=YES
anon_other_write_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd
userlist_enable=YES
listen_port=9096
# 自定义端口
pasv_enable=YES
# 被动模式
pasv_min_port=30000
# 被动开始端口
pasv_max_port=30020
# 被动结束端口
pasv_address=39.108.4.89
# 设置 pasv 模式中的外网 IP

备注(特别重要):默认为 passive 模式,开始和结束端口同样需要映射,原则上建议内网端口和外网端口一致。如为华三防火墙,请在 NAT 映射时选择 NAT 映射为 FTP,端口可根据实际需要变更。passive 端口的计算方式如下,则端口为 117*256+63 = 30015:

复制代码
227 Entering Passive Mode (127,0,0,1,117,63)

7、重启 vsftpd

bash 复制代码
systemctl restart vsftpd

8、测试

bash 复制代码
ftp -p 127.0.0.1 9096

输入账号密码,即可登录。常用命令:dir 查看目录、get 下载、put 上传、cd 进入指定目录。

9、常见错误

  1. 无法进入 passive 模式:检查 passive 端口是否映射、是否连续、是否内外网一致。

  2. 530 Login incorrect:账号密码错误。由于虚拟用户使用了 PAM 模块,可通过 systemctl status vsftpd 进行排查,一般会有 pam_faillock(vsftpd:auth): User unknown: testUser,或者在 /var/log/secure 中根据账号关键字查找,即账号不存在。

    备注:由于使用 PAM 模块,默认登录失败信息并不会存放至 /var/log/xferlog。

  3. 其他上传或者下载失败问题:请检查 user_config_dir=/etc/vsftpd/vu_perm 中的配置。

相关推荐
别动我齐刘海2 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
不像程序员的程序媛4 小时前
linux常见文本操作命令
linux·运维·服务器
wangbing11254 小时前
开发指南149-IotDB-常用命令
linux·运维·iotdb
Dovis(誓平步青云)4 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
志栋智能5 小时前
运维超自动化的知识管理与传承
运维·自动化
蜗牛互联网5 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
jack186895 小时前
OpenClaw 数据采集与自动化应用场景指南
运维·自动化
小HANN6 小时前
华为云企业网站上云实战|从零搭建高可用WordPress全站架构(ECS+RDS+ELB+弹性伸缩+云监控闭环)
linux·运维·服务器·经验分享
奈落246 小时前
规则引擎还是大模型?AI 工作流与传统自动化的分工边界:确定性流程照旧,‘每次都不太一样‘的知识型工作才交给 AI
运维·人工智能·自动化·大模型·工作流·ai 办公