ttyd を用いて Web ブラウザから ssh リモート接続ができるようにする(Ubuntu 上)

ttyd は,端末を Web ブラウザに公開するソフトウェアである。ブラウザ側の端末エミュレータは xterm.js,サーバ側は libwebsockets を使用し,WebSocket で端末の入出力を中継する。ttyd ssh <ユーザ名>@<ホスト名> のように実行することで,Web ブラウザから SSH 接続ができる。

Ubuntu 24.04 LTS では,公式リポジトリ(universe)の ttyd パッケージ(バージョン 1.7.4)を apt でインストールできる。同じ用途のソフトウェアとして,Apache Guacamole(SSH に加えて RDP, VNC にも対応するゲートウェイ),Wetty(Node.js 上で動作)がある。

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは,次のコマンドを実行する。次のコマンドは Ubuntu 24.04 LTS で使用できる。

Ubuntu のインストールは別ページ »で説明する。

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now

OpenSSH サーバのインストール

次のコマンドを実行する。次のコマンドは Ubuntu 24.04 LTS で使用できる。

-y オプションは,確認プロンプトに自動で「はい」と応答する。インストールされるパッケージを事前に確認しないので,必要に応じて -y を外して実行する。

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install openssh-server

ttyd のインストールと起動

ここでの設定:使用するポート番号 8443

ttyd のインストール

次のコマンドを実行する。次のコマンドは Ubuntu 24.04 LTS で使用できる。

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install ttyd

バージョンを確認する。

ttyd --version

ufw で ttyd のポートの解除

次のコマンドを実行する。ufw は Ubuntu 24.04 LTS のファイアウォール設定ツールであり,次のコマンドは指定ポートへのアクセスを許可する。

sudo ufw allow 8443

SSL/TLS 用の証明書の作成

次のコマンドを実行する。ここでは動作確認用に自己署名証明書を作成する。Web ブラウザには警告が表示される。外部に公開する場合は,認証局が発行した証明書を使用する。

cd ~
openssl req -newkey rsa:2048 -nodes -keyout server.key \
  -x509 -days 365 -subj "/CN=localhost" -out server.crt
chmod 600 server.key

ttyd の起動

次のコマンドを実行する。

ttyd --port=8443 --writable --credential webuser:<パスワード> \
  --ssl --ssl-cert ~/server.crt --ssl-key ~/server.key \
  ssh <ユーザ名>@<接続先ホスト名>

各オプションの意味は次の通りである。

Web 経由で端末を公開するため,SSL/TLS による暗号化と Basic 認証を設定する。Ubuntu のパッケージにはセキュリティ更新が提供されるため,ttydOpenSSH サーバを最新の状態に保つ。

Web ブラウザから使ってみる

ttyd が起動したら,Web ブラウザで,次の URL を指定する。Basic 認証のユーザ名とパスワードを入力すると,SSH の認証画面が表示される。

https://<IP アドレス>:8443

この方法により,SSH クライアントがインストールされていない環境からでも,Web ブラウザ経由で Ubuntu のサーバへアクセスできる。