ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

麒麟V10上vsftpd搭建FTP:匿名、本地与虚拟用户配置实战

麒麟V10上vsftpd搭建FTP:匿名、本地与虚拟用户配置实战 简介这份资源面向在麒麟V10服务器上部署文件共享服务的运维人员与Linux学习者围绕vsftpd搭建FTP服务这一核心任务解决从零配置到多账户登录的实操问题。压缩包内共1个docx文档约4.37MB以图文步骤形式组织内容涵盖概念说明、准备工作、匿名用户登录、本地用户与虚拟用户配置等模块并配有常见问题及解决办法。文档从FTP协议、端口号、账户分类讲起逐步展开查看系统版本、导入ISO映像、安装与重启vsftpd、配置网络等准备环节再分别演示匿名用户与本地用户的权限设置、配置文件修改、安全上下文调整及Windows端连接测试还整理了检查授权、核对/etc/passwd与/etc/shells等排错思路。目前已有6809人学习下载适合需要快速掌握麒麟V10下FTP服务搭建与调试的读者参考。1. 麒麟 V10 上把 FTP 跑起来为什么我优先选 vsftpd 而不是其他方案在麒麟 V10 服务器上搭 FTP很多人第一反应是去找图形化的 FTP 工具或者干脆用 Samba 代替。但真到生产环境里尤其是需要跨 Windows、Linux、国产终端混用的场景FTP 依然是那个最稳、最不挑客户端的方案。麒麟 V10 自带软件源里就有 vsftpd装完改几行配置就能跑不需要额外编译也不用折腾依赖。这篇文章拆的是我在麒麟 V10 上反复搭过多次的一套流程覆盖匿名用户、本地用户、虚拟用户三种模式重点讲清楚每一步的参数含义和翻车点。如果你手头正好有一台麒麟 V10 服务器想快速把文件上传下载通道打通这套东西可以直接抄。适合运维、信创适配工程师以及需要在国产系统上做文件共享的开发者。2. 装 vsftpd 之前系统确认、ISO 源与网络配置2.1 确认系统版本和软件源状态麒麟 V10 的版本号直接决定软件源里 vsftpd 的版本和依赖关系。第一步不是急着装而是先看清楚自己跑的是哪个版本。常见做法是执行# 查看内核和系统版本 uname -a cat /etc/kylin-releaseuname -a输出里会带内核版本和架构/etc/kylin-release里是发行版具体版本。麒麟 V10 有 SP1、SP2、SP3 等不同迭代软件源地址和包版本会有差异。如果/etc/kylin-release不存在可以试cat /etc/os-release里面VERSION_ID字段能看出大版本。确认版本之后检查软件源是否可用# 查看当前 repo 列表 dnf repolist # 或者 yum repolist麒麟 V10 默认用 dnf 作为包管理器yum 是兼容命令。如果 repolist 为空或者报错说明 ISO 源没挂上。这时候需要导入 ISO 映像文件作为本地源。把麒麟 V10 的 ISO 挂到光驱或者虚拟机光驱里然后# 创建挂载点 mkdir -p /mnt/cdrom # 挂载 ISO mount /dev/sr0 /mnt/cdrom # 确认挂载成功 ls /mnt/cdrom挂载后能看到Packages、repodata这些目录说明 ISO 内容正常。接下来配置本地 repo 文件# 备份原有 repo 配置 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2/dev/null # 新建本地源配置 cat /etc/yum.repos.d/kylin-local.repo EOF [kylin-local] nameKylin Local ISO baseurlfile:///mnt/cdrom enabled1 gpgcheck0 EOFbaseurl指向挂载点gpgcheck0是临时关闭签名检查内网环境够用。生产环境如果在意完整性可以导入 ISO 里的 GPG key 再开启校验。配完后执行dnf clean all dnf makecache让缓存刷新。2.2 安装 vsftpd 并设置开机自启源配好之后安装就是一条命令的事# 安装 vsftpd dnf install -y vsftpd # 确认安装版本 rpm -qa | grep vsftpd安装完成后vsftpd 的主配置文件在/etc/vsftpd/vsftpd.conf默认的匿名用户目录在/var/ftp。但麒麟 V10 上实际默认访问路径可能是/srv/ftp这个后面配置时会专门处理。启动服务并设置开机自启# 启动 vsftpd systemctl start vsftpd # 设置开机自启 systemctl enable vsftpd # 查看服务状态 systemctl status vsftpdsystemctl status输出里看到active (running)才算真正跑起来。如果显示failed先看/var/log/messages或者journalctl -u vsftpd -n 50常见原因是 21 端口被占用或者配置文件语法错误。2.3 网络配置确保客户端能连上FTP 服务能不能被外部访问网络配置占一半原因。麒麟 V10 在虚拟机里跑的时候网卡名通常是ens33或ens160。先确认 IP# 查看网卡和 IP ip addr show # 或者 ifconfig假设服务器 IP 是192.168.8.124子网掩码255.255.255.0。客户端如果是 Windows 主机需要保证在同一个网段。Windows 侧打开 cmd执行ipconfig看 IPv4 地址是不是192.168.8.x。如果不在同一网段要么改虚拟机网络模式为桥接要么在 Windows 上临时加一个同网段 IP。网络通了之后在 Windows 上先 ping 一下ping 192.168.8.124能 ping 通只代表网络层没问题FTP 还涉及 21 控制端口和 20 数据端口。如果服务器开了防火墙需要放行# 查看防火墙状态 systemctl status firewalld # 放行 FTP 服务 firewall-cmd --permanent --add-serviceftp firewall-cmd --reload如果 firewalld 没开但 iptables 有规则同样需要检查 21 和 20 端口。这一步不做后面客户端连不上会浪费很多时间排查。3. 匿名用户登录配置、权限与 Windows 端验证3.1 匿名用户的核心参数与配置逻辑匿名用户模式适合内部临时共享不需要账号密码客户端用ftp或anonymous作为用户名密码留空即可。但匿名用户的权限控制必须精确否则要么只能看不能传要么传上来一堆乱七八糟的文件。先备份配置文件# 备份原配置 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak然后编辑/etc/vsftpd/vsftpd.conf把匿名相关的参数改成下面这样# 启用匿名访问 anonymous_enableYES # 匿名用户不需要密码 no_anon_passwordYES # 关闭本地用户访问 local_enableNO # 匿名用户上传文件的 umask anon_umask022 # 允许匿名用户上传 anon_upload_enableYES # 允许匿名用户读取所有文件 anon_world_readable_onlyNO # 允许匿名用户创建目录 anon_mkdir_write_enableYES # 允许匿名用户执行删除、重命名等操作 anon_other_write_enableYES # 文件系统编码 utf8_filesystemYES这里有几个参数容易搞混。anon_world_readable_onlyNO是让匿名用户能读取那些权限不是or的文件如果不设上传上来的文件可能自己都下载不了。anon_other_write_enableYES控制的是删除和重命名如果只想要上传不想要删除这个设成NO。改完后重启服务systemctl restart vsftpd3.2 目录权限与 SELinux 上下文配置文件改完不代表就能用目录权限是匿名用户模式最大的坑。默认匿名根目录是/var/ftp但麒麟 V10 上实际可能指向/srv/ftp。先确认# 查看匿名用户根目录 grep ftp /etc/passwd输出里ftp用户的家目录就是匿名根目录。假设是/srv/ftp需要保证# 根目录属主是 root权限 755 chown root:root /srv/ftp chmod 755 /srv/ftp # 在根目录下创建可写子目录 mkdir -p /srv/ftp/upload chown ftp:ftp /srv/ftp/upload chmod 777 /srv/ftp/upload根目录本身不能给写权限否则 vsftpd 会拒绝匿名登录。可写权限要放在子目录里比如upload。这样匿名用户能在upload里上传、新建、重命名但在根目录只能下载。如果系统开了 SELinux还需要改安全上下文# 查看 SELinux 状态 getenforce # 如果返回 Enforcing需要放行 FTP 目录 setsebool -P ftpd_anon_write1 setsebool -P ftpd_full_access1 # 修改目录上下文 semanage fcontext -a -t public_content_rw_t /srv/ftp/upload(/.*)? restorecon -Rv /srv/ftpftpd_anon_write和ftpd_full_access这两个布尔值控制匿名写入和完整访问权限。semanage命令如果提示找不到需要先装policycoreutils-python-utils。3.3 Windows 端连接与功能验证服务端配好后在 Windows 文件资源管理器地址栏输入ftp://192.168.8.124/回车后会弹出登录框用户名填ftp密码留空直接点登录。如果能看到/srv/ftp下的文件说明匿名登录成功。接下来验证上传功能。在 Windows 桌面准备一个测试文件比如test.txt拖拽到upload目录里。然后在服务器上查看ls -l /srv/ftp/upload/如果文件存在且属主是ftp说明上传成功。再在 Windows 端尝试重命名和删除验证anon_other_write_enable是否生效。浏览器方式也可以测试但浏览器对 FTP 的支持越来越弱有些新版浏览器直接屏蔽了 FTP 协议。更稳的方式是用 Windows 文件资源管理器或者命令行# Windows cmd 里连接 ftp 192.168.8.124 # 用户名输入 ftp密码直接回车 # 登录后执行 ls cd upload put test.txt命令行方式能看到每一步的返回码排查问题比图形界面方便。4. 本地用户模式创建用户、禁登录与权限隔离4.1 创建专用 FTP 用户并禁止 Shell 登录本地用户模式比匿名用户安全因为需要账号密码。但直接用系统已有用户做 FTP 登录风险很大常见做法是创建专用用户并且禁止其通过 SSH 登录服务器。# 创建用户 ftpuser指定家目录 useradd -d /home/ftpuser -s /usr/sbin/nologin ftpuser # 设置密码 passwd ftpuser-s /usr/sbin/nologin是关键这样ftpuser只能用来登录 FTP不能 SSH 进系统。但有些系统上/usr/sbin/nologin不在/etc/shells里vsftpd 会拒绝登录。需要检查# 查看 /etc/shells cat /etc/shells如果没有/usr/sbin/nologin追加进去echo /usr/sbin/nologin /etc/shells这一步不做客户端登录时会报530 Login incorrect但日志里看不出具体原因属于典型的血泪坑。4.2 配置本地用户访问参数编辑/etc/vsftpd/vsftpd.conf本地用户相关参数# 启用本地用户 local_enableYES # 允许写入 write_enableYES # 本地用户上传文件权限 local_umask022 # 限制本地用户在家目录 chroot_local_userYES # 允许 chroot 列表中的用户切换目录 chroot_list_enableYES chroot_list_file/etc/vsftpd/chroot_list # 启用用户列表文件 userlist_enableYES userlist_file/etc/vsftpd/user_list userlist_denyNOchroot_local_userYES把所有本地用户限制在家目录chroot_list_file里的用户例外。如果想让所有本地用户都锁在家目录chroot_list_enable可以设成NO。userlist_denyNO表示user_list文件里的用户允许登录不在里面的拒绝。这个逻辑和默认相反容易搞反。如果设成YES则user_list是黑名单。改完后重启systemctl restart vsftpd4.3 目录权限与安全上下文调整本地用户的家目录权限同样关键。假设用户是ftpuser家目录/home/ftpuser# 家目录属主 chown ftpuser:ftpuser /home/ftpuser # 权限 755不能给 777 chmod 755 /home/ftpuser # 创建可写子目录 mkdir -p /home/ftpuser/upload chown ftpuser:ftpuser /home/ftpuser/upload chmod 755 /home/ftpuser/upload家目录如果给777vsftpd 会认为不安全直接拒绝登录。可写操作放在子目录里子目录权限755配合local_umask022上传的文件权限是644目录是755。SELinux 方面# 允许 FTP 读写家目录 setsebool -P ftp_home_dir1 # 如果还不行临时放行 setsebool -P ftpd_full_access1ftp_home_dir控制 FTP 是否能访问用户家目录默认可能是关闭的。不改这个本地用户登录后看不到自己家目录里的文件。4.4 客户端测试与权限验证Windows 端连接ftp://192.168.8.124/用户名ftpuser密码是刚才设置的。登录后应该直接进入/home/ftpuser能看到upload目录。尝试上传文件到upload然后在服务器上确认属主和权限。如果登录失败按顺序检查# 查看 FTP 日志 tail -f /var/log/vsftpd.log # 或者 journalctl -u vsftpd -f日志里530 Login incorrect通常是密码错或者 shell 问题500 OOPS: vsftpd: refusing to run with writable root inside chroot()是家目录权限给太宽550 Failed to change directory是 SELinux 或者目录权限问题。5. 虚拟用户模式PAM 认证、数据库文件与权限分级5.1 虚拟用户的认证原理与文件准备虚拟用户的核心思路是账号密码存在数据库文件里不占用系统用户。vsftpd 通过 PAM 模块读取这个数据库验证通过后映射到一个系统用户来执行文件操作。这样既能精细控制每个虚拟用户的权限又不会在系统里留一堆真实账户。先创建虚拟用户列表文件# 创建虚拟用户文本文件 vim /etc/vsftpd/vusers.txt内容格式是奇数行用户名偶数行密码vuser1 password1 vuser2 password2然后用db_load转成数据库文件# 安装 db 工具 dnf install -y libdb-utils # 转换为数据库 db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db # 设置权限 chmod 600 /etc/vsftpd/vusers.db-T允许非 Berkeley DB 文本文件转换-t hash指定哈希类型。数据库文件权限必须600否则 PAM 模块可能拒绝读取。5.2 创建映射用的系统用户和 PAM 配置虚拟用户需要一个系统用户来“承载”文件操作通常叫virtual或者vftp# 创建虚拟用户映射的系统账户 useradd -d /home/virtual -s /usr/sbin/nologin virtual # 设置家目录权限 chmod 755 /home/virtual然后创建 PAM 配置文件/etc/pam.d/vsftpd.vu# 备份原 PAM 配置 cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak # 新建虚拟用户 PAM 配置 cat /etc/pam.d/vsftpd.vu EOF auth required pam_userdb.so db/etc/vsftpd/vusers account required pam_userdb.so db/etc/vsftpd/vusers EOF注意db后面跟的路径不带.db后缀PAM 模块会自动补。如果写成/etc/vsftpd/vusers.db反而会找不到文件。接着修改/etc/vsftpd/vsftpd.conf指定 PAM 服务名# 使用虚拟用户 PAM 配置 pam_service_namevsftpd.vu # 启用虚拟用户 guest_enableYES # 虚拟用户映射的系统用户 guest_usernamevirtual # 虚拟用户权限独立配置 user_config_dir/etc/vsftpd/vusers_confguest_enableYES是虚拟用户模式的开关guest_username指定映射用户user_config_dir让每个虚拟用户有独立的权限配置文件。5.3 为每个虚拟用户配置独立权限创建用户配置目录mkdir -p /etc/vsftpd/vusers_conf为vuser1创建配置只读权限cat /etc/vsftpd/vusers_conf/vuser1 EOF # 只读不能上传 write_enableNO anon_world_readable_onlyYES anon_upload_enableNO anon_mkdir_write_enableNO anon_other_write_enableNO local_root/srv/ftp/vuser1 EOF为vuser2创建配置可读写cat /etc/vsftpd/vusers_conf/vuser2 EOF # 可上传、下载、新建、删除 write_enableYES anon_world_readable_onlyNO anon_upload_enableYES anon_mkdir_write_enableYES anon_other_write_enableYES local_root/srv/ftp/vuser2 EOFlocal_root指定每个虚拟用户登录后的根目录。需要提前创建并授权mkdir -p /srv/ftp/vuser1 /srv/ftp/vuser2 chown virtual:virtual /srv/ftp/vuser1 /srv/ftp/vuser2 chmod 755 /srv/ftp/vuser1 /srv/ftp/vuser2重启服务systemctl restart vsftpd5.4 虚拟用户测试与数据库重建Windows 端分别用vuser1和vuser2登录验证权限差异。vuser1应该只能下载上传会报550 Permission denied。vuser2可以上传、新建、删除。如果登录失败最常见的原因是数据库文件没重建。修改vusers.txt后必须重新执行db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db systemctl restart vsftpd直接改.db文件是没用的它是二进制格式。另外PAM 配置里db路径写错、数据库文件权限不是600、guest_username指定的用户不存在都会导致530 Login incorrect。6. 避坑与排查麒麟 V10 上 FTP 最常见的五个翻车点6.1 匿名用户能登录但无法上传现象Windows 端用ftp登录成功能看到目录但拖拽文件时提示权限不足。原因匿名根目录权限给太宽或者可写子目录属主不对。vsftpd 要求匿名根目录不能有写权限否则拒绝登录但子目录需要给ftp用户写权限。解决根目录chmod 755属主root可写子目录chown ftp:ftpchmod 777。同时确认anon_upload_enableYES和write_enableYES都已开启。6.2 本地用户登录报 530 Login incorrect现象密码确认没错但客户端一直提示登录失败。原因用户 shell 是/usr/sbin/nologin但/etc/shells里没有这个路径vsftpd 认为该用户不允许登录。解决cat /etc/shells检查如果没有/usr/sbin/nologin追加进去重启 vsftpd。或者把用户 shell 改成/bin/false同样要确保在/etc/shells里。6.3 虚拟用户修改密码后不生效现象改了vusers.txt里的密码重启服务后还是旧密码能登录。原因vusers.db没有重新生成PAM 读的还是旧数据库。解决每次修改vusers.txt后必须重新执行db_load命令生成.db文件然后重启 vsftpd。养成习惯改文本文件 → 重建数据库 → 重启服务三步不能少。6.4 客户端连接超时或被动模式失败现象能 ping 通服务器但 FTP 客户端连接时卡在Entering Passive Mode。原因被动模式需要服务器开放一个随机端口范围防火墙没放行。或者 vsftpd 没配置pasv_address返回的是内网 IP客户端无法回连。解决在/etc/vsftpd/vsftpd.conf里加pasv_enableYES pasv_min_port30000 pasv_max_port31000 pasv_address192.168.8.124防火墙放行30000-31000端口。pasv_address填服务器实际 IP不要填127.0.0.1。6.5 SELinux 导致上传文件后无法下载现象文件上传成功但客户端下载时提示550 Failed to open file。原因SELinux 上下文不对上传的文件被标记为user_home_t而不是public_content_t。解决执行setsebool -P ftpd_full_access1临时放行或者用semanage fcontext修正目录上下文后restorecon。生产环境建议精确配置上下文不要长期开着ftpd_full_access。7. 进阶技巧用 user_config_dir 做细粒度权限和日志审计虚拟用户模式最实用的进阶玩法是把user_config_dir和独立日志结合起来。每个虚拟用户在/etc/vsftpd/vusers_conf/下有自己的配置文件可以单独控制上传、下载、删除、重命名甚至限速。比如给vuser2加限速cat /etc/vsftpd/vusers_conf/vuser2 EOF # 限速 500KB/s local_max_rate512000 # 空闲超时 idle_session_timeout300 # 数据连接超时 data_connection_timeout60 EOFlocal_max_rate单位是字节每秒512000大约是 500KB/s。这个参数对虚拟用户同样生效因为虚拟用户最终映射到virtual系统用户走的是本地用户限速逻辑。日志方面vsftpd 默认写/var/log/vsftpd.log但虚拟用户的登录和操作可以单独记录。在vsftpd.conf里确认xferlog_enableYES xferlog_file/var/log/vsftpd.log xferlog_std_formatYESxferlog_std_formatYES输出的是标准格式方便用脚本解析。如果要做审计可以按用户拆分日志# 在 user_config_dir 里为每个用户指定独立日志 cat /etc/vsftpd/vusers_conf/vuser2 EOF xferlog_file/var/log/vsftpd_vuser2.log EOF这样vuser2的上传下载记录会单独写到/var/log/vsftpd_vuser2.log排查问题时不用在一大堆日志里翻。验证配置是否生效最直接的方法是传一个文件然后看日志tail -f /var/log/vsftpd_vuser2.log正常输出里会有OK UPLOAD、OK DOWNLOAD这样的记录带文件名、大小、耗时。如果日志没动静说明xferlog_enable没开或者路径写错。还有一个容易忽略的点虚拟用户的local_root目录如果不存在登录后会报500 OOPS: cannot change directory。我一般会在创建用户配置的同时用脚本批量建目录# 批量创建虚拟用户根目录 for user in vuser1 vuser2; do mkdir -p /srv/ftp/$user chown virtual:virtual /srv/ftp/$user chmod 755 /srv/ftp/$user done从那以后我每次配虚拟用户都先把目录建好、权限设好、数据库重建一遍再重启服务最后才去客户端测。这三步顺序乱了排查起来就是黑匣子。希望帮到你。本文还有配套的精品资源点击获取
返回列表