HTML5 Console Access from Windows PC (Under Investigation)
以前のエントリーでも紹介していますが、vSphere 5.5 の vSphere Web Client からは Mac OS もサポートされています。Windows や Linux では vmware-vmrc という仮想マシンのコンソール アクセス用のバイナリが提供されていますが、Mac OS 用には提供されていません。Mac OS からアクセスした場合には、HTML5 ベースのコンソールがブラウザー内で動作します。 VMRC SDK にも記述はないので、まぁお察しください。
HTML5 ベースのコンソール
HTML5 ベースのコンソールは、Mac OS 上のブラウザーで vSphere Web Client にログインした後、仮想マシンの「コンソールの起動」をクリックすることでアクセスできます。
新しいタブ/ウィンドウが開き HTML5 ベースのコンソールが表示されます。
コンソールに関わるボタンが「Send Ctrl+Alt+Del」だけで、「Power On」「Power Off」「Reset」「Mount ISO/FD」などがないのが寂しいところですが、仕様なので仕方ないでしょう。
今回のポイントはコンソール アクセスのウィンドウの URL です。vCenter Server のポート 7331 に HTTP アクセスしています。vSphere Web Client はポート 9443 ですので、コンソールは vSphere Web Client とは別に扱われていそうです。私の環境は vCenter Server Appliance で構成されていますので、アプライアンスにログインしてポート 7331 を利用しているプロセスを lsof で確認してみます。
vc-l-01sp:~ # lsof -i:7331
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 5787 root 21u IPv6 20543 0t0 TCP *:7331 (LISTEN)
java 5787 root 76u IPv6 939059 0t0 TCP vc-l-01sp.yyy.zzz:7331->aa.bb.cc.dd:64146 (ESTABLISHED)
vc-l-01sp:~ # ps -ef | grep 5787
root 5787 5034 0 12:03 ? 00:00:19 /usr/java/jre-vmware/bin/java -Djetty.port=7331 -jar start.jar -Xss1024k -Xms1024m OPTIONS=Server,websocket
root 13209 12376 0 12:38 pts/0 00:00:00 grep 5787
vc-l-01sp:~ #
なぜ Jetty というツッコミはありますが、この Jetty が使っている他のポートを確認してみます。
vc-l-01sp:~ # lsof -n -P -p 5787 | grep TCP
java 5787 root 21u IPv6 20543 0t0 TCP *:7331 (LISTEN)
java 5787 root 76u IPv6 939059 0t0 TCP aa.bb.cc.dd:7331->ww.xx.yy.zz:64146 (ESTABLISHED)
java 5787 root 80u IPv6 939064 0t0 TCP aa.bb.cc.dd:34321->AA.BB.CC.DD:902 (ESTABLISHED)
java 5787 root 86u IPv6 544211 0t0 TCP 127.0.0.1:60056->127.0.0.1:443 (ESTABLISHED)
java 5787 root 87u IPv6 544228 0t0 TCP aa.bb.cc.dd:33523->AA.BB.CC.DD:902 (CLOSE_WAIT)
vc-l-01sp:~ #
aa.bb.cc.dd は vCenter Server の IP アドレス、AA.BB.CC.DD は vSphere ESXi の IP アドレスになります。おそらく Jetty は、vCenter Server (vpxd) のポート 443 への API 用接続と、vSphere ESXi のポート 902 への VNC アクセスを持っていると推察できます。 また、コンソール アクセスのウィンドウの URL の GET アトリビュートを見てみると
- vm-id (仮想マシンの Managed Object Reference ID)
- vmName (仮想マシン名)
- host (vCenter Server のアドレス)
- sessionTicket (MKS チケットと vCenter Server の証明書の Thumbprint)
- thumbprint (vCenter Server の証明書の Thumbprint)
といったパラメータを確認できます。(Thumbprint は MKS チケットの Thumbprint ではないことに注意) ここまで分かれば Windows からでも HTML5 コンソールに接続できるのでは?と妄想してみます。
Windows PC から HTML5 コンソールへのアクセスにチャレンジ
クライアント偽装 (NG)
User-Agent を誤魔化せば…とやってみたものの、JavaScript 内で Runtime を見ている模様。
PowerCLI からのアクセス (NG)
上記のパラメーターを PowerCLI で取得して、Firefox を起動してみます。
$VCenter = "vc-l-01sp"
$VCenterThumbprint = "AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:MM:NN:OO:PP:QQ:RR:SS:TT"
Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer $VCenter -User XXXX -Password XXXX
$Vm = Get-VM polaris
$Ticket = $Vm.ExtensionData.AcquireTicket("mks")
$VmName = $Vm.Name
$VmId = $Vm.ExtensionData.MoRef.Value
$VmHost = $VCenter
$SessionTicket = "cst-VCT-" + $Ticket.Ticket + "--tp-" + $VCenterThumbprint.Replace(":", "-")
$Thumprint = $VCenterThumbprint
$URL = "http://"+$VCenter+":7331/console/?vmId="+$VmId+"&vmName="+$VmName+"&host="+$VCenter+"&sessionTicket="+$SessionTicket+"&thumbprint="+$VCenterThumbprint
& 'C:Program Files (x86)Mozilla Firefoxfirefox.exe' $URL
残念ながら、接続に失敗してしまいます。vCenter 側のログには以下のエラーが出力されます。 /var/log/vmware/vsphere-client/logs/vsphere_client_virgo.log
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err Aug 24, 2014 2:16:31 PM com.vmware.mks.AuthdAdapterServlet retrieveMksTicket
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err SEVERE: com.vmware.vim.binding.vim.fault.InvalidLogin:
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err inherited from com.vmware.vim.binding.vim.fault.VimFault:
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err inherited from com.vmware.vim.binding.vim.fault.InvalidLogin: Cannot complete login due to an incorrect user name or password.
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err 2014-08-24 14:16:31.025:WARN:oejs.ServletHandler:/console/authd
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err java.lang.NullPointerException
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err at com.vmware.mks.AuthdAdapterServlet.doWebSocketConnect(AuthdAdapterServlet.java:135)
[2014-08-24 14:16:31.026] [ERROR] Thread-42 System.err at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:328)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.websocket.WebSocketServlet.service(WebSocketServlet.java:97)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:648)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:534)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
[2014-08-24 14:16:31.027] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.Server.handle(Server.java:365)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
[2014-08-24 14:16:31.028] [ERROR] Thread-42 System.err at java.lang.Thread.run(Unknown Source)
authd は vSphere ESXi でポート 902 の認証を司っているコンポーネントなので、Ticket あたりを間違えているのか…。
おわりに
Firebug などを使って、もうちょっと調べてみたいところです。