在远程服务器上部署 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

使用默认账号登录:

  • 用户名:admindemo
  • 密码: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 端口转发
需要经过跳板机 使用 -JProxyJump
想长期使用 配置 ~/.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运维


相关推荐
哈里谢顿1 天前
使用devstack部署openstack
openstack
忧思幽释1 天前
Mariadb Galera集群在Openstack中的应用
wpf·openstack·mariadb
阿干tkl1 天前
本地源方式安装开源 OpenStack (V版本)
开源·openstack
孪生质数-2 天前
Ansible基础入门
服务器·自动化·ansible·openstack
阿干tkl7 天前
CentOS Stream 8 通过 Packstack 安装开源OpenStack(V版本)
openstack
28的博客8 天前
CentOS 7 通过 Packstack 安装 OpenStack Train 完整步骤
云计算·openstack·平台即服务
降临-max12 天前
OpenStack创建实例一直处于创建且未分配IP问题解决
笔记·学习·openstack
求知若渴,虚心若愚。15 天前
手搓 OpenStack 部署 实战
运维·openstack
刘某的Cloud17 天前
openvswitch-ovs-流表
linux·运维·openstack·系统·neutron·openvswitch