Cloudflare Tunnelを使ってローカルのサーバーを安全に公開する

VPSをやめる #

indigoのVPSサーバー上にTailscaleをインストールして、自宅のサーバーにVPNで接続して、nginxのproxyとBASIC認証を使っていたのだけれど*、自宅からVPSサーバーを迂回して大きなファイルを転送するとループを検知してか、30分ぐらいIPアドレスがブロックされてしまう。運用も面倒だなと思っていたら、Cloudflare Tunnelを使うと、無料で認証まで簡単にやってくれるらしい。実際やってみると簡単。VPS借りて手動でプロキシ立てるのがばからしくなる。

メモ #

前提 #

必要なのは

  1. 自分でネームサーバーを設定できる独自ドメイン

Cloudflareにドメインを登録してネームサーバーをCloudflareに設定する #

Cloudflareが現状のDNS設定を読み込んでくれ、ネームサーバーの変更をガイドしてくれる

Cloudflare for Teamsに登録 #

アプリケーションの追加 #

Cloudflare for Teamsのダッシュボードからアプリケーションを追加する。Application URLはアクセスしたいURLを指定する。認証方法はメールアドレスや、IPアドレス、国等いろいろと選べる。

20211030-05-14-11-NPFd9meNr7exX4TYqzw3.png
20211030-05-14-11-KOagNzNb8tL1hIFTPoz9.png

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もしくはダッシュボードから可能。

20211030-04-56-26-5A-HtfL5EQlZreSa3l4Y.png

ホームフォルダ上の.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レコードの追加 #

20211030-05-29-35-kR0HJitFJ_xol0u--AeH.png

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を順次追加していくことも可能)
$ sudo cloudflared --config /path/to/.cloudflared/config.yml service install
$ sudo systemctl start cloudflared
$ sudo systemctl enable cloudflared

これは便利だー

参考 #

コメント