在远程服务器上部署 DevStack 后如何访问 Horizon Dashboard?

环境 :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运维


相关推荐
xbzb14 小时前
OpenStack 计算管理:实例锁定后被普通用户解锁了?避坑实操
openstack·实例·解锁·用户·计算·锁定
静以修身zzz14 小时前
OpenStack对象存储-Swift、OpenStack编排管理-heat、OpenStack网络管理-neutron
linux·运维·服务器·架构·openstack·swift
知已难寻1 天前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
青峰讲运维1 天前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack
青峰讲运维2 天前
OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
开发语言·openstack·swift
知已难寻3 天前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
Z21-X3 天前
云原生运维笔记:硬核拆解OpenStack计算与存储——从主机聚合到Cinder挂载全流程
运维·笔记·学习·云原生·openstack
青峰讲运维3 天前
OpenStack Nova 计算服务深度解析|原理 + 架构 + 完整实操
架构·openstack
Linux界最忧郁之人4 天前
OpenStack Victoria双节点实战|Packstack一键部署(CentOS‑Stream‑8)+华为云ECS实操
linux·运维·服务器·centos·华为云·openstack
运维踩坑日记5 天前
OpenStack 核心服务实战笔记
linux·运维·服务器·笔记·openstack