
1. 部署前环境准备与方案取舍1.1 为什么在openEuler上选vsftpd先说说背景。前阵子公司内部要搭一个文件服务器给开发和交付两边的同事交换部署包、日志和配置文件用。要求很明确稳定、配置简单、权限可控。手头正好有一台新装好的openEuler 22.03 LTS SP3服务器系统纯净网络环境是标准办公内网。考察了一圈传输方案最后还是选了vsftpd。vsftpd的全称是Very Secure FTP Daemon在Linux生态里算是老牌FTP服务端了。它体积小、配置直观安全性设计也扎实尤其对匿名用户和虚拟用户的支持非常成熟。相比自己用Python写个HTTP上传服务vsftpd直接提供完整的权限体系、日志体系和并发控制相比Samba它更轻量Windows、macOS、Linux客户端都能开箱即连。openEuler的软件源里也直接收录了vsftpd一条命令就能装完全不需要手工编译折腾源码。有同事问过为什么不用SSH自带的SFTP从传输安全角度看SFTP确实更优。但现实需求是业务那边有一台老旧设备只支持FTP协议没法改固件项目周期又不允许等设备替换。所以FTP在内网这种明确边界内依然是绕不开的需求。vsftpd配合IP白名单、内网隔离、被动端口限制安全性完全够用。1.2 系统基础检查与静态IP配置部署之前先把系统环境摸清楚。我习惯先看操作系统版本和内核cat /etc/openEuler-release uname -a我这边输出是openEuler 22.03 LTS SP3x86_64架构。接着检查网络状态确保服务器有固定IP。很多人装完系统发现客户端连不上十有八九是IP配置问题或者防火墙没放行先把底层环境打牢比啥都强。配置静态IP是第一步。openEuler默认由NetworkManager管理网络直接改ifcfg网卡文件vi /etc/sysconfig/network-scripts/ifcfg-ens160把核心参数改成这样BOOTPROTOstatic ONBOOTyes IPADDR192.168.10.88 PREFIX24 GATEWAY192.168.10.1 DNS1192.168.10.1改完重载网络配置nmcli connection reload nmcli connection up ens160这里有个细节老一批习惯了CentOS 6/7操作方式的运维可能还在用service network restart但openEuler 20.03之后网络管理基本都切到NetworkManager了直接在ifcfg文件里改完最好用nmcli重载一次否则配置可能不生效。改完确认一下IP和连通性ip addr show ens160 ping -c 4 192.168.10.1能ping通网关就说明网络通了后面部署FTP才谈得上被客户端访问。如果机器是刚装好的我还建议先更新一下软件源缓存避免后续装包遇到索引过期的问题dnf makecacheopenEuler默认的dnf源指向官方镜像站一般不用额外改动。如果服务器部署在隔离内网记得提前把源替换成内网镜像地址否则dnf安装会卡在超时上很浪费时间。2. 安装vsftpd并完成基础配置2.1 安装步骤与路径梳理openEuler安装软件包非常简单直接走dnfdnf install -y vsftpd安装完成后用rpm确认一下装好的关键文件路径rpm -ql vsftpd | head -30vsftpd装好后需要重点关注的路径有这些/etc/vsftpd/vsftpd.conf主配置文件所有行为都在这里调整/etc/vsftpd/ftpusers被禁止登录FTP的用户列表默认包含root、bin、daemon等系统账号/etc/vsftpd/user_list配合userlist_enable和userlist_deny参数实现白名单或黑名单/usr/sbin/vsftpd主程序文件/var/ftp匿名用户的根目录不过后面我直接关闭了匿名访问启动服务并设置开机自启systemctl start vsftpd systemctl enable vsftpd systemctl status vsftpd看到active (running)说明服务已经起来了。这里先打个预防针如果你之前动过SELinux不要急着setenforce 0关掉它后面第4章专门讲怎么正确调SELinux策略。一遇到问题就关SELinux解决不了根本问题反而给服务器留下安全隐患。2.2 主配置文件核心参数逐项拆解vsftpd.conf是核心几乎所有的行为都由它决定。默认配置可以直接跑但要做一个生产可用的私有文件服务器需要动不少地方。我把这次实际使用的配置贴出来再逐个解释关键项anonymous_enableNO local_enableYES write_enableYES local_umask022 dirmessage_enableYES xferlog_enableYES connect_from_port_20YES xferlog_std_formatYES listenYES listen_ipv6NO pam_service_namevsftpd userlist_enableYES userlist_denyNO tcp_wrappersYES chroot_local_userYES allow_writeable_chrootYES local_root/data/ftp pasv_enableYES pasv_min_port30000 pasv_max_port31000逐个拆开讲。anonymous_enableNO直接关掉匿名访问。内网文件交换场景原则上所有访问者都必须有明确身份匿名通道关掉最省心也少一个被渗透的入口。local_enableYES允许系统本地用户登录。这是FTP账号体系的基础后面创建的Linux用户都能用来登录FTP。write_enableYES允许写入。FTP服务器要接收上传文件这行必须打开。如果只是做下载分发可以关掉但这次业务要传包所以必须开。local_umask022上传文件的权限掩码。022意味着新上传的文件权限是644目录是755。这样其他用户能读但不能改符合文件分发场景。如果希望文件只属于上传者本人可以改成077。chroot_local_userYES把用户限制在自己的家目录里。这行非常关键不开启的话用户登录后可以一路浏览到/var、/etc等系统目录安全隐患很大。开启后用户看到的根目录就是自己的家目录外面什么都看不到。allow_writeable_chrootYES允许chroot目录本身可写。单独说明一下vsftpd出于安全考量如果chroot目录本身可写会拒绝登录并报500 OOPS错误。早期的解决办法是让用户家目录不可写但实际使用中我们经常希望用户直接把文件传到根目录。加上这个参数就绕开了限制。local_root/data/ftp指定用户的FTP根目录。我这里用了统一目录后面会给不同项目组建不同子目录并做权限隔离。pasv_enableYES启用被动模式。FTP有两种工作模式主动模式PORT和被动模式PASV。现在几乎所有客户端都处在NAT后面主动模式下服务器主动连回客户端端口基本都会失败所以必须用被动模式。后面再用防火墙放行30000-31000这个端口段。2.3 重启服务与基础连接验证配置改完重启vsftpd并检查端口监听systemctl restart vsftpd ss -tlnp | grep 21看到0.0.0.0:21或:::21在监听就正常。然后本地测试一下匿名访问是否被拒绝ftp 127.0.0.1输入用户名anonymous应该直接被拒。如果还能进去说明anonymous_enable的配置没生效检查一下配置文件里对应的行是不是被#注释掉了。本地验证通过之后再拿一台内网客户机去连几秒钟就能确认服务基本可用。3. 用户权限规划与目录隔离细节3.1 创建专用FTP账号并禁用ShellFTP服务不建议直接用root账号登录也不建议使用高权限的系统账号。因为FTP账号的密码在网络上是明文传输的一旦泄露攻击者就等于拿到了一个有效登录凭证。正确的做法是单独建一个专用FTP账号按最小权限原则赋予它只属于FTP服务的权限。我的做法是useradd -d /data/ftp/devuser -s /sbin/nologin devuser passwd devuser这里的-s /sbin/nologin参数意思是为用户指定非登录Shell。这样devuser只能通过FTP登录无法SSH登录系统即使FTP密码泄露攻击者也拿不到shell。这是安全基线里很重要的一条相当于在账号层面做了一层隔离。建完账号后顺手设置一下家目录属主和权限chown devuser:devuser /data/ftp/devuser chmod 755 /data/ftp/devuser这里权限设置要注意如果把家目录设置成777配合allow_writeable_chrootYES会让用户对整个根目录都有完全控制权这种配置在生产环境里非常危险。我把家目录设置成755用户能看到但只有属主能写。3.2 多项目目录隔离的两种方案如果只是一个人用账号建好就能开工了。但实际情况是文件服务器通常要给多个项目组共用这时候目录隔离就很重要。我提供两种方案按需选择。方案一同一用户下建子目录区分项目。如果几个项目组共用一个账号在/data/ftp/devuser下建立project_a、project_b等子目录再按项目组分配子目录的写权限。优点是账号少、好管理缺点是同一账号下所有人相互没有隔断误删除的概率高。方案二每个项目组单独账号和目录。这是强烈推荐的方案。创建步骤mkdir -p /data/ftp/project_a mkdir -p /data/ftp/project_b useradd -d /data/ftp/project_a -s /sbin/nologin user_a useradd -d /data/ftp/project_b -s /sbin/nologin user_b passwd user_a passwd user_b chown user_a:user_a /data/ftp/project_a -R chown user_b:user_b /data/ftp/project_b -R开启chroot_local_userYES后user_a登录后看到的根目录就是/data/ftp/project_a内容为空只能在自己这棵目录树下活动。user_b也一样两个账号天然隔离谁也看不见谁权限边界非常清晰。实操时我还习惯在每个用户目录下预创建几个常用子目录比如upload、download、backup然后设置好属主mkdir -p /data/ftp/project_a/{upload,download,backup} chown user_a:user_a /data/ftp/project_a -R用户一进来就能看到清晰的文件结构配合dirmessage_enableYES还可以设置目录欢迎信息使用体验会提升不少。3.3 虚拟用户模式进阶配置系统本地用户模式简单但如果账号规模变大每个FTP账号都占用一个系统用户名额管理起来很麻烦。虚拟用户模式可以解决这个问题它把FTP账号独立存放在一个文件或数据库里认证交给PAM处理账号本身在系统里并不存在安全性更高。虚拟用户的配置分四步。第一步创建纯文本账号密码文件格式是用户名一行、密码一行交替排列vi /etc/vsftpd/vuser.txt内容示例vuser1 pass123456 vuser2 pass654321第二步把纯文本文件转成vsftpd能识别的hash数据库文件。openEuler 22.03上用的是db5工具db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db chmod 600 /etc/vsftpd/vuser.dbdb_load命令由db5-utils包提供如果提示找不到命令先装包dnf install -y db5-utils第三步配置PAM认证。openEuler的vsftpd默认PAM配置文件是/etc/pam.d/vsftpd改成这样auth required pam_userdb.so db/etc/vsftpd/vuser account required pam_userdb.so db/etc/vsftpd/vuser注意db路径后面不写.db后缀pam_userdb会自己补全。同时主配置里需要加pam_service_namevsftpd guest_enableYES guest_usernameftpguest_username指定虚拟用户映射到哪个系统账号这里映射成ftp用户所有虚拟用户的文件操作身份都是ftp。第四步做虚拟用户目录隔离。在vsftpd.conf里加一行user_config_dir/etc/vsftpd/vuser_conf然后为每个虚拟用户单独建配置文件。比如创建/etc/vsftpd/vuser_conf/vuser1内容local_root/data/ftp/vuser1 write_enableYES anon_umask022每个虚拟用户的local_root不同就实现了目录隔离。这种模式在多租户文件服务场景里很常见账号增删不影响系统用户管理起来干净利落。缺点是多一层映射关系排错时稍微绕一点。4. 防火墙、SELinux与安全加固4.1 防火墙放行FTP服务与被动端口openEuler默认启用firewalld防火墙规则不配客户端连都连不上。这是FTP部署中最常见的坑之一服务端一切正常客户端就是连接超时基本都是卡在防火墙。按服务名放行FTP是直观的方式firewall-cmd --permanent --add-serviceftp firewall-cmd --reload但这样只放行了21端口。被动模式下客户端还要连接30000-31000这个数据端口段必须一起放行firewall-cmd --permanent --add-port30000-31000/tcp firewall-cmd --reload检查规则是否生效firewall-cmd --list-all看到ftp服务和30000-31000/tcp端口在列表中就可以了。如果服务器用的是纯iptables而非firewalld可以改用iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT service iptables save防火墙是FTP服务能不能被访问的第一道门槛也是最容易被忽略的一环。建议每次部署完都用一条ss命令确认完端口监听再核对一遍防火墙规则避免后面反复折腾。4.2 SELinux策略正确配置方法openEuler默认SELinux是enforcing模式这就是一场容易被人误解的坑。直接启动vsftpd如果没调SELinux策略用户写文件、用被动模式都可能被拦。遇到问题就关SELinux是最偷懒但最不推荐的做法。正确做法是打开vsftpd相关的SELinux布尔值。先看当前的FTP相关开关getsebool -a | grep ftp重点看这几个ftpd_full_accessftp_home_dirallow_ftpd_anon_writeallow_ftpd_use_cifsallow_ftpd_use_nfs如果用户传到自家目录报Permission Denied大概率是ftp_home_dir没开setsebool -P ftp_home_dir 1-P参数表示持久化重启后依然生效。如果FTP根目录不在标准/var/ftp下而是用了/data/ftp这样的自定义路径还需要给目录打上正确的SELinux类型标签semanage fcontext -a -t public_content_t /data/ftp(/.*)? restorecon -Rv /data/ftpsemanage命令由policycoreutils-python-utils包提供。找不到命令就先装dnf install -y policycoreutils-python-utils如果布尔值都开了还是不生效再检查文件上下文ls -Z /data/ftp看输出的SELinux上下文类型是否正确。如果不是public_content_t按上面两步重新标记。这里我想多说一句SELinux真的不是敌人。它是在权限体系之上再叠加一层强制访问控制很多横向渗透攻击就是被它挡住的。为了vsftpd一个服务放弃整个安全机制完全不值得。花十分钟调好策略后面能少操很多心。4.3 用户白名单机制与访问控制前面配置里写到的userlist_enableYES和userlist_denyNO两者组合起来是这么个意思只有在/etc/vsftpd/user_list文件中列出的用户才允许登录FTP其他用户一律拒绝。这就是白名单模式。使用方法vi /etc/vsftpd/user_list写入允许登录的用户名一行一个devuser user_a user_b这样即使系统里存在其他账号且知道密码也无法通过FTP进入服务器。白名单模式非常适合内网文件交换这种用户集合明确、固定不变的场景。如果反过来只想禁止少数几个用户把userlist_deny改成YESuser_list就从白名单变成了黑名单。两种模式两种思路我建议有明确账号规划的用白名单临时应急的黑名单容易疏漏。另外注意/etc/vsftpd/ftpusers文件和user_list是两套独立机制。ftpusers里维护的是绝对禁止登录FTP的系统账号清单默认包含root、bin、daemon等这份文件保持默认就好不要往里加业务账号否则排查时容易混乱。4.4 连接数控制与带宽限制FTP服务器要是不加并发限制某个下载任务就可能把带宽打满影响同一台机器上的其他业务。vsftpd提供了三个非常实用的限制参数max_clients100 max_per_ip10 local_max_rate1000000max_clients控制服务器最大并发连接数max_per_ip控制单个IP的最大连接数local_max_rate是本地用户最大传输速率单位是字节/秒1000000就是约1MB/s。生产环境的FTP服务器我强烈建议加这几个参数尤其是local_max_rate否则一个程序脚本跑批拉文件带宽很容易被打爆。传输超时方面也有必要设置idle_session_timeout600 data_connection_timeout300idle_session_timeout600表示用户连接后10分钟没有操作服务端自动断开。data_connection_timeout300是数据连接5分钟不活跃就断开。这两项能有效回收那些挂着不动的僵死连接避免连接数被耗尽。5. 客户端连接与文件传输实测5.1 Linux命令行客户端验证全流程服务端配置好了先从本机命令行验证一下这样最快最直接。ftp 192.168.10.88输入用户名devuser和密码登录成功后先pwd确认当前路径再用ls看目录内容ftp pwd 257 /data/ftp/devuser ftp ls能看到目录列表说明基本流程已经通了。接着测试上传和下载ftp put /tmp/testfile.txt ftp get testfile.txt上传的同时再到服务端用ls -l /data/ftp/devuser确认文件确实存在并且属主是devuser。这一步能顺带验证umask和属主设置是否符合预期。命令行验证是基础中的基础命令行都过不了图形化客户端不用想。我每次新部署完FTP都会先走一遍这条命令行的完整链路花不了两分钟但能筛掉大部分低级配置问题。5.2 Windows客户端与FileZilla连接要点实际业务用户大部分用的是Windows推荐FileZilla这类图形化客户端。连接时注意几个设置协议选FTP不是SFTP也不是FTPS主机填服务器IP或域名用户名密码填FTP账号端口默认21不用改连接后如果提示目录列表失败多半是被动模式端口没放行或SELinux没调好回到第4章去检查。FileZilla有一个很好用的功能是站点管理器里可以选主动或被动传输模式。默认是被动模式业务用户一般不用改。但是如果服务器在特殊网络环境下可能需要强制主动模式这个就得看具体环境来定。FileZilla的日志窗口非常有用它会直接把连接、认证、列出目录、数据连接协商的全过程打出来。问题出现时看日志比盲猜靠谱一万倍。日志里出现500 Illegal PORT command说明服务器拒绝主动模式或者端口被防火墙拦了出现425 Failed to establish connection八成是被动模式的端口范围没通。5.3 FTPS加密传输的可选配置如果业务场景对传输链路有加密要求vsftpd支持基于TLS的FTPS。虽然配置比纯FTP稍复杂但在半公网或跨区域传输场景下值得做。先生成自签名证书cd /etc/pki/tls/certs make vsftpd.pem或者用openssl手动生成openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.crt然后在vsftpd.conf里打开TLSssl_enableYES allow_anon_sslNO force_local_data_sslYES force_local_logins_sslYES ssl_tlsv1YES ssl_sslv2NO ssl_sslv3NO rsa_cert_file/etc/vsftpd/vsftpd.crt rsa_private_key_file/etc/vsftpd/vsftpd.key配置后重启vsftpdFileZilla里协议要选FTPS - FTP over TLS否则直接连接会被拒绝。FTPS的配置在生产场景里确实有用。老设备固件只支持FTP协议时FTPS是兼容性和安全性之间比较均衡的折中方案。6. 常见问题与排查实录6.1 登录报530 Login incorrect530是FTP最经典的报错用户名密码错误、用户存在但被策略拒绝都会返回530。排查顺序我建议这样走。第一步先确认密码本身没写错。在服务器上用su测试账号密码是否正常。注意如果账号指定了/sbin/nologinsu会提示无Shell这本身是正常的不代表密码错误。第二步看用户是否被策略禁了。检查/etc/vsftpd/ftpusers和/etc/vsftpd/user_list看目标用户是不是被写进去了。如果userlist_denyNO而用户又不在user_list白名单里同样会被拒绝。第三步查看系统日志journalctl -u vsftpd -f tail -100 /var/log/messages日志里会有PAM认证失败的具体记录能直接看出是密码不对还是账号被锁定。如果使用的是虚拟用户模式530大概率是PAM配置的问题。重点检查pam_service_name是否指向vsftpdpam_userdb.so的db路径是否带了.db后缀以及vuser.db文件权限是否为600且属主为root。数据库文件权限过宽时PAM会拒绝加载这类问题在测试环境里经常遇到。6.2 目录能进但列表为空或上传失败登录成功也进入目录了但ls和put都失败。这种问题通常指向两个方向。一是目录权限问题。检查目录属主ls -ld /data/ftp/devuser如果不是devuser所有直接改chown devuser:devuser /data/ftp/devuser -R同时检查SELinux上下文ls -Z /data/ftp/devuser如果SELinux类型不是public_content_t按照第4章的semanage和restorecon修复。二是chroot限制的问题。如果用户家目录本身是可写的却没有加allow_writeable_chrootYES登录时会直接报500 OOPS: vsftpd: refusing to run with writable root inside chroot。这个报错我遇到太多次了每次都是忘了加参数。反过来如果家目录是755不可写用户登录后无法在家目录根直接创建新文件只能在预建的可写子目录里操作这也是限制方式的一种看你的实际需求选。6.3 被动模式连接超时客户端能登录但目录列表卡死或者文件下载传到一半卡住。这个十有八九是被动模式数据端口不通。服务端先检查数据端口范围的放行情况firewall-cmd --list-ports然后用FileZilla客户端连一次观察日志里PASV响应的IP和端口。如果PASV响应的是内网IP而客户端在外网要在vsftpd.conf里指定外网地址pasv_address公网IP或域名服务端也可以通过tcpdump抓包看协商过程tcpdump -i ens160 port 21 or port 30000-31000从抓包里能看到数据连接协商的完整过程定位是防火墙拦了端口还是路由层面的问题。这种问题在客户现场部署时尤其容易出现因为现场网络环境往往不受自己控制。6.4 重启后配置不生效这个坑比较隐蔽。我遇到过修改vsftpd.conf后重启服务但行为依然是旧的。排查发现原来是端口上有一个残留的旧vsftpd进程在监听systemctl restart并没有干净地杀掉全部旧进程。处理办法是彻底清理再启动systemctl stop vsftpd pkill -9 vsftpd systemctl start vsftpd然后确认进程启动时间和参数ps -ef | grep vsftpd如果还不行可以手动指定配置文件启动报错信息会直接打到终端上排错效率高很多/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf6.5 问题排查速查表为了后续运维方便我把常见问题和排查命令整理成一张表贴到项目文档里团队其他同事也能直接参考现象可能原因排查命令连接超时防火墙未放行firewall-cmd --list-all530 Login incorrect用户被禁或密码错误journalctl -u vsftpd500 OOPS writable root缺allow_writeable_chrootgrep chroot vsftpd.conf目录列表失败被动端口不通tcpdump -i ens160 port 21上传Permission DeniedSELinux限制或目录权限ls -Z 目录; getsebool -a用户看到其他目录未开启chrootgrep chroot vsftpd.conf重启后配置未生效残留旧进程ps -ef | grep vsftpd这张表基本覆盖了FTP部署过程中90%的常见问题照着方向去查半个小时以内基本都能定位到根因。7. 完整运维清单与个人经验7.1 一套可直接复制的部署命令清单把整个部署流程压缩成一份可执行的清单新环境直接照着跑# 1. 安装 dnf install -y vsftpd # 2. 创建目录和用户 mkdir -p /data/ftp/devuser useradd -d /data/ftp/devuser -s /sbin/nologin devuser passwd devuser chown devuser:devuser /data/ftp/devuser # 3. 编辑主配置 vi /etc/vsftpd/vsftpd.conf # 4. 配置白名单 vi /etc/vsftpd/user_list # 5. 防火墙放行 firewall-cmd --permanent --add-serviceftp firewall-cmd --permanent --add-port30000-31000/tcp firewall-cmd --reload # 6. SELinux策略 setsebool -P ftp_home_dir 1 semanage fcontext -a -t public_content_t /data/ftp(/.*)? restorecon -Rv /data/ftp # 7. 启动服务 systemctl start vsftpd systemctl enable vsftpd这套流程我在三台openEuler服务器上完整跑过基本是复制粘贴级别的操作。但每一步执行前要清楚它的作用尤其是目录权限和SELinux那两步跳过必踩坑。7.2 日志监控与日常维护FTP服务器的日常运维日志是第一手资料。vsftpd的传输日志默认写在/var/log/xferlog记录了所有上传下载的文件名、大小、耗时、用户IP和用户账号。有了xferlog_enableYES这个配置就能持续写入。文件传输量大的时候日志膨胀速度很快。我习惯加一个定时清理任务清理超过90天的日志find /var/log -name xferlog* -mtime 90 -exec rm -f {} \;同时检查一下openEuler自带的logrotate配置默认会对/var/log/xferlog做周轮转保留4周。如果文件传输量特别大建议改成按天轮转保留更久。实时连接状态可以用ss命令查看ss -tn state established ( sport :21 or sport :30000-31000 )能看到当前哪些客户端IP正在连接传输端口是多少排查问题非常直观。7.3 部署完成后的几条实用提醒FTP服务器跑起来只是开始真正的功夫在运维细节上。第一账号密码要有轮换机制。FTP密码是明文传输的内网环境下隔离风险可以接受但密码定期更换必须有。我这边设定的策略是90天强制更新一次用脚本定期提醒。第二配置文件改动前先备份cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date %F)养成这个习惯改坏了能秒回滚不用凭记忆去改回来。第三加监控。用脚本定时检查21端口存活配合企业微信或钉钉告警。脚本很简单一行nc命令加一个判断nc -zv -w 3 127.0.0.1 21通了继续不通就发告警。FTP服务往往是业务文件流转的枢纽挂了影响的是上下游一整条链路不能等用户发现才处理。第四数据目录最好挂在独立磁盘或分区上。当时我把/data/ftp单独挂在一块数据盘上避免FTP文件涨起来把系统盘写满导致整个服务器异常。这一步在最初规划存储时就该想好。我在openEuler上部署vsftpd这套方案已经稳定运行了大半年期间只因为证书过期处理过一次FTPS连接问题纯FTP通道始终没出过故障。FTP确实是老协议但老协议不代表不能用。把它放在合适的网络边界内配合合理的权限和监控它依然是极可靠的文件传输工具。如果你的场景正好也是内网文件交换、定时取数、系统间传包这类需求按这篇文章的清单走一遍应该能省下不少排查的时间。