X

Raspberry Piで、ブラウザからアクセスできるリモートデスクトップゲートウェイを構築する – GUACAMOLE

Windows Server Essentialsには、外部のネットワークからリモートWebアクセスサイトを経由して、ネットワーク内のクライアントコンピューターにアクセスできる機能があります。

デバイス欄に表示されたオンライン状態のコンピューターをクリックすると、Microsoftのリモートデスクトップクライアントから接続ができる.rdpファイルがダウンロードできます。

この機能は、Windows Serverのリモートデスクトップゲートウェイ機能を利用して構築されています。

同じようなことをRaspberry Piでできないか?

Windows Server Essentialsの特徴的な機能の1つであるこのリモートデスクトップゲートウェイ機能を、5,000円程度と安価に購入できるRaspberry Piで代替できないかと考えてみました。

Raspberry Pi上に、Apache Guacamoleを構築する

候補を検討していると、HTML 5を利用して、ブラウザからリモートデスクトップ接続できるApache Guacamoleをみつけました。マイクロソフトのRDPだけでなく、VNCやSSHもサポートするため、Windows以外のホストにアクセスする際にも便利に利用できそうです。

また、ブラウザを利用するため、クライアントもブラウザさえあればよいのも便利そうです。最近ではiOSにもAndroidにもMicrosoft純正のRDPクライアントアプリが用意されていますが。

事前準備:認証用のMySQLのインストール

認証にデータベースを用いる構成とすることで、管理ポータル画面でユーザーや接続設定の管理が可能になることから、今回は認証情報の保存にMySQLを利用する構成にチャレンジます。

Guacamoleのサイトにある、データベース認証の構成ガイドを参考に設定していきます。

  1. MySQLのインストール
    sudo apt-get install mysql-server
  2. 初期設定をします。
    $ sudo mysql_secure_installation

    パスワードは設定されていないためカレントパスワードは何も入力せずエンターを押下します。新しいパスワードを設定します。匿名ユーザーやテストデータベースの削除は好みに応じて選択します。

  3. Guacamole用のデータベース作成
    Guacmoleで利用するデータベースを作成します。’パスワード’は自身で任意のパスワードを設定してください。
    sudo mysql -u root -p
    MariaDB [(none)]> CREATE DATABASE guacamole_db;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'パスワード';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
    Query OK, 0 rows affected (0.07 sec)
    
    MariaDB [(none)]> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [(none)]> quit
    Bye
    pi@raspberrypi:~ $

Guacamoleのインストール方法

こちらのページを参考にインストールしてみます。Raspberry PiにSSHで接続して、コマンドを入力していきます。

  1. システムのアップデート
    $ sudo apt-get update
    $ sudo apt-get upgrade

  2.  必要となる依存パッケージをインストールします。
    $ sudo apt-get install libcairo2-dev
    $ sudo apt-get install libjpeg62-turbo-dev
    $ sudo apt-get install libpng12-dev
    $ sudo apt-get install libossp-uuid-dev

  3. オプションのパッケージをインストールします。
    $ sudo apt-get install libavcodec-dev libavutil-dev libswscale-dev
    $ sudo apt-get install libpango1.0-dev
    $ sudo apt-get install libssh2-1-dev
    $ sudo apt-get install libtelnet-dev
    $ sudo apt-get install libvncserver-dev
    $ sudo apt-get install libpulse-dev
    $ sudo apt-get install libssl-dev
    $ sudo apt-get install libvorbis-dev
    $ sudo apt-get install libwebp-dev
    $ sudo apt-get install libfreerdp-dev
  4. Guacamole サーバーとクライアントパッケージをダウンロードします。
    $ wget http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.14.tar.gz
    $ wget http://sourceforge.net/projects/guacamole/files/current/source/guacamole-client-0.9.14.tar.gz

    ダウンロードするパッケージのバージョンはGuacamoleのサイトから最新のバージョンを確認して読み換えてください。

  5. Guacamoleサーバーをビルドしてインストールします。
    $ tar xzf guacamole-server-0.9.14.tar.gz
    $ cd guacamole-server-0.9.14
    $ ./configure --with-init-dir=/etc/init.d
    $ make
    $ sudo make install
    $ sudo update-rc.d guacd defaults
    $ sudo ldconfig

    パッケージのバージョンも、上記4同様に読み替えてください。

  6. クライアントをビルドします。
    $ sudo apt-get install maven
    $ cd ~/
    $ tar xzf guacamole-client-0.9.14.tar.gz
    $ cd guacamole-client-0.9.14
    $ mvn package

    クライアントパッケージのバージョンも上記4同様に読み替えてください。

  7. スキーマーのインポート
    $ cd ~/guacamole-client-0.9.14/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql
    $ cat schema/*.sql | sudo mysql -u root -p guacamole_db
    
  8. jdbcのドライバーをインストールします。
    $ cd ~/
    $ curl -L 'http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.24.tar.gz/from/http://cdn.mysql.com/' | sudo tar xz
    $ sudo mkdir /etc/guacamole
    $ sudo mkdir /etc/guacamole/lib
    $ sudo cp mysql-connector-java-5.1.24/mysql-connector-java-5.1.24-bin.jar /etc/guacamole/lib/
  9. jetty9 サーバーをインストールします。
    sudo apt-get install jetty9
  10. Guacamoleを展開します。
    $ cd ~/guacamole-client-0.9.14
    $ sudo cp guacamole/target/guacamole-0.9.14.war /var/lib/jetty9/webapps/guacamole.war
    
  11. データベース認証用のjarをextensionsフォルダー配下に配置します。
    $ sudo mkdir -p /etc/guacamole/extensions
    $ sudo cp ~/guacamole-client-0.9.14/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/target/guacamole-auth-jdbc-mysql-0.9.14.jar /etc/guacamole/extensions/
  12. nanoエディタで、”guacamole.properties”を新規作成します。
    cd /etc/guacamole/
    sudo nano guacamole.properties
  13. 次のテキストをコピーしてペーストします。Ctrl+Xを押下して、その後[Y]を押下、エンターを押下して保存します。
    # Hostname and port of guacamole proxy
    guacd-hostname: localhost
    guacd-port:     4822
    
    # Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
    auth-provider: net.sourceforge.guacamole.net.auth.mysql.MySQLAuthenticationProvider
    
    # MySQL properties
    mysql-hostname: localhost
    mysql-port: 3306
    mysql-database: guacamole_db
    mysql-username: guacamole_user
    mysql-password: 3で作成したパスワード

  14. raspberry piを再起動します。
    sudo reboot

     

Guacamoleへのログイン

  1. http://raspberry piのIPアドレス:8080/guacamole にアクセスします。

  2. 初期のユーザー名とパスワードは いずれもguacadmin になっています。ログインすると以下のような画面になります。

  3. 右上のユーザー名の隣に表示されている▼を押下し、[SETTINGS]を押下します。

    [Users]タブを押下。

    guacadminをクリックします。表示された画面で、パスワードを変更したり権限などの設定ができます。


    デフォルトのパスワードを変更したら、[New User]から新しいユーザーを追加します。

  4. [Connections]を押下すると、接続先の設定を管理できます。

  5. [New Connection]を押下して、接続先を追加します。リモートデスクトップやSSH,VNCなどが選択できます。

    接続先の設定では、GUACAMOLE PROXY PARAMETERSに、
    Hostname:localhost
    Port:4822
    を入力してください。

  6. 設定後は、ログイン後のHome画面に以下のように接続先が表示されます。

うまくつながらず、ループしてしまう場合は、[Ctrl]+[Alt]+[Shift]を押下すると設定メニューを開くことができます。

Windowsに接続する場合、以下の2つにチェックをつける必要があります。

  • Ignore server certificate
  • Disable audio

Windows Server 2016には、以下のレジストリの修正をすることで接続することができました。

参考:Guacamole, RDP, Windows 10 and Windows Server 2016

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
“SecurityLayer”=dword:00000001
“UserAuthentication”=dword:0x00000000

これで、Webページ上から内部ネットワークのサーバーやクライアントPCにRDP/VNC/SSHなどで接続するポータルを作成することができました。あとは、Raspberry Piを外部からアクセスできるように公開すればOKです。Raspberry PiですのでDDNSを使うこともできますから、自宅ネットワークのWAN側にアサインされているIPアドレスが変わってもアクセスできるサイトを構築できます。

自宅ではフレッツ光のIPoE接続ですが、サーバーはPPPoEセッションを張って公開しています。IPoE上でもサーバー公開したくなり、あえて今回はRaspberry PiとDDNS接続を利用してIPoE接続ルートでRaspberry Piを外部公開してみました(IPoEでも占有できるポート番号を用いて公開しています)。無事、スマホからもアクセスできるようになりました。

今回はRDPの代替にチャレンジしましたが、ほかにもVPNサーバーやファイルサーバーとしての機能を加えることもできますので、チャレンジしてみてはいかがでしょうか。

ださっち: