环境 :Ubuntu 22.04 + KVM/libvirt + DevStack (2024.2)
适用场景:通过 SSH 远程登录到一台物理机,在其上用 KVM 启动了 Ubuntu 虚拟机,并成功安装了 OpenStack DevStack,但无法从本地浏览器访问 Web 控制台。
🧩 场景描述
我的网络拓扑如下:
less
[本地电脑]
│
└── SSH → [跳板机/物理主机: 192.168.18.133]
│
└── KVM 虚拟机 (libvirt NAT 网络)
│
└── IP: 192.168.122.30
└── DevStack 已成功安装
Horizon 地址: http://192.168.122.30/dashboard
问题来了:在本地电脑的浏览器中输入 http://192.168.122.30/dashboard,页面无法打开。
原因很简单:192.168.122.30 是 libvirt 创建的 NAT 虚拟网络,只有宿主机(192.168.18.133)能访问它,而本地电脑根本"看不见"这个 IP。
🔍 核心思路:SSH 端口转发(隧道)
我们要做的,是建立一条安全隧道:
本地电脑 → 跳板机(192.168.18.133)→ 虚拟机(192.168.122.30:80)
最终效果:在本地访问 http://localhost:8080/dashboard,流量自动穿透两层网络到达 DevStack 的 Horizon。
✅ 推荐方案:使用 SSH ProxyJump(OpenSSH 7.3+)
现代 OpenSSH 支持 -J 参数(即 ProxyJump),可一键完成跳转和端口转发。
步骤 1:在本地电脑执行
ruby
ssh -L 8080:localhost:80 -J hanwang@192.168.18.133 stack@192.168.122.30
参数说明:
-L 8080:localhost:80:将本地 8080 端口映射到目标主机的 80 端口-J hanwang@192.168.18.133:先通过跳板机连接stack@192.168.122.30:最终目标虚拟机
💡 提示:确保你已将公钥部署到跳板机和 VM,避免重复输密码。
步骤 2:保持 SSH 会话运行
不要关闭终端!只要这个 SSH 连接存在,隧道就有效。
步骤 3:在本地浏览器访问
打开:
bash
http://localhost:8080/dashboard
使用默认账号登录:
- 用户名:
admin或demo - 密码:
secret
✅ 成功进入 OpenStack Horizon!
🛠️ 备选方案:分步手动转发(兼容旧版 SSH)
如果你的本地 SSH 版本较老(<7.3),不支持 -J,可以用两步法:
在本地电脑执行:
kotlin
ssh -L 8080:192.168.122.30:80 hanwang@192.168.18.133
这条命令的意思是:
"在我本地开一个 8080 端口,所有流量通过 192.168.18.133 转发到 192.168.122.30:80"
然后同样访问 http://localhost:8080/dashboard 即可。
📝 长期使用建议:配置 SSH config
在你本地电脑的 ~/.ssh/config 中添加:
css
Host devstack-vm
HostName 192.168.122.30
User stack
ProxyJump hanwang@192.168.18.133
LocalForward 8080 localhost:80
之后只需运行:
ssh devstack-vm
即可自动建立隧道,简洁高效!
❓ 常见问题排查
Q1:访问 localhost:8080 显示空白或连接拒绝?
- 检查 SSH 隧道是否仍在运行
- 在 VM 中确认服务正常:
curl -I http://localhost/dashboard - 确保 DevStack 安装成功(无报错退出)
Q2:能否让其他人也访问?
可以,但需谨慎。使用:
ini
ssh -o GatewayPorts=yes -L 0.0.0.0:8080:localhost:80 -J ...
然后别人可通过 http://192.168.18.133:8080/dashboard 访问。
⚠️ 注意:这会暴露 OpenStack 到局域网,请确保网络安全!
Q3:为什么不用直接桥接网络?
桥接确实能让 VM 获得局域网 IP,但配置复杂,且可能影响生产网络。对于开发测试,SSH 隧道更安全、轻量、无需改网络。
🎉 总结
| 问题 | 解决方案 |
|---|---|
| 无法访问 NAT 网络中的 DevStack Dashboard | 使用 SSH 端口转发 |
| 需要经过跳板机 | 使用 -J 或 ProxyJump |
| 想长期使用 | 配置 ~/.ssh/config |
通过一条简单的 SSH 命令,我们轻松打通了三层网络,安全地访问到了 OpenStack 控制台。这也是云原生时代开发者必备的网络调试技能之一。
附:DevStack 默认凭证
- URL:
http://localhost:8080/dashboard- Admin 用户:
admin / secret- Demo 用户:
demo / secret
Happy Hacking with OpenStack! ☁️
标签:#OpenStack #DevStack #KVM #SSH隧道 #Horizon #云计算 #Linux运维