0. 基础环境和说明

基础环境软件版本

环境

软件版本

vsftpd软件版本

vsftpd-3.0.2

操作系统版本

CentOS7.6

客户端软件

filezilla client

端口和安全组

需要为云主机开放如下端口范围,20000~20100为一个随机端口范围,用与vsftp服务的pasv模式的数据端口,可以使用别的端口范围,但需要同步修改vsftpd配置文件中的端口范围。

协议类型

端口范围

TCP

20、21、20000~20100

UDP

20、21

说明

用例中的vsftpd服务需求如下:

(1)使用虚拟用户作为登录ftp的用户,且虚拟用户需要使用密码进行验证。

(2)虚拟用户拥有单独的家目录,不同用户不可以相互访问彼此的家目录。

(3)使用基于SSL的vsftpd,使用自签名证书签发服务器密钥。

(4)vsftpd服务支持pasv模式和port模式两种模式。

(5)vusers.list文件存放虚拟用户的用户名和密码、格式为用户名1,回车换行 用户1的密码, 例如下面代码格式。

(6)vusers.db文件存放经过hash后的二进制用户名密码库文件。转化命令如下:

  (7) vsftpd PAM认证文件存放于/etc/pam.d/vsftpd.vu,文件内容如下:

(8)虚拟用户家目录配置文件路径:/etc/vsftpd/user_conf/。

(9)chroot_list中存放虚拟用户名,文件名为/etc/vsftpd/chroot_list,格式为每行一个虚拟用户名。

1. 软件包安装

使用YUM工具安装vsftpd

yum install vsftpd -y

2. 配置服务

(1)添加vuserlist.list

[root@node-18-237 vsftpd]# vim vusers.list

user1 
123456
user2 
12345678
user3 
123456789

(2)创建用户家目录的根目录

mkdir /data01/ftpuser

(3) 生成用户密钥文件

#交互式,交互式中在交互过程中需要输入非交互式的echo内容,注意IP地址需要变更为自己服务器地址:
openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048


#非交互式:
echo 'CN
Beijing
Beijing
iie
ops
10.0.18.237
12345678@qq.com
' | openssl req -x509 -nodes -keyout /tmp/vsftpd.pem -out /tmp/vsftpd.pem -days 365 -newkey rsa:2048

(4)生成用户db文件

db_load  -T -t hash -f /etc/vsftpd/vusers.list  /etc/vsftpd/vusers.db

(5) 创建用户家目录配置文件和用户家目录。

[root@node-18-237 ~]# vim /etc/vsftpd/user_conf/user1
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_root=/mnt/ftpuser/user1


[root@node-18-237 ~]# mkdir /data01/ftpuser/user1 && chmod 0700 /data01/ftpuser/user1 && chown ftp:ftp /data01/ftpuser/user1

(6) 添加PAM文件

vim /etc/pam.d/vsftpd.vu

#%PAM-1.0

auth required pam_userdb.so db=/etc/vsftpd/vusers
account required  pam_userdb.so db=/etc/vsftpd/vusers

(7) 将users.list转化为db文件

db_load  -T -t hash -f /etc/vsftpd/vusers.list  /etc/vsftpd/vusers.db

(8)在chroot_list文件中添加用户名

echo  user1>>/etc/vsftpd/chroot_list

(9)配置服务配置文件

vim /etc/vsftpd/vsftpd.conf

listen_address=0.0.0.0
anonymous_enable=NO
local_enable=YES
write_enable=YES
allow_writeable_chroot=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_conf
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
pasv_min_port=20000
pasv_max_port=20100
pasv_enable=YES
port_enable=YES
ssl_enable=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
allow_anon_ssl=NO
[root@node-cpu-0-240 ~]# cat /etc/vsftpd/vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf
#listen_address=10.0.18.237
listen_address=0.0.0.0
anonymous_enable=NO
local_enable=YES
write_enable=YES
allow_writeable_chroot=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
#chown_uploads=YES
#chown_username=whoever
#
#xferlog_file=/var/log/xferlog
#
xferlog_std_format=YES
#
#idle_session_timeout=600
#
#data_connection_timeout=120
#
#nopriv_user=ftpsecure
#
#async_abor_enable=YES
#
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
#ftpd_banner=Welcome to blah FTP service.
#
#deny_email_enable=YES

#banned_email_file=/etc/vsftpd/banned_emails
chroot_local_user=YES
chroot_list_enable=NO
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_conf

#ls_recurse_enable=YES
listen=YES
#
listen_ipv6=NO
pam_service_name=vsftpd.vu
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

#pasv_min_port=35000
#pasv_max_port=35020
pasv_min_port=20000
pasv_max_port=20100
pasv_enable=YES
port_enable=YES

# 启用 SSL/TLS
ssl_enable=YES

# 指定 RSA 证书和私钥文件
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

# 强制使用 SSL/TLS
force_local_data_ssl=YES
force_local_logins_ssl=YES

# 允许的 SSL 版本
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

# 使用强制加密
require_ssl_reuse=NO
ssl_ciphers=HIGH

# 配置虚拟用户的访问控制
allow_anon_ssl=NO

3. 服务启动

systemctl start vsftpd

4. 客户端使用

(1) 下载链接

https://www.filezilla.cn/download

(2)使用

选择合适版本的filezila客户端,安装完成后,双击打开

在文件-->站点管理-->新站点,添加要连接的ftp站点,依次输入IP地址、用户名、密码。加密框中选择如果可用,使用显示的FTP over TLS。

点击连接后即可上传文件。

5. 附件

批量添加用户脚本

[root@node-cpu-0-240 vsftpd]# cat adduser.sh 
#!/bin/bash

# 用户列表文件,此处userlist.txt格式为:
#用户一ID   用户一密码
#用户二ID   用户二密码
#
USERLIST="userlist.txt"

# FTP 用户根目录,家目录要在此目录创建
FTP_ROOT="/data01/ftpuser"

# vsftpd 虚拟用户列表文件
VUSERS_LIST="/etc/vsftpd/vusers.list"

# vsftpd chroot list 文件
CHROOT_LIST="/etc/vsftpd/chroot_list"

# user 家目录配置文件
USER_CONF="/etc/vsftpd/user_conf"

# 检查用户列表文件是否存在
if [[ ! -f $USERLIST ]]; then
    echo "用户列表文件 $USERLIST 不存在。"
    exit 1
fi

# 创建 FTP 根目录(如果不存在)
if [[ ! -d $FTP_ROOT ]]; then
    sudo mkdir -p $FTP_ROOT
    sudo chmod 755 $FTP_ROOT
fi

# 清空 vusers.list 文件
sudo truncate -s 0 "$VUSERS_LIST"

# 读取用户列表文件并处理每一行
while IFS=' ' read -r USERID PASSWORD; do
    # 创建用户名
    USERNAME="user${USERID}"

    # 创建用户家目录
    USER_HOME="${FTP_ROOT}/${USERNAME}"

    if [[ ! -d "$USER_HOME" ]]; then
        # 创建用户家目录
        sudo mkdir -p "$USER_HOME"
        sudo chown ftp:ftp "$USER_HOME"
        sudo chmod 700 "$USER_HOME"
        echo "用户家目录 $USER_HOME 创建成功。"
    fi

    if [[ ! -f "$USER_CONF/user${USERID}" ]]; then
        # 创建用户配置
        cp /etc/vsftpd/user_conf/uesr1 /etc/vsftpd/user_conf/user${USERID}
        sed -i  "s/user1/user${USERID}/ " /etc/vsftpd/user_conf/user${USERID}
        echo "用户家目录配置文件添加成功"
    fi

    # 添加用户名和密码到 vusers.list 文件
    echo "$USERNAME" | sudo tee -a "$VUSERS_LIST" >/dev/null
    echo "$PASSWORD" | sudo tee -a "$VUSERS_LIST" >/dev/null

    # 将用户名添加到 vsftpd chroot list
    if ! grep -q "^${USERNAME}$" "$CHROOT_LIST"; then
        echo "$USERNAME" | sudo tee -a "$CHROOT_LIST" >/dev/null
        echo "用户 $USERNAME 已添加到 $CHROOT_LIST。"
    else
        echo "用户 $USERNAME 已存在于 $CHROOT_LIST 中,跳过添加。"
    fi
done < "$USERLIST"

# 生成 vusers.db 文件
sudo db_load -T -t hash -f "$VUSERS_LIST" /etc/vsftpd/vusers.db

echo "所有用户处理完毕。"