昨今の「社内PC」は管理者権限が与えられておらず、「ブラウザ」、「メール」、「Office」の3つだけという環境が標準だったりします。ダディ伯爵の貸与されている社内PCも同様で、プロキシサーバによるサイト閲覧制限のおまけつき。
そのような制限が厳しくなった「社内PC」からでも、お手軽にRDP接続、VNC接続、SSH接続が出来る方法を簡単に作ることが出来ましたのでご紹介いたします。
- GCPのAlways FreeのGAE無料枠を使ってみた
- GAEの「無料ドメイン」と「無料SSL証明書」がとても便利♪
- 社内PCからRDP接続するために中継サーバ(Guacamole)をdockerコンテナで立ててみた
- 社内PCからGCPのdockerコンテナ環境へSSH接続する
- 「Container-Optimized OS」から「Google Container Registry(GCR)」へコンテナイメージをpushする方法
- Google Cloud Platform(GCP)認定資格の勉強方法
- GCP認定資格「Associate Cloud Engineer」を受験するための勉強方法
- GCP認定資格「Professional Cloud Architect」を受験するための勉強方法
- Google Cloud Platform(GCP)イベント「Cloud OnBoard」に参加してみた
- クレカ不要でGCPを始めよう「Qwiklabs」が無料で使える♪
- クラウド移行ツール「CloudEndure(クラウドエンデュア)」が無料で使える
- ロードバランサー比較(AWS、Azure、GCP)
- SD-WANをOSSで実現できるのか?
- マルチクラウドにおけるVPNネットワーク相互接続について
1.社内PCからRDP接続、VNC接続、SSH接続するための構成
ブラウザだけでリモート接続できるソフトとして「noVNC」や「ThinPC」等がありますが、いずれも接続したいサーバ側へインストールが必要となります。
ダディ伯爵が紹介する構成は、接続したいサーバ側へは何もインストールせずに「社内PC」と「接続したいサーバ」の間に「中継サーバ」を立てる構成となります。
簡単に書くと以下の通りです。
社内PC
↓
社内プロキシサーバー
↓
インターネット
↓
Guacamoleサーバ★
↓
接続したいサーバ★
ダディ伯爵は、★の2台を「Google Cloud Platform」の「Google Compute Engine」で構築することで実現しました。
以下に手順メモを残します。
2.Guacamoleサーバの構築手順
Apache Guacamole用のサーバを作ります。ダディ伯爵はdockerの勉強も兼ねてGCPの「Container-Optimized OS」を使ってみました。
CentOS等にパッケージインストールして構築される場合は、https://blog.intracker.net/archives/1163の記事が参考になるかと思います。
ダディ伯爵の一から構築する手順を途中まで頑張ってみましたが、Apache Guacamoleを動かすのに必要なパッケージが多く時間もかかるので断念しました。
後述の手順にある「コンテナ」を組み合わせるのが楽だと思います。
2-1.GCPのComputeEngineでVMインスタンスを作成する
「Google Cloud Platform」にログインし「Compute Engine」→「VMインスタンス」を開き「Guacamoleサーバ」のためのdocker環境の箱を作ります。
インスタンス名 instance-1(任意)
リージョン asia-northeast2(大阪)※
ゾーン asia-northeast2-a
マシンタイプ vCPU×1、メモリ3.75GB
ブートディスク Container-Optimized OS 74-11895.86.0 stable
標準の永続ディスク10GB
その他はデフォルト
※早速、GCP大阪リージョンを使ってみました。
2-2.dockerイメージをダウンロードする
「Google Cloud Platform」から「Compute Engine」→「VMインスタンス」を開き、先ほど作成した「instance-1」にブラウザからSSH接続(※)します。
※この時点で「ブラウザからSSH接続」は実現出来てしまうのです。。はい。
dockerコマンドが使える環境が立ち上がるので、以下のコマンドを順に実行し4個のイメージがダウンロード出来たことを確認します。
docker images
docker pull guacamole/guacd
docker pull guacamole/guacamole
docker pull mysql
docker pull nginx
docker images
2-3.docker-compose初期設定
先ほどダウンロードした4個のイメージをまとめて起動するための「docker-compose」の初期設定を行います。
参考URL:https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os
docker run docker/compose:1.24.0 version
echo alias docker-compose="'"'docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:$PWD" \
-w="$PWD" \
docker/compose:1.24.0'"'" >> ~/.bashrc
source ~/.bashrc
2-4.docker-compose.yml作成
「docker-compose」の設定ファイルを作成します。
参考URL:https://nyacom.net/?p=443
version: '2'
services:
mysql:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: "gehogeho"
MYSQL_DATABASE: "guacamole_db"
MYSQL_USER: "guacamole_user"
MYSQL_PASSWORD: "hogehoge"
volumes:
- ./sql:/docker-entrypoint-initdb.d
- ./mysql:/var/lib/mysql
networks:
- guac
guacd:
image: guacamole/guacd
restart: always
networks:
- guac
guac:
image: guacamole/guacamole
restart: always
ports:
- "8080:8080"
environment:
GUACD_HOSTNAME: guacd
GUACD_PORT: 4822
MYSQL_HOSTNAME: mysql
MYSQL_DATABASE: "guacamole_db"
MYSQL_USER: "guacamole_user"
MYSQL_PASSWORD: "hogehoge"
networks:
- guac
depends_on:
- mysql
- guacd
nginx:
image: nginx-custom(※)
restart: always
ports:
- "443:443"
networks:
- guac
depends_on:
- guac
networks:
guac:
driver: bridge
※後述の手順で作成したnginxコンテナを「docker commit」してイメージ化したものを使います。
2-5.MYSQL初期設定
Guacamoleマニュアル通り、以下のコマンドでSQLファイル「initdb.sql」を作成します。
出力先ファイルは、SQLディレクトリにしています。
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > ./sql/initdb.sql
2-6.オレオレ証明書作成
nginxコンテナにログインして/opt/nginx/certsディレクトリを作成後、オレオレ証明書をnginxコンテナへコピーします。
docker start nginx
docker exec -ti nginx /bin/bash
mkdir -p /opt/nginx/certs
exit
openssl genrsa -out server.key 4096
openssl req -new -batch -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
sudo docker cp ./server.key nginx:/opt/nginx/certs/
sudo docker cp ./server.crt nginx:/opt/nginx/certs/
2-7.NGINX初期設定
①nginxにてhttps(443)からhttp(8080)へリバプロするための設定ファイルを作成します。
server {
listen 443;
ssl_certificate /opt/nginx/certs/server.crt;
ssl_certificate_key /opt/nginx/certs/server.key;
ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";
location /guacamole/ {
proxy_pass http://XXX.XXX.XXX.XXX:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}
}
②設定ファイルをnginxコンテナへコピーします。
sudo docker cp ./default.conf /etc/nginx/conf.d/default.conf
2-8.GCP firewall設定
GCPコンソールにて、インターネットからGuacamoleサーバへtcp8080,tcp443を通すように設定を追加しておきます。
2-9.サービス起動
「docker-compose up -d」でサービス起動します。
docker-compose up -d
サービス停止は「docker-compose down」で行います。「docker-compose ps」で4個のコンテナがUPしていたら設定完了です。もし起動していないコンテナがあれば「docker-compose logs」を確認しトラブルシューティングを行います。
もし「Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘guacamole_db.guacamole_user’ doesn’t exist」というエラーが出ている場合は「initdb.sql」が実行されていません。「initdb.sql」が「sqlディレクトリ」に作成されているか確認しましょう。
2-10.ログイン、パスワード変更
「http://XXX.XXX.XXX.XXX:8080/guacamole/
」か「https://XXX.XXX.XXX.XXX/guacamole/
」へアクセスします。
HTTP(8080)でアクセス出来ない場合は、guacamoleの設定が出来ていませんのでトラブルシューティングしましょう。
HTTPS(443)でアクセス出来ない場合は、nginxの設定が出来ていませんのでトラブルシューティングしましょう。
めでたくログイン画面が表示されたら「guacadmin/guacadmin」でログインしパスワード変更しましょう。
3.Guacamoleサーバ経由でRDP接続
Apache Guacamoleサーバの構築が終わったら、いよいよ本題のブラウザからRDP接続です。
動作確認のため、GCPでVMインスタンス(Windows2016)を作成、起動している前提です。
3-1.RDP接続設定
guacamoleサーバ「https://XXX.XXX.XXX.XXX/guacamole/
」にログイン後「Settings」→「Connections」から
EDIT CONNECTION
Name:XXXX ★ココ
Protocol:RDP ★ココ
CONCURRENCY LIMITS
Maximum number of connections:2(※1)
Maximum number of connections per user:2(※1)
PARAMETERS
Network
Hostname:XXX.XXX.XXX.XXX ★ココ
Authentication
Username:XXXX ★ココ
Password:XXXX ★ココ
Security mode:NLA(Network Level Authentication) ★ココ(※2)
Ignore server certificate:On ★ココ
Basic Settings
Keyboard layout:Japanese(Qwerty)
Administrator console:on
Performance
Enable wallpaper:on
の項目を設定します。
★7個は必須です。
※1 デフォルトは「1」のような動作をするので、CONCURRENCY LIMITSは「2」に増やしておいたほうが無難です。
社内プロキシ経由の場合、RDP接続1回目が成功しアイドルタイムアウトし再接続するときにデフォルトの「1」だと前のセッションが邪魔して接続ができなくなってしまいます。
※2 Security modeを指定しない場合「Error: protocol security negotiation or connection failure」が出てRDP接続できませんでした。
Security modeは「NLA(Network Level Authentication)」もしくは「Any」とすれば、エラーが出ることなくRDP接続できました。
3-2.RDP接続確認
HOMEに戻りRDP接続を試します。無事にログイン出来たら終了です。お疲れさまでした。
今回は、RDP接続しか試しませんでしたが「Apache Guacamole」にはVNC接続やSSH接続も中継してくれる機能があります。時間があれば、試した記録を残したいと思います。乞うご期待。
GAE無料枠を利用して個人ブログを始める手順について、以下の参考記事にまとめていますので試してみたい方はご確認ください。
- GCPのAlways FreeのGAE無料枠を使ってみた
- GAEの「無料ドメイン」と「無料SSL証明書」がとても便利♪
- 社内PCからRDP接続するために中継サーバ(Guacamole)をdockerコンテナで立ててみた
- 社内PCからGCPのdockerコンテナ環境へSSH接続する
- 「Container-Optimized OS」から「Google Container Registry(GCR)」へコンテナイメージをpushする方法
- Google Cloud Platform(GCP)認定資格の勉強方法
- GCP認定資格「Associate Cloud Engineer」を受験するための勉強方法
- GCP認定資格「Professional Cloud Architect」を受験するための勉強方法
- Google Cloud Platform(GCP)イベント「Cloud OnBoard」に参加してみた
- クレカ不要でGCPを始めよう「Qwiklabs」が無料で使える♪
- クラウド移行ツール「CloudEndure(クラウドエンデュア)」が無料で使える
- ロードバランサー比較(AWS、Azure、GCP)
- SD-WANをOSSで実現できるのか?
- マルチクラウドにおけるVPNネットワーク相互接続について