系列:文件共享与传输
- 用 vsftpd 在 Ubuntu 上搭建文件共享服务器
- SCP 和 SFTP 使用指南:远程文件传输基础
- Samba 安装与配置指南:Linux 和 Windows 文件共享
- NFS 安装与配置指南:Linux 系统间文件共享
- Syncthing 异地同步指南:多设备文件同步不带公网 IP
背景
局域网内或远程开发时,几台机器之间传文件经常碰到。云服务器上跑 HTTP 服务可以用来共享文件,但权限和目录管理要多做一些工作;scp 和 rsync 适合一次性拷贝,多人共享时不够直观。FTP 虽然是个老协议,但好在通用:几乎所有操作系统都自带客户端,用户隔离和目录权限也可以直接配清楚。
最近把一台闲置的 Ubuntu 22.04 改成了文件共享机,用了 vsftpd(Very Secure FTP Daemon)。配置不复杂,安全选项也比较全。这篇文章把搭的步骤、被动模式端口范围、用户隔离和几个踩过的坑一并记录下来,下次照着做就行。
步骤
1. 安装 vsftpd
sudo apt updatesudo apt install vsftpd -ysudo systemctl enable --now vsftpd装完服务会自动启动,可以用 sudo systemctl status vsftpd 确认。
2. 备份原始配置
默认配置文件在 /etc/vsftpd.conf,先备份再改动:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig3. 基础配置
编辑 /etc/vsftpd.conf,把下面这些选项开启或修改:
listen=YESlisten_ipv6=NOanonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESchroot_local_user=YESallow_writeable_chroot=YESchroot_local_user=YES 会把每个用户锁在自己的 home 目录里,安全性好一点。allow_writeable_chroot=YES 是 vsftpd 较新版本才需要的,不加的话用户连不上。
4. 配置被动模式(PASV)
FTP 默认的主动模式在防火墙和 NAT 后面经常出问题,需要打开被动模式并指定数据端口范围。
在配置文件末尾加上:
pasv_enable=YESpasv_min_port=30000pasv_max_port=31000pasv_address=你的服务器公网IP或内网IP如果用的是云服务器并且有弹性公网 IP,pasv_address 就填公网 IP;如果只在局域网里用,填内网 IP 或者干脆不写(vsftpd 会自动取)。端口范围可以按需要调,30000-31000 只是个例子。
5. 创建 FTP 用户
单独建一个给 FTP 用的系统用户,不和常规用户混在一起:
sudo adduser ftpuser --disabled-passwordsudo passwd ftpuser然后准备 home 目录并设权限:
sudo mkdir -p /home/ftpuser/ftpsudo chown -R ftpuser:ftpuser /home/ftpusersudo chmod 755 /home/ftpuser因为我们启用了 allow_writeable_chroot=YES,用户的 home 目录可写也能正常登录。如果想做得更干净,也可以把 home 目录的属主改成 root,里面再建一个子目录给 ftpuser 写,不过现在这样简单够用。
6. 防火墙放行端口
如果开了 ufw:
sudo ufw allow 21/tcpsudo ufw allow 30000:31000/tcpsudo ufw reload云服务器上一般还有安全组,记得把 21 和 30000-31000 的 TCP 入方向一并加上。
7. 重启服务并测试
sudo systemctl restart vsftpd用命令行客户端快速试一下:
ftp 服务器IP用上面创建的 ftpuser 和密码登录,成功的话会回到它的 home 目录。上传文件可以用 put localfile 测试。
如果用 FileZilla 这类 GUI 客户端,连接时协议选 FTP,加密选“使用明确的 FTP over TLS(如果可用)”;没配 SSL 的话就直接用“普通的 FTP”。
常见问题
写权限被拒绝
就算配了 write_enable=YES,还是可能碰到 “550 Permission denied”。先检查目标目录的 Unix 权限,确认 FTP 用户有写入权限。另外如果启用了 chroot_local_user=YES 但没开 allow_writeable_chroot,用户的 home 目录就不能有写权限,否则会被 vsftpd 直接拒绝连接。开了 allow_writeable_chroot 之后可以放宽这个限制,但目录属主也要对应清楚。
被动模式数据连接超时
这是最容易撞的坑。被动模式下,客户端会连到 pasv_address 加上被动端口范围内的一个端口。能 ping 通服务器但列目录或传文件超时,常见原因有两个:一是安全组或 iptables 没把被动端口段放通;二是 pasv_address 填错了,比如客户端在外网,但填的是内网 IP,或者填了外网 IP 但服务器不直接持有这个 IP(NAT 场景)。排查时可以用 telnet 服务器IP 30001 先确认端口可达,再检查两边防火墙。
启动报错:port already in use
端口 21 被另一个 FTP 服务占了,比如又装过 ProFTPD,停掉多余的就行。另外,listen=YES 和 listen_ipv6=YES 不要同时开,新版 vsftpd 会因为双监听报错;一般只留 IPv4 就够了。
chroot 后无法登录
报错类似 “500 OOPS: vsftpd: refusing to run with writable root inside chroot()”。vsftpd 从 3.0.0 开始,如果用户 home 目录可写,chroot 会直接拒绝连接。解决办法有两个:一是在配置文件里明确加上 allow_writeable_chroot=YES;二是把 home 目录的属主改成 root,再在 home 下面建一个子目录给 ftpuser 写数据。后者多一步,但更安全。
总结
用 vsftpd 在 Ubuntu 上搭 FTP 服务,流程比较清晰。装完包后改好基本配置,指定被动模式端口范围,创建专用用户并放通防火墙,基本就能用。遇到问题大多集中在被动模式的网络连通和 chroot 权限这两块,照着检查配置和安全规则就能解决。