配置虚拟机SFTP访问,核心分三步:宿主机网络打通、虚拟机开启SSH服务、设置账号密码。下面按步骤拆解,从零开始把每个环节说透,保证照着做就能连上。
虚拟机sftp连接不上?先搞懂这几个前提
很多新手卡在第一步:虚拟机装了,密码设了,但用客户端就是连不上去,大多数情况不是密码错,是网络模式和IP地址没搞明白。
检查网络连通性
- 桥接模式:虚拟机和宿主机会在同网段,直接访问虚拟机IP即可,但IP可能因路由器分配而变动。
- NAT模式:VMware/VirtualBox默认用NAT时,虚拟机对外不可见,需要配置端口转发才能用SFTP连接。
- 仅主机模式:只能宿主机访问虚拟机,适合测试环境,其他机器进不来。
检查方法很简单,在宿主机打开命令行,执行:
ping 虚拟机IP
能通,说明网络没问题,不通,优先检查虚拟机防火墙和VMware的网络设置。
虚拟机的SSH服务是否在运行
SFTP依赖SSH服务,没有开启一切白搭,执行:
sudo systemctl status sshd
没启动就:
sudo systemctl start sshd sudo systemctl enable sshd # 设置开机自启
VMware虚拟机sftp配置教程:从安装到连接
以下以Ubuntu 22.04 LTS在VMware Workstation上运行为例,其他发行版命令基本通用。
安装并配置SSH服务
如果没有安装openssh-server(现象是提示找不到sshd服务),先安装:
sudo apt update sudo apt install openssh-server -y
安装完成后,检查SSH默认端口(22)没有冲突,修改端口可以编辑/etc/ssh/sshd_config文件:
sudo nano /etc/ssh/sshd_config
找到#Port 22,去掉注释,改成想要的端口,改完记得重启服务:
sudo systemctl restart sshd
防火墙放行端口
Ubuntu默认装了ufw防火墙,可能把22端口或自定义端口挡了,执行:
sudo ufw allow 22/tcp sudo ufw reload
如果改了端口,把22换成你设置的端口号。

sftp用户名密码设置方法:三种典型场景
用户名密码的设置方式取决于你希望谁登录,下面是常见方案对比:
| 场景 | 命令 | 特点 |
|---|---|---|
| 新建专用SFTP用户目录 | sudo useradd -m sftp_user |
隔离账户,不能登录Shell |
| 给现有普通用户开放SFTP | 直接使用现有账号密码 | 权限较大,有安全风险 |
| 限制只能SFTP不能SSH登录 | 修改sshd配置Match组 | 安全隔离,生产环境推荐 |
新建专用账号:最省心的做法
创建用户并设置密码:
sudo useradd -m sftpuser sudo passwd sftpuser
按提示输入两遍密码,就完成了,账号sftpuser,密码是你刚才输入的,就这么简单。
但这里有个坑:普通账号默认能SSH登录,如果你只想让它传文件,需要在sshd_config末尾追加:
Match User sftpuser
ForceCommand internal-sftp
ChrootDirectory /home/sftpuser
ProhibitPasswordAuthentication no
追加后重启sshd,这样该账号只能用SFTP,且被锁定在自己的home目录里,安全性高不少。
用已有的sudo用户连SFTP
日常开发中最常用,直接拿虚拟机里已有的用户名和密码连,比如虚拟机用户名是dev,密码是123456,打开WinSCP或FileZilla,填dev和123456就能进。
但要注意,自己的家目录可能没有写权限,特别是用Nginx的www目录时,需要加到www-data组:
sudo usermod -a -G www-data dev
否则上传文件时会报Permission denied。
把密码改成更安全的登录方式
密码总有泄露风险,更推荐用密钥登录,在本机生成密钥对:
ssh-keygen -t rsa -b 4096
然后复制公钥到虚拟机:
ssh-copy-id dev@虚拟机IP
之后就可以用密钥登录SFTP,连密码都不用输,比纯密码方案安全一个量级。
本地SFTP服务器配置与连接实测
服务端配好了,客户端怎么连?以FileZilla为例:
- 打开FileZilla,主机栏填
sftp://虚拟机IP,端口填22(或自定义端口) - 用户名填刚创建的sftpuser,密码填你设的密码
- 点击快速连接,就能看到右侧虚拟机的目录树

连接成功后,直接把左边本地文件拖到右边,就是上传,上传速度快慢取决于虚拟机的磁盘IO和宿主机带宽,内网环境下通常能跑满千兆。
本地服务器和虚拟机sftp哪个效率高
这里做个对比,帮你选合适方案:
| 对比项 | 本地服务器SFTP | 虚拟机SFTP |
|---|---|---|
| 部署成本 | 需要服务器+公网IP | 本机即可,零额外成本 |
| 访问速度 | 依赖带宽 | 内网,延迟低 |
| 学习价值 | 了解生产环境流程 | 适合练手、测试 |
| 稳定性 | 高 | 依赖宿主机开关机 |
行业共识认为,工作学习中先掌握虚拟机SFTP再迁移到独立服务器,是最高效的踩坑路线,因为大部分配置逻辑完全一致,区别仅在网络层。
电脑可以sftp虚拟机的实现原理
上面操作能跑通,底层靠的是SFTP的三种通道内容:
协议层:SFTP走的是SSH加密通道,不是FTP那种明文协议,所以哪怕被抓包,数据也是密文。
认证层:分为两种,密码认证和密钥认证,密码认证交互简单,密钥认证免密更方便。
权限层:用户被限制在ChrootDirectory指定的目录里,目录之外的内容完全不可见,专业说法叫目录监狱,是生产环境最常用的隔离手段。
如果上面的步骤都做了还是连不上,有另一台机器可以试试,很多时候问题出在Windows防火墙拦截了22端口,解决办法:
netsh advfirewall firewall add rule name="SFTP" dir=in action=allow protocol=TCP localport=22
sftp默认密码是什么?别被误导了
有些教程提到虚拟机初始密码统一是ubuntu或root,纯属以讹传讹。SFTP没有默认密码,密码在安装系统或创建用户时由安装者设定,如果你忘了密码,用root权限直接重置:
sudo passwd sftpuser
重置后立即生效,无须重启服务,这一点对云服务器和本地虚拟机同样适用。
如果连root密码也忘了,需要进入虚拟机恢复模式重置,Ubuntu系统在GRUB菜单选择advanced options里的recovery mode,然后选root shell,执行passwd命令重置root密码,技术含量不高,但操作时小心别误删不该动的东西。

常见问题:配置完成却依旧连接失败
下面这是多数同学最终实战时会遇到的场景。
问题:FileZilla提示“无法连接到服务器”或“Connection refused”
排查顺序:
- 检查sshd监听状态:
netstat -tlnp | grep sshd,确认服务在跑 - 检查22端口连通性:
telnet 虚拟机IP 22,通了说明防火墙或安全组没问题 - 检查虚拟机防火墙:
sudo ufw status,inactive或allow 22均可 - 检查VMware端口转发:NAT模式下,确认宿主机的端口转发规则指向虚拟机IP和22端口
- 检查登录凭据大小写:Linux用户名区分大小写,别把SFTP_User输错
一般走到第3步就能解决,少部分情形是虚拟机装了杀毒软件拦截入站连接,直接卸载或者放行22端口就行。
问题:连上了但传文件报Permission denied
通常原因:目标目录的属主不是当前用户,解决:
sudo chown -R sftpuser:sftpuser /目标目录路径
把目录还给用户,上传立即恢复正常。
怎么设置SFTP密码才算安全
大家关心密码强弱,提醒几个原则:
- 位数不低于14位,混合大小写字母数字和符号
- 不要和虚拟机SSH登录密码相同
- 定期更换,建议90天为一个周期
- 开启密钥认证后取消密码登录:把sshd_config中的
PasswordAuthentication改成no
还有一点容易被忽略:云服务器上跑SFTP时,务必不要在密码里带单引号和空格,部分客户端无法正确解析,修改密码:
sudo passwd sftpuser
系统会让你输入两次新密码,遵守上面规则即可。
通过上面的操作步骤,你能在20分钟内完成从虚拟机安装到SFTP正常上传下载的全过程,核心就一句话:网络通、服务在、密码对,按顺序排查,没有解决不了的情况。