GL.iNet Brume 2を自宅サーバーとして使う
ども、takiponeです。
OpenWRT採用のトラベルWi-Fiルーターに定評のあるGL.iNetからセキュリティゲートウェイ製品Brume 2が発売されました。
数多くのVPNソリューションに対応し、VPNトンネルを中継するVPN Cascadingという込み入ったリモートアクセスVPN構成がセールスポイントとして謳われています。
一方でWi-Fiルーター向けSoCの高性能化が進み、Brume 2が採用するMediaTek MT7981BはArm 64bitのデュアルコア1.3GHz CPUにDDR3メモリ1GB、eMMC 8GBに2.5Gbps Ethernet、USB3.0インターフェースとRaspberry PiのようなSBC(Single Board Computer)のスペックに追いついてきました。プリインストールOSとしてルーター向けLinuxディストリビューション OpenWRTのOld stable version 21.02を採用しているので、Linuxのソフトウェア資産も広く使えそうです。
ということで、本記事ではBrume 2を自宅サーバーとして利用するためのTipsあれこれを共有します。
1. 初期セットアップとSSHログイン
パッケージには本体のほか、ACアダプタとLANケーブルが付属します。
※ ACアダプタの補足
今回は直販サイトで購入したためACアダプタが日本仕様ではなく、PSEマークが未取得のものです。USB-C 5V/2A供給なので、電源供給に不安のある方は別のUSB-Cアダプタを利用いただくのがいいかもしれません。日本で発売されるときには相応のACアダプタが同梱されることでしょう。
Brume 2はWi-Fi機能を搭載しないので、既存のWi-Fiに参加したりWi-Fiアクセスポイントとして動作させることはできません。電源を供給し、LANポートにLANケーブルでPC/Macと接続、Webブラウザで 192.168.8.1
にアクセスし初期Webセットアップ画面を表示します。
言語を選択したら、管理者パスワードをセットします。
これでOKです。初期状態でSSHが有効なので、ターミナルから root
ユーザーでログインできます。
% ssh root@192.168.8.1
The authenticity of host '192.168.8.1 (192.168.8.1)' can't be established.
ED25519 key fingerprint is SHA256:tX9JAP/2PrmMGLZd98scDR1gLVo+f60hmZV9YIUTz4I.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.8.1' (ED25519) to the list of known hosts.
root@192.168.8.1's password: (先ほど設定した管理者パスワードを入力しEnter押下)
BusyBox v1.33.2 (2022-11-04 16:35:25 UTC) built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt 21.02-SNAPSHOT, r15812+865-46b6ee7ffc
-----------------------------------------------------
root@GL-MT2500:~#
OSのインストールが不要なので、SBCよりも手軽に使えるLinux Boxと呼んでも良さそうな感じです。
2. ディスクの増設とDockerのインストール
Linuxソフトウェアを手軽に使う定番の方法としてDockerコンテナが挙げられるでしょう。DockerリポジトリのDocker Hubには数多くのイメージが公開されており、Brume 2でも活用できます。
ただし、Brume 2の内蔵ディスクは8GBのため、100MBを超えるような大きめのDockerイメージを扱うとあっという間にディスク領域を使い切ってしまいます。そこで今回はUSB3.0ポートに外付けSSDを接続し、Dockerのディスク領域として利用してみます。
USBポートにSSDをセットし、Ext4にフォーマットします。デバイスファイル名は /dev/sda1
です。
# umount /tmp/mountd/disk1_part1/
# mke2fs -t ext4 /dev/sda1
mke2fs 1.45.6 (20-Mar-2020)
/dev/sda1 contains a ntfs file system
Proceed anyway? (y,N) y
Creating filesystem with 30204160 4k blocks and 7553024 inodes
Filesystem UUID: 6f0cf678-1b19-4ce1-b4b8-4a1f704b4204
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
#
独自のNAS管理プログラムによってSSDのファイルシステムが自動マウントされるため、フォーマット前に umount
でアンマウントしています。再度SSDを差し直すと自動でExt4ファイルシステムとして認識され、 /tmp/mountd/disk1_part1
にマウントされます。
# mount | grep sda1
/dev/sda1 on /tmp/mountd/disk1_part1 type ext4 (rw,relatime,stripe=8191)
#
今回の環境ではDockerやDockerが依存するcontainerdのファイルが /opt
以下に配置されることからSSDを /opt
にマウントさせたいのですが、その設定を明示してもNAS管理プログラムが /tmp/mountd/disk1_part1
に再マウントするためシンボリックリンクで回避しました。
# ln -s /tmp/mountd/disk1_part1 /opt
# ls /opt
lost+found
#
これでDockerをインストールする準備が整いました。パッケージのインストールにはインターネット接続が必要です。WANポートにLANケーブルでルーターなどに接続しておきましょう(こちらはDHCPでIPアドレスを自動取得します)。Web管理画面のメニュー [アプリケーション] - [パッケージソフトウェア] をクリックし、フィルターのテキストボックスに docker
と入力、 dockerd
や docker-compose
など必要なパッケージの右側にある [インストール] ボタンをクリックし、それぞれインストールしましょう。
これでOKです。CLIを実行してみると...
# docker version
Client:
Version: 20.10.17
API version: 1.41
Go version: go1.18.9
Git commit: 100c701
Built: Fri Dec 16 23:15:42 2022
OS/Arch: linux/arm64
Context: default
Experimental: true
Server:
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.18.9
Git commit: a89b842
Built: Fri Dec 9 02:25:49 2022
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.6
GitCommit:
runc:
Version: 1.1.2
GitCommit:
docker-init:
Version: 0.19.0
GitCommit: de40ad0
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker-compose version
docker-compose version 1.28.2, build unknown
docker-py version: 4.4.1
CPython version: 3.9.13
OpenSSL version: OpenSSL 1.1.1q 5 Jul 2022
#
きちんと動いていますね。
3. Docker利用上の注意点
Dockerを利用する上で留意点がいくつかあります
TCP 80番と443番ポートはWeb管理画面が使っている
先ほどの手順でも利用したWeb管理画面が、TCP 80番ポートと443番ポートでListenしています。内部的にはNginxを利用しているのが見えます。
# netstat -ltpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5494/nginx.conf -g
tcp 0 0 192.168.4.4:53 0.0.0.0:* LISTEN 8113/dnsmasq
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 8113/dnsmasq
tcp 0 0 192.168.8.1:53 0.0.0.0:* LISTEN 8113/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4312/dropbear
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 5494/nginx.conf -g
tcp 0 0 :::80 :::* LISTEN 5494/nginx.conf -g
tcp 0 0 fe80::9683:c4ff:fe25:7348:53 :::* LISTEN 8113/dnsmasq
tcp 0 0 ::1:53 :::* LISTEN 8113/dnsmasq
tcp 0 0 :::22 :::* LISTEN 4312/dropbear
tcp 0 0 :::443 :::* LISTEN 5494/nginx.conf -g
SSHがあるからWeb管理画面は使わん!という方は以下のコマンドで無効にしてしまうこともできます。私はGL.iNetとLuciの管理画面が好きなので生かしてますが。
# service nginx stop
# service nginx disable
ネットワークモードはbridgeを避け、host推奨
Dockerコンテナにはコンテナとホストを関連付けるためのネットワークモードがあり、デフォルトではbridgeモードで実行されます。しかし、OpenWRT環境ではルーター用途でルーティングやNATが多く構成されており、Dockerの -p
オプションによるポートフォワードの動作が不安定な事象がありました。hostモードを用いてポートフォワードを回避することで不安定になることは無くなりました。Netfilterの構成をきちんと理解すればbridgeモードでも上手く動作させることができるかもしれません。また、Web管理画面のネットモードをブリッジにすることでNAT構成を変更しやりやすくなるかもしれません(未検証)。
Docker Hubのイメージはarm64/v8が使える
Docker Hubで公開されているイメージはアーキテクチャごとに用意されています。Brume 2はArm 64bitアーキテクチャなので、 linux/arm64/v8
があるものが利用できます。
アーキテクチャの選択は自動で行われるため、操作は通常のコンテナイメージの場合と変わりません。
※ DockerのArm 64bit対応雑感
Docker自体はIntel CPUで多く利用されてきましたが、Raspberry PiをはじめAWS Gravitonといったクラウド環境でArm CPUの利用が進み、Docker Hubのイメージのマルチアーキテクチャ対応と Arm 64bit( arm64/v8
)のイメージが徐々に増えてきている印象です。
Tailscaleも使える
Brume 2はたくさんのVPNサービスをサポートしているのですが、今回はTailscaleを利用したかったので、パッケージからインストールしました。
インストール後は標準の手順にのっとる流れでOKです。
# tailscale up
ただし、Tailscaleで利用するShared Address Space(100.64.0.0/10
)のルーティングが動かなかったので、 /etc/rc.local
に追記しました。
今回はTailscaleをVPN用途に加えて、外部からの接続を受け付けるTailscale Funnelを利用しています。その辺りの様子は、こちらの記事に書きました。
おまけ1: 2.5Gbps WANポートのスピードテスト
せっかく2.5Gbpsポートを搭載しているので、スピードテストを試してみた結果を共有しておきます(フレッツ光クロス回線で、レンタルルーターの10GbpsポートにWANポートを接続、v4なのでOCNバーチャルコネクト経由です)。
# ./speedtest
Speedtest by Ookla
Server: IPA CyberLab 400G - Tokyo (id: 48463)
ISP: NTT
Idle Latency: 3.38 ms (jitter: 0.11ms, low: 3.24ms, high: 3.48ms)
Download: 2236.51 Mbps (data used: 1.8 GB)
10.95 ms (jitter: 12.04ms, low: 3.75ms, high: 251.77ms)
Upload: 2350.26 Mbps (data used: 1.2 GB)
5.99 ms (jitter: 1.17ms, low: 3.53ms, high: 14.03ms)
Packet Loss: 0.0%
#
いい感じです!
おまけ2: 消費電力の測定
電源供給がUSB-Cなので、手持ちのワットチェッカーで消費電力を測定してみました。
おお、今回はサーバー用途なのでUPSに繋いで使っていますが、これなら数時間持ちそうですね。
まとめ
GL.iNet Brume 2を自宅サーバーとして使うためのTipsをDockerをメインに紹介しました。Raspberry Piの入手が長らく難しい状態なので、ケースに入っていて電源要件もシンプルなBrume 2であなたも年末は自宅サーバーしてみませんか。