BETA

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

投稿日:2020-04-10
最終更新:2020-04-25

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

機構の概要図

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

主な登場人物(?)

  • 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 に到着。

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

組み立ては同梱されていたマニュアルに記載されていた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 [email protected]  
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.  
[email protected]'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.  

[email protected]:~ $      

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

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箇所違いがあることに気が付きました。

自分の設定の決定版はこちら

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 個 のインストールが・・・何分かかったか採取してません。。すみません。。

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

[email protected]:~ $ 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' を実行してください。  

[email protected]:~ $ 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 [email protected]  

#仮のユーザー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 [email protected]  

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

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

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

#一旦ログアウト  
exit  

#新しいユーザー名でSSH接続  
ssh [email protected]  

#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

Footnote

[^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]: newpi ALL=NOPASSWD: ALL から訂正
[^5]: 長くなるのを避ける意図で仮に付けました
[^6]: 付属のマニュアルに記載されていたURLは - が余計

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@sogaoh's founds in personal activity

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう