この記事はMisskey Advent Calender 2022の12月24日の記事です(最初はサーバー構築から全部やるつもりが、時間が足りなくてこういう不完全な形になりました…。いつか書きます)。
Cloudflare、使ってますか?私は使っています。Misskeyインスタンスを自宅サーバー上で建てて、外部公開するために使い始めたのですが、めちゃくちゃ便利で助かっています。今回は、任意のドメインで、Cloudflare Zero TrustのTunnelsを使って自宅にあるサーバーを外部公開する方法を紹介します。
Cloudflare Tunnelsとは
分かる人向けに一言でいうと、Cloudflare版ngrokみたいなやつです。
ポート開放やNAT超えみたいなことをせずに、いくつかの設定をするだけで、Webサイトの外部公開ができ、やりようによってはVPNの代替的にも使えます(私はVPN的にも使っていて、そこでちょっとハマったところもあるので、そこも書きます(自分の設定が悪くてハマったような気もする))。
以前はCloudflare Zero Trustは以前Cloudflare for Teamsと呼ばれていたもので、最近のトレンド(?)であるゼロトラストセキュリティをクラウドで実現するための様々な機能が用意されています。
Cloudflare Tunnelsのメリット
- Freeプランでは50ユーザーまで無料
- クライアントアプリはmacOS/Windows/iOS/Android/Linuxが用意
- サーバー側に入れるcloudflaredはmacOS/Windows/Debian/RedHat/Dockerが用意(Arm版もあり)
- cloudflaredはOSS(GitHub)
- SSL証明書のインストール不要でEnd-to-Endの暗号化可能(証明書をインストールすればもっと厳密に暗号化可能)
- SSL証明書は自動で更新
- IPv6が使える(無効化も可能)
- ポート開放が不要
しかも記事執筆時点では無料です。これが無料!???!?!?!
今回の環境・前提
- Windows 11 Proのx86_64機(OSのPro/Homeは多分関係ない)
- 公開したいアプリはMisskeyで、WSL2を使ってDockerで構築済み
- 1Gbpsの光回線(IPv6オプション、BIGLOBE光なのでNAT64/DNS64)
- Cloudflareのアカウントは作成済み(特に難しく無いので自力でできると思います)
- 今回公開するのは自宅にあるMisskeyインスタンス
コマンドで設定できますが、Cloudflaredを入れてしまえばその後はWebブラウザから設定できるので、今回はWebのGUIからやります。
ドメインをCloudflareで登録する必要はありませんが、DNSサーバーをCloudflareに設定する必要があります(無料)。
Cloudflare Tunnelsの設定方法
Cloudflaredのインストール
- Step.1ダッシュボードからZero Trustを起動
Cloudflare.comでログインし、ダッシュボード左側の
Zero Trust
をクリックします。 - Step.2Cloudflare Zero TrustのダッシュボードでTunnelsをクリック
Cloudflare Zero Trustのダッシュボードで、左側の
Access
内にあるTunnels
をクリックします。 - Step.3Create tunnelをクリック
Create tunnel
をクリックし、トンネルを作成します。 - Step.4Tunnel名を設定
トンネル名を設定します。どこのトンネルなのか、分かりやすい名前にするといいです。
- Step.5環境に合わせてCloudflaredをダウンロード
使う環境に合わせて、Cloudflaredをインストールします。Windows/macOS/Debian/Red Hat/Dockerと、それぞれに32bit/64bit版があります。DebianなどはArm版も用意されているので、自分の環境にあったものをクリックして選択しましょう。今回はWindows 11 Pro(64bit)なので、画像のように選択しています。
CloudflaredはGitHub上にホストされていて、ここからダウンロードします。Windowsなら、
.msi
形式のものをダウンロードし、実行すればインストーラーでインストールできます。なお、Windows版Cloudflaredは自動で更新できないので、新しいものが出たら手動でアップデートする必要があります。
- Step.6ターミナル/PowerShellでコマンドを実行しCloudflareと接続
Step.5で表示されているコマンドをコピーして、PowerShellなどにペーストして実行します。正常にインストールされた状態で実行すれば、特にエラーなどは出ずに実行できるはずです。実行したら、下の
Next
をクリックします。 - Step.7公開ホスト名を編集
画像のように、公開ホストの情報を設定します。設定したら
Save {トンネル名} tunnel
をクリックします。これはあとから設定することもできる(はず)です。ローカルのURLですが、同一LAN内にあるCloudflaredをインストールしたマシン以外の場合は、{そのマシンのローカルIP}:{ポート番号}のようにすれば良いと思います。もちろん、ルーターでマシンにIPを固定することをお忘れなく。
ちなみに、マシンごとにCloudflaredをインストールするのは不要で、そもそも非推奨です(別に複数あっても動作しましたが、一応)。
- Step.8セットアップ終了
ここまで終われば、Cloudflaredのインストールは完了です。画像では実際にはCloudflaredをインストールしていないのでINACTIVEの表示になっていますが、正常に接続できていればHEALTHYの表示になっているはずです。
アプリケーションを追加
- Step.1Access→Applicationを開く
トンネルが設定できたら、アプリケーションを追加します。
Self-hosted
を選択します。…TunnelのPublic Hostnameの設定だけでできるっぽい(??)説明もあるのですが、私の場合上手くいかなかったのでこれも設定しています。
- Step.2Applicationの設定を追加
アプリ名やセッションの有効期間、アプリのドメインなどを設定します。アプリのロゴを独自に設定したりもできます。終わったら、上部のNextをクリックします。
同じページの下部に、IdP(Identity Provider)の設定の項目があります。が、この後に誰からもアクセスできるように設定するので、特に触るところはありません。ONで良いと思います。
- Step.3(アクセス)ポリシーの追加
どういうユーザーのアクセスを許可するか、画像のように(アクセス)ポリシーを追加します。今回はインターネットからアクセスできる、公開されたものにするので、Actionの欄はByPassに設定します。私はここでハマりました…
最低1つグループに入っていないといけないらしいのですが、ここをどうやって設定したか忘れました(
- Step.4CookieとCORSの設定
ここはよく分からないので変えていません(おい)。
終わったら右上のAdd Applicationをクリックすると、アプリケーションが追加できます。
ここまで終われば、インターネットからアクセスできるようになっているはずです。お疲れ様でした。
VPN代わりにCloudflare Tunnelsを使う方法
Cloudflaredの設定方法は紹介した通りなので、Tunnelを設定済みの状態から解説します。
Cloudflare TunnelsでPrivate Networkを追加する方法
- Step.1Tunnelの設定を開く
左のメニューで、Access→Tunnelsを開き、作成したTunnelsの設定(Configure)を開きます。
- Step.2Private Networkタブを開く
設定のPrivate Networkタブをクリックし、Add a private networkをクリックします。
- Step.3CIDRを追加
Create private network forの欄に、ローカルのCIDR(参考)かIPを追加します。CIDRで指定すれば、その範囲のIPアドレスを持つ1台以上の機器にアクセスできるようになります。アクセスしたい機器が1つで良いなら、その機器のIPを入れればOKです。IPを入れる場合は、そのIPを持つ機器のローカルIPが変動しないよう、LAN内のルーターで固定IPを設定しておきましょう。
終わったら、Save private networkをクリックすれば設定完了です。
これでネットワークの設定は完了ですが、実際にはアクセスできません。Private Networkで設定したマシンにインターネット経由でアクセスできるようにするには、クライアントアプリの1.1.1.1を使います。まずは、
iOSならApp Store、
AndroidならGoogle Playから1.1.1.1 + WARPアプリを、
PCならCloudflareのWebサイト(Windows / macOS / Linux)から、WARPクライアントをダウンロードしてインストールしてください。ここからは、PlayストアからダウンロードしたAndroidアプリでの設定方法を解説します。
1.1.1.1アプリでCloudflare Zero Trustアカウントにログインする方法
- Step.1初回の説明を読んで進める
最初は色々と説明があります。ざっと読んで進めましょう。AndroidなどではVPNプロファイルのインストールを求められるかもしれないので、許可してインストールします(インストールしないと使えません)。
Android機(特に中国メーカーのカスタムスキン)の場合、タスクキル機能が有効だとバックグラウンドの1.1.1.1アプリが自動で終了される可能性があるので、OSの「バッテリーの最適化」などの項目からは外しておきましょう。
- Step.2タイトル
起動すると、最初はWARPか1.1.1.1のスイッチになっていると思うので、Cloudflare Zero Trustのチームにログインします。画像のようにタップして進めます。
- Step.3チーム名を入力してログイン
チーム名を入力してログインします。IdP(Identity Provider)を使う方法を設定しているならそれでもいいですが、今回はデフォルトで設定している(はず)のEメールにOTPを送信する方法でログインします。Cloudflare Zero Trustに登録したメールアドレスを入力し、Send me a codeをタップするとOTPが送られるので、それを入力してSign inをタップします。
組織名は、Settings→General Settingsの中のTeam domainがそうです。このチームドメインは、インターネットから誰でもアクセスできるので、公開したくない情報(本名など)は入れないようにしましょう(ちゃんとアクセスポリシーを設定すればログインはできません)。他のチームと被らなければ、変更もできます。
- Step.4ログイン完了
正常にログインできたら、このような画面になります。トグルスイッチを右側(接続済み)にすると、Cloudflareのネットワークに繋がって、インターネットからでもLAN内のアプリケーションにアクセスできるようになります。
IdP(GitHub)を追加する方法(まだ書けてません)
FAQ
- QDDNS的なものはいらないの?
- A
要りません(私も最初は必要だと思ってました)。
Tunnelでアプリケーションを追加すると、自動でDNSレコードにCNAMEレコードが追加されるようになっているのですが、これはコンテンツの欄にIPではなくID的なものが入っているので、サーバーのIPが変わっても再設定などは不要です。
逆に、自分で公開予定のアプリケーションのドメインにDNSレコードを設定していると、競合するのでTunnelでPublic Hostnameを追加する際にエラーで追加できなくなります。
特に理由がなければ、DDoS対策のためにプロキシは有効化しておくのがおすすめです。
参考情報
- CloudFlare Tunnelで自宅サーバーを公開する(FreeプランOK) https://zenn.dev/yakumo/articles/b1f0e1115cb5b6
- VPN装置やファイアウォールを無料でクラウド化! より使いやすく進化した「Cloudflare Zero Trust」【イニシャルB】 – INTERNET Watch https://internet.watch.impress.co.jp/docs/column/shimizu/1410247.html
- Getting Cloudflare Tunnels to connect to the Cloudflare Network with QUIC https://blog.cloudflare.com/getting-cloudflare-tunnels-to-connect-to-the-cloudflare-network-with-quic/
- Tunnel: Cloudflare’s Newest Homeowner https://blog.cloudflare.com/observe-and-manage-cloudflare-tunnel/
- Start building your own private network on Cloudflare today https://blog.cloudflare.com/build-your-own-private-network-on-cloudflare/
- Highly available and highly scalable Cloudflare tunnels https://blog.cloudflare.com/highly-available-and-highly-scalable-cloudflare-tunnels/
- 実際にサイバー犯罪者が使うツールに耐えられるCloudflareの設定 | もぺブログ https://blog.lem0n.cc/archives/74
- raspberry pi 4でmisskeyインスタンスを立てた話(あとその他諸々) https://nanasi-apps.xyz/?p=11