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_portpasv_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_denyNO 表示启用的是白名单模式(仅名单中的用户名可以访问 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_userYES 表示限制用户不能访问家目录之外的目录(名单中的用户不能),为 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

参考文献