:wq!

GL.iNet Brume 2を自宅サーバーとして使う

ども、takiponeです。

OpenWRT採用のトラベルWi-Fiルーターに定評のあるGL.iNetからセキュリティゲートウェイ製品Brume 2が発売されました。

GL-MT2500 / Brume 2
Brume 2 (GL-MT2500/GL-MT2500A) is an industrial security gateway for a network to run add-on programs and act as a VPN client or server before data is transmitted out of the network premise.

数多くの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セットアップ画面を表示します。

言語を選択したら、管理者パスワードをセットします。

このあと接続するrootユーザーのパスワードにも同じものがセットされます

これで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 と入力、 dockerddocker-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を利用しています。その辺りの様子は、こちらの記事に書きました。

Tailscale Funnelで自宅サーバーをCloudFrontのオリジンにする

おまけ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であなたも年末は自宅サーバーしてみませんか。