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のサイトにある、データベース認証の構成ガイドを参考に設定していきます。
- MySQLのインストール
sudo apt-get install mysql-server
- 初期設定をします。
$ sudo mysql_secure_installation
パスワードは設定されていないためカレントパスワードは何も入力せずエンターを押下します。新しいパスワードを設定します。匿名ユーザーやテストデータベースの削除は好みに応じて選択します。
- 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で接続して、コマンドを入力していきます。
- システムのアップデート
$ sudo apt-get update $ sudo apt-get upgrade
- 必要となる依存パッケージをインストールします。
$ 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
- オプションのパッケージをインストールします。
$ 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
- 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のサイトから最新のバージョンを確認して読み換えてください。
- 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同様に読み替えてください。
- クライアントをビルドします。
$ sudo apt-get install maven $ cd ~/ $ tar xzf guacamole-client-0.9.14.tar.gz $ cd guacamole-client-0.9.14 $ mvn package
クライアントパッケージのバージョンも上記4同様に読み替えてください。
- スキーマーのインポート
$ 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
- 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/
- jetty9 サーバーをインストールします。
sudo apt-get install jetty9
- Guacamoleを展開します。
$ cd ~/guacamole-client-0.9.14 $ sudo cp guacamole/target/guacamole-0.9.14.war /var/lib/jetty9/webapps/guacamole.war
- データベース認証用の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/
- nanoエディタで、”guacamole.properties”を新規作成します。
cd /etc/guacamole/ sudo nano guacamole.properties
- 次のテキストをコピーしてペーストします。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で作成したパスワード
- raspberry piを再起動します。
sudo reboot
Guacamoleへのログイン
- http://raspberry piのIPアドレス:8080/guacamole にアクセスします。
- 初期のユーザー名とパスワードは いずれもguacadmin になっています。ログインすると以下のような画面になります。
- 右上のユーザー名の隣に表示されている▼を押下し、[SETTINGS]を押下します。
[Users]タブを押下。
guacadminをクリックします。表示された画面で、パスワードを変更したり権限などの設定ができます。
デフォルトのパスワードを変更したら、[New User]から新しいユーザーを追加します。 - [Connections]を押下すると、接続先の設定を管理できます。
- [New Connection]を押下して、接続先を追加します。リモートデスクトップやSSH,VNCなどが選択できます。
接続先の設定では、GUACAMOLE PROXY PARAMETERSに、
Hostname:localhost
Port:4822
を入力してください。 - 設定後は、ログイン後の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サーバーやファイルサーバーとしての機能を加えることもできますので、チャレンジしてみてはいかがでしょうか。