# 外部程序如何通过novnc访问proxmox的虚拟机
# 1. proxmox工作原理
proxmox虚拟化平台管理界面可以通过novnc连接虚拟机,web管理页面基本都是通过api完成相关功能的,具体api文档可以点击右上角“documentation”查看:
novnc连接的步骤如下:
1.通过API:/api2/json/nodes/pve/qemu/105/vncproxy获取vnc的ticket
2.novnc通过websocket建立连接
websocket建立成功有一下几点注意的地方:
1.每个vnc的ticket只能建立一次连接,无论失败成功,再次使用无法建立连接报bad handshake错误
2.websocket连接请求中需要携带PVEAuthCookie,值是pve的认证ticket,proxmox系统登录后或者通过api获得(/api2/json/access/ticket)
3.连接过程中novnc需要输入密码,密码就是:vncticket的值(不能url编码),proxmox前端自动填入密码登录,因此登录过程未出现输入密码的过程。
4.PVEAuthCookie和ticket必须使用url编码
# 2.外部调用
开发第三方应用如何将novnc嵌入访问proxmox的虚拟机资源,就要满足websocket建立的三个条件
# 1.nginx代理
将第三方应用和proxmox管理页面用nginx代理到同一IP地址下,实现同源,这样访问时就可以自动携带PVEAuthCookie,这种方式的优势是不需要后端处理,前端模仿proxmox连接vnc的过程就可以。
缺点是:暴露了PVEAuthCookie,用户可以通过该值直接登录proxmox或者通过api控制proxmox,存在安全极大安全风险。
# 2.websocket代理
这种方式实现的原理是,websocket代理转发客户端和proxmox之间的连接流量,proxmox认证需要的信息由代理生成:
客户端————(websocket)—————代理————(websocket)————-proxmox
# 2.1 获取pve的token
|
|
# 2.2 获取vnc的ticket
|
|
# 2.3 建立websocket转发
|
|
# 2.4 代理端口监听和处理
|
|
# 2.5 novnc连接
由于程序测试的缘故,需要提供路径参数,点击连接后出现密码输入框:
输入vncticket:PVEVNC:66F13904::KCOiBbp61SRDoRPfuJCU0dSiOTddunbMSmoNwIIlNvooFtbJO/BMscu7l61a83rr3PH8kOjvaXRxgHZRL24FvRFc5KZKLQsFcok0 rsB1QdLceiX05xVkhInHqCWbPSNKZy5j4cIzQZGCVNfFOcEZNFMSNzGJGEdxQ/6F9jYsJMvnyxIKHff90RIHtupvKWpn1Ou3pdWKX2BbnT20mHHLogxdLKlMxXbHYJ/ia/6WHKBUBaYTQwReH7K0mmSmElJXQW3iit R0FA52uMwS1sBG5Gl0WJWmWzcA8EnPV6wID0w/P 9NaG8Cd1C6XdUghsKaIj0wz0p2DJSDlfzymdLA==
连接成功
这种方法的缺点是后端的编程工作量稍大,但是由于代理的存在,用户端无需获得proxmox相关凭证,不会对proxmox造成安全威胁,后续业务逻辑处理起来也更加灵活。
# 3.结束语
本文介绍了最关键的novnc的代理方式,第三方应用如果想控制proxmox实现开关机、新建等功能也可以通过类似的的方式后端程序通过api进行控制proxmox。