资讯动态

FileZilla上传报550 Permission denied:Ubuntu下vsftpd权限排查与解决

发布时间:2026/10/18 14:06:36 来源:尧图企业网站定制
之前有个同事跑过来说他的 FileZilla连接Linux服务器Ubuntu明明一切正常账号密码也都是对的可一旦拖文件上去日志栏就蹦出两行字“响应:550 Permission denied”“错误: 严重文件传输错误”。他第一反应是改密码改了三次问题依旧。我一听这个组合就明白了这根本不是认证没过而是文件操作被服务器拒绝了。在FTP的世界里“连接成功”和“能写文件”是两码事。这篇文章我就从实际排查这类问题的经验出发把遇到550 Permission denied的常见原因、配置项、排查顺序和验证方法一次讲清楚适合刚把站点搭在Ubuntu上的同学也适合被这个报错折腾了一下午的老手。1. 550 Permission denied 到底是什么先别急着改密码很多人看到“严重文件传输错误”就以为是断网了、密码错了、服务挂了实际上FTP会话还活着只是服务器在响应某个具体文件操作时明确告诉你“这个动作我不允许”。在FileZilla的日志里550前一定有一行命令找到那行命令就等于找到了问题入口。1.1 从 FileZilla 日志定位“被拒绝”的是哪个操作我让同事把完整日志拉出来典型的现场长这样状态: 已连接 状态: 已登录 状态: 读取目录列表... 状态: 列出“/”的目录列表成功 命令: CWD /data/upload 响应: 250 Directory successfully changed. 命令: PASV 响应: 227 Entering Passive Mode (192,168,1,20,199,227) 命令: STOR site_config.tar.gz 响应: 550 Permission denied. 错误: 严重文件传输错误关键不是最后那行红色错误而是它前面的“命令”行。STOR代表上传文件后面跟的就是文件名。如果你看到的命令是DELE删除文件、MKD创建目录、RMD删除目录、RNFR/RNTO重命名那么问题性质是一样的——服务器拒绝了一个“写操作”。注意上面日志里CWD是成功的说明目录能进、能列FTP用户对路径有基本的“读”和“执行”权限但缺少“写”权限。这就比那种连目录列表都拉不出来的情况要清晰得多认证没问题、服务没问题、网络也没问题纯粹是写操作被卡住了。1.2 用响应码给问题排队530、550、553 的分工FTP协议用三位数字表达状态理解它们能省掉很多无效折腾。我把几个最容易碰到的码放在一起对比响应码含义常见原因方向530登录认证失败用户名、密码、用户被禁用550请求的操作未执行权限不足目录所有权/权限位、vsftpd写开关、SELinux/AppArmor553无法创建文件文件名非法、目录无写权限、磁盘只读450文件不可用或总线错误文件占用、磁盘临时故障500/501语法错误或参数错误FTP命令不受支持、客户端兼容性550和553经常被混为一谈。区别在于550是服务器“拒绝”你的操作通常是权限模型不让你做这件事553则是想做但做不成比如目录确实没有写权限或同名目录已存在。实际排查中550的优先级高于553先把权限问题解决很多553也会跟着消失。另外如果日志里的错误是“无法连接到服务器”或“连接超时”那就别往权限方向钻了优先查端口、防火墙、安全组。我们后面专门讲这个区别因为FileZilla的报错描述容易让人误判。2. 第一道关卡目录的所有权和权限位90% 的 550 出在这里在调整任何vsftpd配置之前先做一件事确认FTP用户对目标目录有没有“写”权限。Linux目录权限的基本单位是owner、group、others三组而不是“管理员说了算”。很多初学者把目录建在/home/user又习惯用root去创建结果FTP用户根本进不去自然一切写操作都报550。2.1 用 ls -ld 先看归属SSH登录到服务器先落在出问题的目录附近ls -ld /home/someone ls -ld /home/someone/upload ls -l /home/someone/upload输出示例drwxr-xr-x 2 root root 4096 1月 20 10:00 /home/someone/upload从左往右看第一个字母d表示目录接着三组rwx分别对应owner、group、others再后面是owner用户名和group组名。上面这个例子里owner是rootgroup是root权限是755。这说明除了root可以写组内用户和other都只能读和执行。如果FTP登录用户是someone且someone既不是root也不在root组那么someone在这个目录下创建文件服务器必然回550。更隐蔽的情况是上级目录的问题。比如/home/someone权限是700只有owner能进入那么FTP用户尝试切换进去时可能得到550或其他访问错误。所以要逐级查/、/home、/home/someone、/home/someone/upload任何一级缺少执行权限后面都被堵死。2.2 权限位的数值换算755、775、750 分别意味着什么rwx不是口号它对应的数值是r4w2x1。三个数加起来就是那一位的权限值。我把常见目录权限整理成表格方便对照数值对应字符ownergroupothers典型用途755drwxr-xr-x读写执行读执行读执行普通用户主目录、公开上传目录的上级目录775drwxrwxr-x读写执行读写执行读执行需要同组协作者的目录750drwxr-x---读写执行读执行无仅自己和组内可访问的目录770drwxrwx---读写执行读写执行无组内共同工作目录700drwx------读写执行无无仅用户自己访问的私有目录如果你是单一FTP用户最稳妥的做法是让该用户成为目录owner权限设755owner自己能读写其他人也能读和执行但写不了这正好符合大多数个人站的预期。如果需要同组账号一起维护上传文件就把目录owner设为某个公共组权限设775或770。2.3 两条修复命令chown 与 chmod 的组合假设目录/home/someone/upload目前owner是root你要把权限交给FTP用户someonesudo chown -R someone:someone /home/someone/upload sudo chmod 755 /home/someone/upload这里有一个很多人会写反的点chmod 755的第一位7是给owner的owner拥有rwx所以someone作为owner是可以写的。如果你看到的是chmod 755但又没改owner那someone仍然只是“others”身份只有r-x没有写权限照样550。所以顺序很重要——先确认owner再看权限位。如果想更严格一点可以把上传目录设为750这样其他人完全看不到内容适合不想让无关用户访问的场景。设完后立刻用ls -ld复查一遍看到owner已经是someone、权限位第一位是7再接FileZilla上传试试。3. vsftpd 配置项才是真正的幕后推手write_enable、chroot、local_umask目录权限本身没问题550还出现那就该看/etc/vsftpd.conf了。vsftpd是Ubuntu上最常见的FTP服务软件它的行为由配置文件控制。很多默认配置出于安全考虑把写入功能关得很死稍微改一下才能让它松口。3.1 write_enableYES 是写入操作的全局开关先执行grep -n write_enable /etc/vsftpd.conf如果看到#write_enableYES那问题就找到了。注释状态下vsftpd对所有FTP写操作一视同仁地拒绝不管目录权限多正确上传、删除、创建目录都会收到550。把它取消注释write_enableYES然后重启服务sudo systemctl restart vsftpd这个配置对本地用户和匿名用户都生效。换句话说只要你想通过FTP往服务器上写任何东西这一项就必须是YES。它是个总开关排在所有权限判断之前。我遇到过不止一次配置文件里之前被别人注释掉了改了三次密码都不管用最后看到这个注释才哭笑不得。3.2 chroot 根目录可写一个隐藏得很深的坑chroot_local_userYES是很多服务器为了安全开启的选项意思是把用户限制在他的主目录里登录后看到的/就是他的家目录。这个设计本身没错但它带出一个著名坑vsftpd从2.3.5开始不允许chroot根目录对用户可写如果检测到可写可能直接拒绝登录或者在操作时报错。如果你开启chroot同时又把用户主目录本身当上传目录用并且主目录权限是755owner可写那你就踩在这个坑边缘。比较推荐的做法是主目录/home/someone保持755但只作为登录后的落脚点在下面建一个专门的上传子目录比如/home/someone/upload并把它chown给someone设置local_root/home/someone让用户登录后就在主目录里活动。如果你确实希望用户直接往主目录里写又不想跟vsftpd的安全检查纠缠可以加一行allow_writeable_chrootYES但这会削弱chroot的安全性我一般只在临时测试时用。线上环境还是建议开一个独立的upload子目录既满足写入需求又不会让整个主目录暴露成可写状态。3.3 local_umask 与上传文件默认权限别忽略的细节local_umask决定通过FTP创建的文件和目录默认权限。默认值通常是022含义是文件666 - 022 644即 owner可读写其他只读目录777 - 022 755即 owner可读写执行其他只读执行。这意味着即使上传成功文件owner有完全控制权但同组用户没有写权限。如果多个账号需要协作修改同一批文件你可能要改成local_umask002文件666 - 002 664owner和group可读写目录777 - 002 775owner和group可读写执行。修改后同样要重启vsftpd。这个细节不会直接造成550但会影响后续的二次上传、覆盖、编辑。比如另一个组内账号想覆盖同一个文件因为文件owner不是它即使目录可写也可能遇到文件级的权限问题表现形式五花八门甚至不是550而是553或Refusing to send file。4. Ubuntu 特有的拦路虎AppArmor 对 vsftpd 的限制如果你的目录权限和vsftpd配置看着全对FileZilla依然报550那很可能是Ubuntu安全模块AppArmor在背后拦截。这是很多从CentOS转过来的人容易忽略的点——CentOS默认用SELinuxUbuntu默认用AppArmor机制不同但都会在权限模型之外再套一层保险锁。4.1 AppArmor 是什么为什么它会让 FTP 操作失败AppArmor是Linux内核的强制访问控制机制简单说它给每个程序画了一个“活动范围”程序只能访问它被允许访问的文件和目录。vsftpd服务在Ubuntu上通常有一个对应的profile位于/etc/apparmor.d/usr.sbin.vsftpd。如果这个profile里没有放行某个路径即便Linux用户权限完全正确vsftpd尝试写那个路径时仍会被内核拒绝FTP客户端看到的可能就是550 Permission denied。问题在于大多数教程只讲chmod、chown、vsftpd.conf没人提AppArmor。你按教程一步步查下来都是“对的”但结果就是不行非常劝退。我建议排查顺序里永远把AppArmor放进备选清单特别是当涉及非标准路径、自定义上传目录时。4.2 如何确认是 AppArmor 在拦截三条命令定位先看AppArmor是否在管vsftpdsudo aa-status | grep vsftpd正常会看到vsftpd处于enforce模式。然后查系统日志看有没有被拦截的记录sudo journalctl -u vsftpd | grep -i deny或者sudo dmesg | grep -i denied | tail -n 20如果看到类似下面的输出基本就可以确诊了Feb 20 15:02:11 ubuntu kernel: audit: type1400 audit(...): apparmorDENIED operationfile_lock profile/usr/sbin/vsftpd name/home/someone/upload/test.txt那行apparmorDENIED就是最直接的证据。它明确告诉你vsftpd这个程序在试图访问某个文件时被AppArmor拦了。很多时候报错不是550但日志里就是这个线索注意别漏掉。4.3 给 vsftpd 放行改 profile 还是调整模式确认是AppArmor后有两种处理方式。第一种临时把vsftpd的profile切到complain模式让它只记日志不拦截sudo apt install apparmor-utils -y sudo aa-complain /usr/sbin/vsftpd这样能立刻恢复文件传输适合紧急验证。但这相当于把保险锁卸了不是长期方案。第二种编辑profile把需要访问的路径加进去。比如你要允许vsftpd访问/home/someone/upload/在/etc/apparmor.d/usr.sbin.vsftpd的合适位置加上/home/someone/upload/ rw, /home/someone/upload/** rw,然后重新加载sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.vsftpd改profile比粗暴切换模式麻烦但更符合生产环境的做法。需要注意的是不同Ubuntu版本的profile文件名可能略有差异以/etc/apparmor.d/下实际文件名为准。改完以后再用aa-status确认还是enforce模式并且测试一次上传确认日志不再出现DENIED。5. 被动模式与防火墙看起来像传输错误其实未必是 550很多时候FileZilla的报错是“无法连接到服务器”“读取目录列表失败”但偶尔也会在传输阶段出现一些接近550的描述尤其是配置了特殊端口段之后网络问题会和权限问题纠缠在一起。把这一块单独拿出来是为了避免你把时间浪费在错误的方向上。5.1 被动模式为什么是 FileZilla 的默认选择FTP有两种数据连接模式主动模式PORT和被动模式PASV。在主动模式下客户端向服务器21端口发送命令然后服务器主动去连接客户端的随机端口这对NAT环境下的家用网络非常不友好因为服务器根本连不进路由器后面的客户端。被动模式则反过来客户端在命令通道里发PASV服务器告诉客户端“你从我这个IP的某个数据端口连过来吧”所有数据连接都由客户端发起穿透性更好。FileZilla默认使用被动模式绝大多数教程也推荐这样。但是被动模式需要服务器开放一个端口范围给数据连接默认vsftpd如果不配置会启用系统动态端口范围大且难以在防火墙上精确放行。如果只放行了21端口客户端能登录、能列目录但上传文件时建立数据连接失败日志可能显示“无法从服务器读取目录列表”或“连接已重置”而不是典型的550。可一旦你把被动端口配置好了这类网络问题通常一并消失。5.2 配置 pasv 端口段并放行别把网络问题当权限问题在/etc/vsftpd.conf里显式固定一个端口段pasv_enableYES pasv_min_port50000 pasv_max_port50100然后重启vsftpd并在防火墙里放行这段端口sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 50000:50100/tcp如果你的服务器还挂在云平台记得同步在安全组里放行50000-50100的TCP入站规则。很多云平台默认只有端口22开放21端口放行后被动端口没跟上就会出现“能登录但传不了文件”的稀奇现象。这种问题日志里更多是连接超时、连接被拒绝不是550。所以判断思路要清晰看到550先查权限和配置看到连接类报错再回头查防火墙和数据端口两者不能混为一谈。6. 我自己的排查路径与最终验证清单前面分了三类原因目录权限、vsftpd配置、AppArmor。实际排查时我不建议跳来跳去而是按固定顺序走一遍每一步都用日志和命令互相印证。下面这条链路是我自己长期用的遇到550基本能在一刻钟内定位。6.1 从日志到命令的逐步排查顺序在FileZilla日志里找到触发550的那条命令记住是STOR、DELE、MKD还是RNFR。SSH登录服务器用getent passwd 用户名确认FTP用户存在、shell有效。用ls -ld逐级查看用户主目录和目标目录确认owner和权限位。重点看写权限是否落到FTP用户身上。用grep -E write_enable|chroot|local_umask|allow_writeable /etc/vsftpd.conf查看关键配置。修改后执行sudo systemctl restart vsftpd再用systemctl status vsftpd确认服务正常。如果前五项都正常查journalctl -u vsftpd | grep -i deny和aa-status排除AppArmor。最后在服务器本地用touch /home/someone/upload/test.txt测试确认系统层面能建文件如果连本地都建不了那就是文件系统只读或磁盘满了和FTP无关。这个顺序的核心原则是“从底层到上层”先确认用户身份和目录再看服务配置再看内核安全模块。每走一步出问题的那一层就会暴露出来。6.2 FileZilla 内的分步验证列表、上传、创建目录、删除修复过程中我习惯在FileZilla里做一套标准动作而不是反复拖同一个大文件。登录成功后先按F5刷新目录确认“读”和“执行”权限正常。在主目录下创建一个test.txt小文件看能否上传到“根目录”和“子目录”各一次。尝试右键新建文件夹testdir验证MKD命令是否被允许。尝试删除这个文件夹验证RMD命令是否被允许。如果子目录能上传、根目录不能那多半是chroot根目录的写限制或主目录owner不对。如果连列表都失败那就不是550的范畴了要去查用户是否能进入目录、防火墙是否拦截PASV数据端口。这套动作能把“单点失败”暴露得很明显也方便你把结果记下来下次再遇到直接对照。别忘了每改一次配置就重启vsftpd并重新用新的FTP会话测试有的坑是旧会话缓存导致的问题。6.3 防止再犯的几条经验第一不要把用户主目录本身当作上传目录专门建一个upload子目录权限给到775或750再把owner设置成FTP用户或公共组。第二不要一上来就chmod 777那会让目录完全敞开后续权限问题更难查正确做法是chown加指定权限位。第三配置文件改完立刻看日志journalctl -u vsftpd是vsftpd的日记本能省大量猜测。第四记住550是“操作被拒绝”不是“连接失败”先从权限、配置、AppArmor这条线排查网络问题永远排在后面。我印象最深的一次卡了两天目录权限、vsftpd配置全对最后发现是某个自定义上传目录没放进AppArmor的profile导致vsftpd每次写入都被内核静默拦截。那次之后我给自己定了一条规矩凡是在Ubuntu上配vsftpd先把aa-status看了一眼再开始调权限。这样折腾一轮下来你现在手里的Ubuntu服务器再遇到550应该不会再盯着密码反复改了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑