ICMP、飛ばしていますか?私はおうちでいっぱい飛ばすことにしました。
ICBMは飛ばしちゃだめだよ。
やりたいこと
お家のマイコン・IoT家電の動作状況をいつでも知りたい。
理由1:稀にIoT機器が死んで暗い生活(物理)になる前に気づきたい
「Alexa、寝室の照明つけて!」
↓
「....」
↓
「寝室から応答がありません」
_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y^Y^ ̄
理由2:おうちマイコンの死活管理の難しさを改善したい
マイコン側のプログラムで生死を発信させるのは面倒なので、外から調べたい。
どうやるか
ICMPを飛ばして結果を見る。(プロトコルの名前なので飛ばすという表現が正しいかは分からないが……)
マスタリングTCP/IPを見るとICMPはパケットの送信元に異常を知らせるためのプロトコルらしい。pingでも使われてるやつ。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-2.png)
こんなイメージ。
この環境を作るために、まずIPを手動で割り当てる必要が生じた。(ARPとか使えばDHCPのままできるかもしれないが...)
あたたかみのあるIP割当て
現代はDHCP全盛時代なので、機器をルータに繋ぐといいかんじにローカルIPが割り当てられる。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-3.png)
これを手動で割り当てる必要が出た。
業務用ルータもない極めて一般の家庭なのでVLANなどには分けず、普通の一般用ルータで192.168.37.0/24の範囲でIP割当設定をする。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-4.png)
どれをどれに割り当てたか忘れないように、Notionで控えておく。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-16.png)
抽象に抽象を重ねる
IPアドレスが機器ごとに固定したので、あとはそいつらにICMPプロトコルでパケットを送りつけてやれば良い。
この「ICMPパケットを送りつけるやつ」は残念がら人間にはできない。
しかしネットにつなげる機器なら大抵可能で、マイコンでも、Windowsでも、Androidでもできる。
折角ちょうど家に暇を持て余すミニPCがあったので、これを使うことにした。
話は変わるが、人類共通の話題として絶えないのが「変化しにくいものに依存しすること」である。
銀行口座だって、国家だって、プログラムのコードだって。
ミニPCを直に「ICMPパケットを送りつけるやつ」にすることもできる。
しかしそれではOSのアップデートやPC構成の変更への対応に弱い。
そこで、ミニPCを仮想化し構築することとした。
これにより、例えば急な事情で
「ミニPCにMisskeyいれたくなっちゃった……いれるね……」
のような状況が生じても柔軟に対応できる。
ミニPCの仮想化にはProxmoxを用いた。
自宅クラウド界隈でアツい仮想化プラットフォームだ。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-5.png)
これにより動作環境が揃った。
ICMPを飛ばすにあたって、せっかくなら「綺麗なグラフとかがギュインギュイン動く」ハッカー系映画に出てくるみたいな画面にしたいと思う。
そこでGrafanaでの可視化、Victoriametricsでの監視・時系列データ集計を行うことにした。
VictoriametricsはおなじみのPrometheusと互換性がある。
prometheusのGitHubリポジトリにあるBlackbox exporterは
The blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, ICMP and gRPC.
らしく、まさしく今回必要としていた「ICMPパケットを送りつけるやつ」としてふさわしい人材だ。
これらの構成をOSに直にぶちこむと渋谷の街みたいなカオスになるので、Dockerという有名コンテナ技術により、もう1段仮想化した環境の上で動かす。(Proxmoxとは違いuserlandより上の仮想化であるが)
要はこういう状況である。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-18.png)
これを実際に動かしたものがこちら。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-9.png)
いい感じに応答速度と生存状況が可視化されている。
ちなみにAlexaたちはICMPを無視するような作りらしく、反応してくれないので除外。
Grafanaからアラートも飛ばせるので、死んだやつが居たらDiscordに通知される仕組みにもなっている。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-10.png)
安全性もだいじ
これでかっこいい監視体制ができあがった。
しかしこれはお家の中で完結している。
おうちのグローバルIPに対して、直にポートを公開するような状態は危険である。そもそもうちはIPv4 over IPv6の都合でWell Known Portsは天岩戸に隠れたアマテラス並に閉ざされている。
尤も、適当なポートでポート開放すれば外から見れなくはないが、セキュリティ的によろしくない。
そこで、これまた自宅クラウド界隈で話題のTailscaleというVPNサービスを用いる。
Grafanaを起動しているコンテナと同じネットワーク内にTailscaleのコンテナも建立することでGrafanaのネットワークとお外のスマホが同一のネットワークにいるかのような状態にできるという算段だ。
これによりどこからでも家の機器の生存チェックができるようになった。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-12.png)
さらにProxmox自体のCPU使用率やディスク使用率の可視化も追加し、最強の監視体制が構築された。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-17.png)
最終的な構成を示す。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-19.png)
保守性もだいじ
Dockerもcompose.ymlでコード化しProxmoxもTerraformでコード化した。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-20.png)
ミニPCが物理的に炎上しても、復活が容易である。
なお冗長化は予算の都合上できていない。
完成。
お家のネットワーク監視は積年の課題だったため、実現できて嬉しい。
この調子で、もっとネットワーク周りも充実させていきたい。
![](https://blogapi.usuyuki.net/content/images/2024/06/image-13.png)
ちなみにこのグラフ上で「病んだ社会人の精神状態」みたいな動きをする機器は某社のスマートリモコンだった。