安装

1
sudo apt-get install vsftpd

配置

备份配置文件

1
sudo mv /etc/vsftpd.conf /etc/vsftpd.bak

一、 匿名用户

1
anonymous_enable=YES

二、 系统用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
pasv_enable=Yes
pasv_min_port=10000
pasv_max_port=10100
allow_writeable_chroot=YES

三、 虚拟用户

  1. 安装密码生成工具
1
apt-get install -y db-util
  1. 配置用户名和密码
1
2
mkdir -p /etc/vsftpd
cd /etc/vsftpd

添加用户名和密码,可以添加多个账户。

1
2
3
4
cat <<EOF>login.txt
username
password
EOF

生成login.db文件

1
sudo db_load -T -t hash -f /etc/vsftpd/login.txt  /etc/vsftpd/login.db
  1. 修改虚拟用户权限vsftpd.pam配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 备份原来的pam文件
sudo cp /etc/pam.d/vsftpd  /etc/pam.d/vsftpd.bak
# 拷贝pam模板文件到/etc/pam.d/
sudo cp /usr/share/doc/vsftpd/examples/VIRTUAL_USERS/vsftpd.pam /etc/pam.d/vsftpd
# 编译新的pam文件
# 注意pam_userdb.so的位置,模板中/lib/security/pam_userdb.so是找不到的
# 根据系统的情况改,db=/etc/vsftpd/ftpusers ftpuser是认证数据库文件的文件名,这里不需要加后缀
sudo vim /etc/pam.d/vsftpd
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login
  1. 添加虚拟用户配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mkidr -p /etc/vsftpd/user_config_dir
# 开启全部操作权限
# 文件名跟login.txt 用户名保持一致
cat << EOF> username
write_enable=YES
virtual_use_local_privs=YES
anon_upload_enable=YES
anon_world_readable_only=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/mnt/repo
EOF

重点: 个人测试发现,virtual_use_local_privs=NO时,其他客户端无法登录,如果开启配置使用 IP 登录访问可以看到服务器所有文件。 本身virtual_use_local_privs 本应该设置为 NO ,我估计这个应该是 bug。 最后结果是 我们使用vsftpd开启一个可以全部操作的用户,这个账户只给特定人员使用,文件下载功能使用nginx实现。

  1. 修改 vsftpd 配置文件 /etc/vsftpd.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
guest_enable=YES
guest_username=vsftpd
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_config_dir
1
2

useradd -s /usr/sbin/nologin -d /home/vsftpd vsftpd

防火墙

1
sudo ufw allow from any to any port 20,21,10000:10100 proto tcp