Cloudflaredを使ってブラウザで任意のサーバーにSSHする

この記事はQiitaからの移行記事です。

CloudflareのCloudflare Zero Trustというサービスを使ってOCIのVMにブラウザでSSH接続できるようにしてみました。 ポート開放ができない環境下でも使用可能です。

なお、ここで説明することはすべてCloudflare Docsに書いてあります。ぜひそちらもお読みください。 Connect through Cloudflare Access over SSH - Cloudflare Zero Trust docs

概要

以下の図のようにCloudflaredを使用してCloudflareにトンネルを張り、ブラウザでSSH接続できるようにします。 スクリーンショット 2022-07-02 172950.png

前提

Cloudflareのアカウントを持っていること ドメインを持っており、ネームサーバーをCloudflareに向けてあること Cloudflare Zero Trustの初期設定が済んでいること

ここではこれらの説明は割愛します。 Cloudflare Zero Trustの初期設定に関しては以下を参照してください。 Get started - Cloudflare Zero Trust docs

環境

Oracle Cloud Ampere A1 VM, Oracle Linux 8.6

下準備

Cloudflare Zero Trustダッシュボードを開きます。 Cloudflare Zero Trust

アプリケーションの作成

Access > Applications > Add an applicationでアプリケーションを作成します。

Self-hostedを選択します。

任意のApplication name,Session Duration,Application domainを入力します。その他は各自適当に設定してください。 (Application domainは後程また入力します。)

Warning: No DNS record found for this domain. The policy may not execute as expected.と言われますが後で設定するので無視して問題ありません。

Nextを選択して次へ進みます。

ポリシーの追加

Policy nameを入力します。 Rule actionはAllow、Session durationはお好みで。

Create additional rulesでアクセス元の制限を追加します。

Nextを選択して次へ進みます。

Browser renderingの有効化

Additional settingに移動してEnable automatic cloudflared authenticationのトグルをオンに、Browser renderingをSSHに設定します。

Add applicationでアプリケーションの作成を完了します。

Cloudflaredのインストール

OCIのVMにCloudflareとトンネルを張るためのCloudflaredというソフトウェアをインストールします。 Ampere A1ですのでARM64を使用します。

他のOSやCPUを使用している場合は適宜読み替えてください。

ここから先はsu -sudo su -などでrootで作業することをお勧めします。(後でデーモン化するときに楽なので)

Downloads - Cloudflare Zero Trust docs

任意のフォルダーにwgetでダウンロードし、インストールします。

1
2
3
# RHEL (aarch64)
$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-aarch64.rpm
$ dnf install ./cloudflared-linux-aarch64.rpm
1
2
3
4
5
6
7
# Debian (amd64/x86)
$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
$ apt install ./cloudflared-linux-amd64.deb

# RHEL (amd64/x86)
$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
$ dnf install ./cloudflared-linux-x86_64.rpm

これでインストールは完了です。

Cloudflareにログインする

1
2
3
4
5
6
7
8
9
$ cloudflared tunnel login
A browser window should have opened at the following URL:

https://dash.cloudflare.com/...(ログイン用URL)

If the browser failed to open, please visit the URL above directly in your browser.
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem

ログイン用のURLが表示されるので任意の端末のブラウザでアクセスし、認証を行います。

Cloudflare Edgeとトンネルを張る

トンネルを作成

oci-tunnelの部分は好きな名称で構いません。

1
2
3
4
$ cloudflared tunnel create oci-tunnel
Tunnel credentials written to /root/.cloudflared/<UUID>.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel lobby-ssh with id <UUID>

最下段に表示されるUUIDをコピーします。後程使います。

トンネルの設定を作成

任意のテキストエディタを使用して/root/.cloudflared/config.ymlを編集します。 ここではvimを使用します。

1
$ vim /root/.cloudflared/config.yml

新しくファイルが作成されます。次のように書き込みます。

1
2
3
4
5
6
7
tunnel: <コピーしておいたUUID>
credentials-file: /root/.cloudflared/<コピーしておいたUUID>.json

ingress:
  - hostname: <事前に入力したドメイン名>
    service: ssh://localhost:22
  - service: http_status:404

iで編集モードに移行し、Escで編集モードを終了します。 :wqで保存して終了します。

実行

1
$ cloudflared tunnel run oci-tunnel

これでCloudflare Edgeとトンネルを張れます。 日本ではCloudflareのDCのある東京と大阪に接続されるでしょう。(NRTが東京、KIXが大阪) Ctrl+Cで終了できます。

デーモン化

先ほどの方法ではSSH接続を終了してしまうと、Cloudflareとの接続が切断されてしまいます。 デーモン化をして再起動時に自動で実行したり、バックグラウンドで動作してもらうようにします。

1
$ cloudflared service install

自動起動の設定と起動

1
2
$ systemctl enable cloudflared
$ systemctl start cloudflared

念のためちゃんと動作しているのか確認してみましょう。

1
$ systemctl status cloudflared

これでサーバー側の設定は完了です。

DNSの設定

Cloudflareダッシュボードに移動します。 ドメイン選択 > DNS より事前に入力したドメインのDNS設定画面に移動します。

レコードを追加を選択します。

タイプCNAMEに、名前事前に設定したドメインターゲット<UUID>.cfargotunnel.comとします。

ブラウザでSSHしてみる

任意のブラウザでURLを入力します。 Cloudflare Accessの認証画面が表示されるので、認証します。 ユーザー名とパスワードを入力するとブラウザ経由でSSH接続ができると思います。

Built with Hugo
テーマ StackJimmy によって設計されています。