CentOS 7 搭建 vsftpd:匿名用户、本地用户、虚拟用户与 FTPS
# CentOS 7 搭建 vsftpd匿名用户、本地用户、虚拟用户与 FTPS1. 服务介绍vsftpdVery Secure FTP Daemon是 Linux 常用 FTP 服务端软件用于文件上传、下载和目录共享。它支持匿名访问、本地系统用户、基于 PAM 的虚拟用户、目录隔离、被动模式和 TLS 加密适合内网文件交换、运维文件分发及账号隔离实验。FTP 使用独立的控制连接和数据连接。部署时不能只检查 TCP 21还要同时处理被动端口、防火墙、NAT、目录权限和 SELinux。本文基于 CentOS 7分别配置匿名用户、本地用户、虚拟用户并给出客户端和服务端验证方法。2. 准备运行环境• 服务端CentOS 7.x示例地址10.1.100.101/24。• 客户端Windows 或 Linux与服务器网络互通。• 操作权限root或具备sudo权限的管理员账号。• 软件源YUM 可用。• FTP 控制端口TCP21。• 被动数据端口本文使用 TCP30000-31000。• 主配置文件/etc/vsftpd/vsftpd.conf。• 主要日志/var/log/xferlog、systemd journal启用协议日志后可查看/var/log/vsftpd.log。安装服务端和测试工具并备份原配置yum install -y vsftpd ftp lftp db4-utils policycoreutils-python cp -a /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date %F-%H%M%S) vsftpd -v3. 相关知识3.1 主动模式和被动模式• 主动模式客户端连接服务器 TCP 21服务器再从 TCP 20 主动连接客户端。客户端处于 NAT 或防火墙后时容易失败。• 被动模式客户端同时发起控制连接和数据连接。服务器返回一个高位端口客户端连接该端口。现代网络更常用被动模式。• 被动模式端口必须在vsftpd.conf、firewalld 和上级 NAT 中保持一致。3.2 文件权限有两层vsftpd 配置决定“功能是否允许”Linux 文件权限和 SELinux 决定“系统是否允许”。即使设置write_enableYES目录无写权限或 SELinux 类型不正确上传仍会失败。3.3 chroot 目录隔离chroot_local_userYES可把本地用户限制在 FTP 根目录。为减少目录逃逸风险用户根目录建议由root管理且不可写在根目录下创建用户可写的upload子目录。直接让 chroot 根目录可写可能触发500 OOPS: vsftpd: refusing to run with writable root inside chroot()。3.4 匿名、本地和虚拟用户• 匿名用户通常使用用户名anonymous或ftp适合公开下载匿名写入风险高应只开放单独上传目录。• 本地用户直接使用 Linux 系统账号认证权限由账号和目录属主决定。• 虚拟用户账号保存在独立数据库中通过 PAM 认证再统一映射到不可登录系统的宿主账号。适合只需要 FTP、无需系统 Shell 的用户。3.5 FTPS 与 SFTP 不同FTPS 是 FTP 加 TLS仍使用 FTP 控制和数据连接SFTP 是 SSH 子系统通常使用 TCP 22。两者协议不同客户端配置不能混用。FTP 明文传输账号和数据跨不可信网络时应启用 FTPS 或改用 SFTP。4. 实验步骤4.1 配置基础服务和被动模式先写入通用配置。保留原文件中的注释也可以但不要重复定义相互冲突的参数listenYES listen_ipv6NO anonymous_enableNO local_enableYES write_enableYES local_umask022 use_localtimeYES xferlog_enableYES xferlog_std_formatYES dual_log_enableYES log_ftp_protocolYES connect_from_port_20YES pam_service_namevsftpd userlist_enableYES chroot_local_userYES allow_writeable_chrootNO pasv_enableYES pasv_min_port30000 pasv_max_port31000检查配置并放行端口systemctl enable --now vsftpd firewall-cmd --permanent --add-serviceftp firewall-cmd --permanent --add-port30000-31000/tcp firewall-cmd --reload systemctl restart vsftpd若服务器经过 NAT还应配置pasv_address为客户端可访问的地址并在上级网关映射相同被动端口范围。4.2 配置匿名用户建立匿名根目录和单独上传目录。根目录保持不可写上传目录才授予ftp用户写权限mkdir -p /var/ftp/pub/upload chown root:root /var/ftp/pub chmod 755 /var/ftp/pub chown ftp:ftp /var/ftp/pub/upload chmod 733 /var/ftp/pub/upload在/etc/vsftpd/vsftpd.conf增加anonymous_enableYES anon_root/var/ftp/pub no_anon_passwordYES anon_world_readable_onlyYES anon_upload_enableYES anon_mkdir_write_enableNO anon_other_write_enableNO anon_umask022配置 SELinux 允许匿名用户写入指定目录semanage fcontext -a -t public_content_rw_t /var/ftp/pub/upload(/.*)? restorecon -Rv /var/ftp/pub/upload setsebool -P ftpd_anon_write on systemctl restart vsftpd客户端连接时使用用户名anonymous或ftp匿名用户只能在upload子目录上传不能修改根目录匿名上传目录容易被滥用。生产环境应限制来源地址、文件大小、速率和定期清理策略不需要匿名上传时关闭anon_upload_enable。4.3 配置本地用户和目录隔离创建本地 FTP 用户useradd qwe passwd qwe mkdir -p /srv/ftp/qwe/upload chown root:root /srv/ftp/qwe chmod 755 /srv/ftp/qwe chown qwe:qwe /srv/ftp/qwe/upload chmod 750 /srv/ftp/qwe/upload在配置文件中启用本地用户local_enableYES write_enableYES local_umask022 chroot_local_userYES allow_writeable_chrootNO user_sub_token$USER local_root/srv/ftp/$USER如果只允许指定账号登录可启用用户白名单userlist_enableYES userlist_denyNO userlist_file/etc/vsftpd/user_listprintf %s\n qwe /etc/vsftpd/user_list chmod 600 /etc/vsftpd/user_list systemctl restart vsftpdchroot_local_user和chroot_list_enable的组合关系如下本地用户登录后查看目录执行cd ..后再次查看目录仍停留在隔离根目录说明 chroot 生效4.4 配置虚拟用户创建不可登录系统的宿主账号和虚拟用户目录useradd -r -d /srv/ftp/virtual -s /sbin/nologin ftpvirtual mkdir -p /srv/ftp/virtual/li4/upload /srv/ftp/virtual/wang5/upload chown root:root /srv/ftp/virtual/li4 /srv/ftp/virtual/wang5 chmod 755 /srv/ftp/virtual/li4 /srv/ftp/virtual/wang5 chown -R ftpvirtual:ftpvirtual /srv/ftp/virtual/li4/upload /srv/ftp/virtual/wang5/upload建立账号文本。奇数行为用户名下一行为对应密码li4 请替换为强密码 wang5 请替换为另一个强密码原实验账号文件格式如下。图中123456仅是实验示例实际部署必须更换生成 Berkeley DB并删除明文账号文件db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db chmod 600 /etc/vsftpd/vusers.db rm -f /etc/vsftpd/vusers.txt建立/etc/pam.d/vsftpd-virtualauth required pam_userdb.so db/etc/vsftpd/vusers account required pam_userdb.so db/etc/vsftpd/vusersPAM 数据库路径不带.db后缀修改 vsftpd 配置anonymous_enableNO local_enableYES write_enableYES guest_enableYES guest_usernameftpvirtual virtual_use_local_privsYES pam_service_namevsftpd-virtual user_sub_token$USER local_root/srv/ftp/virtual/$USER chroot_local_userYES allow_writeable_chrootNO如果不同虚拟用户需要不同权限增加独立配置目录user_config_dir/etc/vsftpd/vconfigmkdir -p /etc/vsftpd/vconfig cat /etc/vsftpd/vconfig/li4 EOF write_enableNO download_enableYES EOF cat /etc/vsftpd/vconfig/wang5 EOF write_enableYES download_enableYES EOF chmod 600 /etc/vsftpd/vconfig/* systemctl restart vsftpd4.5 可选启用 FTPS生成实验用自签名证书openssl req -x509 -nodes -newkey rsa:2048 -days 365 \ -keyout /etc/pki/tls/private/vsftpd.key \ -out /etc/pki/tls/certs/vsftpd.crt chmod 600 /etc/pki/tls/private/vsftpd.key在配置文件中增加ssl_enableYES rsa_cert_file/etc/pki/tls/certs/vsftpd.crt rsa_private_key_file/etc/pki/tls/private/vsftpd.key force_local_logins_sslYES force_local_data_sslYES ssl_tlsv1YES ssl_sslv2NO ssl_sslv3NO require_ssl_reuseNO自签名证书只适合实验。生产环境应使用受客户端信任的证书并使用支持显式 FTPS 的客户端测试。5. 验证结果5.1 服务端验证systemctl status vsftpd --no-pager ss -lntp | grep :21 firewall-cmd --list-services firewall-cmd --list-ports getsebool ftpd_anon_write journalctl -u vsftpd -n 80 --no-pager检查配置和目录权限grep -Ev ^#|^$ /etc/vsftpd/vsftpd.conf namei -l /var/ftp/pub/upload namei -l /srv/ftp/qwe/upload5.2 匿名用户验证Linux 客户端lftp -u anonymous ftp://10.1.100.101连接后执行ls cd upload put test.txt ls预期能浏览公开目录只能在upload子目录上传不能删除或改写根目录内容。5.3 本地用户验证lftp -u qwe ftp://10.1.100.101登录后执行pwd、ls、cd ..和put test.txt -o upload/test.txt。预期用户不能离开/srv/ftp/qwe映射的根目录只能写入upload。Windows 客户端可执行Test-NetConnection 10.1.100.101 -Port 21 ftp 10.1.100.1015.4 虚拟用户验证lftp -u li4 ftp://10.1.100.101 lftp -u wang5 ftp://10.1.100.101预期两个虚拟账号均不能登录系统 Shellli4只能下载wang5可在自己的upload目录上传。服务端可确认宿主进程和文件属主ps -ef | grep [v]sftpd find /srv/ftp/virtual -maxdepth 3 -ls5.5 常见故障排查journalctl -u vsftpd -n 100 --no-pager tail -n 100 /var/log/xferlog tail -n 100 /var/log/vsftpd.log 2/dev/null ausearch -m AVC -ts recent•530 Login incorrect检查账号、PAM 文件名、用户数据库路径和userlist。•500 OOPS: refusing to run with writable root inside chroot()让根目录归root且不可写把写权限放到子目录不要优先关闭安全检查。• 能登录但无法列目录或传输检查被动端口、防火墙、NAT 和客户端 PASV 模式。•550 Permission denied同时检查 vsftpd 写开关、Linux 权限和 SELinux 上下文。• 虚拟用户能认证但目录错误检查user_sub_token、local_root和目录名是否与虚拟用户名一致。

相关新闻

URP水体渲染:动态生成渐变纹理实现数据驱动颜色控制

URP水体渲染:动态生成渐变纹理实现数据驱动颜色控制

1. 项目概述:为什么要在URP里动态生成渐变图来做水?做水,大概是每个游戏开发者都绕不开的“甜蜜的烦恼”。尤其是在Unity的URP(通用渲染管线)环境下,大家第一时间想到的可能是去Asset Store找个现成的插件&…

2026/7/28 16:43:35 阅读更多 →
Vosk-Browser:浏览器端离线语音识别的革命性解决方案

Vosk-Browser:浏览器端离线语音识别的革命性解决方案

Vosk-Browser:浏览器端离线语音识别的革命性解决方案 【免费下载链接】vosk-browser A speech recognition library running in the browser thanks to a WebAssembly build of Vosk 项目地址: https://gitcode.com/gh_mirrors/vo/vosk-browser 在当今数字化…

2026/7/28 16:43:35 阅读更多 →
物联网安全:SE050与STM32L041C6硬件加密实践

物联网安全:SE050与STM32L041C6硬件加密实践

1. 物联网安全现状与SE050的定位 在2023年的物联网安全态势报告中,全球每天新增的物联网设备达到惊人的150万台,而其中采用基础安全方案的设备占比不足30%。这个数字背后隐藏着巨大的安全隐患——去年因物联网设备漏洞导致的数据泄露事件同比增长了217%。…

2026/7/28 16:42:35 阅读更多 →

最新新闻

【独家】MIT+DeepMind联合泄露报告:2026年前AI将突破因果推理瓶颈——附5个已验证的产业级应用信号

【独家】MIT+DeepMind联合泄露报告:2026年前AI将突破因果推理瓶颈——附5个已验证的产业级应用信号

更多请点击: https://intelliparadigm.com 第一章:AI因果推理突破的范式转移与历史坐标 传统机器学习长期囿于相关性建模,将“统计拟合”误作“机制理解”。而近年来,以Pearl的do-calculus为理论基石、结合结构因果模型&#xff…

2026/7/28 16:52:39 阅读更多 →
2012-2018普及组第一题题解

2012-2018普及组第一题题解

noip2018 标题统计 【题目描述】 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。 【输入】 输入文…

2026/7/28 16:52:39 阅读更多 →
免费轻量级散热控制:3分钟让你的Dell G15告别过热卡顿

免费轻量级散热控制:3分钟让你的Dell G15告别过热卡顿

免费轻量级散热控制:3分钟让你的Dell G15告别过热卡顿 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为游戏本散热问题烦恼吗?当你…

2026/7/28 16:52:39 阅读更多 →
Leaf size is too small for the input dataset 解决办法

Leaf size is too small for the input dataset 解决办法

问题描述 在使用PCL的voxelgrid filter时,若点云过大,而设置的voxel比较小,可能会导致voxel的数量超过int32的上限,从而会出现警告:“Leaf size is too small for the input dataset”。 通用解决办法 此文提出了几…

2026/7/28 16:52:39 阅读更多 →
晴神机试模拟题选解

晴神机试模拟题选解

晴神机试模拟题选解 题目一:next[i] 在字符串匹配的KMP算法中有一个重要的概念是next数组,求解它的过程让不少同学伤透了心。next数组的直接语义其实是:使“长度为L的前缀”与“长度为L的后缀”相同的最大L,且满足条件的前后缀不能是原字符串本身。 例如对字符串"aba…

2026/7/28 16:52:39 阅读更多 →
GPT 5.6 超长上下文调优,大型代码库持续检索稳定方案

GPT 5.6 超长上下文调优,大型代码库持续检索稳定方案

大型代码库动辄几万行,想让AI理解整个项目几乎是不可能的——一次塞不进去,分段又丢了上下文。GPT-5.6的上下文窗口是128K tokens,听起来不小,但对一个5万行的项目来说连五分之一都装不下。怎么在有限的窗口里实现"持续稳定的…

2026/7/28 16:51:39 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻