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 "所有用户处理完毕。"