☰
麒麟V10服务器搭建FTP服务:vsftpd配置、防火墙与SELinux排错指南
2026/10/6 6:12:54 网站建设 项目流程

简介:这份资源面向在国产麒麟V10服务器上部署文件共享服务的运维人员与Linux学习者,聚焦FTP服务的完整搭建流程,帮助解决文件上传、下载与共享的实际需求。资源包内含1个docx文档,压缩包大小约4.37MB,以图文步骤形式组织内容,便于对照操作。文档从FTP基本概念讲起,涵盖协议端口、账户分类与配置文件说明,随后依次展开准备工作、匿名用户登录、本地用户登录及虚拟用户配置等模块,并针对授权检查、shells配置、数据库重建等常见问题给出排错思路。目前已有6809人学习下载,适合需要快速上手麒麟V10平台FTP服务搭建、希望获得可复用配置参考与故障排查经验的读者。

1. 麒麟V10服务器搭建FTP服务:从 systemctl 到防火墙的完整落地路径

很多人在麒麟V10服务器上装完 vsftpd,systemctl start显示绿色 running,结果客户端一连就报Connection refused或者登录后目录空白。问题往往不在 vsftpd 本身,而在麒麟V10默认开启的防火墙策略、SELinux 布尔值、以及 PAM 认证模块这三道关卡上。这篇笔记面向需要在麒麟V10(含 SP3 等常见版本)上搭建 FTP 服务、用于内网文件分发或替代简单文件共享的运维人员。我会按「装包 → 配置 → 放行 → 验证 → 排错」的顺序,把每一步的命令、参数含义和翻车点讲清楚,让你照着敲就能跑通一个可用的 FTP 服务,而不是停在「服务已启动」的假象里。

2. 装包与最小可用配置:vsftpd 在麒麟V10上的安装与首次启动

2.1 为什么选 vsftpd 而不是其他 FTP 软件

在麒麟V10的软件源里,vsftpd 是最省心的选择。它体积小、依赖少、默认配置偏安全,而且麒麟V10的官方仓库直接收录,yum或dnf一条命令就能装完。相比之下,pure-ftpd 需要额外配 PAM 规则,proftpd 的配置文件语法更重,对于「内网快速搭一个文件交换点」这个需求来说,vsftpd 的投入产出比最高。

麒麟V10基于 RPM 体系,包管理命令用dnf或yum都行,实际指向同一套仓库。先确认系统版本和架构,避免装错包:

# 查看系统版本,确认是麒麟V10哪个SP cat /etc/kylin-release # 查看架构,x86_64 还是 aarch64 uname -m

这两条命令的输出要记下来。后面如果遇到问题去查资料,版本和架构是第一个要提供的信息。尤其是 aarch64 架构的麒麟V10,某些第三方源里的包可能不兼容,尽量只用系统自带源。

2.2 安装 vsftpd 并设置开机自启

安装本身没有难度,关键是装完之后别急着改配置,先让服务以默认配置跑起来,确认基础环境没问题:

# 安装 vsftpd,-y 自动确认 sudo dnf install -y vsftpd # 启动服务 sudo systemctl start vsftpd # 设置开机自启,服务器重启后 FTP 自动可用 sudo systemctl enable vsftpd # 查看服务状态,确认 active (running) sudo systemctl status vsftpd

systemctl status的输出里,重点看两行:Active:后面是不是active (running),以及Loaded:后面是不是enabled。如果Active显示failed,先别改配置文件,用journalctl -u vsftpd -n 50看最近50行日志,大概率是端口被占用或者配置文件语法错误。

安装完成后,vsftpd 的默认配置文件在/etc/vsftpd/vsftpd.conf,默认的 FTP 根目录在/var/ftp。这两个路径先记住,后面所有配置都围绕它们展开。

2.3 首次启动后必须确认的三件事

服务跑起来不等于能用。在麒麟V10上,默认配置下至少有三件事会挡住你的客户端连接:

第一,防火墙。麒麟V10默认启用 firewalld,FTP 的 21 端口和被动模式的数据端口都没放行。第二,SELinux。麒麟V10默认 SELinux 是 enforcing 状态,它会限制 vsftpd 读取非标准目录。第三,匿名访问。默认配置允许匿名用户登录,但匿名用户只能读不能写,如果你要的是带账号密码的可写 FTP,这一步就得改。

先用一条命令快速验证本机 FTP 端口是否在监听:

# 查看 21 端口监听状态 ss -tlnp | grep :21

如果输出里有vsftpd且状态是LISTEN,说明服务本身没问题,连不上就是防火墙或 SELinux 的事。如果没有输出,回到上一步看服务日志。

3. 配置文件逐项拆解:从匿名访问到本地用户读写的参数怎么改

3.1 vsftpd.conf 的核心参数与推荐值

直接编辑/etc/vsftpd/vsftpd.conf,下面这份配置是我在麒麟V10上反复用过的版本,支持本地用户登录、可读可写、禁用匿名、限制用户只能在自己的家目录里活动:

# 备份原配置,出问题能快速回滚 sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak # 编辑配置 sudo vi /etc/vsftpd/vsftpd.conf

在配置文件里确保以下参数存在且值正确。如果某一行前面有#,把#去掉;如果没有这一行,手动加上:

# 禁用匿名登录,只允许本地系统用户 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许本地用户写入(上传、创建目录、删除) write_enable=YES # 本地用户的默认权限掩码,022 表示上传的文件权限为 644 local_umask=022 # 限制本地用户只能在自己的家目录里活动 chroot_local_user=YES # 允许 chroot 列表中的用户例外(配合 chroot_list_file 使用) chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list # 被动模式端口范围,防火墙要放行这个区间 pasv_min_port=30000 pasv_max_port=30100 # 被动模式下返回给客户端的 IP,填服务器本机 IP pasv_address=192.168.1.100 # 启用日志,排错时非常有用 xferlog_enable=YES xferlog_file=/var/log/vsftpd.log

chroot_local_user=YES这个参数有个坑:当用户被 chroot 到自己的家目录后,如果家目录本身没有写权限,vsftpd 会拒绝登录。解决办法是给家目录加写权限,或者用allow_writeable_chroot=YES参数。我一般选前者,因为后者会削弱 chroot 的安全隔离效果。

pasv_address必须填服务器的真实 IP,不能填127.0.0.1。如果服务器有多个网卡,填客户端能访问到的那个 IP。这个参数填错,表现是客户端能登录、能列目录,但一传文件就卡死。

3.2 创建 FTP 专用用户并设置家目录权限

不建议直接用 root 或已有系统账号做 FTP 登录。单独建一个用户,权限边界清晰:

# 创建用户 ftpuser,家目录 /home/ftpuser,禁止 shell 登录 sudo useradd -d /home/ftpuser -s /sbin/nologin ftpuser # 设置密码 sudo passwd ftpuser # 创建家目录并设置权限 sudo mkdir -p /home/ftpuser sudo chown ftpuser:ftpuser /home/ftpuser sudo chmod 755 /home/ftpuser

-s /sbin/nologin表示这个用户不能通过 SSH 登录服务器,只能用于 FTP。这是最小权限原则的体现。chmod 755保证家目录有写权限,避免 chroot 后登录被拒。

如果你需要多个 FTP 用户,重复上面的步骤即可。每个用户独立家目录,互不干扰。

3.3 防火墙放行与 SELinux 布尔值调整

麒麟V10的 firewalld 默认不认 FTP 协议,需要显式放行:

# 放行 FTP 服务,firewalld 会自动处理 21 端口和相关的连接跟踪 sudo firewall-cmd --permanent --add-service=ftp # 放行被动模式端口范围 sudo firewall-cmd --permanent --add-port=30000-30100/tcp # 重新加载防火墙规则 sudo firewall-cmd --reload # 确认放行结果 sudo firewall-cmd --list-all

--add-service=ftp这一条会加载 firewalld 内置的 FTP 规则,包括nf_conntrack_ftp模块,能自动处理主动模式的连接跟踪。被动模式的端口范围必须单独放行,因为它是动态的。

SELinux 方面,麒麟V10默认策略会阻止 vsftpd 访问用户家目录。执行:

# 查看当前 SELinux 状态 getenforce # 如果返回 Enforcing,设置 FTP 相关的布尔值 sudo setsebool -P ftpd_full_access on sudo setsebool -P ftp_home_dir on

ftpd_full_access允许 vsftpd 读写文件,ftp_home_dir允许访问用户家目录。-P参数让设置永久生效,重启后不丢失。如果getenforce返回Disabled,这两条命令可以跳过。

改完配置后重启服务:

sudo systemctl restart vsftpd

4. 客户端连接验证:用命令行和图形工具分别测一遍

4.1 用 ftp 命令行做最小验证

在另一台机器上(或者本机开另一个终端),用ftp命令测试:

# 连接服务器,替换为你的服务器 IP ftp 192.168.1.100 # 输入用户名 ftpuser 和密码 # 登录成功后测试列目录 ls # 测试上传 put /etc/hostname test_upload.txt # 测试下载 get test_upload.txt # 退出 bye

如果ls能列出目录,put和get都成功,说明 FTP 服务基本可用。如果ls卡住不动,大概率是被动模式端口没放行,或者pasv_address填错了。

4.2 图形客户端连接时的注意事项

用 FileZilla、CuteFTP 这类图形工具连接时,把传输模式设为「被动模式」。主动模式在 NAT 环境下经常失败,因为服务器会尝试反向连接客户端的一个随机端口,这个端口通常被客户端防火墙挡住。

连接信息填写:主机填服务器 IP,端口 21,协议 FTP,加密方式选「只使用普通 FTP」或者「显式 FTP over TLS」(如果没配证书就选普通)。登录类型选「正常」,填用户名和密码。

如果图形客户端报425 Failed to establish connection,回到服务器检查pasv_min_port和pasv_max_port是否在防火墙放行范围内,以及pasv_address是否等于客户端访问的 IP。

4.3 用日志确认每一次连接的去向

排错时最有用的工具是日志。vsftpd 的日志默认在/var/log/vsftpd.log,如果配置了xferlog_enable=YES,上传下载记录会写在这里:

# 实时查看 FTP 日志 sudo tail -f /var/log/vsftpd.log

日志里会记录每次连接的来源 IP、登录用户名、执行的命令、传输的文件名和字节数。如果客户端报错但日志里没有对应记录,说明连接根本没到 vsftpd,问题在防火墙或网络层。如果日志里有FAIL LOGIN,说明用户名密码错了,或者 PAM 配置有问题。

5. 避坑与排查:麒麟V10上搭 FTP 最容易翻车的五个点

5.1 坑一:服务 running 但客户端 Connection refused

现象:systemctl status vsftpd显示 active (running),但客户端连接直接报Connection refused。

原因:firewalld 没放行 21 端口,或者 vsftpd 只监听了127.0.0.1而不是0.0.0.0。

解决:先ss -tlnp | grep :21看监听地址。如果是127.0.0.1:21,在vsftpd.conf里加listen_address=0.0.0.0或者删掉listen_address行。然后firewall-cmd --list-all确认ftp服务在放行列表里,不在就执行--add-service=ftp并--reload。

5.2 坑二:登录成功但目录列表为空或卡死

现象:输入用户名密码后登录成功,但ls命令卡住,最后超时。

原因:被动模式端口范围没放行,或者pasv_address填的是内网 IP 但客户端从外网访问。

解决:确认pasv_min_port和pasv_max_port之间的端口在 firewalld 里放行了。pasv_address必须填客户端能路由到的 IP。如果服务器在 NAT 后面,pasv_address填公网 IP,同时路由器上做端口映射。

5.3 坑三:chroot 后用户无法登录,报 500 OOPS

现象:本地用户登录时报500 OOPS: vsftpd: refusing to run with writable root inside chroot()。

原因:chroot_local_user=YES把用户锁在家目录,但家目录有写权限,vsftpd 认为这不安全。

解决:两个选择。一是去掉家目录的写权限chmod 555 /home/ftpuser,但这样用户就不能在家目录根下创建文件了,需要提前建好子目录并授权。二是在vsftpd.conf里加allow_writeable_chroot=YES,但会降低隔离性。我一般选第一种,提前建好upload子目录给用户写。

5.4 坑四:SELinux 拦截导致上传失败

现象:登录和列目录正常,但上传文件时报553 Could not create file。

原因:SELinux 的ftpd_full_access布尔值没开,或者目标目录的 SELinux 上下文不对。

解决:先getenforce确认是 Enforcing。然后sudo setsebool -P ftpd_full_access on。如果还不行,用ls -Z /home/ftpuser看目录的 SELinux 上下文,应该是ftpd_etc_t或user_home_t。不对的话用restorecon -Rv /home/ftpuser恢复默认上下文。

5.5 坑五:重启后服务没起来

现象:服务器重启后 FTP 连不上,systemctl status vsftpd显示 inactive。

原因:忘了systemctl enable vsftpd,或者 vsftpd 依赖的网络服务启动顺序有问题。

解决:执行sudo systemctl enable vsftpd设置开机自启。如果已经 enable 了但还是没起来,检查journalctl -b -u vsftpd看本次启动的日志。麒麟V10上偶尔会遇到网络管理服务启动慢导致 vsftpd 抢跑失败,可以在vsftpd.service里加After=network-online.target和Wants=network-online.target。

6. 进阶技巧:用虚拟用户和 TLS 把 FTP 服务做得更可控

本地用户方案够用,但用户多了之后管理麻烦,而且每个用户都要占一个系统账号。虚拟用户方案把 FTP 账号和系统账号解耦,所有虚拟用户映射到一个系统用户上,权限统一管理,账号增删只改两个文本文件,不用碰useradd。

先装认证模块:

sudo dnf install -y libdb-utils

创建虚拟用户密码文件,奇数行用户名,偶数行密码:

# 创建虚拟用户文件 sudo vi /etc/vsftpd/virtusers

内容格式:

ftpuser1 password1 ftpuser2 password2

生成数据库文件:

# 生成 Berkeley DB 格式的认证文件 sudo db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db # 设置权限,只允许 root 读写 sudo chmod 600 /etc/vsftpd/virtusers.db

创建 PAM 配置文件/etc/pam.d/vsftpd.virtual:

auth required pam_userdb.so db=/etc/vsftpd/virtusers account required pam_userdb.so db=/etc/vsftpd/virtusers

在vsftpd.conf里启用虚拟用户:

# 启用虚拟用户 guest_enable=YES guest_username=ftpuser pam_service_name=vsftpd.virtual # 虚拟用户独立配置文件目录 user_config_dir=/etc/vsftpd/virtusers_conf

为每个虚拟用户建独立配置,比如/etc/vsftpd/virtusers_conf/ftpuser1:

# 虚拟用户的家目录 local_root=/home/ftpuser/ftpuser1 # 允许写入 write_enable=YES # 允许下载 download_enable=YES

虚拟用户方案的好处是:FTP 账号和系统账号彻底分离,删掉一个虚拟用户不影响系统;每个用户可以独立配置权限和家目录;密码文件集中管理,备份方便。

TLS 加密方面,用openssl生成自签证书,在vsftpd.conf里加ssl_enable=YES、rsa_cert_file和rsa_private_key_file指向证书路径,强制加密用force_local_logins_ssl=YES和force_local_data_ssl=YES。自签证书客户端会提示不受信任,内网使用可以接受,或者把证书导入客户端信任库。

最后说一个我自己的习惯:每次改完vsftpd.conf,先vsftpd -olisten=NO /etc/vsftpd/vsftpd.conf做语法检查,确认没报错再systemctl restart。这个命令不会真正启动服务,只解析配置,能提前发现拼写错误和参数冲突。搭 FTP 这件事,配置本身不难,难的是防火墙、SELinux、权限这三层叠加后的排查。把日志看熟,把ss、firewall-cmd --list-all、getenforce这三条命令变成肌肉记忆,大部分问题都能在五分钟内定位。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询