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接続に利用)
高速動作を実現するため、Debianを最適化した「DietPi」OSを採用しました。
まずはMicroSDカードに書き込むOSのimgファイルを以下のリンクからダウンロードします。
DietPiは数多のSBCとに対応しており、他のSOCでも同様の手順でセットアップできると思います。
URL:https://dietpi.com/#download
imgファイルのダウンロードが完了したら Rufus を利用してMicroSDカードに書き込みます。Rufusは以下のリンクからダウンロードできます。
Rufusはブート可能なimgファイルをもとにブータブルUSBメモリを簡単に作成できるソフトです。
①Rufusを起動しOSのimgを選択し、スタートを押します。 | ②初期化の警告をOKします。 | ③Rufusのステータスが「準備完了」に変われば書き込み完了です。 |
---|---|---|
OSの書き込みが完了したら、SSH接続に備えてWiFiを設定します。 インストール時に生成されるファイルを編集します。
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アドレスをネットワークスキャンができるソフトで確認してください。
またSSHクライアントは好きなものを使ってください。今回はOSSのTeraTermを使用しました。(PowerShellのsshコマンドでもできます。)
デフォルトのユーザー名とパスワードは下記のとおりです。
①TeraTermを起動し、接続先のIPアドレスをホスト欄に入力してOKしてください。 | ②ユーザー名とパスワードを入力してOKしてください。 | ③セキュリティ警告の表示には続行を選択してください。 |
---|---|---|
私の環境ではBluetoothがデフォルトでOFFになる仕様に伴う不具合から、WiFiが認識していませんでした。
解決策はBluetoothをONにすることです。
① 一度モニターに接続してシェルに
dietpi-config
と入力し、4:Advanced Options を選択してください。② 一番下にあるBlutoothオプションをONにして再起動してください。
SSHでの接続が成功すると自動で初期セットアップが始まります。 セットアップ画面に沿って下の画面まで進めて下さい。
ここでInstallを選択することで一番ミニマムな初期セットアップが完了します。
下の画面が表示されればインストール完了です。
Nextcloudは、オンラインストレージの作成と使用のためのクライアント・サーバ型のソフトウェアです。
Snapはディストリビューションを問わず利用できるユニバーサルパッケージ管理システムです。NextCloudのインストールがDB含めて一発で完了できるので利用します。
パッケージ一覧を更新します。
sudo apt update
Snapをインストールします。
sudo apt install snapd -y
sudo snap install core
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
SBCのIPアドレスの80番ポートにアクセスします。画面に従って管理者アカウントを作成してください。
DBへの接続でエラーが出る場合はNextCloudを再起動してください。
snap restart nextcloud
以下のように表示されていればセットアップ完了です。
イントラネットで利用する場合はここまででOKです!
追記 Snap版NextCloudでCLI管理コマンドoccが利用出来ない問題について 絶対パスを指定することで解決できます。
sudo /snap/bin/nextcloud.occ
目的としているセキュアにLAN外から自宅鯖のNextCloudに接続するため、TorのOnion Serviceを利用します。
まず Tor とは、インタネット上で匿名の通信を行うためのシステムです。Torは「The Onion Router」の略で、玉ねぎのように何重にも層を重ねて暗号化をし、接続経路の匿名化をします。また接続経路にある中継地点の経由時のリレーにはログを残らず、アクセス経路の出口以外は全て暗号化されているため、発信源が不明になり匿名性が保たれます。
少し前にダークウェブ上の違法なサイトが問題視されていたことが記憶に新しいですね。
これを活用することでサーバー側も接続側も匿名でセキュアな接続ができます。またグローバルIPが必要なく、ルーターのポート開放も必要ないことから選択しました。
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アドレスへアクセスしても接続できません。
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外から接続できています!
正直Torを用いた接続は安全性が高いですが、弊害として世界中のサーバーを経由しているために通信速度が極めて遅く、ファイルサーバーとしての利用には向いていませんでした。速度を求めるなら大人しく固定IPを取得するなり、Tailscaleを使いましょう。