果報

二度寝して待つ

Cloudflare Tunnelで自宅のNextcloudにhttps接続する

はじめに

自宅サーバ上のNextcloudに自宅外からアクセスするため、独自ドメインとCloudflare Tunnelを使用して、httpsで接続できるように設定します。

以下のネットワーク構成図だと①の方法です。

ネットワーク構成図

先日紹介した上図②と③の方法は無料で実現できましたが、今回紹介する方法は独自ドメインの取得と更新に費用がかかります。1 ただ、今回の方法が運用の手間や性能面、接続の容易さなどで最もおすすめです。特に、既存のCloudflareユーザの場合は今回の方法一択だと思います。

text.yusukesakai.com

text.yusukesakai.com

前提として、以下の環境で作業します。

  • 自宅サーバ: Ubuntu 22.04
  • Nextcloud: snap版を使用して初期設定済

Cloudflareの登録

取得した独自ドメインをCloudflareに登録します。まだドメインを未取得の場合はCloudflare Resisterがおすすめです。Cloudflareとそのまま連携できますし、ドメインも原価で提供されていて良心的です。

www.cloudflare.com

具体的な登録方法についてはここでは省略します。

cloudflaredのインストール

自宅サーバにcloudflaredをインストールします。最新バージョンのインストール資材などは以下のページに記載されています。

developers.cloudflare.com

$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
$ sudo apt install ./cloudflared-linux-amd64.deb
$ sudo cloudflared tunnel login

コマンドを実行後、表示されたURLにアクセスし、認証します。Cloudflareのダッシュボード上で、登録したドメインを指定すれば完了です。

続いて、トンネルを作成します。[トンネル名]は任意の名前を指定します。

$ sudo cloudflared tunnel create [トンネル名]

実行度、出力結果からCreated tunnel mattermost with idより後ろの文字列(UUID)をコピーします。

コピーしたUUIDと、Nextcloudで使用するドメインをDNSに登録します。

$ sudo cloudflared tunnel route dns [UUID] xxxxx.yusukesakai.com

次に、設定ファイルを編集します。ここで、トンネルからのアクセスを自宅サーバのサービスと連携させます。

$ sudo nano /root/.cloudflared/config.yml

UUIDは先ほどの文字列に修正します。

tunnel: [UUID]
credentials-file: /root/.cloudflared/[UUID].json

ingress:
    - hostname: xxxxx.yusukesakai.com
      service: http://localhost:80
    - service: http_status:404

最後に、cloudflaredをサービス登録して、systemctlでバックグラウンドでも動作するように設定します。

$ sudo cloudflared service install
$ sudo systemctl restart cloudflared

Nextcloudの設定

Nextcloudの設定を編集し、独自ドメインを信頼できるドメインとして追加します。

$ sudo nano /var/snap/nextcloud/current/nextcloud/config/config.php

trusted_domainsの設定項目を見つけて編集します。既にarray内に設定が存在する場合は、番号をカウントアップして追加します。

'trusted_domains' =>
array (
  0 => 'xxxxx.yusukesakai.com',
),

CloudflareのRocket Loader無効化

現状でもサイトに接続できますが、NextcloudとCloudflareのRocket Loaderという機能の相性が悪く、Rocket Loaderが有効だとNextcloudのJavaScriptが正常に動作しません。そこで、CloudflareのダッシュボードからRocket Loaderを無効化します。

Cloudflareのダッシュボードにログイン後、「ルール」から「構成ルール」を選択し、「ルールを作成」ボタンをクリックします。

適当なルール名を入力後、カスタムフィルタ式を選択し、フィールド:ホスト名オペレーター:等しい値:{今回のドメイン名}とします。

その後、設定内容から「Rocket Loader」で追加ボタンをクリックし、オフにします。

ページ下部の展開ボタンをクリックすれば完了です。

Cloudflareでのリダイレクト設定

現状でもサイトに接続できますが、Nextcloudの管理画面で表示される警告を回避するため、Cooudflareのダッシュボードからリダイレクトの設定を行います。

Cloudflareのダッシュボードにログイン後、「ルール」から「リダイレクト ルール」を選択し、「ルールを作成」ボタンをクリックします。

適当なルール名を入力後、カスタムフィルタ式を選択し、OR条件でフィールド:完全URIオペレーター:等しい値:{以下2つのアドレス}とします。

  • https://xxxxx.yusukesakai.com/.well-known/carddav
  • https://xxxxx.yusukesakai.com/.well-known/caldav

その後、実行内容として、タイプ:静的URL:{以下のアドレス}ステータスコード:301とします。

  • https://xxxxx.yusukesakai.com/remote.php/dav

ページ下部の展開ボタンをクリックすれば完了です。

Nextcloudへの接続確認

任意のブラウザまたはアプリからhttps://xxxxx.yusukesakai.comにアクセスします。

無事にログインできれば成功です。お疲れさまでした。

参考:Cloudflare packagesリポジトリの追加

必須ではないですが、cloudflaredをリポジトリからインストールする場合は、公式サイトに従って、以下のコマンドを実行します。

$ sudo mkdir -p --mode=0755 /usr/share/keyrings
$ curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
$ echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
$ sudo apt update && sudo apt install cloudflared

基本的に公式サイトのとおりですが、リスト登録時にarch=amd64を付与してないとエラーになるため、追加します。


  1. きちんと調べてないですが、Quick Tunnelsという機能を使えば、ドメインを持ってなくても、ランダムに生成されたURLで無料で公開できるらしい。すげえ。