SFTP 运行在现有的 SSH 连接之内,因此服务器上无需额外软件,也不需要新增端口。在 VPS Linux Infrawire 上,用 FileZilla 这样的图形客户端上传网站或下载备份,是最安全的方式。本文涵盖密码和密钥登录、文件权限,以及仅限 SFTP 的受限用户。
📋 前提条件
- 一台 Linux VPS(Ubuntu 24.04、Debian 12、AlmaLinux 9 或 Rocky 9),SSH 在 22 端口正常工作。
- VPS 的 IP 和 root 密码,可在客户区查看。
- 在你的电脑上安装 FileZilla Client(是 Client,不是 FileZilla Server)。
1. 用密码快速连接
首次测试时,使用 FileZilla 顶部的快速连接栏:
- 主机:
sftp://VPS_IP - 用户名:
USER - 密码:你的密码
- 端口:
22
第一次连接时接受主机密钥。右侧面板会显示服务器的文件树。建议使用普通用户而不是 root:误操作造成的损失更小。
Bashadduser USER usermod -aG sudo USER
在 AlmaLinux 或 Rocky 上,请使用 useradd -m USER、passwd USER 和 usermod -aG wheel USER。
2. 使用 SSH 密钥登录
密钥比密码更安全,也无法被暴力破解。在你自己的电脑上生成密钥对,并把公钥复制到服务器。
Bashssh-keygen -t ed25519 -C "filezilla" ssh-copy-id USER@VPS_IP
在 FileZilla 中打开 编辑 > 设置 > 连接 > SFTP > 添加密钥文件,选择你的私钥(不带 .pub 的文件)。FileZilla 可能会提示转换为其自有格式,请同意。切勿分享私钥。
3. 在站点管理器中保存连接
- 打开 文件 > 站点管理器,点击 新站点。
- 协议:SFTP - SSH File Transfer Protocol。
- 主机:
VPS_IP,端口:22。 - 登录类型:密码选 正常,密钥选 密钥文件。
- 用户:
USER。在“高级”选项卡中设置默认远程目录,例如/var/www/example.com。 - 点击 连接。该站点会被保存,下次直接使用。
不要在你无法掌控的电脑上保存密码。
4. 设置网站文件的所有者和权限
上传的文件常常属于错误的用户,导致 403 或 500 错误。请把网站目录交给你的用户,并让 Web 服务器能够读取。
Bashmkdir -p /var/www/example.com chown -R USER:www-data /var/www/example.com find /var/www/example.com -type d -exec chmod 755 {} \; find /var/www/example.com -type f -exec chmod 644 {} \;
在 AlmaLinux 和 Rocky 上,Web 服务器的用户组是 apache,而不是 www-data。应用需要写入的目录(上传、缓存)可设为 775,并以 Web 服务器组作为所属组。切勿使用 chmod -R 777。在 FileZilla 中,也可以右键点击文件并选择 文件权限。
5. 可选:被锁定在目录内的纯 SFTP 用户
要让客户只访问某一个目录且没有 shell,请使用 chroot。chroot 目录本身必须属于 root,且不能被其他人写入,否则 sshd 会拒绝登录。
Bashgroupadd sftpusers useradd -M -d /files -s /usr/sbin/nologin -G sftpusers CLIENT passwd CLIENT mkdir -p /var/sftp/CLIENT/files chown root:root /var/sftp/CLIENT chmod 755 /var/sftp/CLIENT chown CLIENT:CLIENT /var/sftp/CLIENT/files
把下面这段添加到 /etc/ssh/sshd_config 末尾:
INI1Match Group sftpusers 2 ChrootDirectory /var/sftp/%u 3 ForceCommand internal-sftp 4 AllowTcpForwarding no 5 X11Forwarding no
重新加载前先检查语法,并在确认新登录可用之前保持当前 SSH 会话不要关闭。
Bashsshd -t systemctl reload ssh
该服务在 Ubuntu 和 Debian 上叫 ssh,在 AlmaLinux 和 Rocky 上叫 sshd。受限用户登录后进入 /files,看不到其他任何内容。
验证
在怪罪 FileZilla 之前,先在终端里测试:
Bashsftp USER@VPS_IP sftp> pwd sftp> put test.txt sftp> ls -l
然后用 FileZilla 上传一个文件,并用 ls -l /var/www/example.com 检查其所有者。
故障排查
- 连接被拒绝或超时:检查 sshd 是否在运行(
systemctl status ssh)、防火墙是否放行了端口,以及你选的是 SFTP 而不是 FTP。 - Permission denied (publickey):公钥不在
~/.ssh/authorized_keys中,或权限不对。用chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys修复。 - chroot 用户登录后立即断开:chroot 目录不属于 root,或组可写。在
journalctl -u ssh中查找“bad ownership or modes for chroot directory”。 - 无法上传,目录权限被拒绝:用户不是目标目录的所有者。重新执行第 4 步中的
chown和chmod命令。
✅ 现在你可以用 FileZilla 安全地向 Linux VPS 传输文件了。