「NAT環境にいるCloudStack管理GUIでWebコンソールへのアクセスを可能にする」

補欠だったのですが急遽参加する事になったCloudStack Advent Calendar(http://atnd.org/events/34309)

人身事故で家に帰れなくなった僕がこれから12/07分を書くよ\(^o^)/

 

内容は「NAT環境にいるCloudStack管理GUIでWebコンソールへのアクセスを可能にする」です。

内容は「NAT環境にいるCloudStack管理GUIでWebコンソールへのアクセスを可能にする」です。

 

みなさんCloudStack 4.0(http://incubator.apache.org/cloudstack/)を動かしてますか?

 
僕は検証の時間がやっと作れたので環境を構築しています。
環境としては以下
 
  1. CloudStack環境は独立したネットワークに閉じ込める(10.10.0.0/16のBasic Network環境)
  2. CloudStack環境へのアクセスには境界ルータを用いる( IIJ製SEIL)
  3. Management WebUIには、境界ルータのNAT/NAPT機能を用いてアクセスする(SEILのNAT機能)
みなさんまさかオフィスのネットワークに「直に」CloudStack環境つないでたりしませんよね?
境界ルータ置きますよね?
SEILとかSEILとかSEIL/x86とか
 
ここで問題が...
Management WebUIまでのブラウザアクセスは、境界ルータのNAT設定だけで行けるのですが、
インスタンスのWebコンソールへのアクセスは実はあっさりは成功しません
# 最終的にはVMへのVNC
# VNCのお話は今回は割愛(まだソースコードをちゃんと読んでいないので)

ということで

「NAT環境にいるCloudStack管理GUIでWebコンソールへのアクセスを可能にする」

を目的に話しを進めたいと思います。

 

環境イメージ

 

f:id:hirolovesbeer:20121207165338p:plain

問題点

  1. realhostip.comが使われている
  2. Ajaxが使われている
  3. httpsが使われている
  4. NATが挟まっている

解決策

「ReverseProxyを間に挟む」

 

ReverseProxy環境イメージ

f:id:hirolovesbeer:20121207165439p:plain

ReverseProxy設定

 

  1. CentOS 環境なので、yum install httpdとかはapacheを入れる
  2. /etc/httpd/conf.d/rproxy.confとかに以下を記述
  3. 10.10.0.10
  4. cloud-gate.hogefuga.jp
  5. 10.10.0.151

 

Listen 10.10.0.10:8888
<virtualhost 10.10.0.10:8888="">
  ServerName    10.10.0.10
  ErrorLog      logs/ssl_error_log
  Customlog     logs/ssl_access_log combined

  ProxyPass /client http://10.10.0.10:8080/client     <- 10.10.0.10:8888/clientへのアクセスを8080へと飛ばす
  ProxyPassReverse /client http://10.10.0.10:8080/client

  SSLProxyEngine On     <- ConsoleProxyへのアクセスがhttpsの為にSSLProxyEngineをonする
  SSLProtocol all -SSLv2

  ProxyPass /ajaximg https://10.10.0.151/ajaximg
  ProxyPassReverse /ajaximg https://10.10.0.151/ajaximg
  ProxyPass /resource https://10.10.0.151/resource
  ProxyPassReverse /resource https://10.10.0.151/resource
  ProxyPass /ajax https://10.10.0.151/ajax
  ProxyPassReverse /ajax https://10.10.0.151/ajax

  ExtFilterDefine console_proxy mode=output cmd="/bin/sed -e 's,https://10-10-0-151.realhostip.com/,http://cloudstack-gate.hogefuga.jp:8888/,g'" <- 表示されるHTMLを無理矢理書き換えるフィルタ

  <location>
    AddOutputFilterByType console_proxy text/html
  </location>
</virtualhost>

NATの設定

 

SEILの設定に以下を追加
# nat snapt add protocol tcp listen 8888-8888 forward 10.10.0.10 8888-8888 enable interface lan1
 
 

設定の結果

http://cloud-gate.hogefuga.jp:8888へとアクセスするとManagementサーバのReverseProxyへとアクセスし、
さらに8080ポートへと通信が転送され、管理WebUIへとアクセスができます。
「ReverseProxyの設定」と「NATの設定」でNAT環境かのホストに対するWebコンソールがつかめました。
 
過去のMLの内容などをみると、VPN張ればいいじゃんとか言う案もある様ですが、それはそれは敷居が高いので今回は割愛。
ApacheのReverseProxy設定なので、敷居は下がるのじゃないかと思う次第。
 
ちなみに参考にさせていただいたのはこちら
 
 
ちなみに、ソースコード(ConsoleProxy.java)を読むと
/getscreen
/resource/
/ajaximg
の4つに対するハンドラが登録されているので、「/getscreen」もケアしてあげた方がいいかもですが時間ができたら検証します。