🍆

NASを建てて、光クロスな自宅の外からアクセスしたい!

2024/12/25に公開

こんにちは。mizusawa @mizphsesです。

今回は、自宅に Raspberry Pi + 裸族のテラスハウスを用いた NAS と、Cloudflare Access を用いたリモートアクセスを構築しました。

経緯

私は車と映像が好きで、一定距離以上のドライブの時は結構な頻度でカメラを回しています。

一時期はミラーレスを車に取り付けて撮影していたのですが、最近は専ら OSMO Action 4 を愛用しています。

法的制約の都合[1]から、多くのカメラは 30 分の連続撮影制限がついていました。私の持っているカメラも例外ではなく、30 分に一回録画が完全に止まります。

しかし、Osmo Action4 は特にこうした制約はないらしく、したがって数時間の連続撮影が問題なくできるようになりました。

しかし、映像というものは容量を食べます。1ファイル 17GB ほどある動画ファイルが続々と溜まっていき、結果的にテラバイト単位の動画量となってしまいました。

これでは Google One でもらっている 2TB を食い潰してしまうので、仕方なく自宅に NAS を設置することにした次第です。

ハードウェア

HDD には東芝製 MG グレードの HDD を採用しました。友人が同じく自宅 NAS の目的で採用しており、寝室で添い寝するのでなければ特に文句はないとのことだったので、これにしました。

2024 年 12 月現在、Fieldlake 指定代理店のOCN オンラインショップで 1 台あたり 45,800 円でした。RAID1 を構築するので、2 台購入しています。多分この東芝のが同グレードでは Seagate など他メーカーよりも金額的には安いと思います。

自宅に Raspberry Pi が転がっていたので、こちらをサーバに転用しました。HDD と接続するため、裸族のテラスハウス(Gen2)を購入しました。

大体全部合わせて 10~13 万円くらいでしょうか。パソコンは家に転がってるやつでいいので、新規購入したのは 10 万前後でした。

NAS 構築

Raspberry Pi は適宜 SSH 等を設定しているものとします。Raspberry Pi OS Lite (64bit)で構築しました。

ディスク準備

まずは、裸族側で MIRRORING モードの設定をします。HDD を 2 台とも挿し、Raspberry Pi に接続します。

裸族側のセットアップが完了したら、私の場合は/dev/sdaにディスクが認識されましたので、これを使用します。(確認はsudo fdisk -lで可能)

これをpartedで以下のように設定します。

$ sudo parted /dev/sda
(parted) mklabel gpt # GUIDパーティションにする
(parted) mkpart
File system type?  [ext2]? ext4
Start? 0%
End? 100%
(parted) p # 設定内容を確認
Model: ASMT ASM1352R RAID1 (scsi)
Disk /dev/sda: 16.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: loop
Disk Flags:

Number  Start  End     Size    File system  Flags
 1      0.00B  16.0TB  16.0TB  ext4

最終的に、p コマンドで確認してディスクが ext4 で認識されていれば成功です。

続いて、このディスクをマウントします。今回は/mnt/disk1 にマウントしました。

$ sudo mount -t ext4 /dev/sda /mnt/disk1

さらに、永続化します。まずはディスクの UUID を確認します。

$ ls -l /dev/disk/by-uuid/

total 0
lrwxrwxrwx 1 root root 15 Dec 25 13:12 XXXX-XXXX -> ../../mmcblk0p1
lrwxrwxrwx 1 root root  9 Dec 25 14:14 a59xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -> ../../sda
lrwxrwxrwx 1 root root 15 Dec 25 13:12 ce2xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -> ../../mmcblk0p2

今回は、a59xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxがディスクの UUID でした。こちらを/etc/fstabに書き込みます。

 proc            /proc           proc    defaults          0       0
 PARTUUID=xxxxxxxx-01  /boot/firmware  vfat    defaults          0       2
 PARTUUID=xxxxxxxx-02  /               ext4    defaults,noatime  0       1
+UUID=a59xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx       /mnt/disk1      ext4    defaults        0       0

これで再起動しても読み込まれるはずです。sudo rebootでもして確認しましょう。

samba を設定

続いて宅内 LAN から接続できるよう、NAS サーバを構築します。大体これに書いてある通りです。

1 依存関係のインストール

$ sudo apt update & sudo apt upgrade -y
$ sudo apt install samba

2 権限調節

/mnt/disk1に 777 を振る

$ sudo chmod /mnt/disk1 777

3 smb.conf の登録

/etc/samba/smb.confに下記を追記し、smb でアクセスできるようにします。

[nas]
    path = /mnt/disk1
    browseable = yes
    writable = yes
    guest ok = yes
    guest only = yes
    create mode = 0777
    directory mode = 0777
$ testparm

を実行すると、conf ファイルが正常かを確認できます。

4 samba のパスワードを登録

$ sudo smbpasswd -a mizphses

パスワードを設定してあげましょう。このパスワードが PC から接続するときのパスワードとなります。AD みたいな面倒なことは将来の自分に任せます。

5 サーバーを起動&永続化

$ sudo systemctl restart smbd # 特に何も出なければOK
$ sudo systemctl enable smbd # 再起動しても起動するようにする

これでアクセスできるはず。Mac なら、Finder→ 移動 → サーバに接続、からラズパイの IP アドレスに smb 接続してみましょう。

自宅外からのアクセスを許可する

本当は Softether を引こうと思っていたのですが、IP 固定や公開周りが面倒なフレッツ光クロスの環境との相性が非常に悪いので、他の方法でやることにしました。

以前友人が Cloudflare Access 経由でマイクラサーバーを設置していたことを思い出したので、これを用いて自宅外からアクセスすることにしました。

Cloudflared のダウンロード

pkg.cloudflare.com から、パッケージのレポジトリを追加 & Cloudflared のインストールを実施します。

# Add cloudflare gpg key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# Add this repo to your apt repositories
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared
sudo apt-get update && sudo apt-get install cloudflared

Cloudflared の設定

似たことをやってる人(自宅宛の VPN として ZTNA を使う人)がいたので、参考にしました。

Raspberry Pi で設定する

$ cloudflared tunnel login # ログインURLが発行されるのでログイン、適当なドメインに紐付けする
$ cloudflared tunnel create kawasaki # 私はtunnelの名前を拠点の住所にしています。ここで出てくるtunnel IDを覚えておく。
$ cloudflared tunnel route ip add 192.168.1.0/24 kawasaki # 自宅のLANのCIDRを振ってやる

続いて、/etc/cloudflared/config.ymlに以下の内容を書き込みます。

tunnel: kawasaki.mizphses.com
credentials-file: /etc/cloudflared/e80c1a04-86dc-41b6-9c91-f1298b7f8138.json
warp-routing:
    enabled: true

最後に、サービス化してそのサービスも念のため再起動します。

$ sudo cloudflared service install
$ sudo systemctl restart cloudflared

自宅ネットワークが分離されないようにする

多くの自宅ネットワークは 192.168.xxx.xxx 上に設置されていると思いますが、cloudflare tunnel はどっちかというとその外側にあるサービスのアクセスを制御する道具なので[2]、LAN 用のアドレスは Tunnel に流さないことになっています。

したがって、設定画面で以下のように変更する必要があります。

https://one.dash.cloudflare.com/{あなたのcloudflare user id}/settings/devices にある、WARP クライアントの設定から、デバイスのプロファイルを編集します。

この画面の中で、「スプリット トンネル」というメニューの管理画面から、192.168.x.x に関係しそうなものを全部削除します。(これで 192.168.x.x も透過されなくになる)

Google ログインの設定

メール OTP でもいいのですが、たまにメールが届かないので Google や GitHub の oAuth で認証をしましょう。今回は Google ログインとします。

https://one.dash.cloudflare.com/{あなたのcloudflare user id}/settings/authenticationにある認証 → ログイン方法から、Google ログインを追加します。

Google Cloud Console から、OAuth の設定を登録する。自分しか入らないので公開アプリにする必要はないと思っています。

Access グループの設定

誰が開けるかを管理するために、Access グループを設定します。これを設定しないと、誰でも入れてしまいます。

包含: Login Methods (Google を設定), 要求: Emails (自分のメアド)を設定したら OK です。

これを Access にいるアプリケーションのポリシーにアタッチします。さっき定義した Access グループのチェックボックスを入れれば OK です。

使ってみる

まずはパソコンに Warp アプリをインストールします。1.1.1.1からダウンロード可能です。

インストールしたら、Preferences → Account で、Login to Cloudflare Zero Trust からログインします。

Google でログインしたら、Warp のアプリが「Zero Trust」と出てくるので、それ次第トグルを右にやると、成功です。

以上でアクセス可能な状態になりました。

まとめ

いかがだったでしょうか?自宅 LAN にある機器を操作するのにはかなり便利そうです。自宅内で動いている WEB アプリがあるので、この辺も触れるようになったのがちょっと嬉しいです。

お読みいただきありがとうございました。

脚注
  1. EU ではビデオカメラの税率が複数あり、連続 30 分以上の撮影ができる。23fps 以上・800x600px 以上 をすべて満たすカメラは高い税率となっていた。 https://av.watch.impress.co.jp/docs/series/zooma/1171774.html ↩︎

  2. VPN 繋いでて自宅のプリンター使えなかったら不便ですもんね ↩︎

Discussion