果報

二度寝して待つ

TailscaleとCaddyとMyDNSを用いたリバースプロキシで自宅のNextcloudにhttps接続する

はじめに

自宅サーバ上のNextcloudに自宅外からアクセスするため、クラウド上にリバースプロキシサーバ(以下、リバプロサーバ)を構築して、Tailscale、Caddy、MyDNSを組み合わせてhttpsで接続できるように設定します。

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

ネットワーク構成図

先日書いた以下の記事でも似たような方法(上図③)を紹介しましたが、クライアント側にTailscaleが必要でした。今回の方法はどんなクライアントからでもアクセスできるのが特長です。

text.yusukesakai.com

また、①の方法については以下を参照ください。

text.yusukesakai.com

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

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

リバプロサーバの構築

クライアントからのhttps接続先かつ自宅サーバへの入口として、リバプロサーバを構築します。リバプロサーバから自宅サーバ間はTailscaleによって暗号化(VPN接続)します。

リバプロサーバの構築は、有料のVPSによる方法を紹介する記事が多いですが、GCEやOCIのAlways Free枠を利用することで無料で実現できます。今回は東京リージョンを選択でき、データ転送量が10TBまで無料という太っ腹なOCIを使用します。

OCIサーバのデプロイ

OCIのアカウント登録やOCIサーバのデプロイ方法は、本記事の主題ではないのと、ネット上でたくさん紹介されてるので省略します。ここではポイントだけ記載します。

  • OSは「Canonical Ubuntu 22.04 with the latest build date」を選択します
  • 東京リージョンの場合「VM.Standard.A1.Flex」は基本空いてないので「VM.Standard.E2.1.Micro」を選択します(スペックは十分です)
  • 対象サーバのVCN設定で80ポートと443ポートの通信を許可します

なお、OCIでデプロイしたサーバは、iptablesがデフォルトで有効化されていますが、役割がVCN設定と重複するし、管理も面倒なので削除します。

$ sudo apt remove iptables-persistent
$ sudo reboot

MyDNSの登録

独自ドメインを持っている場合はそれを使えばよいですが、今回はMyDNSという老舗かつ無料のDDNS(ダイナミックDNS)を利用して、Nextcloudにアクセスするためのドメインを取得します。DDNSなので、OCIで外部IPアドレスを固定化する必要がないのも利点です。

www.mydns.jp

アカウントとドメイン登録後、リバプロサーバからMyDNSに定期的にIPアドレスを通知するようにします。方法はいくつかありますが、今回はcronを使って10分間隔で通知します。

$ crontab -e

以下の行を追加します。userとpasswdの箇所は変更してください。

*/10 * * * * wget --http-user=mydnsXXXXXX --http-passwd=XXXXXXXXXX --spider https://ipv4.mydns.jp/login.html
*/10 * * * * wget --http-user=mydnsXXXXXX --http-passwd=XXXXXXXXXX --spider https://ipv6.mydns.jp/login.html

Tailscale、Caddyのインストール

リバプロサーバにTailscaleとCaddyをインストールします。インストール方法は先日の記事と同じなので、そちらを参照してください。

text.yusukesakai.com

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

$ sudo nano /etc/caddy/Caddyfile

以下の設定は一例です。

{
        ocsp_stapling off
        servers {
                strict_sni_host
        }
        email mail@XXXXX.mydns.jp
}

XXXXX.mydns.jp {
        root * /usr/share/caddy
        encode zstd gzip
        file_server
        reverse_proxy YYYYY:80
        redir /.well-known/carddav /remote.php/dav 301
        redir /.well-known/caldav /remote.php/dav 301
        header {
                Strict-Transport-Security max-age=31536000;
                Permissions-Policy interest-cohort=()
        }
}

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

  • 設定のインデントは半角スペースではなくタブを使います
  • emailでメールアドレスを設定します(Let's EncryptのSSL証明書の取得に必要です)
  • XXXXX.mydns.jpは取得したMyDNSのドメインにあわせて変更します
  • reverse_proxy YYYYY:80はNextcloudのホスト名とポート番号を指定します(Tailscaleの機能で名前解決してくれます)

なお、ここでお気付きの方もいるかもですが、Caddyではemailの設定さえすればLet's EncryptからSSL証明書を自動で取得・更新してくれて、とても便利です。

設定反映後、以下のコマンドで設定に問題がないか検証します。「ERROR」や「WARN」がなければ基本OKです。

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

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

$ sudo systemctl restart caddy

自宅サーバの設定

リバプロサーバの構築が終わったら、自宅サーバ側の設定を行います。

Tailscaleのインストール

自宅サーバにTailscaleをインストールします。手順はリバプロサーバと同じなので省略します。

インストール後、リバプロサーバから自宅サーバに接続できることと、ホスト名で名前解決できることを確認します。

$ ping [自宅サーバのホスト名]

Nextcloudの設定変更

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

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

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

'trusted_domains' =>
array (
  0 => 'XXXXX.mydns.jp',
),

Nextcloudへの接続確認

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

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