云计算---关于通过vnc客户端连接openstack创建虚拟机方法

在openstack上创建虚拟机后,通过自身带的vnc插件连接反应比较慢,因此想通过vnc客户端进行连接,进而提上体验感,该文章主要也是参考的网络上某一些博客,存在不足请大家指出。

一、简述

VNC (Virtual Network Computer) 是虚拟网络计算机的缩写,在针对通过vnc连接openstack创建的虚拟机,其实是通过直接连接计算节点kvm创建的虚拟机(需要说明,目前测试了只针对kvm虚拟机,其他虚拟化未测试),基本思路为通过命令获取计算机节点启动的虚拟机获取虚拟机对应的ID号--->通过ID号获取虚拟机暴露的端口---->最终通过计算节点IP:端口号访问虚拟机实例

二、操作过程

1.在计算节点查看虚拟机的 ID(libvird 的,非 instanc_id)

执行命令为:virsh list --all

执行结果如下:

[root@compute1 ~]# virsh list --all
Id Name State
----------------------------------------------------
1 instance-000000b7 running
- instance-000000ac shut off

2.找到需要连接的虚拟机的 ID 号,查看其中暴露的端口:

执行命令为:virsh vncdisplay 1

执行结果如下:
[root@compute1 ~]# virsh vncdisplay 1
:0

3.在 VNC 查看工具中输入相关连接:

在 VNC 客户端上输入 对应的计算节点 IP:0

点击 Connect 后就可以连接上 openstack 创建的虚拟机。

说明:以上采用的方法,实际是直接连接的底层的 libvirt,本质上和上层的 openstack 无太大关系,因此也可以用于其它平台,再次说明下,vnc客户端输入的IP地址是虚拟机实例所在的计算节点IP,并要加上获取的端口号。

三、针对计算节点查看连接虚拟机实例的方法

 为了查看外网哪些IP连接到了实例,需要root 权限登陆计算节点后,执行以下命令:

netstat -tanp | grep kvm | grep LISTEN

说明:输出的内容中,监听地址为0.0.0.0的,都可以外网直接访问此实例

四、OpenStack 中 VNC 分析

1.VNC Proxy 的功能

将公网 (public network) 和私网 (private network) 隔离

  • VNC client 运行在公网上,VNCServer 运行在私网上,VNC Proxy 作为中间的桥梁将二者连接起来
  • VNC Proxy 通过 token 对 VNC Client 进行验证
  • VNC Proxy 不仅仅使得私网的访问更加安全,而且将具体的 VNC Server 的实现分离,可以支持不同 Hypervisor 的 VNC Server 但不影响用户体验

2.VNC Proxy 的运行过程

云计算---关于通过vnc客户端连接openstack创建虚拟机方法_第1张图片

  • (01) 一个用户试图从浏览器里面打开连接到虚拟机的 VNC Client
  • (02) 浏览器向 nova-api 发送请求,要求返回访问 vnc 的 url
  • (03) nova-api 调用 nova-compute 的 get vnc console 方法,要求返回连接 VNC 的信息
  • (04) nova-compute 调用 libvirt 的 get vnc console 函数
  • (05) libvirt 会通过解析虚拟机运行的 /etc/libvirt/qemu/instance-0000000c.xml 文件来获得 VNC Server 的信息
  • (06) libvirt 将 host, port 等信息以 json 格式返回给 nova-compute
  • (07) nova-compute 会随机生成一个 UUID 作为 Token
  • (08) nova-compute 将 libvirt 返回的信息以及配置文件中的信息综合成 connect_info 返回给 nova-api
  • (09) nova-api 会调用 nova-consoleauth 的 authorize_console 函数
  • (10) nova-consoleauth 会将 instance –> token, token –> connect_info 的信息 cache 起来
  • (11) nova-api 将 connect_info 中的 access url 信息返回给浏览器:http://172.24.1.1:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29
  • (12) 浏览器会试图打开这个链接
  • (13) 这个链接会将请求发送给 nova-novncproxy
  • (14) nova-novncproxy 调用 nova-consoleauth 的 check_token 函数
  • (15) nova-consoleauth 验证了这个 token,将这个 instance 对应的 connect_info 返回给 nova-novncproxy
  • (16) nova-novncproxy 通过 connect_info 中的 host, port 等信息,连接 compute 节点上的 VNC Server,从而开始了 proxy 的工作

五、NOVA 中 VNC 相关配置

  • vnc_enabled=True 启用虚拟机的 VNC 功能。
  • vncserver_listen=0.0.0.0
    • 127.0.0.1(默认),即只可以从本机进行访问,缺点是浏览器 VNC 访问实例也会失败
    • 管理网的 IP 地址
    • 0.0.0.0 主要是考虑到动态迁移时,目的宿主机没有相应的 IP 地址,动态迁移会失败。
  • vncserver_proxyclient_address 该地址指明 vnc proxy 应该通过那个 IP 地址来连接 vncserver,通常是管理网 IP 地址。
  • novncproxy_base_url=http://SERVICEHOST:6080/vncauto.html 指定浏览器 client 应该连接的地址。

如果 OpenStack 平台架设在公网上,则 vncserver_listen 需要配置为管理网的 IP 地址,否则设置为 0.0.0.0 就会使得外网用户可以直接访问虚拟机,非常危险

关于重新设置监听地址后老实例的处理方法:

 计算节点重新设置监听地址后(如从0.0.0.0,修改为计算节点管理网段的 IP),旧实例的对外的 VNC 仍然是 0.0.0.0,这是因为 /etc/libvirt/qemu/instancexxxx.xml 中配置的监听地址没有变化,可以通过硬重启实例使之(旧实例)生效。

 

你可能感兴趣的:(云计算,openstack,云安全)