简介:这份资源面向在麒麟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] name=Kylin Local ISO baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0 EOFbaseurl指向挂载点,gpgcheck=0是临时关闭签名检查,内网环境够用。生产环境如果在意完整性,可以导入 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-service=ftp 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_enable=YES # 匿名用户不需要密码 no_anon_password=YES # 关闭本地用户访问 local_enable=NO # 匿名用户上传文件的 umask anon_umask=022 # 允许匿名用户上传 anon_upload_enable=YES # 允许匿名用户读取所有文件 anon_world_readable_only=NO # 允许匿名用户创建目录 anon_mkdir_write_enable=YES # 允许匿名用户执行删除、重命名等操作 anon_other_write_enable=YES # 文件系统编码 utf8_filesystem=YES这里有几个参数容易搞混。anon_world_readable_only=NO是让匿名用户能读取那些权限不是o+r的文件,如果不设,上传上来的文件可能自己都下载不了。anon_other_write_enable=YES控制的是删除和重命名,如果只想要上传不想要删除,这个设成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_write=1 setsebool -P ftpd_full_access=1 # 修改目录上下文 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_enable=YES # 允许写入 write_enable=YES # 本地用户上传文件权限 local_umask=022 # 限制本地用户在家目录 chroot_local_user=YES # 允许 chroot 列表中的用户切换目录 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list # 启用用户列表文件 userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=NOchroot_local_user=YES把所有本地用户限制在家目录,chroot_list_file里的用户例外。如果想让所有本地用户都锁在家目录,chroot_list_enable可以设成NO。
userlist_deny=NO表示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家目录如果给777,vsftpd 会认为不安全,直接拒绝登录。可写操作放在子目录里,子目录权限755配合local_umask=022,上传的文件权限是644,目录是755。
SELinux 方面:
# 允许 FTP 读写家目录 setsebool -P ftp_home_dir=1 # 如果还不行,临时放行 setsebool -P ftpd_full_access=1ftp_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_name=vsftpd.vu # 启用虚拟用户 guest_enable=YES # 虚拟用户映射的系统用户 guest_username=virtual # 虚拟用户权限独立配置 user_config_dir=/etc/vsftpd/vusers_confguest_enable=YES是虚拟用户模式的开关,guest_username指定映射用户,user_config_dir让每个虚拟用户有独立的权限配置文件。
5.3 为每个虚拟用户配置独立权限
创建用户配置目录:
mkdir -p /etc/vsftpd/vusers_conf为vuser1创建配置,只读权限:
cat > /etc/vsftpd/vusers_conf/vuser1 << 'EOF' # 只读,不能上传 write_enable=NO anon_world_readable_only=YES anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO local_root=/srv/ftp/vuser1 EOF为vuser2创建配置,可读写:
cat > /etc/vsftpd/vusers_conf/vuser2 << 'EOF' # 可上传、下载、新建、删除 write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES 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:ftp,chmod 777。同时确认anon_upload_enable=YES和write_enable=YES都已开启。
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_enable=YES pasv_min_port=30000 pasv_max_port=31000 pasv_address=192.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_access=1临时放行,或者用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_rate=512000 # 空闲超时 idle_session_timeout=300 # 数据连接超时 data_connection_timeout=60 EOFlocal_max_rate单位是字节每秒,512000大约是 500KB/s。这个参数对虚拟用户同样生效,因为虚拟用户最终映射到virtual系统用户,走的是本地用户限速逻辑。
日志方面,vsftpd 默认写/var/log/vsftpd.log,但虚拟用户的登录和操作可以单独记录。在vsftpd.conf里确认:
xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YESxferlog_std_format=YES输出的是标准格式,方便用脚本解析。如果要做审计,可以按用户拆分日志:
# 在 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从那以后我每次配虚拟用户,都先把目录建好、权限设好、数据库重建一遍,再重启服务,最后才去客户端测。这三步顺序乱了,排查起来就是黑匣子。希望帮到你。
本文还有配套的精品资源,点击获取