QnapにCloudflare Zero Trustで外部から安全にアクセスする

Cloudflare Zero Trustを使用してQnapのNASに外部からアクセスできるようにします。 安全にアクセスするためにGoogleアカウントによる認証を挟むようにします。

このやり方には独自ドメインが必要になるため、所持していない場合はTailscaleを使う方法がオススメです。 アクセスするクライアント側にもTailscaleのインストールが必要になりますが、全体の設定手順はTailscaleのほうが簡単です。

環境

  • Qnap TS-431P

構築の流れ

  • Qnapにcloudflaredをインストールする
  • Cloudflareにドメインを登録する
  • Cloudflareに許可するGoogleアカウントを登録する
  • Cloudflare Accessの設定をする

Qnapにcloudflaredをインストールする

Cloudflare Zero Trustを使うのに必要なcloudflaredをQnapにインストールします。

大きく分けて2つの方法があり、アプリリポジトリを追加する方法と手動でインストールする方法です。

アプリリポジトリを追加する方法

非公式のリポジトリであるQPKG Storeを追加してそこからインストールします。

追加方法は公式のドキュメントを参照してください。

www.qnapclub.eu

追加後にApp CenterからCloudflared CLIを検索してインストールします。

www.qnapclub.eu

手動でインストールする方法

手動でインストールする場合は最初に使用しているQnapのCPUアーキテクチャを確認します。

Qnapにsshして以下のコマンドを実行します。

$ uname -a
Linux QNAP 4.2.8 #2 SMP Sat Sep 3 06:31:33 CST 2022 armv7l unknown

出力結果の右から2つ目に注目します。 TS-431Pの場合はarmv7lです。

この結果からTS-431Pはarmの32bitであることがわかります。

アーキテクチャがわかったら適切なバイナリを公式からダウンロードします。

github.com

例として以下のコマンドでダウンロードできます。

$ wget https://github.com/cloudflare/cloudflared/releases/download/2022.10.2/cloudflared-linux-arm
$ chmod  755 cloudflared-linux-arm
$ mv cloudflared-linux-arm cloudflared

注意点としてHomeディレクトリや/binなどは永続化されておらず再起動のタイミングで初期化されてしまうため、/share/homes/adminなどのNASの保存領域に配置する必要があります。

Cloudflareにドメインを登録する

新規に取得する場合はこちらのドキュメントを

developers.cloudflare.com

移管する場合はこちらのドキュメントを参照してください。

developers.cloudflare.com

Cloudflareに許可するGoogleアカウントを登録する

Googleアカウントでログインできるように設定します。

Settings > Authentication > Login methodsにあるAdd newをクリックしGoogleを選択します。 右側に表示されるドキュメントにそって設定します。

同等のドキュメントはこちらです。

developers.cloudflare.com

次にAccess > Access GroupsAdd a Groupをクリックします。 任意のGroup nameを入力したあとGroup configurationEmailsを選択し、ログインに使いたいGoogleアカウントのメールアドレスを入力します。 その後、上部にあるSaveボタンをクリックして完了です。

Cloudflare Accessの設定をする

CLIの認証

cloudflaredを使用するためにログインします。

$ cloudflared tunnel login
Please open the following URL and log in with your Cloudflare account: https://xxxxxxxxxx

出力されたURLをブラウザで表示し認証します。 アクセスに使うドメインを選択するようにしてください。

トンネルの作成

Qnapへのアクセスに使うトンネルを作成します。

$ cloudflared tunnel create [tunnel_name]
Created tunnel [tunnel_name] with id [UUID]

コマンドを実行したディレクトリかHomeディレクトリに.cloudflaredが作成されているはずで、これも再起動しても消えない/share/homes/adminなどに移動させておきます。 .cloudflared配下にある[UUID].jsonというファイルはこの後の作業で使用するため作成されているか確認してください。

DNS登録

上で作成したトンネルにアクセスできるようにDNSに登録します。

$ cloudflared tunnel route dns [UUID] [domain]

トンネル作成時に出力されたUUIDを入力します。

configファイルの作成

永続化されている任意のディレクトリに config.yml を作成します。 今回は /share/homes/admin/.cloudflared に作成します。

$ vim /share/homes/admin/.cloudflared/config.yml

以下が内容の例です。

logDirectory: /var/log/cloudflared
tunnel: [UUID]
credentials-file: /share/homes/admin/.cloudflared/[UUID].json

ingress:
  - hostname: [your_domain]
    service: http://localhost:8080

credentials-file のパスやUUIDは各自の内容に書き換えてください。 また、Qnapのwebコンソールのポート番号を変えている場合はそこの変更も必要です。

ブラウザからアクセスするときの認証設定

ここからはCloudflareのwebコンソールでの作業になります。

Access > ApplicationsAdd an applicationをクリックします。 Self-hostedを選択しApplication nameApplication domainに適切な値を入力します。 その他の入力項目は必要であれば適宜入力します。

上部のNextをクリックしポリシーを設定します。

Policy nameSession durationに任意の値を入力します。 その他の入力項目は必要であれば適宜入力します。

上部のNextをクリックし次の入力画面に移動します。 ここも必要であれば入力し上部のAdd an applicationをクリックして完了です。

手動で起動する

ここからはQnapのCLIでの作業になります。

まずは手動でトンネルを起動して動作確認してみます。

$ cloudflared tunnel --config /share/homes/admin/.cloudflared/config.yml run

赤文字のエラーが出力されなければ成功です。 ブラウザで指定したドメインからアクセスしてみましょう。

再起動後もトンネルを起動させる

OSの更新などで再起動された後も自動的に起動するようにします。

Qnapには起動時にスクリプトを実行してくれる機能があるため、ここにトンネルの起動コマンドを記述します。 この機能の使い方はハードウェアごとに異なるため詳細は公式ドキュメントを参照してください。

wiki.qnap.com

TS-431Pの場合は以下の手順で記述できます。

$ ubiattach -m 6 -d 2
$ /bin/mount -t ubifs ubi2:config /tmp/config
$ vi /tmp/config/autorun.sh
$ chmod +x /tmp/config/autorun.sh
$ umount /tmp/config
$ ubidetach -m 6

autorun.shを開いたら以下のコマンドを追記します。

/opt/bin/nohup sudo cloudflared tunnel --config /share/homes/admin/.cloudflared/config.yml run &

保存後、再起動したあとも指定したドメインからアクセスできれば設定完了です。