📈

RaspberryPi起点で自宅インターネット回線のモニタリング作戦

2020/09/27に公開

published_at: 2020-04-10 20:23


自宅インターネット回線の死活・性能はきっと現状のようなリモートワーク効率の生命線であろうと思います。
不調になってからの後手の業者への状況確認・対応依頼ではなく、早めに検知して先んじて予備のモバイルWiFiに切り換えてしばらく凌ぐ、というようなことができるように、と方法を考えて実装してみたので紹介したいと思います。

機構の概要図

RasPi-NetMon-fig.png (135.4 kB)

図にしてみて、今の世情からではあるけど当家なかなかにインターネットを使ってるんだなあと感じました。。

主な登場人物(?)

  • raspi-01 : このために購入した RaspberryPi 4 (Raspbian GNU/Linux 10 (buster)) [1]
  • my-Air : 操作や確認を行う私物 MacBook Air (macOS Catalina 10.15.4)
  • speedtest.net CLI : 回線速度の計測を行うツール [2]
  • Mackerel : 回線速度を定期的に送り込むSaaSの監視システム [3]

RaspberryPi4 セットアップ

購入〜組み立て

ふりかえってみると 3/18 に RaspberryPi 4 を購入を申し込んでました。
当初到着予定が 3/30 だったのですが諸事情で届かず、メールで問い合わせたら 明後日(4/1)到着予定 と業者から返信が来た直後くらいに 3/31 に届くとAmazonからメールが来て、どっちなんだろう・・・と思いました。
結局は 3/31 にも来ず、4/1 に到着。

いつ来るの?って問い合わせるくらいには待望していたので、記念にモノを撮りました。

raspi-open-1.png (4.7 MB)

raspi-open-2.png (5.6 MB)

raspi-open-3.png (8.8 MB)

組み立ては同梱されていたマニュアルに記載されていたURLの 動画 を見て、

  • ヒートシンクを本体に取り付け
  • ファンをケースの上側のほうに取り付け
  • (カメラの取り付けは買ってないので飛ばし)
  • 本体をケースの下側のほうに取り付け
  • ファンの電極(?)を本体に挿し込み
  • ケースの上のと下のを合体 (何回かリトライ。ケースが割れないように気をつけた。)

という過程で組み立てました。
動画のその先はWindowsだったので、利用しなかったです。何回か流してたけど。

Mac経由で初期設定、キーボード・マウスはいらない

いくつか見た RaspberryPi 初期設定のガイドページのうち、日付が新しくて内容が整理されていて秀逸だった
ラズパイ(raspberry pi)のセットアップをするよ(win/mac対応) | sukiburo のサイトを参照して、

  • モニターなし
  • マウスなし
  • キーボードなし
  • LANケーブルつながず(初めのうちは無線)

で設定を進めました。
ただし、SDカードのアダプタを使いました。my-Air からSDカードに読み書きできるようになっている必要があります。

  • OSのダウンロード
  • SDカードのフォーマット :間違えてMac本体のディスクをフォーマットしないように注意!と随所に書いてあった
  • SDカードにOSを書き込む

何もせずでよかったのでとばし ました。
SDカードをアダプタに嵌めてそれを my-Air に挿したうえで、以下2点の準備だけ行いました。

SSH有効化

RaspbianをインストールするときSSHを有効化する方法 - ラズパイダ にも書いてあったのですが、中身がカラの ssh という名前のファイルを作成し、
SDカードの boot ディレクトリ直下に Finder で置きました。こうすると SSH で接続できるようになるみたいです。

WiFi有効化

wpa_supplicant.conf という名前の設定ファイルが、ssh と同様 boot ディレクトリの直下に必要、なようです。
以下の内容にしておいてください。

wpa_supplicant.conf の例

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=JP
update_config=1

network={
    ssid="<your_ssid>"
    psk="<your_psk>"
}    

これら2つのファイルを追加したらSDカードを取り出し、RaspberryPi のSDカードスロットに挿して起動すると、
SSH接続できました。(初期のID・パスワードはわりと有名っぽくて探せばどこかで見つかると思います)

こちらが、初回SSH接続成功したときのコンソールログ
 ping raspberrypi.local
PING raspberrypi.local (192.168.0.32): 56 data bytes
64 bytes from 192.168.0.32: icmp_seq=0 ttl=64 time=121.720 ms
64 bytes from 192.168.0.32: icmp_seq=1 ttl=64 time=2.088 ms
64 bytes from 192.168.0.32: icmp_seq=2 ttl=64 time=1.906 ms
^C
--- raspberrypi.local ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.906/41.905/121.720/56.438 ms

~
❯ ssh pi@192.168.0.32
The authenticity of host '192.168.0.32 (192.168.0.32)' can't be established.
ECDSA key fingerprint is SHA256:PU4QnHx3Tib23eOwGMMRA4YVzEUy2b2MfGrhBpq6ILo.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.32' (ECDSA) to the list of known hosts.
pi@192.168.0.32's password:
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Sep 26 03:17:11 2019

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $    

ネットワーク周りとセキュリティ調整

SSH接続ができたあとにVNC接続の設定を実はしたのですが、ほぼ素直に ラズパイ(raspberry pi)のセットアップをするよ(win/mac対応) | sukiburo (以降「sukiburoさんのサイト」)に従ったので割愛します。
1点だけつまづきがあって、画面サイズが小さいとデスクトップが表示されなかったので調整しました。
そのとき参照した情報は -> https://www.raspberrypi.org/forums/viewtopic.php?t=216737&start=25 (「 raspi "Cannot currently show desktop" VNC」で検索)

IPアドレスの固定

これもほぼ sukiburoさんのサイトに従いましたが、/etc/dhcpcd.conf の設定で domainname_servers8.8.8.88.8.4.4 を足さないとインターネットの外に出られなかったです。
それとこの記事を書いていて、もう1箇所違いがあることに気が付きました。

自分の設定の決定版はこちら
  • /etc/dhcpcd.conf
    
interface eth0
static ip_address=192.168.0.34
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8 8.8.4.4

ソフトウェアの更新(ここで一度OS再起動)

ここで後回しにしていたソフトウェアアップデートを行いました。
アップグレード: 284 個、新規インストール: 7 個 のインストールが・・・何分かかったか採取してません。。すみません。。

ソフトウェア更新時のコンソール出力(一部)

pi@raspberrypi:~ $ sudo apt update
取得:1 http://archive.raspberrypi.org/debian buster InRelease [25.1 kB]
取得:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
取得:3 http://archive.raspberrypi.org/debian buster/main armhf Packages [280 kB]
取得:4 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages [13.0 MB]
13.3 MB を 15秒 で取得しました (870 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードできるパッケージが 284 個あります。表示するには 'apt list --upgradable' を実行してください。

pi@raspberrypi:~ $ sudo apt upgrade -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  alsa-base gstreamer0.10-alsa gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-0 libgstreamer0.10-0 libllvm8 libva-wayland2 libxfce4util-bin
  libxfce4util-common libxfce4util7 libxfconf-0-2 pimixer point-rpi xfconf
これを削除するには 'sudo apt autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
  bubblewrap eject libdav1d3 libfl2 libllvm9 rtimucli xdg-dbus-proxy
以下のパッケージはアップグレードされます:
  arandr base-files binutils binutils-arm-linux-gnueabihf binutils-common bluez chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg-extra cron curl
  dhcpcd5 distro-info-data e2fsprogs ffmpeg file firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek fonts-opensymbol
  freetype2-doc git git-man gldriver-test gtk2-engines-pixflat libarchive13 libavcodec58 libavdevice58 libavfilter7 libavformat58 libavresample4 libavutil56
  libbinutils libbluetooth3 libboost-atomic1.67.0 libboost-chrono1.67.0 libboost-date-time1.67.0 libboost-filesystem1.67.0 libboost-iostreams1.67.0
  libboost-locale1.67.0 libboost-system1.67.0 libboost-thread1.67.0 libcom-err2 libcups2 libcupsimage2 libcurl3-gnutls libcurl4 libdrm-amdgpu1 libdrm-common
  libdrm-nouveau2 libdrm-radeon1 libdrm2 libegl-mesa0 libegl1 libexif12 libext2fs2 libfm-data libfm-extra4 libfm-gtk-data libfm-gtk4 libfm-modules libfm4
  libfreetype6 libfreetype6-dev libfribidi0 libgbm1 libgl1 libgl1-mesa-dri libglapi-mesa libgles1 libgles2 libgles2-mesa libglib2.0-0 libglib2.0-bin
  libglib2.0-data libglvnd0 libglx-mesa0 libglx0 libgnutls30 libgs9 libgs9-common libicu63 libidn2-0 libimobiledevice6 libjavascriptcoregtk-4.0-18
  libmagic-mgc libmagic1 libmatroska6v5 libmp3lame0 libmtdev1 libmysofa0 libncurses5 libncurses6 libncursesw5 libncursesw6 libnss3 libobrender32v5 libobt2v5
  libogg0 libopenjp2-7 libpam-systemd libpostproc55 libpq5 libpython2.7 libpython2.7-dev libpython2.7-minimal libpython2.7-stdlib libpython3.7
  libpython3.7-dev libpython3.7-minimal libpython3.7-stdlib libqt5concurrent5 libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5opengl5
  libqt5printsupport5 libqt5sql5 libqt5sql5-sqlite libqt5test5 libqt5widgets5 libqt5xml5 libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc
  libraspberrypi0 libraw1394-11 libreoffice libreoffice-avmedia-backend-gstreamer libreoffice-base libreoffice-base-core libreoffice-base-drivers
  libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw libreoffice-gtk3 libreoffice-help-common libreoffice-help-en-gb libreoffice-impress
  libreoffice-java-common libreoffice-l10n-en-gb libreoffice-librelogo libreoffice-math libreoffice-nlpsolver libreoffice-report-builder
  libreoffice-report-builder-bin libreoffice-script-provider-bsh libreoffice-script-provider-js libreoffice-script-provider-python libreoffice-sdbc-firebird
  libreoffice-sdbc-hsqldb libreoffice-sdbc-postgresql libreoffice-style-colibre libreoffice-style-tango libreoffice-wiki-publisher libreoffice-writer
  libruby2.5 libsasl2-2 libsasl2-modules-db libsord-0-0 libspeex1 libspeexdsp1 libss2 libssl-dev libssl1.1 libswresample3 libswscale5 libsystemd0 libtiff5
  libtinfo5 libtinfo6 libudev1 libvlc-bin libvlc5 libvlccore9 libvpx5 libwebkit2gtk-4.0-37 libxaw7 libxcb-util0 libxdamage1 libxml2 libxmu6 libxmuu1
  libxslt1.1 libxt-dev libxt6 lxinput lxpanel lxpanel-data lxplug-bluetooth lxplug-cputemp lxplug-ejecter lxplug-network lxplug-ptbatt lxplug-volume
  mesa-va-drivers mesa-vdpau-drivers ncurses-base ncurses-bin ncurses-term nodered obconf openbox openjdk-11-jdk openjdk-11-jdk-headless openjdk-11-jre
  openjdk-11-jre-headless openssh-client openssh-server openssh-sftp-server openssl pcmanfm pi-bluetooth piclone pipanel piwiz pixflat-icons python-apt-common
  python-cryptography python-motephat python-piglow python-pil python-spidev python-werkzeug python2.7 python2.7-dev python2.7-minimal python3-apt
  python3-cryptography python3-motephat python3-piglow python3-pil python3-pil.imagetk python3-spidev python3-uno python3-werkzeug python3.7 python3.7-dev
  python3.7-minimal python3.7-venv qt5-gtk-platformtheme raspberrypi-bootloader raspberrypi-kernel raspberrypi-sys-mods raspberrypi-ui-mods raspi-config
  raspi-gpio rc-gui realvnc-vnc-server realvnc-vnc-viewer rp-prefapps rpcbind rpd-plym-splash rpi-chromium-mods rpi-eeprom rpi-eeprom-images ruby2.5 scratch3
  ssh sudo systemd systemd-sysv thonny udev uno-libs3 ure vlc vlc-bin vlc-data vlc-l10n vlc-plugin-base vlc-plugin-notify vlc-plugin-qt vlc-plugin-samba
  vlc-plugin-skins2 vlc-plugin-video-output vlc-plugin-video-splitter vlc-plugin-visualization wpasupplicant x11-xserver-utils
アップグレード: 284 個、新規インストール: 7 個、削除: 0 個、保留: 0 個。
905 MB のアーカイブを取得する必要があります。
この操作後に追加で 70.7 MB のディスク容量が消費されます。    
・・・    

そして、OS再起動しておきました。
無事、戻ってきてくれました。

ファイアウォールの設定

こちらもだいたいは sukiburoさんのサイトからリンクされている 【パクろう】ラズパイでファイアーウォールを設定する方法 | sukiburo の内容をベースに、以下のコマンドを実行しました。
意図としては 内部の SSH(22) と VNC(5900) だけ開けておく、です。

ファイアウォール設定のヒストリ

   96  sudo apt install ufw
   97  sudo ufw status
   98  sudo ufw enable
   99  sudo ufw status
  100  sudo ufw status numbered
  101  sudo ufw allow from 192.168.0.0/24 to any port 22
  102  sudo ufw allow from 192.168.0.0/24 to any port 5900
  103  sudo ufw status numbered    

pi ユーザーの変更

繰り返しになってしまいますがこちらも sukiburoさんのサイトの完全コピーでやりました。
このパートには重大な注意点があるようなのでお気をつけください。
すぐにはないと思いますが情報消失に備えて、自分が踏襲したはずのコマンド実行順を転記してしまいます。ご容赦を。

piユーザー変更手順(newpi は適宜置き換え)

#SSH接続
ssh pi@192.168.0.34

#仮のユーザーtmpを追加
sudo useradd -M tmp

#tmpユーザーをsudoグループに追加
sudo gpasswd -a tmp sudo

#tmpユーザーのパスワードを設定
sudo passwd tmp

#exitの前に
sudo raspi-config
#3→B1→B1を選択(起動オプションをCUIに)

#再起動しますか?と言われると思うのでYesを選択

#言われなかったら(言われたのでコメントアウト)
#sudo reboot    
    
#tmpユーザーでSSH接続
ssh tmp@192.168.0.34

#piユーザーをnewpiユーザーに変える
sudo usermod -l newpi pi

#ホームディレクトリを変更
sudo usermod -d /home/newpi -m newpi

#piグループをnewpiに変更
sudo groupmod -n newpi pi

#一旦ログアウト
exit
    
#新しいユーザー名でSSH接続
ssh newpi@192.168.0.34

#tmpユーザーを消す
sudo userdel tmp

#newpiユーザーのパスワードを変える
sudo passwd newpi

#exitの前に
sudo raspi-config
#3→B1→B4を選択(起動オプションを Desktop Autologin に)

#再起動しますか?と言われると思うのでYesを選択

#言われなかったら(言われたのでコメントアウト)
#sudo reboot

その他の設定

  • VNC でWiFiをOFFにしました。
  • 後続となる Ansible での各種インストールの準備として、SSH の設定を調整しました。
    キーポイントになる対象ファイルは2つで、ポイントは以下に畳んで記述します。
    特に上のファイルは似た名前のファイルがあるのでオリジナルを確保しておいてから手を加えるのが安全かと思います。
/etc/ssh/sshd_config
    
-#PermitRootLogin prohibit-password
+PermitRootLogin no
    
+RSAAuthentication yes
+PubkeyAuthentication yes
    
-#AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2
+AuthorizedKeysFile %h/.ssh/authorized_keys
    
-#PasswordAuthentication yes
+PasswordAuthentication no

/etc/sudoers (visudo で編集。nanoエディタ慣れない...)

 # User privilege specification
 root    ALL=(ALL:ALL) ALL
+newpi   ALL=(ALL) NOPASSWD: ALL  # [^4]

つづく

けっこう話が長くなってきたのでここで一旦この記事を中断します。
以下の記事が今後続く予定です。書き上がったらリンクにします。
興味あればご覧いただければと思います。

Title / Link Description Status Note
RaspberryPi4 セットアップ 活用前の初期設定でしたことの記事 Shipped この記事です
モニタリングの準備 raspi-01 に mackerel-agent 等を Ansible でインストールしたことの記事 Shipped Mackerel Ambassador (sogaoh) blogs に掲載
モニタリング機構の実装 raspi-01 で speedtest.net のCLIを定期的に実行して Mackerel にサービスメトリックを投稿するようにしたことの記事 Shipped
この作戦の余談 それらの過程で気が付いたことの記事など Shipped Medium に掲載

Appendix

脚注
  1. LABISTS Raspberry Pi 4 Model B 4GB RAM MicroSDHCカード32G/NOOBSシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書/24ヶ月保証 ↩︎

  2. Speedtest CLI - 開発者向けインターネット接続測定 ↩︎

  3. Mackerel(マカレル): 新世代のサーバー管理・監視サービス ↩︎

  4. 付属のマニュアルに記載されていたURLは - が余計 ↩︎

Discussion