CloudflareのCloudflare Zero Trustというサービスを使ってOCIのVMにブラウザでSSH接続できるようにしてみました。
ポート開放ができない環境下でも使用可能です。
なお、ここで説明することはすべてCloudflare Docsに書いてあります。ぜひそちらもお読みください。
Connect through Cloudflare Access over SSH - Cloudflare Zero Trust docs
概要
以下の図のようにCloudflaredを使用してCloudflareにトンネルを張り、ブラウザでSSH接続できるようにします。
前提
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でダウンロードし、インストールします。
# RHEL (aarch64)
$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-aarch64.rpm
$ dnf install ./cloudflared-linux-aarch64.rpm
# 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にログインする
$ 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
の部分は好きな名称で構いません。
$ 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を使用します。
$ vim /root/.cloudflared/config.yml
新しくファイルが作成されます。次のように書き込みます。
tunnel: <コピーしておいたUUID>
credentials-file: /root/.cloudflared/<コピーしておいたUUID>.json
ingress:
- hostname: <事前に入力したドメイン名>
service: ssh://localhost:22
- service: http_status:404
i
で編集モードに移行し、Esc
で編集モードを終了します。
:wq
で保存して終了します。
実行
$ cloudflared tunnel run oci-tunnel
これでCloudflare Edgeとトンネルを張れます。
日本ではCloudflareのDCのある東京と大阪に接続されるでしょう。(NRTが東京、KIXが大阪)
Ctrl+Cで終了できます。
デーモン化
先ほどの方法ではSSH接続を終了してしまうと、Cloudflareとの接続が切断されてしまいます。
デーモン化をして再起動時に自動で実行したり、バックグラウンドで動作してもらうようにします。
$ cloudflared service install
自動起動の設定と起動
$ systemctl enable cloudflared
$ systemctl start cloudflared
念のためちゃんと動作しているのか確認してみましょう。
$ systemctl status cloudflared
これでサーバー側の設定は完了です。
DNSの設定
Cloudflareダッシュボードに移動します。
ドメイン選択 > DNS
より事前に入力したドメインのDNS設定画面に移動します。
レコードを追加
を選択します。
タイプ
をCNAME
に、名前
は事前に設定したドメイン
、ターゲット
を<UUID>.cfargotunnel.com
とします。
ブラウザでSSHしてみる
任意のブラウザでURLを入力します。
Cloudflare Accessの認証画面が表示されるので、認証します。
ユーザー名とパスワードを入力するとブラウザ経由でSSH接続ができると思います。