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を追加してそこからインストールします。
追加方法は公式のドキュメントを参照してください。
追加後にApp CenterからCloudflared CLIを検索してインストールします。
手動でインストールする方法
手動でインストールする場合は最初に使用している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であることがわかります。
アーキテクチャがわかったら適切なバイナリを公式からダウンロードします。
例として以下のコマンドでダウンロードできます。
$ 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にドメインを登録する
新規に取得する場合はこちらのドキュメントを
移管する場合はこちらのドキュメントを参照してください。
Cloudflareに許可するGoogleアカウントを登録する
Googleアカウントでログインできるように設定します。
Settings > Authentication > Login methodsにあるAdd newをクリックしGoogleを選択します。
右側に表示されるドキュメントにそって設定します。
同等のドキュメントはこちらです。
次にAccess > Access GroupsのAdd a Groupをクリックします。
任意のGroup nameを入力したあとGroup configurationでEmailsを選択し、ログインに使いたい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 > ApplicationsのAdd an applicationをクリックします。
Self-hostedを選択しApplication nameとApplication domainに適切な値を入力します。
その他の入力項目は必要であれば適宜入力します。
上部のNextをクリックしポリシーを設定します。
Policy nameとSession durationに任意の値を入力します。
その他の入力項目は必要であれば適宜入力します。
上部のNextをクリックし次の入力画面に移動します。
ここも必要であれば入力し上部のAdd an applicationをクリックして完了です。
手動で起動する
ここからはQnapのCLIでの作業になります。
まずは手動でトンネルを起動して動作確認してみます。
$ cloudflared tunnel --config /share/homes/admin/.cloudflared/config.yml run
赤文字のエラーが出力されなければ成功です。 ブラウザで指定したドメインからアクセスしてみましょう。
再起動後もトンネルを起動させる
OSの更新などで再起動された後も自動的に起動するようにします。
Qnapには起動時にスクリプトを実行してくれる機能があるため、ここにトンネルの起動コマンドを記述します。 この機能の使い方はハードウェアごとに異なるため詳細は公式ドキュメントを参照してください。
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 &
保存後、再起動したあとも指定したドメインからアクセスできれば設定完了です。