Apache Guacamole を使って自宅 Ubuntu マシンに SSH 接続してみた

以前、Cloudflare Zero Trust Tunnel の「ブラウザレンダリング SSH」機能を使って、ブラウザ上から自宅の Ubuntu マシンへと SSH 接続をした。

機能的にはコレで申し分ないのだが、SSH 接続するたびに秘密鍵をコピペしないといけないのが若干面倒だった。また、ブラウザ上から Ubuntu の GUI デスクトップにもリモートデスクトップ接続出来たらいいなーと思い、やり方を調べたところ Apache Guacamole というフリーソフトが使えそうだったので試してみた。

試行錯誤した結果、以下のように Docker Compose で準備してやると簡単だった。

# 適当な作業ディレクトリを作る
$ mkdir guacamole && cd $_

# Guacamole 用の PostgreSQL DB を構築するための SQL ファイルを出力する
$ mkdir ./init
$ chmod -R +x ./init
$ docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > ./init/initdb.sql

# ボリュームマウント用の空ディレクトリを作る
$ mkdir ./drive ./record ./data

# 以下の Docker Compose ファイルを用意する
$ touch docker-compose.yml

docker-compose.yml ファイルの内容は次のようにする。guacd というバックエンドサービス、guacamole フロントエンド、それからユーザ管理などを保存しておく PostgreSQL データベースから構成される。

networks:
  guacnetwork:
    driver: bridge
services:
  guacd:
    container_name: guacamole-guacd
    image: guacamole/guacd
    networks:
      - guacnetwork
    restart: always
    volumes:
      - ./drive:/drive:rw
      - ./record:/record:rw
  postgres:
    container_name: guacamole-postgres
    image: postgres:15-alpine
    environment:
      PGDATA: /var/lib/postgresql/data/guacamole
      POSTGRES_DB      : guacamole_db
      POSTGRES_PASSWORD: guacamole_pass
      POSTGRES_USER    : guacamole_user
    volumes:
      - ./init:/docker-entrypoint-initdb.d:z
      - ./data:/var/lib/postgresql/data:Z
    networks:
      - guacnetwork
    restart: always
  guacamole:
    container_name: guacamole
    image: guacamole/guacamole
    depends_on:
      - guacd
      - postgres
    environment:
      GUACD_HOSTNAME: guacd
      POSTGRES_HOSTNAME: postgres
      POSTGRES_DATABASE: guacamole_db
      POSTGRES_PASSWORD: guacamole_pass
      POSTGRES_USER    : guacamole_user
    volumes:
      - ./record:/record:rw
    ports:
      - 8080:8080/tcp
    networks:
      - guacnetwork
    restart: always

外部公開しているのは guacamole8080 ポート。$ docker compose up -d でコンテナ群を起動したら、

にアクセスしてみる。/guacamole パスを忘れないこと。


うまくいくとログイン画面が表示されると思うので、ユーザ ID・パスワードともに初期値の guacadmin でログインする。

そしたら「設定」よりパスワードを変更したり、「接続」から接続先情報を設定したりしていく。

SSH に関しては、Guacamole を起動している localhost 自身に対して、SSH 接続に必要な秘密鍵を貼り付けて保存しておいてやれば良い。ちゃんと設定できていれば「ホーム」から SSH 接続ができるはずだ。

GUI デスクトップ接続については、当方の Ubuntu 24.04 マシンの GNOME デスクトップで試したところ、xrdptigervnc も、うまく設定して接続することが出来なかった。ココら辺は Guacamole のせいというワケではなく、xrdp や TigerVNC の設定の詰めの問題だと思われるが、とにかく自分はうまくいかなかったので GUI 接続に関しては断念;;。

また、今回は localhost に対する SSH や RDP・VNC 接続を試しているが、この Ubuntu マシンから接続できる他のマシン、例えば Windows マシンへの RDP などを接続先として設定することも可能だ。Guacamole が ~/.ssh/config 的な役割を果たしてくれて、ココから色々なマシンに、色々な接続方式でリモートデスクトップ接続できるワケだ。これは素晴らしい。

今回はとりあえず、ブラウザ上で Guacamole を経由しての SSH 接続はできるところまで設定をした。


最後に、この http://localhost:8080/ に対して Cloudflare Zero Trust Tunnel でトンネルを作ってやる。ちゃんと設定できれば https://guacamole.example.com/guacamole といった感じの URL で Guacamole の管理画面にアクセスできるようになる。

コレで、秘密鍵を都度コピペしないといけなかった Cloudflare の「ブラウザレンダリング SSH 接続」よりは若干お手軽に SSH 接続できるようになった。