果報

二度寝して待つ

TailscaleとCaddyで自宅のNextcloudにhttps接続する

はじめに

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

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

ネットワーク構成図

①と②の方法については以下の記事を参照ください。

text.yusukesakai.com

text.yusukesakai.com

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

  • 自宅サーバ: Ubuntu 22.04
  • Nextcloud: snap版を使用して初期設定済
  • 接続クライアント: Tailscale導入済のOS(Windows、Androidなど)

Tailscaleのインストール

自宅サーバにTailscaleをインストールします。予めTailscaleのアカウントを作成しておく必要がありますが、ここでは手順を省略します。

tailscale.com

Linuxでは以下のコマンドを実行します。

$ curl -fsSL https://tailscale.com/install.sh | sh

実行後、ブラウザで指定のURLを開くように指示されるので、案内に従って認証します。

Caddyのインストール

自宅サーバにCaddyをインストールします。CaddyはGo言語で書かれた軽量なWebサーバで、ApacheやNginxより設定が楽です。あと、Tailscaleとの連携が便利です。

caddyserver.com

以下のコマンドを実行します。

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy

インストール後、Caddyの設定を変更します。

$ sudo nano /etc/caddy/Caddyfile

以下の設定は一例です。

{
        auto_https disable_redirects
        ocsp_stapling off
}

xxxxx.taildbXXX.ts.net {
        root * /snap/nextcloud/current
        encode zstd gzip
        file_server
        reverse_proxy localhost:80 {
                flush_interval -1
        }
        redir /.well-known/carddav /remote.php/dav 301
        redir /.well-known/caldav /remote.php/dav 301
        tls {
                get_certificate tailscale
        }
        header {
                Strict-Transport-Security max-age=31536000;
        }
}

いくつか設定のポイントを記載すると…

  • 設定のインデントは半角スペースではなくタブを使います
  • auto_https disable_redirectsで、http→httpsへのリダイレクト機能を無効化します(そうしないとNextcloud(httpd)で使用しているhttpポートをCaddyで使用しようとしてエラーになる)
  • xxxxx.taildbXXX.ts.netは、自宅サーバのホスト名とTailscaleのDNS(Tailnet name)に従って変更します
  • get_certificate tailscaleという一文でLet's EncryptのSSL証明書を取得してくれます

設定反映後、以下のコマンドで設定に問題がないか検証します。「ERROR」や「WARN」がなければ基本OKですが、先の設定で無効化したauto_httpsはWARNで表示されます。

$ sudo caddy validate --config /etc/caddy/Caddyfile

問題なければサービスを再起動します。

$ sudo systemctl restart caddy

なお、Caddyをrootユーザ以外で実行している場合は、以下のリンク先を参考に、SSL証明書を取得するための権限をcaddyユーザに付与します。

tailscale.com

$ sudo nano /etc/default/tailscaled

以下を最下行に追加します。

TS_PERMIT_CERT_UID=caddy

Nextcloudの設定変更

Tailscaleのアドレスを信頼できるドメインとしてNextcloudの設定に追加します。

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

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

'trusted_domains' =>
array (
  0 => 'xxxxx.taildbXXX.ts.net',
),

Nextcloudへの接続確認

Tailscaleをインストールした任意のクライアントで、Tailscaleを起動後、https://xxxxx.taildbXXX.ts.netにアクセスします。

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