每天 Shaarli

一天内的所有链接,汇聚在一个页面上。

January 8, 2026

Note: VSFTP配置虚拟用户

VSFTP配置虚拟用户

安装依赖工具

sudo apt install -y vsftpd db-util

创建vsftpd专用目录

mkdir -p /etc/vsftpd/

创建ftp用户

sudo useradd -r -d /srv/ftp -s /usr/sbin/nologin ftpvirt
sudo mkdir -p /srv/ftp
sudo chown -R ftpvirt:ftpvirt /srv/ftp

sudo mkdir -p /etc/vsftpd/vuser_conf
sudo mkdir -p /srv/ftp/scientistzjf
sudo chown -R ftpvirt:ftpvirt /srv/ftp/scientistzjf

创建虚拟用户的用户名和密码,并转换成db数据

# virt_users.txt每两行一组
sudo tee /etc/vsftpd/virt_users.txt > /dev/null <<'EOF'
scientistzjf
YOUR_PASSWORD
EOF

sudo db_load -T -t hash -f /etc/vsftpd/virt_users.txt /etc/vsftpd/virt_users.db
sudo chmod 600 /etc/vsftpd/virt_users.*

将用户数据导入PAM中

sudo tee /etc/pam.d/vsftpd_virtual > /dev/null <<'EOF'
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
EOF

编辑/etc/vsftpd.conf配置文件

# 禁止匿名
anonymous_enable=NO

# 允许非匿名登录(虚拟用户也算“非匿名”,必须开)
local_enable=YES

# 允许写
write_enable=YES

# PAM 指向我们刚建的虚拟用户认证
pam_service_name=vsftpd_virtual

# 启用 guest 映射:所有虚拟用户映射为 ftpvirt
guest_enable=YES
guest_username=ftpvirt

# 让虚拟用户拥有本地用户权限(否则像匿名一样限制多)
virtual_use_local_privs=YES

# 每个虚拟用户独立配置(非常好用)
user_config_dir=/etc/vsftpd/vuser_conf

# 建议启用(按需)
chroot_local_user=YES
allow_writeable_chroot=YES

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.allowed_users

# 独立监听模式
listen_ipv6=NO
listen=YES

给vsftpd独立用户创建配置

sudo tee /etc/vsftpd/vuser_conf/scientistzjf > /dev/null <<'EOF'
local_root=/srv/ftp/scientistzjf
write_enable=YES
EOF

#此处local_root=/srv/ftp/scientistzjf是该用户的根目录,一定要给与ftp用户目录权限(ftpvirt:ftpvirt)

给vsftpd配置白名单(防止服务器本地用户登录)

echo "scientistzjf" | sudo tee /etc/vsftpd.allowed_users
sudo chmod 600 /etc/vsftpd.allowed_users

注意,vsftpd.conf中应该要有以下配置:

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.allowed_users

重启VSFTPD服务

sudo systemctl restart vsftpd
sudo systemctl status vsftpd --no-pager

验证是否真的在监听 21 端口

sudo ss -lntp | grep ':21'

Note: vsftpd.conf 选项速查手册(中文整理版)

vsftpd.conf 选项速查手册(中文整理版)

1. 文件与语法

  • 默认配置文件路径通常为:/etc/vsftpd.conf
    (有些发行版会放在 /etc/vsftpd/vsftpd.conf,以你的系统为准)
  • vsftpd 启动时也可以通过命令行参数指定配置文件路径。
  • 基本语法:

注释行以 # 开头

配置行格式:option=value

option=value 之间不能有空格(有空格可能会被当成错误)

2. 布尔选项(YES/NO)

2.1 匿名/访客与权限

anonymous_enable

  • 作用:是否允许匿名登录(用户名 anonymousftp
  • 默认:YES
  • 常用:

公共下载站:YES

只允许账号登录:NO

no_anon_password

  • 作用:匿名登录时不要求输入密码(直接登录)
  • 默认:NO

anon_world_readable_only

  • 作用:匿名用户只能下载“全局可读”(world-readable) 文件
  • 默认:YES

anon_upload_enable

  • 作用:允许匿名用户上传文件
  • 依赖:write_enable=YES 且匿名用户对目标目录有写权限
  • 默认:NO
  • 备注:虚拟用户默认也按“匿名权限模型”处理时,上传也常需要这个开关。

anon_mkdir_write_enable

  • 作用:允许匿名用户创建目录
  • 依赖:write_enable=YES
  • 默认:NO

anon_other_write_enable

  • 作用:允许匿名用户执行“除上传/建目录以外”的写操作(删除、重命名等)
  • 默认:NO
  • 安全建议:一般不推荐打开

2.2 本地用户、虚拟用户与 chroot

local_enable

  • 作用:是否允许本地系统用户登录(/etc/passwd 或 PAM)
  • 默认:NO
  • 重要:任何非匿名登录(包括虚拟用户)要能用,通常都需要 local_enable=YES

write_enable

  • 作用:是否允许执行会修改文件系统的 FTP 命令
    包括:STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, SITE
  • 默认:NO

chroot_local_user

  • 作用:将本地用户登录后“限制在其家目录(chroot 牢笼)内”
  • 默认:NO
  • 提醒:启用后能提升隔离性,但要注意:

用户若可写入 chroot 根目录,可能触发安全限制或需要额外配置(如 allow_writeable_chroot 在某些版本/发行版存在)

不同发行版补丁策略不同

chroot_list_enable

  • 作用:启用 chroot 用户名单机制(配合 chroot_list_file
  • 默认:NO
  • 语义:

chroot_local_user=NO:名单中的用户会被 chroot

chroot_local_user=YES:名单中的用户 不会被 chroot(例外名单)

passwd_chroot_enable

  • 作用:允许在 /etc/passwd 的 home 字段里用 /. 指定 chroot 位置
    示例:/data/ftp/. 形式表示 chroot 到某位置
  • 默认:NO
  • 备注:属于高级玩法,谨慎使用

guest_enable

  • 作用:把所有“非匿名登录”都当作访客(guest)登录,并映射到 guest_username
  • 默认:NO
  • 典型用途:虚拟用户(PAM + guest 映射)

virtual_use_local_privs

  • 作用:让虚拟用户使用“本地用户权限模型”而非“匿名权限模型”
  • 默认:NO
  • 说明:虚拟用户默认权限更像匿名(更受限);要让虚拟用户像本地用户一样可写,通常要开这个。

2.3 SSL/TLS 相关

仅在 ssl_enable=YES 时相关的选项,才会生效。

ssl_enable

  • 作用:启用 FTPS(基于 OpenSSL)
  • 默认:NO

allow_anon_ssl

  • 作用:允许匿名用户使用 SSL/TLS
  • 默认:NO

force_anon_logins_ssl / force_anon_data_ssl

  • 作用:强制匿名用户在登录/数据连接上使用 SSL/TLS
  • 默认:NO

force_local_logins_ssl / force_local_data_ssl

  • 作用:强制本地用户在登录/数据连接上使用 SSL/TLS
  • 默认:通常为 YES(不少发行版如此)
  • 备注:若你只跑明文 FTP,需要显式关掉它们。

ssl_sslv2 / ssl_sslv3 / ssl_tlsv1

  • 作用:允许哪些协议版本
  • 默认:sslv2=NO sslv3=NO tlsv1=YES
  • 建议:现代环境应禁用 SSLv2/SSLv3。

require_ssl_reuse

  • 作用:要求 SSL 数据连接复用控制连接的 SSL 会话(更安全)
  • 默认:YES
  • 兼容性:有些客户端会被它“搞坏”,遇到连接/传输异常可尝试设为 NO

require_cert

  • 作用:强制客户端提供证书(双向认证)
  • 默认:NO

ssl_request_cert

  • 作用:请求客户端证书(但不强制,除非 require_cert=YES
  • 默认:YES

validate_cert

  • 作用:要求客户端证书验证通过(自签通常不算通过)
  • 默认:NO

debug_ssl

  • 作用:把 OpenSSL 连接诊断写进日志(排错用)
  • 默认:NO

strict_ssl_read_eof / strict_ssl_write_shutdown

  • 作用:更严格地判断 SSL 传输结束方式(更安全/更严格)
  • 默认:NO
  • 兼容性:很多客户端不支持,通常保持默认

implicit_ssl

  • 作用:启用“隐式 FTPS”(一上来就握手 SSL)
  • 默认:NO
  • 提醒:现代多用“显式 FTPS”(AUTH TLS),隐式通常需要独立监听端口。

2.4 连接模式与安全检查

pasv_enable

  • 作用:允许被动模式(PASV)
  • 默认:YES

port_enable

  • 作用:允许主动模式(PORT)
  • 默认:YES

pasv_promiscuous

  • 作用:禁用 PASV 的“数据连接 IP 必须与控制连接 IP 相同”的检查
  • 默认:NO
  • 风险:安全性降低,一般不要开(除非你明确知道用途,比如某些隧道/特殊网络)

port_promiscuous

  • 作用:禁用 PORT 的“数据连接只能连回客户端”的检查
  • 默认:NO
  • 风险:同上,不推荐

connect_from_port_20

  • 作用:主动(PORT)模式的数据连接是否强制从服务器端口 20 发起
  • 默认:NO(示例配置里常会设成 YES
  • 备注:开启会需要更多特权,可能影响安全/部署灵活性

2.5 日志与调试

xferlog_enable

  • 作用:记录上传/下载传输日志
  • 默认:NO

xferlog_std_format

  • 作用:使用传统 wu-ftpd 风格的 xferlog 格式
  • 默认:NO

dual_log_enable

  • 作用:同时写两份日志:/var/log/xferlog + /var/log/vsftpd.log
  • 默认:NO

log_ftp_protocol

  • 作用:记录所有 FTP 命令/响应(协议级调试)
  • 默认:NO

syslog_enable

  • 作用:把 vsftpd 日志写入系统日志(syslog),而不是文件
  • 默认:NO

2.6 运行方式/隔离

listen

  • 作用:独立运行模式(不通过 inetd)
  • 默认:NO

listen_ipv6

  • 作用:监听 IPv6(与 listen 互斥)
  • 默认:NO

background

  • 作用:独立模式启动时是否后台运行
  • 默认:YES

run_as_launching_user

  • 作用:以启动 vsftpd 的用户身份运行(非 root)
  • 默认:NO
  • 严重提醒:会导致很多特权功能不可用(chroot/低端口等),风险和限制很大,除非你非常清楚。

isolate_network

  • 作用:用 Linux namespace(CLONE_NEWNET)隔离不受信任进程网络
  • 默认:YES

isolate

  • 作用:用 PID/IPC namespace(CLONE_NEWPID/NEWIPC)隔离进程
  • 默认:YES

2.7 其他常见布尔项

dirlist_enable

  • 作用:是否允许列目录(LIST/NLST 等)
  • 默认:YES

download_enable

  • 作用:是否允许下载(RETR 等)
  • 默认:YES

dirmessage_enable

  • 作用:进入目录时显示消息文件(如 .message
  • 默认:NO(示例文件常开)

message_file

  • 关联字符串选项,默认 .message

force_dot_files

  • 作用:即使客户端不加 -a,也显示以 . 开头的文件/目录(不包括 ./..
  • 默认:NO

ls_recurse_enable

  • 作用:允许 ls -R 递归列目录
  • 默认:NO
  • 风险:可能造成性能/资源问题

async_abor_enable

  • 作用:启用异步 ABOR(某些客户端取消传输会用)
  • 默认:NO

chmod_enable

  • 作用:允许本地用户使用 SITE CHMOD
  • 默认:YES

hide_ids

  • 作用:目录列表中把用户/组显示为 ftp
  • 默认:NO

text_userdb_names

  • 作用:列表中显示用户名而不是数字 UID/GID
  • 默认:NO

reverse_lookup_enable

  • 作用:PAM 认证前做反向 DNS(IP->主机名)
  • 默认:YES
  • 若 DNS 慢导致登录慢,可设 NO

tcp_wrappers

  • 作用:启用 TCP Wrappers(hosts.allow/deny + 按IP加载配置)
  • 默认:NO

session_support

  • 作用:维护会话(utmp/wtmp + pam_session)
  • 默认:NO

setproctitle_enable

  • 作用:在进程列表里显示会话状态(idle/download…)
  • 默认:NO

no_log_lock

  • 作用:写日志时不加文件锁(解决极少数文件系统挂起)
  • 默认:NO

lock_upload_files

  • 作用:上传加写锁、下载加共享读锁
  • 默认:YES

mdtm_write

  • 作用:允许 MDTM 修改文件时间(受权限检查)
  • 默认:YES

delete_failed_uploads

  • 作用:上传失败时删除不完整文件
  • 默认:NO

deny_email_enable

  • 作用:匿名密码(常被用作 email)黑名单机制
  • 默认:NO

secure_email_list_enable

  • 作用:只允许匿名登录使用“白名单密码”(每行一个)
  • 默认:NO

check_shell

  • 作用:检查 /etc/shells 里是否是合法 shell(仅非 PAM 版本相关)
  • 默认:YES

use_localtime

  • 作用:目录列表显示本地时区时间(默认 GMT)
  • 默认:NO

use_sendfile

  • 作用:内部性能相关(sendfile)
  • 默认:YES

tilde_user_enable

  • 作用:解析 ~user/path 这种路径
  • 默认:NO

3. 数字选项(非负整数,部分可用八进制)

注意:涉及 umask 的选项常用八进制,记得加前导 0,如 077

3.1 超时与限制

accept_timeout

  • 作用:PASV 数据连接等待客户端连接的超时(秒)
  • 默认:60

connect_timeout

  • 作用:PORT 数据连接等待客户端响应的超时(秒)
  • 默认:60

data_connection_timeout

  • 作用:数据传输无进展的超时(秒)
  • 默认:300

idle_session_timeout

  • 作用:控制连接空闲超时(秒)
  • 默认:300

max_login_fails

  • 作用:连续登录失败次数达到后断开
  • 默认:3

max_clients

  • 作用:独立模式下最大并发客户端数(0=不限制)
  • 默认:2000

max_per_ip

  • 作用:同一 IP 最大并发连接数(0=不限制)
  • 默认:50

3.2 速率限制

anon_max_rate

  • 作用:匿名用户最大传输速率(字节/秒,0=不限)
  • 默认:0

local_max_rate

  • 作用:本地用户最大传输速率(字节/秒,0=不限)
  • 默认:0

3.3 被动端口与其他

listen_port

  • 作用:独立模式监听端口
  • 默认:21

pasv_min_port / pasv_max_port

  • 作用:PASV 数据连接端口范围(便于防火墙放行)
  • 默认:0(表示任意端口)

ftp_data_port

  • 作用:PORT 模式数据连接默认端口(通常 20)
  • 默认:20

file_open_mode

  • 作用:上传文件创建时的基础权限(再叠加 umask)
  • 默认:0666

local_umask / anon_umask

  • 作用:本地/匿名用户创建文件的 umask
  • 默认:077

delay_failed_login

  • 作用:登录失败前延迟(秒)
  • 默认:1

delay_successful_login

  • 作用:成功登录前延迟(秒)
  • 默认:0

trans_chunk_size

  • 作用:内部传输块大小(可影响限速平滑性)
  • 默认:0(自动选择)

chown_upload_mode

  • 作用:匿名上传且 chown 后强制的文件模式
  • 默认:0600

4. 字符串选项

4.1 目录与根目录

anon_root

  • 作用:匿名登录后的根目录(chdir 到这里)
  • 默认:空

local_root

  • 作用:本地用户登录后的根目录(chdir 到这里)
  • 默认:空
  • 常用:配合 chroot_local_user=YES 做用户目录限制

secure_chroot_dir

  • 作用:vsftpd 需要无权限运行时使用的“安全空目录”
  • 默认:/usr/share/empty
  • 要求:该目录必须存在,且普通 ftp 用户不可写

4.2 用户列表 / 每用户配置

userlist_file

  • 作用:userlist 名单文件路径
  • 默认:/etc/vsftpd/user_list

userlist_enable

  • 作用:启用 userlist 机制(会读取 userlist_file
  • 默认:NO

userlist_deny

  • 作用:配合 userlist_enable 使用:

YES:名单里的人 拒绝登录(黑名单)

NO:名单里的人 允许登录(白名单)

  • 默认:YES

userlist_log

  • 作用:记录 userlist 拒绝登录事件
  • 默认:NO

user_config_dir

  • 作用:按用户覆盖配置(登录用户为 chris 时加载 .../chris
  • 默认:空
  • 注意:并非所有选项都能“按用户生效”,有些必须在会话开始前确定。

user_sub_token

  • 作用:模板变量替换,常用于虚拟用户目录生成
    例如 local_root=/home/virtual/$USER
  • 默认:空

4.3 Banner / 消息 / 隐藏与拒绝

ftpd_banner

  • 作用:连接时显示的欢迎横幅字符串
  • 默认:空(显示默认横幅)

banner_file

  • 作用:从文件读取横幅内容(覆盖 ftpd_banner
  • 默认:空

message_file

  • 作用:目录消息文件名(配合 dirmessage_enable
  • 默认:.message

hide_file

  • 作用:目录列表中隐藏匹配的文件名模式(但知道名字仍可访问)
  • 默认:空

deny_file

  • 作用:拒绝访问匹配的文件/目录(不隐藏,直接拒绝操作)
  • 默认:空
  • 说明:这是“轻量策略”,严肃访问控制应优先依赖文件系统权限。

4.4 PAM 与用户映射

pam_service_name

  • 作用:vsftpd 使用的 PAM 服务名
  • 默认:ftp

guest_username

  • 作用:访客(guest)登录映射到的真实系统用户
  • 默认:ftp

ftp_username

  • 作用:匿名 FTP 使用的本地用户(其 home 通常是匿名根目录)
  • 默认:ftp

4.5 监听地址

listen_address

  • 作用:独立模式下绑定监听的 IPv4 地址(不填则所有接口)
  • 默认:空

listen_address6

  • 作用:独立模式下绑定监听的 IPv6 地址
  • 默认:空

4.6 PASV 公网地址

pasv_address

  • 作用:PASV 模式向客户端“宣告”的 IP 地址(NAT/公网时常用)
  • 默认:空(默认取控制连接的本地地址)

pasv_addr_resolve

  • 作用:若 pasv_address 填的是主机名,是否在启动时解析
  • 默认:NO

4.7 SSL 证书与加密套件

rsa_cert_file

  • 作用:RSA 证书文件路径
  • 默认:/usr/share/ssl/certs/vsftpd.pem(发行版可能不同)

rsa_private_key_file

  • 作用:RSA 私钥文件路径(不填通常与 cert 同文件)
  • 默认:空

dsa_cert_file / dsa_private_key_file

  • 作用:DSA 证书/私钥路径(现在较少用)
  • 默认:空

ca_certs_file

  • 作用:CA 证书链文件(用于验证客户端证书)
  • 默认:空

ssl_ciphers

  • 作用:允许的 SSL/TLS 加密套件
  • 默认:DES-CBC3-SHA(历史默认;现代建议配置更强套件)

4.8 日志文件路径

vsftpd_log_file

  • 作用:vsftpd 风格日志文件路径
  • 默认:/var/log/vsftpd.log

xferlog_file

  • 作用:wu-ftpd 风格传输日志文件路径
  • 默认:/var/log/xferlog

5. 常见组合示例(便于你自己搜)

5.1 禁用匿名、只允许本地用户

anonymous_enable=NO
local_enable=YES

5.2 允许写入(上传/删除/改名等)

write_enable=YES

5.3 把用户限制在目录(chroot)

chroot_local_user=YES

5.4 只允许名单用户登录(白名单)

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.userlist

5.5 PASV 端口范围(防火墙/NAT 常用)

pasv_enable=YES
pasv_min_port=10090
pasv_max_port=10100
Note: Linux中 7z打包的排除与加密命令
7z a /root/backup_name.7z /DevelopZone -xr\!target -xr\!node_modules -mmt12 -mx9 -p123 -mhe=on -y