在统信UOS上搭建FTP服务器,核心只需四步:安装vsftpd服务、配置匿名访问、设置本地用户权限、放行防火墙端口。少一步,客户端要么无法连接,要么连接后无法传输文件。很多人遇到“目录列表为空”或“连接被拒绝”的错误,根源在于某个环节没有闭环——本文将逐一拆解每一步的常见陷阱和解决方案。

先梳理整体思路:安装vsftpd并确保服务正常运行;开启匿名访问用于快速连通测试;配置本地用户并锁定chroot隔离权限;最后通过ufw放行21端口及被动模式端口段。下面逐一详细说明。
安装vsftpd服务并验证运行状态
统信UOS桌面版和服务器版均基于Debian底层,安装软件包必须使用apt,不要尝试yum或rpm——在UOS上执行这些命令会直接报错并触发依赖安装,白白浪费时间。
打开终端,首先更新软件源:sudo apt update
接着安装vsftpd:sudo apt install vsftpd -y
安装完成后立即检查服务状态:systemctl status vsftpd。输出必须显示“enabled; vendor preset: enabled”并且当前状态为active (running)。如果显示inactive或failed,说明存在未完成的依赖,先执行sudo apt --fix-broken install修复,再重新尝试一次。
启用匿名访问(快速测试用)
该模式适用于局域网内临时传输文件,无需新建用户,但默认仅允许只读访问——必须手动开启写入权限才能上传文件。具体操作如下:
先备份原始配置文件,防止修改出错:sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
然后编辑主配置文件:sudo nano /etc/vsftpd.conf
找到以下四行配置,确保其值均为YES。如果行首有#则删除注释,如果整行缺失则自行添加:
anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
创建匿名用户的可写根目录:sudo mkdir -p /srv/ftp/pub && sudo chmod -R o+rw /srv/ftp/pub
注意:路径必须使用/srv/ftp,不要图省事写成/var/ftp。UOS 1060及以上版本已将匿名根目录固定为/srv/ftp,写错后客户端连接时无法看到任何内容。
最后重启服务使配置生效:sudo systemctl restart vsftpd
配置本地授权用户(生产环境推荐)
这才是正式用途——每个用户绑定独立家目录,配合chroot隔离机制,杜绝越权行为。但绝不能直接使用系统管理员账户(如admin或root),必须新建专用的FTP账户。
- 创建没有登录shell的专用用户:sudo useradd -d /srv/ftp/testuser -s /usr/sbin/nologin testuser
- 设置密码:echo "testuser:UosFtp2026!" | sudo chpasswd
- 编辑配置文件,在末尾追加两行:
userlist_enable=YES
userlist_deny=NO - 将用户名加入白名单:echo "testuser" | sudo tee -a /etc/vsftpd.user_list
- 关键安全参数:在
/etc/vsftpd.conf中确认存在chroot_local_user=YES和allow_writeable_chroot=YES。后者是UOS特有的参数,不加的话用户登录后会立即被踢出,连目录都无法看到。
修改完成后重启服务:sudo systemctl restart vsftpd
放行防火墙端口并验证连通性
UOS默认开启ufw,仅放行21端口远远不够——被动模式需要额外的端口段,否则FileZilla等客户端虽然能建立连接,但会卡在“等待欢迎消息”或“列表为空”阶段。
先启用ufw并放行FTP基础端口:sudo ufw enable && sudo ufw allow 21
为被动模式分配端口范围(推荐21000–21100):echo "pasv_min_port=21000" | sudo tee -a /etc/vsftpd.conf && echo "pasv_max_port=21100" | sudo tee -a /etc/vsftpd.conf
放行该端口段:sudo ufw allow 21000:21100/tcp
最后重启服务使端口配置生效:sudo systemctl restart vsftpd
至此,四个步骤全部闭合完成。可以使用FTP客户端尝试连接,检查能否列出目录、上传文件。如果仍然出现问题,多半是某一步的参数填写有误,或者防火墙没有彻底放行——回头逐项对照检查一遍即可。
