Debian 12 安装配置 vsftpd
安装 vsftpd
更新 APT 软件包索引:
sudo apt update
安装 Berkeley DB (BDB) 数据库的命令行工具,用于生产虚拟用户文件数据库:
sudo apt install -y db-util
安装 vsftpd
:
sudo apt install -y vsftpd
查看安装的 vsftpd
版本信息:
vsftpd -v
vsftpd: version 3.0.3
安装完成后,vsftpd
会自动运行,并且在系统启动时自动运行。
查看 vsftpd
服务运行状态:
sudo systemctl status vsftpd
先关闭 vsftpd 服务方便后面配置:
sudo systemctl stop vsftpd
配置 vsftpd
生成 SSL 证书
检查当前版本 vsftpd
是否支持 SSL:
sudo ldd `which vsftpd` | grep ssl
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007f7ebab8a000)
创建一个用于保存 SSL 证书的目录:
sudo mkdir -p /etc/ssl/ftp
使用 openssl
生成自签名 SSL 证书:
sudo openssl req -x509 \
-nodes \
-newkey rsa:2048 \
-days 365 \
-out /etc/ssl/ftp/cert.pem \
-keyout /etc/ssl/ftp/key.pem
-days
:证书有效期天数。-out
:对应主配置中的rsa_cert_file
配置项,为 SSL 证书公钥。-keyout
:对应主配置中的rsa_private_key_file
配置项,为 SSL 证书私钥。
过程中需要输入的证书信息可随意填写,在使用 FTP 工具连接时,会显示填写的证书信息。
修改证书文件权限:
sudo chmod 644 /etc/ssl/ftp/cert.pem
sudo chmod 600 /etc/ssl/ftp/key.pem
修改主配置文件
备份默认的主配置文件:
sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak
重新创建主配置文件:
sudo vim /etc/vsftpd.conf
插入配置信息:
# standalone mode
listen=YES
listen_ipv6=NO
listen_port=21
# security
nopriv_user=vsftpd
hide_ids=YES
# performance
max_clients=0
max_per_ip=0
# timeout(s)
accept_timeout=60
connect_timeout=60
data_connection_timeout=300
idle_session_timeout=600
# PORT method
port_enable=YES
port_promiscuous=YES
connect_from_port_20=YES
ftp_data_port=20
# PASV method
pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=18800
pasv_max_port=18900
# SSL/TLS (FTPS)
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
require_ssl_reuse=NO
force_local_logins_ssl=YES
allow_anon_ssl=YES
force_local_data_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
rsa_cert_file=/etc/ssl/ftp/cert.pem
rsa_private_key_file=/etc/ssl/ftp/key.pem
# local/anonymous user
local_enable=YES
anonymous_enable=NO
# virtual user
guest_enable=YES
guest_username=vsftpd
pam_service_name=vsftpd
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vuser_conf
# user list
userlist_enable=NO
# chroot
chroot_local_user=YES
allow_writeable_chroot=YES
# log
log_ftp_protocol=NO
- 配置项等号两边不能有空格。
pasv_min_port
和pasv_max_port
为被动模式端口号范围(在 1024~65535 之间,预留 50~100 个端口即可,注意回避一些常用软件端口号)。
检查主配置文件是否有错误(是否可以从配置文件启动):
sudo vsftpd /etc/vsftpd.conf
由于版本差异,部分配置项可能已经废弃,如果有报错的配置项,可以查看官方的参数详解。
如果没有输出内容表示启动正常(配置文件正常),按 Ctrl
+ c
退出即可。
创建宿主用户
创建一个不能登录系统的用户用作 FTP 的宿主用户:
sudo useradd -d /var/ftp -s /sbin/nologin vsftpd
/var/ftp
:宿主用户的家目录,可做为 FTP 根目录。vsftpd
:对应主配置文件中的nopriv_user
配置项和guest_username
配置项,为宿主用户名,是vsftpd
子进程降权时使用的用户,也是 FTP 操作的目录和文件的真正所有者。
创建宿主用户的家目录:
sudo mkdir -p /var/ftp
修改目录所有者为 vsftpd
:
sudo chown vsftpd:vsftpd /var/ftp
添加虚拟用户
创建 /etc/vsftpd
目录用于保存 vsftpd
的额外配置文件:
sudo mkdir -p /etc/vsftpd
创建虚拟用户配置文件:
sudo vim /etc/vsftpd/vuser
在文件中添加虚拟用户名和密码(奇数行为用户名,偶数行为用户密码):
test
test123
生成虚拟用户认证使用的数据库文件:
sudo db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db
修改文件权限:
sudo chmod 600 /etc/vsftpd/vuser
sudo chmod 600 /etc/vsftpd/vuser.db
每次修改 /etc/vsftpd/vuser
文件内容,都需要重新生成一次数据库文件。
创建用于虚拟用户独立配置文件目录,对应主配置中的 user_config_dir
配置项:
sudo mkdir -p /etc/vsftpd/vuser_conf
创建虚拟用户独立配置文件:
sudo vim /etc/vsftpd/vuser_conf/test
test
为虚拟用户的用户名,一个虚拟用户一个单独的配置文件。
写入该用户的独立配置:
local_root=/var/ftp/test
local_umask=022
write_enable=YES
download_enable=YES
- 由于主配置有
virtual_use_local_privs=YES
配置项,虚拟用户使用本地用户的配置。 local_root
为该虚拟用户家目录。local_umask
为该虚拟用户生成的文件(上传或者创建的)的权限掩码(777 -local_umask
= 目录权限,666 -local_umask
= 文件权限),一般根据需要设置为022
(所有用户可读,仅所有者可写,文件不会被其他用户运行的程序修改)或者002
(所有用户可读,所有者和组用户都可写,其他用户加入vsftpd
组后运行的程序可修改文件)。
创建该虚拟用户的家目录:
sudo mkdir -p /var/ftp/test
修改目录所有者为 vsftpd
:
sudo chown vsftpd:vsftpd /var/ftp/test
修改目录权限:
# local_umask=022
sudo chmod 755 /var/ftp/test
# local_umask=002
sudo chmod 775 /var/ftp/test
配置 PAM 认证
备份 vsftpd
默认的 PAM 认证文件:
sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
重新创建 PAM 认证文件,文件名对应主配置中的 pam_service_name
配置项:
sudo vim /etc/pam.d/vsftpd
插入配置:
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
/etc/vsftpd/vuser
为上面生成的认证数据库文件,无 .db
后缀。
启动服务
启动 vsftpd
服务:
sudo systemctl start vsftpd
查看 vsftpd
服务状态:
sudo systemctl status vsftpd
配置防火墙
ufw
防火墙添加对应的端口号:
sudo ufw allow 20:21/tcp
sudo ufw allow 18800:18900/tcp
重新加载防火墙规则:
sudo ufw reload
查看防火墙状态:
sudo ufw status verbose
VPS 如果自带了网络防火墙服务,还需要添加对应的防火墙端口配置。
FTP 客户端
推荐使用免费开源全平台支持的 FileZilla 。
在 FileZilla 中添加站点:
- 协议:FTP - 文件传输协议
- 主机:VPS IPv4 地址
- 端口:默认为 21,可不填
- 加密:要求显式的 FTP over TLS
- 登录类型:询问秘密
- 用户:配置的 FTP 虚拟用户名
第一次连接的时候会提示 “未知证书”,并显示之前填写的证书信息,勾选 “在以后的会话中始终信任该证书“ 并确定即可。
配置 AppArmor
创建配置文件
创建 vsftpd
对应的 AppArmor 配置文件:
sudo vim /etc/apparmor.d/usr.sbin.vsftpd
插入配置:
#include <tunables/global>
/usr/sbin/vsftpd {
#include <abstractions/base>
#include <abstractions/apache2-common>
#include <abstractions/nis>
#include <abstractions/openssl>
capability sys_admin,
capability sys_chroot,
capability setgid,
capability setuid,
capability audit_write,
# binary file
/usr/sbin/vsftpd mr,
# runtime
/run/vsftpd/ rw,
/run/vsftpd/* rw,
# configuration files
/etc/vsftpd.conf r,
/etc/vsftpd/** r,
# logs
/var/log/vsftpd.log rw,
# SSL
/etc/ssl/ftp/** r,
# PAM files
/etc/pam.d/common-* r,
/etc/pam.d/other r,
/etc/pam.d/vsftpd r,
# user files
/var/ftp/** rwk,
}
加载配置文件
加载 AppArmor 配置文件:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.vsftpd
重启 vsftpd
服务:
sudo systemctl restart vsftpd
调试与日志
检查状态:
sudo aa-status | grep vsftpd
查看 vsftpd
的拒绝日志:
sudo journalctl -xe | grep "apparmor.*DENIED.*vsftpd"
进入抱怨模式(Complain Mode)临时调试:
sudo aa-complain /usr/sbin/vsftpd
管理 vsftpd
服务管理
查看 vsftpd
服务状态:
sudo systemctl status vsftpd
启动 vsftpd
服务:
sudo systemctl start vsftpd
停止 vsftpd
服务:
sudo systemctl stop vsftpd
重启 vsftpd
服务:
sudo systemctl restart vsftpd
设置 vsftpd
服务开机启动:
sudo systemctl enable vsftpd
取消 vsftpd
服务开机启动:
sudo systemctl disable vsftpd
公共 FTP 下载
如需启用匿名用户公共下载,需要先修改主配置文件:
sudo vim /etc/vsftpd/vsftpd.conf
修改匿名用户相关配置项:
# local/anonymous user
local_enable=NO
local_umask=022
anonymous_enable=YES
anon_upload_enable=NO
no_anon_password=YES
anon_root=/var/ftp/public
创建匿名用户的家目录,对应主配置中的 anon_root
配置项:
sudo mkdir -p /var/ftp/public
修改目录所有者为 vsftpd
:
sudo chown vsftpd:vsftpd /var/ftp/public
修改目录权限为所有用户可读:
sudo chmod 755 /var/ftp/public
重启 vsftpd
服务:
sudo systemctl restart vsftpd
用户黑白名单
如需启用用户黑白名单,需要先修改主配置文件:
sudo vim /etc/vsftpd/vsftpd.conf
修改用户黑白名单相关配置项:
# user list
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
userlist_deny
为 NO
表示启用的是白名单模式(仅名单中的用户名可以访问 FTP),YES
表示启用的是黑名单模式(名单中的用户名禁止访问 FTP)。
修改黑白名单文件,对应主配置中的 userlist_file
配置项:
sudo vim /etc/vsftpd/user_list
添加用户名(一行一个用户名)。
重启 vsftpd
服务:
sudo systemctl restart vsftpd
chroot 名单
chroot
表示限制用户不能访问家目录之外的目录。
如果需要启用 chroot
名单,需要先修改主配置文件:
sudo vim /etc/vsftpd/vsftpd.conf
修改 chroot
相关配置项:
# chroot
chroot_local_user=YES
allow_writeable_chroot=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user
为 YES
表示限制用户不能访问家目录之外的目录(名单中的用户不能),为 NO
表示允许所有用户访问家目录之外的目录(名单中的用户可以)。
创建 chroot
名单文件,对应主配文件中的 chroot_list_file
配置项:
sudo vim /etc/vsftpd/chroot_list
根据需要添加用户名(一行一个用户名):
test
重启 vsftpd
服务:
sudo systemctl restart vsftpd
日志管理
如需开启日志功能,需要修改主配置文件:
sudo vim /etc/vsftpd/vsftpd.conf
修改日志相关配置项:
# log
log_ftp_protocol=YES
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
创建日志文件,对应主配中的 xferlog_file
配置项:
sudo touch /var/log/vsftpd.log
设置文件所有者为 vsftpd
:
sudo chown vsftpd:vsftpd /var/log/vsftpd.log
重启 vsftpd
服务:
sudo systemctl restart vsftpd
查看 vsftpd
日志:
sudo tail -f /var/log/vsftpd.log