はじめに
自宅サーバ上のNextcloudに自宅外からアクセスするため、クラウド上にリバースプロキシサーバ(以下、リバプロサーバ)を構築して、Tailscale、Caddy、MyDNSを組み合わせてhttpsで接続できるように設定します。
以下のネットワーク構成図だと②の方法です。
先日書いた以下の記事でも似たような方法(上図③)を紹介しましたが、クライアント側にTailscaleが必要でした。今回の方法はどんなクライアントからでもアクセスできるのが特長です。
また、①の方法については以下を参照ください。
前提として、以下の環境で作業します。
- 自宅サーバ: 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アドレスを固定化する必要がないのも利点です。
アカウントとドメイン登録後、リバプロサーバから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をインストールします。インストール方法は先日の記事と同じなので、そちらを参照してください。
インストール後、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
にアクセスします。
無事にログインできれば成功です。お疲れさまでした。
関連リンク
以下の記事で、Let's Encryptのワイルドカード証明書を自動で取得する方法を紹介しています。