top archives tags about 

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

| Tags: memo | n年日記

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アドレス、国等いろいろと選べる。

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

これは便利だー

参考

slug: 353859, filename: 20211030_353859.md