Nutmeg advent calendar 2023

ROCK PI 4B + DietPi + NextCloud + Onion Service で作るファイルサーバー構築

ROCK PI 4B + DietPi + NextCloud + Onion Service で作るファイルサーバー構築

はじめに

NUTMEG アドベントカレンダー 12月09日 を担当します。B1の「やま」です!

今回は手持ちのSBCを使って、寮の自部屋にあるファイルサーバーをLAN外からセキュアに使うための奮闘記録を紹介したいと思います。

ブログ記事を書くのが初めてなのでお手柔らかにお願いします!

背景

長岡技大の寮で契約できる有料インターネット回線は動的IPです。 動的IPはPCやルータ等の再起動によってIPアドレスの切り替わりが発生します。

これはファイルサーバーを外部公開するにあたって、停電や機器の再起動が発生した際に外部からアクセスできなくなる可能性が発生します。

そのためサーバーのポート開放に頼らず、ネットワーク上にデプロイできる仕組みを模索しました。

(結論から言うと今回の手法は安全性を意識しすぎて超絶遅く使い物になりません。大人しくTailscaleを使いましょう!)

実行環境

Rock Pi 4B

  • Soc Rockchip RK3399 (2018年に購入しましたがRPi4超えるくらいの性能です。)
  • RAM 4GB
  • Hanye 512GB SSD

ROG Zephyrus G14 GA402RJ

  • Windows 11 22H2 (SBCへのSSH接続に利用)

PXL_20231208_021922205.MV

環境構築

DietPi のインストール

高速動作を実現するため、Debianを最適化した「DietPi」OSを採用しました。

OSのダウンロード

まずはMicroSDカードに書き込むOSのimgファイルを以下のリンクからダウンロードします。

DietPiは数多のSBCとに対応しており、他のSOCでも同様の手順でセットアップできると思います。

URL:https://dietpi.com/#download

FireShot Capture 143 - DietPi - Lightweight justice for your SBC! - dietpi.com


MicroSDカードへ書き込む

imgファイルのダウンロードが完了したら Rufus を利用してMicroSDカードに書き込みます。Rufusは以下のリンクからダウンロードできます。

Rufusはブート可能なimgファイルをもとにブータブルUSBメモリを簡単に作成できるソフトです。

URL:https://rufus.ie/ja/

FireShot Capture 144 - Rufus - 起動可能なUSBドライブを簡単に作成できます - rufus.ie

①Rufusを起動しOSのimgを選択し、スタートを押します。 ②初期化の警告をOKします。 ③Rufusのステータスが「準備完了」に変われば書き込み完了です。
スクリーンショット 2023-12-07 003915 スクリーンショット 2023-12-07 004223 スクリーンショット 2023-12-07 004441

OSの書き込みが完了したら、SSH接続に備えてWiFiを設定します。 インストール時に生成されるファイルを編集します。

image

dietpi.txt WiFiを利用したインストールを有効にします。

24行をAUTO_SETUP_NET_WIFI_ENABLED=1に変更

##### Network options #####
# Enable Ethernet or WiFi adapter: 1=enable | 0=disable
# - If both Ethernet and WiFi are enabled, WiFi will take priority and Ethernet will be disabled.
# - If using WiFi, please edit dietpi-wifi.txt to pre-enter credentials.
AUTO_SETUP_NET_ETHERNET_ENABLED=1
+AUTO_SETUP_NET_WIFI_ENABLED=1

dietpi-wifi.txt

利用しているWiFiのSSIDとPASSをEntry 0の以下の項目に追加します。 aWIFI_SSID[0]=’' aWIFI_KEY[0]=''

#---------------------------------------------------------------
# Entry 0
# - WiFi SSID: required, case sensitive
+aWIFI_SSID[0]='SSID'
# - WiFi key: If no key/open, leave this blank
# - In case of WPA-PSK, alternatively enter the 64-digit hexadecimal key returned by wpa_passphrase
# - Please replace single quote characters ' in your key with '\''. No other escaping is required.
+aWIFI_KEY[0]='PASSWORD'
# - Key type: NONE (no key/open) | WPA-PSK | WEP | WPA-EAP (then use settings below)
aWIFI_KEYMGR[0]='WPA-PSK'
# - WPA-EAP options: Only fill if WPA-EAP is set above
aWIFI_PROTO[0]=''
aWIFI_PAIRWISE[0]=''
aWIFI_AUTH_ALG[0]=''
aWIFI_EAP[0]=''
aWIFI_IDENTITY[0]=''
aWIFI_PASSWORD[0]=''
aWIFI_PHASE1[0]=''
aWIFI_PHASE2[0]=''
# - Path to the certificate file, e.g.: /boot/mycert.cer
aWIFI_CERT[0]=''
#---------------------------------------------------------------

IPアドレスの確認

接続先のIPアドレスをネットワークスキャンができるソフトで確認してください。

Angry IP Scanner

スクリーンショット 2023-12-07 211623

GlassWire

スクリーンショット 2023-12-07 193900


SSHで接続

またSSHクライアントは好きなものを使ってください。今回はOSSのTeraTermを使用しました。(PowerShellのsshコマンドでもできます。)

デフォルトのユーザー名とパスワードは下記のとおりです。

  • ログイン:root
  • パスワード:dietpi
①TeraTermを起動し、接続先のIPアドレスをホスト欄に入力してOKしてください。 ②ユーザー名とパスワードを入力してOKしてください。 ③セキュリティ警告の表示には続行を選択してください。
スクリーンショット 2023-12-07 212540 スクリーンショット 2023-12-07 202045 スクリーンショット 2023-12-07 202021

私の環境ではBluetoothがデフォルトでOFFになる仕様に伴う不具合から、WiFiが認識していませんでした。

解決策はBluetoothをONにすることです。

① 一度モニターに接続してシェルにdietpi-configと入力し、4:Advanced Options を選択してください。

スクリーンショット 2023-12-07 220445

② 一番下にあるBlutoothオプションをONにして再起動してください。

スクリーンショット 2023-12-07 203644

SSHでの接続が成功すると自動で初期セットアップが始まります。 セットアップ画面に沿って下の画面まで進めて下さい。

ここでInstallを選択することで一番ミニマムな初期セットアップが完了します。

スクリーンショット 2023-12-07 203450

下の画面が表示されればインストール完了です。

スクリーンショット 2023-12-07 222104


NextCloudのセットアップ

Nextcloudは、オンラインストレージの作成と使用のためのクライアント・サーバ型のソフトウェアです。

Snapのインストール

Snapはディストリビューションを問わず利用できるユニバーサルパッケージ管理システムです。NextCloudのインストールがDB含めて一発で完了できるので利用します。

パッケージ一覧を更新します。

sudo apt update

Snapをインストールします。

sudo apt install snapd -y
sudo snap install core

NextCloudのインストール

SnapコマンドでNextCloudをインストールします。

sudo snap install nextcloud

Nextcloud installedが表示されれば完了です。


外付けストレージのセットアップ

外付けストレージをマウントするディレクトリを作成します。

sudo mkdir /media/USBSSD

外付けストレージをマウントします。

sudo mount /dev/sda1 /media/USBSSD

NextCloudのデータ保存ディレクトリを作成します。

sudo mkdir /media/USBSSD/nextcloud
sudo chmod 0770 /media/USBSSD/nextcloud/
sudo touch /media/USBSSD/nextcloud/.ocdata

NextCloudのautoconfig.phpファイルを編集して外付けストレージを参照するように設定します。

ファイル編集のためお好みのエディターをインストールしてください。今回はvimを使用しました。

sudo apt install vim -y

vim /var/snap/nextcloud/current/nextcloud/config/autoconfig.php

設定したストレージのマウント先にアドレスを変更します。

-$data_path = getenv('SNAP_DATA_DIR')
+$data_path = getenv('/media/USBSSD/nextcloud')

NextCloudに外付けストレージを接続します。

sudo snap connect nextcloud:removable-media

NextCloudを起動します。

sudo snap start nextcloud

ローカルLAN内で動作確認をするためにポート開放を行います。

Ubuntuにデフォルトで使用されているファイアウォールの管理プログラムであるufwをインストールしてポート開放を行います。

sudo apt install ufw -y

NextCloudが起動する80番ポートを開放します。

sudo ufw allow 80

NextCloudの初回セットアップ

SBCのIPアドレスの80番ポートにアクセスします。画面に従って管理者アカウントを作成してください。

スクリーンショット 2023-12-07 232549

DBへの接続でエラーが出る場合はNextCloudを再起動してください。

snap restart nextcloud

以下のように表示されていればセットアップ完了です。

スクリーンショット 2023-12-07 234010

イントラネットで利用する場合はここまででOKです!

スクリーンショット 2023-12-07 234019

追記 Snap版NextCloudでCLI管理コマンドoccが利用出来ない問題について 絶対パスを指定することで解決できます。 sudo /snap/bin/nextcloud.occ


Tor Onion Service で利用する

目的としているセキュアにLAN外から自宅鯖のNextCloudに接続するため、TorOnion Serviceを利用します。

まず Tor とは、インタネット上で匿名の通信を行うためのシステムです。Torは「The Onion Router」の略で、玉ねぎのように何重にも層を重ねて暗号化をし、接続経路の匿名化をします。また接続経路にある中継地点の経由時のリレーにはログを残らず、アクセス経路の出口以外は全て暗号化されているため、発信源が不明になり匿名性が保たれます。

少し前にダークウェブ上の違法なサイトが問題視されていたことが記憶に新しいですね。

これを活用することでサーバー側も接続側も匿名でセキュアな接続ができます。またグローバルIPが必要なく、ルーターのポート開放も必要ないことから選択しました。

Torのインストール

sudo apt install tor -y

Onion Serviceを開始するためにtorrcファイルを編集します。

vim /etc/tor/torrc

71・72行目のコメントアウトを外します。

+HiddenServiceDir /var/lib/tor/hidden_service/
+HiddenServicePort 80 127.0.0.1:80
-#HiddenServiceDir /var/lib/tor/hidden_service/
-#HiddenServicePort 80 127.0.0.1:80

Torを再起動します。

sudo systemctl restart tor

.onionアドレスを確認します。

cat /var/lib/tor/hidden_service/hostname

今の状態でTorブラウザから.onionアドレスへアクセスしても接続できません。

スクリーンショット 2023-12-08 012916

Tor経由での接続をするためにNextCloudのtrusted_domainsに.onionアドレスをconfig.phpに追加します。

vim /var/snap/nextcloud/current/nextcloud/config/config.php

config.php

'trusted_domains' =>
array (
    0 => 'YOUR_IP_ADDRESS'
+   1 => 'YOUR_ONION_ADDRESS'
)

Torを再起動します。

sudo systemctl restart tor

再度Torブラウザから.onionアドレスへアクセスして以下のようにログイン画面が表示されていればLAN外から接続できています!

スクリーンショット 2023-12-08 014739

スクリーンショット 2023-12-08 020346

スクリーンショット 2023-12-08 014732

正直Torを用いた接続は安全性が高いですが、弊害として世界中のサーバーを経由しているために通信速度が極めて遅く、ファイルサーバーとしての利用には向いていませんでした。速度を求めるなら大人しく固定IPを取得するなり、Tailscaleを使いましょう。