🛜

社内ネットワークの死活監視機構をRaspberry Pi 4で作った話_無線編

に公開

ぴぴーーーん!!!!
社内ネットワークの管理もしてますケンシロウです!

https://qiita.com/advent-calendar/2025/genda

今回は社内NWの監視機構をラズパイで作りました!っていう話なので「なんか楽しそう」が伝わればいいかなと思います!!

1.背景

今年の8月ごろに引っ越しがあり、新しくネットワーク機器などを導入して運用しています。
最初は整っておらずトラブルも多かったものの、ようやく多少は落ち着いてきました。
ただ、外から監視する仕組みがなかったのでどうしようかなーと思っていたのですが、
ここ最近データチームの同僚やGiGOのメカニックさんとラズパイで色々やってたことから、
ラズパイでいけそうじゃない?ということになり作ってみました。

2.用意するもの

3.無線監視

無線はSSID分子機を用意して、Cronチェックで接続が切れたらSlackに通知するようにしてます

3.設定方法

事前準備

アラート用のチャンネルを作成してWebhookのURLを発行して控えておきましょう。
(設定詳細は省きます)

事前インストール

apt install -y dkms git
git clone https://github.com/morrownr/8821au-20210708.git
cd 8821au-20210708
sudo ./install-driver.sh

wlanへ特定のSSIDを接続するコマンド

sudo nmcli dev wifi connect "SSID名" password "パスワード" ifname wlan[数字]

監視するpythonファイル

import subprocess
import requests
import sys

# --- 設定 ---
# 監視対象 (Google Public DNS)
TARGET_IP = "8.8.8.8"

# インターフェースと監視対象SSIDの対応表
# iwconfigの結果に合わせて設定しました
SSID_MAP = {
    "wlan0": "ssid0",   # 内蔵Wi-Fi
    "wlan1": "ssid1",   # USBアダプタ1
    "wlan2": "ssid2",   # USBアダプタ2
    "wlan3": "ssid3"    # USBアダプタ3
}

# Slack Webhook URL
WEBHOOK_URL = "https://hooks.slack.com/services/hogehoge"
def check_ping(interface):
    """
    指定したインターフェースからPingを打つ
    """
    try:
        # -I でインターフェースを指定してPing
        command = ["/bin/ping", "-I", interface, "-c", "1", "-W", "2", TARGET_IP]
        subprocess.check_output(command, stderr=subprocess.STDOUT)
        return True
    except subprocess.CalledProcessError:
        return False

def send_slack(message):
    """
    Slackに通知を送る
    """
    payload = {"text": message}
    try:
        requests.post(WEBHOOK_URL, json=payload, timeout=5)
    except Exception as e:
        print(f"Slack送信エラー:: {e}")

# --- main ----
if __name__ == "__main__":
    
    # 登録されているインターフェースを順番にチェック
    for iface, ssid_name in SSID_MAP.items():
        
        print(f"--- {iface} ({ssid_name}) チェック開始 ---")
        
        if check_ping(iface):
            print(f"[{iface}] status: OK")
        else:
            print(f"[{iface}] status: NG")
            # 切れている方のSSID名を通知
            msg = f"<@slackuserid> \n ⚠️ 【障害検知】Wi-Fi (*{ssid_name}*) がインターネットに接続できません。"
            send_slack(msg)
    print("全チェック完了")

cron無線NW監視

sudo crontab -e
*/5 * * * * /usr/bin/python3 ~/hoge/hogehoge.py >> ~/hoge/hoge-check.log 2>&1

4.検証

TARGET_IP = "8.8.8.8"のところを"192.0.2.0"とかにして動かしてみましょう

単体テスト

sudo python3 ~/hoge/hogehoge.py

実行結果

メッセージがどうなっているかはpythonのプログラム側を見てください

5.まとめ

案外簡単に作れました!
これでも今のままだと有線LANの方のネットワークが壊れたら使えないので、
次回は有線側はどうしたかを説明しますので乞うご期待!
ちなみに子機の電波が弱いとよく切れますのでそこだけお気をつけw

やっぱりハードは楽しい!!!

GENDA

Discussion