【Google Cloud】社内プロキシ環境からVMに接続してみた

# 社内プロキシ経由でVMに接続してみた

Google CloudのVM(Compute Engineの仮想マシン)に対して、できるだけ簡単/低コストに社内プロキシ経由で接続する方法を調査しましたので、記事として記載します。
社内プロキシ経由でのVMの利用を考えている方への参考になれば幸いです。

## 外部IPをもつVMに対しての接続
ネットワーク経路に問題がなければ、外部IPをもったVMに対しては直接アクセスすることができます。
しかし、前述の通り社内プロキシ経由では、SSH/RDPプロトコルが許可されていない場合が多く、ブラウザやCloud shell(Google Cloud上に作成される一時マシン)経由での接続が必要となります。

### SSH接続
SSH接続の場合は、外部IP(External IP)が割り当てられている場合のみ、ブラウザおよびCloud Shell経由での直接接続が可能です。
プロキシの関与外(Google Cloud内)での通信となるため、社内プロキシ環境からの間接的な接続が可能です。
接続は各マシンへの操作は<接続>タブから実施します。
![CE画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/bd1670b8-b1eb-a642-8088-74642d85948b.png "CE画面")
![SSHの例.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/63b698a4-966c-46d0-f81f-0537650eefd6.png "ssh接続")
**・ブラウザ経由**
　　[ブラウザウィンドウ開く]を選択後、各種情報が自動で設定され、すぐに接続されます。
**・Cloud Shell経由**
　　Cloud Shell 経由の場合は、[gcloudコマンドを表示]を選択後にコピーし、
　　1つ目の画像の黄色部からCloud Shellを起動し、そのまま実行することで接続できます。

### RDP接続
残念ながら、2022年07月時点では、ブラウザやCloud shell経由のアクセス手段は用意されていないようです。
外部IPを持つマシンに対しても、下記の外部IPをもたないVMに対しての接続方法を参照いただければ幸いです。

# 外部IPをもたないVMに対しての接続
Identity-Aware Proxy(IAP) 経由の接続が最も容易だと判断しました。
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/6d62e6df-86a2-d5a7-4bb1-a882c3967674.png "IAP")
Google Cloud の Identity-Aware Proxy とは、
GCP リソースに対するゼロトラストが実現可能なフルマネージドのリバースプロキシです。
External IPが付与されていない、プライベートなネットワークのVMインスタンス にも接続可能です。
また、任意のプロトコルのトンネル通信が可能であり、一時的なネットワーク経路の確立に適しています。

セキュリティ > Identity-Aware Proxy から有効化するだけで利用できます。使用するリソースについては、必要最小限の権限を割り当ててください。
VMへのアクセスのみができれば良いということであれば、IAP Desktop という、VM インスタンスに対する複数のリモート接続を管理できる Windows アプリケーションを利用することがおすすめです。

### IAP Desktopを利用する場合
IAP Desktopは、Windowsの認証情報を利用しているようですので、
ローカルマシンが社内プロキシ環境下にて通信可能な状態であれば、特に設定は不要です。
IAP Desktopでは、SSH/RDP接続どちらも利用可能です。

### gcloudコマンドを利用する場合
社内プロキシ環境にてgcloudコマンドを利用する場合は、下記を参考に
プロキシの設定 並びに 必要に応じて利用する証明書を指定ください。
  [[参考(公式ドキュメント)] プロキシ / ファイアウォールの背後で Cloud SDK を使用する場合の構成](https://cloud.google.com/sdk/docs/proxy-settings?hl=ja)
~~~posix-terminal:プロキシ情報の設定コマンド
gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_IP_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]
gcloud config set proxy/username [USERNAME] //必要に応じて
gcloud config set proxy/password [PASSWORD] //必要に応じて
~~~
~~~bash:証明書の登録コマンド
gcloud config set core/custom_ca_certs_file [PATH_TO_CUSTOM_CA]
~~~


gcloudコマンドを用いて経路を構築する場合は、`start-iap-tunnel` コマンドを実行します。
インスタンスのポート、バインドするローカルマシンのポートを指定することで、
該当のローカルポートへのアクセスを、指定したインスタンスのポートへ転送することができます。
RDPやSSHだけでなく、任意のポートを指定可能です。
~~~bash:start-iap-tunnelコマンド
gcloud compute start-iap-tunnel "インスタンス名" ポート番号 --local-host-port=localhost:ローカルホストのポート番号 --zone="インスタンスのZone名"
~~~


### 参考情報
公式ドキュメント:
   [Windows] https://cloud.google.com/compute/docs/instances/connecting-to-windows?hl=ja
   [Linux] https://cloud.google.com/compute/docs/instances/ssh?hl=ja
   [IAP] https://cloud.google.com/iap/docs/concepts-overview?hl=ja
   [IAP Desktop] https://github.com/GoogleCloudPlatform/iap-desktop/wiki

### 社内プロキシについて
社内プロキシとは、一般に社内からのインターネット接続経路に用意されており、
セキュリティ保護のため、基本的にはHTTP/HTTPSの通信のみを許可するように構築されております。
![社内プロキシ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/849d8ba5-fd4b-0dbf-297c-b7194284349e.png "社内プロキシ")
社内プロキシを経由することで、一定のセキュリティが担保されますが、
一方で、SSH接続やRDP接続といった通信は許可されず、クラウドの上の仮想マシンなどに直接接続することができません。
プロキシ側の設定変更で対処することも多々ありますが、トンネリングという技術を利用することで、末端の端末側のみで対処したケースとなります。


### VM(Compute Engineの仮想マシン)について
用意されている多数のマシンイメージを用いる場合であれば、非常に簡単にGoogle Cloud上に仮想マシンを構築することができます。
構築時に、ネットワーク設定をすることで外部IPなどを設定することができます。
設定によっては、該当のVMが所属するVPCのファイアウォール設定などが、
別途必要となりますので、通信がうまくいかない場合などはご確認をいただければ幸いです。