最近、私は Raspberry Pi 上でいくつかの Web サービスを設定しましたが、これらはローカルでしか使用できず、外部ネットワークからアクセスすることができませんでした。そのため、Cloudflare Tunnel を使用してイントラネットトラフィックを転送することを試みました。ここでは、私の手順を記録します。
私のハードウェア構成
Raspberry Pi 4B+ Ubuntu システム
cloudflared のインストール#
Raspberry Pi で Cloudflare トンネルを設定するには、「Cloudflared」というソフトウェアに依存します。これは、ローカルネットワークと Cloudflare ネットワークの間でセキュアなトンネルを作成および維持するためのソフトウェアです。2 つのインストール方法があります。
方法 1:Cloudflare リポジトリを使用する#
- Cloudflared リポジトリの GPG キーを取得します。
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null
- Cloudflared リポジトリをソフトウェアソースに追加します。
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
- パッケージキャッシュを更新し、
cloudflared
をインストールします。
sudo apt update
sudo apt install cloudflared
方法 2:公式の deb パッケージを直接使用する#
以下のコマンドを使用して、GitHub のリリースページから最新の deb パッケージをダウンロードし、dpkg
を使用してインストールします。
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb && sudo dpkg -i cloudflared-linux-arm64.deb
注意:Raspberry Pi 4B ではarm64
バージョンをインストールしてください。
アカウントの設定#
以下のコマンドを実行し、ガイドに従ってアカウントを認証します。
cloudflared tunnel login
トンネルの作成#
以下のコマンドを実行して、トンネルを作成します。
cloudflared tunnel create <トンネル名>
上記のコマンドを実行すると、次のようなメッセージが表示されます。
Tunnel credentials written to /home/pi/.cloudflared/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.
Created tunnel pimytunnel with id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
このステップでは、トンネルが作成されると同時に、トンネルの UUID、認証情報ファイル、および.cfargotunnel.com
のサブドメインが生成されます。UUID と認証情報ファイルのパス(デフォルトのパスで後で説明します)を覚えておく必要があります。
以下のコマンドを使用して、トンネルが正常に作成されたかどうかを確認することもできます。
cloudflared tunnel list
トンネルの詳細な設定#
設定ファイルのデフォルトパスは 3 つあります。
~/.cloudflared
/etc/cloudflared
/usr/local/etc/cloudflared
ここでは、現在のユーザーディレクトリである~/.cloudflared
を使用します。このディレクトリにconfig.yml
という名前の設定ファイルを作成し、以前に作成したトンネルの生成された設定情報を入力します。
tunnel: <トンネルのUUID>
credentials-file: /home/pi/.cloudflared/<トンネルのUUID>.json
ingress:
- hostname: test.example.com
service: http://localhost:80
- hostname: example.com
service: https://localhost:8000
- service: http_status:404
その後、自分の Web サービスのホスト名とポートを設定ファイルの形式に従って設定します。各ルールには通常、hostname
とservice
の 2 つのパートが含まれます。最後の行の- service: http_status:404
にはホスト名の部分がないことに気付くかもしれませんが、これはエラーではなく、cloudflared
の特殊なルールです。これは、すべてのトラフィックに一致するために必要なものです。
これはcloudflared
のマッチングルールに関連しています。cloudflared
が受信リクエストを受け取ると、それはリクエストに一致するルールを上から下に評価します。ルールは受信リクエストのホスト名またはパス、またはその両方に一致することができます。すべてのルールに一致しない場合、最後のルールが一致します。
イントラネットサービスのトラフィックをルーティングする#
以下のコマンドを使用して、CNAME レコードを割り当ててトラフィックをトンネルのサブドメインにリダイレクトします。
cloudflared tunnel route dns <UUIDまたはNAME> <ホスト名>
# 例
cloudflared tunnel route dns pi test.example.com
トンネルの実行#
以下のコマンドを実行して、cloudflared を Cloudflare ネットワークに接続します。Cloudflared はデフォルトの場所から設定ファイルを取得します(~/.cloudflared/config.yml
)。
cloudflared tunnel run <UUIDまたはNAME>
設定ファイルがデフォルトの場所にない場合は、--config
オプションを使用してトンネルを実行できます。
cloudflared tunnel --config /path/your-config-file.yaml run <UUIDまたはNAME>
トンネルのパラメータを確認する#
これで、トンネルの設定が完了しました。以下のコマンドを実行して、作成したトンネルの情報を取得できます。
cloudflared tunnel info
その他の一般的なコマンド:
機能 | コマンド |
---|---|
トンネルの作成 | cloudflared tunnel run <NAME> |
トンネルの一覧 | cloudflared tunnel list |
トンネルの停止 | cloudflared tunnel stop <NAME> |
トンネルの再起動 | cloudflared tunnel restart <NAME> |
トンネルの削除 | cloudflared tunnel delete <NAME> |
トンネルの強制削除 | cloudflared tunnel delete -f <NAME> |
トンネルの情報表示 | cloudflared tunnel info <NAME> |
トンネルをサービスとして実行する#
Tunnel をシステムサービスとしてインストールし、Tunnel が起動時にデーモンとして自動的に実行されるようにします。デフォルトでは、Tunnel は設定ファイルをデフォルトディレクトリ~/.cloudflared/config.yml
で見つけることを期待していますが、Tunnel をサービスとして実行するためには、config.yml ファイルを~/etc/cloudflared/
に移動する必要があります。
mv
コマンドを使用して設定ファイルを移動します。
sudo mv /home/pi/.cloudflared/config.yml /etc/cloudflared/
次に、以下のコマンドを実行してサービスをインストールします。
sudo cloudflared service install
サービスを起動します。
systemctl start cloudflared
サービスの実行状態を確認します。
systemctl status cloudflared
トラブルシューティング#
トンネルサービスを起動する際に遭遇した問題:
failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB).
解決策:
sudo sysctl -w net.core.rmem_max=2500000
参考文献#
https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size