Cloudflare Tunnelを使ってローカルのサーバーを安全に公開する
VPSをやめる #
indigoのVPSサーバー上にTailscaleをインストールして、自宅のサーバーにVPNで接続して、nginxのproxyとBASIC認証を使っていたのだけれど*、自宅からVPSサーバーを迂回して大きなファイルを転送するとループを検知してか、30分ぐらいIPアドレスがブロックされてしまう。運用も面倒だなと思っていたら、Cloudflare Tunnelを使うと、無料で認証まで簡単にやってくれるらしい。実際やってみると簡単。VPS借りて手動でプロキシ立てるのがばからしくなる。
メモ #
前提 #
必要なのは
- 自分でネームサーバーを設定できる独自ドメイン
Cloudflareにドメインを登録してネームサーバーをCloudflareに設定する #
Cloudflareが現状のDNS設定を読み込んでくれ、ネームサーバーの変更をガイドしてくれる
Cloudflare for Teamsに登録 #
アプリケーションの追加 #
Cloudflare for Teamsのダッシュボードからアプリケーションを追加する。Application URLはアクセスしたいURLを指定する。認証方法はメールアドレスや、IPアドレス、国等いろいろと選べる。


cloudflaredのインストール #
Get started · Cloudflare for Teams documentation
ログインとTunnelsの作成(tunnelの作成はnon rootで可能) #
$ cloudflared tunnel login #(表示されるURLにアクセスする)
$ loudflared tunnel create NAME #(NAMEは任意のチャンネル名)
Tunnel credentials written to /path/to/.cloudflared/<Tunnel-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.
ダッシュボードから作成したTunnelsのTunnel-UUIDが確認できる。削除はCLIもしくはダッシュボードから可能。

ホームフォルダ上の.cloudflaredディレクトリの中に設定ファイルconfig.ymlを作成する。 サーバー上のサービスとバーチャルホストを対応させる。サービスごとにTunnelを作成することもできるが、簡単にするためにIngress rulesにする。
tunnel: <Tunnel-UUID>
credentials-file: /path/to/.cloudflared/<Tunnel-UUID>.json
ingress:
- hostname: www.example.net
service: http://localhost:8080
- hostname: www1.example.net
service: http://localhost:8081
- service: http_status:404 # (catch-allの記述が必要らしい)
$ cloudflared tunnel ingress validate #(config.ymlの文法チェック)
Validating rules from /path/to/.cloudflared/config.yml
OK
Tunnelsの確立 #
$ cloudflared tunnel run <Tunnel-UUID or NAME>
問題なければ、ダッシュボード上でステータスがACTGIVEになる
CNAMEレコードの追加 #

DNSの設定画面から、CNAMEレコードを追加する。
ターゲットはTunnel-UUID.cfargotunnel.comになるようだ。
DNS record · Cloudflare for Teams documentation
$ cloudflared tunnel route dns <UUID or NAME> www.example.net
$ cloudflared tunnel route dns <UUID or NAME> www1.example.net
# (CLIからCNAMEを順次追加していくことも可能)
- 動作確認
ドメインにアクセスすると、認証画面が出る。
- cloudflaredをサービスに登録する
Run as a service · Cloudflare for Teams documentation
$ sudo cloudflared --config /path/to/.cloudflared/config.yml service install
$ sudo systemctl start cloudflared
$ sudo systemctl enable cloudflared
これは便利だー
コメント