找回密碼
 立即註冊
    查看: 176|回覆: 0

    網路掛了自己修:分層偵測腳本、Zigbee 插座重開數據機,和 HA 上的斷線統計

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 11:06:48 | 顯示全部樓層 |閱讀模式
    網路偶爾會掛,而且常常是在你不在家的時候。

    這篇做三件事:讓路由器自己分層判斷、自己用最小的動作修;讓 HA 在路由器也救不回來時斷電重開數據機;並且把每一次斷線記下來,之後跟 ISP 客訴有憑據。

    這篇做三件事

    做完這篇你會有什麼


    • 一支跑在路由器上的分層檢查腳本,由輕到重逐步升級處理
    • HA 裡兩顆可靠的偵測實體(外網通不通、DNS 通不通)
    • 一條「網路斷十分鐘就斷電重開數據機」的自動化,含防迴圈保護
    • 每月斷線次數與總時數的統計


    ---

    第一部分:先分清楚斷在哪個環節

    「網路不通」可能是六個環節之一出問題,而不同環節要用不同的方法修。


    • 環節 1:你的裝置到路由器(Wi-Fi 訊號差、網路線鬆了)
    • 環節 2:路由器本身(當機、記憶體滿、連線表爆掉)
    • 環節 3:路由器到數據機(線鬆、數據機當機)
    • 環節 4:數據機到 ISP(PPPoE 掉線)
    • 環節 5:ISP 自己出問題
    • 環節 6:DNS 解析失敗(IP 通得到,但網址打不開)


    一律「重開路由器」是很粗糙的做法,而且有一半的情況沒用 —— DNS 壞掉時重開路由器只是讓你多斷線兩分鐘。

    怎麼分辨:不要只 ping 一個地方
    1. # 壞的做法:只測一個目標
    2. ping -c 3 8.8.8.8
    3. # 好的做法:分層測
    4. ping -c 2 192.168.1.1        # 路由器通嗎(環節 1、2)
    5. ping -c 2 1.1.1.1            # 外網 IP 通嗎(環節 3、4、5)
    6. nslookup google.com          # DNS 通嗎(環節 6)
    複製代碼

    三個結果的意思:


    • 路由器通、外網不通 → 重撥 PPPoE 或重開數據機。不要重開路由器
    • 外網 IP 通、DNS 不通 → 重啟 DNS 服務就好
    • 路由器都不通 → 這才是重開路由器的時機


    還有一點:不要只測一個目標。1.1.1.1 自己也會出問題,而且它出問題時你會以為自己的網路壞了。
    1. for ip in 1.1.1.1 8.8.8.8 9.9.9.9; do
    2.     ping -c 1 -W 2 $ip > /dev/null 2>&1 && echo OK && break
    3. done
    複製代碼

    三個裡有一個通就算通。

    ---

    三個裡有一個通就算通。

    第二部分:在 OpenWrt 上自動修復

    步驟 1:把腳本放上去

    SSH 進路由器(`ssh root@192.168.1.1`),建立 `/root/netcheck.sh`:
    1. #!/bin/sh
    2. # /root/netcheck.sh
    3. # 分層檢查,只做最小必要的修復動作
    4. LOG=/tmp/netcheck.log
    5. STATE=/tmp/netcheck.state
    6. log() { echo "[$(date '+%F %T')] $*" >> "$LOG"; }
    7. # 保留最後 500 行,避免 /tmp 被塞爆(/tmp 在 OpenWrt 是記憶體)
    8. tail -n 500 "$LOG" > "$LOG.tmp" 2>/dev/null && mv "$LOG.tmp" "$LOG"
    9. check_outside() {
    10.     for ip in 1.1.1.1 8.8.8.8 9.9.9.9; do
    11.         ping -c 1 -W 3 "$ip" > /dev/null 2>&1 && return 0
    12.     done
    13.     return 1
    14. }
    15. check_dns() {
    16.     nslookup google.com > /dev/null 2>&1
    17. }
    18. if check_outside; then
    19.     # 外網通,順便檢查 DNS
    20.     if ! check_dns; then
    21.         log "外網通但 DNS 失敗,重啟 dnsmasq"
    22.         /etc/init.d/dnsmasq restart
    23.     fi
    24.     echo 0 > "$STATE"
    25.     exit 0
    26. fi
    27. # 外網不通,累計失敗次數
    28. FAIL=$(cat "$STATE" 2>/dev/null || echo 0)
    29. FAIL=$((FAIL + 1))
    30. echo "$FAIL" > "$STATE"
    31. log "外網不通(第 $FAIL 次)"
    32. # 連續失敗三次才動作,避免短暫抖動就重撥
    33. if [ "$FAIL" -lt 3 ]; then
    34.     exit 0
    35. fi
    36. if [ "$FAIL" -eq 3 ]; then
    37.     log "重撥 WAN"
    38.     ifup wan
    39.     exit 0
    40. fi
    41. if [ "$FAIL" -eq 6 ]; then
    42.     log "重撥沒用,重啟網路服務"
    43.     /etc/init.d/network restart
    44.     exit 0
    45. fi
    46. if [ "$FAIL" -ge 10 ]; then
    47.     log "還是不通,重新開機"
    48.     echo 0 > "$STATE"
    49.     reboot
    50. fi
    複製代碼

    怎麼把這段放到路由器上:用 `vi /root/netcheck.sh` 貼進去,或在電腦上存成檔案再 `scp netcheck.sh root@192.168.1.1:/root/`。

    給執行權限:
    1. chmod +x /root/netcheck.sh
    複製代碼

    步驟 2:先手動跑一次

    不要直接加進排程。先確認它在網路正常時不會亂動作。
    1. /root/netcheck.sh
    2. echo "離開碼:$?"
    3. cat /tmp/netcheck.state
    4. cat /tmp/netcheck.log
    複製代碼

    你會看到什麼(網路正常時):


    • 離開碼是 0
    • `/tmp/netcheck.state` 的內容是 0
    • `/tmp/netcheck.log` 是空的或不存在(正常時不寫記錄)


    以下還有約 80% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-11-10 00:55 , Processed in 0.159302 second(s), 25 queries .

    快速回覆 返回頂部 返回列表