Cloudflare Zero Trustで宅外から宅内のネットワークへアクセスする
Cloudflare Zero Trustを使用して、外部から自宅のネットワークに安全にアクセスし、かつ宅内では直結で通信する「管理ネットワーク」の設定方法を解説します。
Cloudflare Zero Trust
Cloudflareが提供するZero Trustセキュリティモデルに基づいた包括的ネットワークセキュリティプラットフォームらしいです。
らしいんですが今回の目的はセキュリティよりも便利のほうが重要なので、ここらへんのすごさには触れません。
スンマセン。
なにがしたいか
外にいるときに家の中のネットーワークにアクセスしたい。これだけです。
旅館やカフェ(田舎にはそんなものは無いが)などから192.168.0.40で接続できるようにしたい…って感じ。
アカウントのセットアップなど
ここでは詳細に説明しません。っていうか使い始めたのが2年前とかなり前なので、覚えていません。
Cloudflareの管理画面のサイドバーに
Zero Trustという項目があるのでそこをクリックして案内に従ってください。
設定した当時とかなりUIが変わっていて説明できません。すみません。
おそらくチーム名を決めると思うのですが、それを控えておきましょう。
IDプロバイダーを追加する
デフォルトでメールアドレスを使用したワンタイムコードを利用可能です。しかしこれは不便なのでGoogleアカウントとかでログインできると便利だよね。
ってことで追加しましょう。
Zero Trustのサイドバーの「インテグレーション」の「IDプロバイダー」を開きます。
画像では既にGoogleが追加されていますが気にしないでいいです。

まずは「IDプロバイダーを追加する」をクリックし、
「Google」を選択する。
選択すると画像のような画面に変わります。右側に手順が載っております。英語ですけど。
名前は分かりやすいもの(例:Google)にします。
続いてGoogle Cloud Consoleにアクセスし、
「APIとサービス」を開き、
「OAuth同意画面」を開きます。
「クライアント」を選択し、「クライアントを作成」をクリックします。
アプリケーションの種類は「ウェブアプリケーション」、名前は適切なものを入力します。
承認済みのJavaScript生成元にはhttps://<設定したチーム名>.cloudflareaccess.comを、承認済みのリダイレクトURIにはhttps://<設定したチーム名>.cloudflareaccess.com/cdn-cgi/access/callbackを設定します。
あとは「作成」をクリックします。
すると「クライアントID」と「クライアントシークレット」が表示されるので、
Cloudflare側の入力欄にそれぞれコピペする。あとは保存するだけです。
IDプロバイダー一覧の画面で先程作成したプロバイダーの欄にある「テスト」をクリックしてみて
画像のようにログイン中のGoogleアカウントの情報が表示されるか、Googleアカウントの選択画面が現れれば大丈夫です。
トンネルの追加

サイドバーの「ネットワーク」から「コネクタ」を開き、「トンネルを作成する」をクリックする。
トンネルの種類は「Cloudflared」にする。
トンネル名は適当なものを付けます。私は「myhome」と。ひねりもねぇ。
次はコネクタのインストールです。お使いのサーバーのOSとアーキテクチャを選択して、表示されるコマンドを実行してcloudflaredをインストールします。
インストールが終わったら画像の欄にあるコマンドを実行してコネクタを接続します。
接続が成功したら「Connectors」に何かが表示されるはずです。
「トラフィックのルーティング」という画面が表示されると思いますがこの画面はスキップしていいです。サイドバーの「ネットワーク」→「コネクタ」をクリックすると戻れます。
作成したコネクタが表示されてステータスが緑であればOKです。
ルートを設定

さっき作成したコネクタの三点リーダーをクリックし「設定」を開きます。
「CIDR」タブに移動し、「CIDRルートを追加」をクリックします。
CIDRと説明を適当に入力します。私の家は192.168.0.xxなので192.168.0.0/24です。
CIDRの画面に表示されればOK!
「管理ネットワーク」の作成
家の中にいるか、外に居るかを判断するためにビーコンみたいなサーバーを立てます。
ラズパイとか自宅サーバーで大丈夫です。TLSエンドポイントが必要だそうです。
今回はDockerで立ててみます。Dockerでなくても大丈夫ですが。
適当なディレクトリを作成し、その中にcertsディレクトリとnginx.confを作成します。certsディレクトリに自己TLS証明書を作成します。
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout privkey.pem -out fullchain.pem -subj "/CN=Generic SSL Certificate"
で作成可能です。
作成できました。
次にnginx.confを書きます。次のように。
events {
worker_connections 1024;
}
http {
server {
listen 443 ssl;
ssl_certificate /certs/fullchain.pem;
ssl_certificate_key /certs/privkey.pem;
location / {
return 200;
}
}
}
あとはDocker Composeのファイルを書きます。
services:
nginx:
restart: unless-stopped
image: nginx:latest
ports:
- 7676:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/certs:ro
今回はポート7676で待ち受けるように。あとは立ち上げるだけです。
sudo docker compose up -d
curlを実行してみて、返ってくれば大丈夫です。
次にSHA-256のフィンガープリントを抽出します。
openssl x509 -noout -fingerprint -sha256 -inform pem -in certs/fullchain.pem | tr -d :
上のコマンドを実行して
sha256 Fingerprint=98D.........
みたいなのが得られます。Fingerprint=以降の文字列を控えておきましょう。

ZeroTrustの管理画面のサイドバーの「チームとリソース」から「デバイス」を開き、「デバイスプロファイル」タブに移動します。
「管理ネットワーク」を見つけ、「新しい管理ネットワークを追加する」をクリックします。
名前は適当なものを、ホストとポートは先程立てたWebサーバーのものを、SHA-256は先程控えたフィンガープリントを入力し「保存」
スプリットトンネルの設定
この設定が結構重要です。
さっきの「デバイスプロファイル」タブの画面まで戻り、プロファイル一覧の「デフォルト」の三点リーダーを開き、「設定」をクリックします。
「スプリットトンネル」の項目を見つけ、「IPとドメインを除外する」にチェックが入っていることを確認して「管理」をクリックします。
開いたら10.0.0.0/8と192.168.0.0/16にチェックを入れ、「アクション」から「削除を確認」をクリックします。削除できたら前の画面に戻り、一番下にある「プロファイルを保存」をクリック。
プロファイル一覧画面で「新しいプロフィールを作成」をクリック。
名前は適当に、式はセレクターに「管理ネットワーク」オペレーターに「is」値を先程作成した管理ネットワークにする。
これを設定したら一番下にある「プロファイルを作成」をクリックする。
続いてさっき新たに作成したプロファイルの設定画面を開き、スプリットトンネルが除外になっていることを確認し「管理」を開く。
セレクターを「IP Address」に、値を家のCIDRにして宛先を保存して、前の画面に戻り、一番下の「プロファイルを保存」をクリックします。
WARPクライアントをインストール
からCloudflare WARPをダウンロードしてインストールします。
インストールが終わり起動したらシステムトレイアイコンをクリックして
歯車アイコンをクリックし、環境設定を開きます。
設定ウィンドウのサイドバーの「アカウント」を開き、「Cloudflare Zero Trustにログイン」をクリックし、表示される案内を読み次へとか同意するを押してると
上の画像のようなウィンドウが出ます。ここには設定したチーム名を入力します。
ログインが成功するとWARPを開くか聞かれるので開きます。
表示がオレンジ色のWARPから青色のZero TrustになっていればOKです。
テスト
Cloudflare WARPをインストールしたスマホからモバイルデータを使用して192.168.0.30にアクセスしてみました。
はい。出来ていますね。
今回のポイント
実は他の記事で紹介されている方法では家の中で使うときにも一度Cloudflareを経由してしまい、遅くなってしまうんですよね。
そこで「管理ネットワーク」という機能を使って家の中にいるのかを判断してプロファイルを切り替えるっていうそういう感じにしました。
以上
以上です。やたら長いので分けて書けば良かったかもしれぬ。
n番煎じ感のある記事で申し訳ないです。