niikn: самовосстановление обхода (netns-probe+heal+boot-self-heal на OpenWrt, watchdog LXC137) + внешний бэкап-сторож на HOSTKEY (dead-man's switch); скрипты в snippets/niikn-podkop
This commit is contained in:
@@ -1,10 +1,22 @@
|
||||
---
|
||||
name: NIIKN VPN Finland VPS
|
||||
description: VPS 78.17.4.225 (Finland Spaceweb) — VPN, прокси TG/WhatsApp, AmneziaWG. Активен.
|
||||
description: VPS 78.17.4.225 (Finland AdminVPS, НЕ Spaceweb) — VPN-хаб НИИКН. 2026-06-29 простой за неоплату→восстановлен (отсрочка 7д); мониторинг+self-heal настроены; мигрируем на HOSTKEY 151.241.234.241.
|
||||
type: project
|
||||
originSessionId: 8c23ee07-26c7-4c9d-b7cc-8fd9d2b3c266
|
||||
---
|
||||
## VPS 78.17.4.225 (Finland Spaceweb) — АКТИВЕН
|
||||
## VPS 78.17.4.225 (Finland AdminVPS) — восстановлен 2026-06-29 (был DOWN из-за неоплаты)
|
||||
|
||||
## Мониторинг и самовосстановление (настроено 2026-06-29)
|
||||
- **Контейнерный self-heal (на хабе):** все критичные контейнеры `restart: always` + `watchtower` → при снятии блокировки/ребуте VM поднимаются сами.
|
||||
- **Внешний сторож:** `/root/finland-hub-watchdog.sh` на **openclaw LXC 137**, cron `*/5`. Проверяет хаб `78.17.4.225` снаружи (ICMP + TCP 443/9443). Если оба порта молчат → алерт «хаб лёг (возможно неоплата AdminVPS)». **Только алерт** (коробка провайдерская, удалённо не поднять). Канал: TG Олегу (1292155421) + email support@dttb.ru через `/root/.wd-mail.env`; дедуп (раз в час) + «отбой». Образец — `antoshka-watch-self.sh`. Копия: [[../snippets/finland-hub-watchdog]]. NB: SSH:22 хаба для LXC137 закрыт (только Mac-IP) → глубокую проверку handshake оттуда не делаем.
|
||||
- **Self-heal обхода НИИКН (OpenWrt 192.168.1.50) — сделано 2026-06-29:** netns-проба с позиции клиента + heal (restart podkop+cache+dnsmasq) + cron */5 с гистерезисом + boot-self-heal (rc.local). Зависимость `ip-full`+`kmod-veth`. Внешний сторож-алертер на LXC137 (cron */5, heal→reboot эскалация, TG+email).
|
||||
- **Truly-external бэкап — сделано 2026-06-29:** `/root/hub-backup-watchdog.sh` на HOSTKEY 151.241.234.241 (другой провайдер) — независимо следит за хабом + dead-man's switch (живость дома через git.dttb.ru), TG напрямую.
|
||||
- Все скрипты и схема: [[../snippets/niikn-podkop/README]].
|
||||
|
||||
|
||||
> 2026-06-29: весь Docker-стек не слушает порты (22/443/9443/1080/39202 → refused), панель vpn.niikn.com недоступна, AmneziaWG handshake мёртв → лёг весь обход НИИКН (Claude/TG/WA/instagram). ICMP отвечает 18мс, ХОТЯ в норме на этом VPS ICMP закрыт → значит отвечает шлюз провайдера за остановленную VM. SSH:22 refused и с Мака, и с openclaw → удалённо не поднять. Фикс: vps.sweb.ru (it5870yand) → старт/ребут VM, проверить автозапуск docker.
|
||||
|
||||
## VPS 78.17.4.225 — норма (когда работает)
|
||||
|
||||
- Hostname: finlandit5870.com
|
||||
- Ubuntu 22.04, 3.8GB RAM, 30GB disk (42% used)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
date: 2026-06-29
|
||||
type: claude-session
|
||||
session_id: 3f7b109c-e322-4dff-98cc-da2535c42740
|
||||
started: 2026-06-11T08:02:13.684Z
|
||||
ended: 2026-06-29T14:33:27.054Z
|
||||
messages: 35
|
||||
tools: [AskUserQuestion, Bash, Edit, Read, TaskStop, ToolSearch, Write]
|
||||
tags: [claude, session]
|
||||
---
|
||||
|
||||
# Привет на некстклоуд есть папка которую нужно сжать в файлы до 100 мб. https://n
|
||||
|
||||
## Запрос
|
||||
|
||||
Привет на некстклоуд есть папка которую нужно сжать в файлы до 100 мб. https://niikn.com/s/c3kwLWRa8dKX848
|
||||
|
||||
## Итог (последний ответ Claude, до 500 симв.)
|
||||
|
||||
Готово. Подытожу по твоим трём пунктам:
|
||||
|
||||
## 1. Миграция — сохранено на потом
|
||||
План в базе: [2026-06-29-niikn-vpn-hub-migration-adminvps-to-hostkey.md](decisions/2026-06-29-niikn-vpn-hub-migration-adminvps-to-hostkey.md) (статус: отложено, не выполнять без отмашки). Поправил адреса: **`202.71.12.186` = AdminVPS** (не HOSTKEY), реальный HOSTKEY-хаб для переноса — **`151.241.234.241`** (`ssh awg-fi`, AWG 2.0, UDP 41624).
|
||||
|
||||
## 2. Самовосстановление
|
||||
- **На хабе уже есть** и сработало: все контейнеры `r
|
||||
|
||||
---
|
||||
*Автосохранено из session [`3f7b109c`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/3f7b109c-e322-4dff-98cc-da2535c42740.jsonl) — 35 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, TaskStop, ToolSearch, Write*
|
||||
37
snippets/niikn-podkop/README.md
Normal file
37
snippets/niikn-podkop/README.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
date: 2026-06-29
|
||||
type: reference
|
||||
tags: [niikn, podkop, watchdog, monitoring, self-heal]
|
||||
---
|
||||
|
||||
# Самовосстановление + мониторинг обхода/VPN-хаба НИИКН (2026-06-29)
|
||||
|
||||
Поставлено после инцидента «AdminVPS приостановил VM за неоплату → лёг весь обход» + ручной правки залипа sing-box.
|
||||
Три слоя, образец — Бужарово/Бенелюкс ([[../benelux/benelux-podkop-watchdog]]) и `antoshka-watch-self.sh` (LXC137).
|
||||
|
||||
## Слой 1 — самолечение на роутере (OpenWrt НИИКН `192.168.1.50`)
|
||||
Зависимость: `opkg install ip-full kmod-veth` (для netns; kernel-matched 6.6.73, x86_64 — переживает ребут).
|
||||
- `/usr/local/bin/podkop-probe.sh` — проба ОБХОДА С ПОЗИЦИИ КЛИЕНТА через **netns-«LAN-клиент»** (192.168.1.242 на br-lan,
|
||||
трафик client→MikroTik(.1)→tproxy). Ловит залип forward/tproxy, который роутерный curl маскирует. exit 0=ок/1=сломан/2=инфра.
|
||||
- `/usr/local/bin/podkop-heal.sh` — `podkop stop; killall sing-box; rm cache.db; podkop start; **dnsmasq restart**; re-probe` (лок).
|
||||
dnsmasq restart ОБЯЗАТЕЛЕН — иначе старые FakeIP рассинхронятся (грабля 29.06).
|
||||
- `/usr/local/bin/podkop-selfcheck.sh` — **cron `*/5`**: probe; лечит после 2 провалов подряд (гистерезис).
|
||||
- **boot-self-heal** в `/etc/rc.local`: `( sleep 75; podkop-heal.sh ) &` — лечит гонку старта (sing-box раньше awg0) после ребута.
|
||||
|
||||
## Слой 2 — внешний сторож обхода (openclaw LXC137, cron `*/5`)
|
||||
- `/root/niikn-podkop-watchdog.sh` — SSH на роутер → `podkop-probe.sh` (проба с клиента). Если сломан и роутер сам не вылечил:
|
||||
лестница heal→reboot (гистерезис 2, cooldown 5мин, лимит ребутов 2/сутки) + алерт Олегу TG(Антошка)+email `support@dttb.ru`,
|
||||
дедуп + «отбой». Алертит ОТСЮДА, т.к. с коробки за обходом TG недостижим при сломанном обходе.
|
||||
|
||||
## Слой 3 — внешний мониторинг VPN-хаба (две точки)
|
||||
- `/root/finland-hub-watchdog.sh` на **LXC137** (cron `*/5`): TCP 443/9443 хаба `78.17.4.225`. Молчат → «хаб лёг (неоплата?)». TG+email.
|
||||
- `/root/hub-backup-watchdog.sh` на **HOSTKEY `151.241.234.241`** (другой провайдер, чистый EU-инет, cron `*/5`) — **truly-external**:
|
||||
(1) независимо проверяет тот же хаб (переживает падение дома); (2) **dead-man's switch** — curl `git.dttb.ru`; дом недоступен 2× →
|
||||
«дом/LXC137 лёг» (значит слои 1-2 могли замолчать). TG напрямую (токен `/root/.tg-alert.env`).
|
||||
NB: heartbeat LXC137→HOSTKEY:22 не сделать (egress LXC137 на фин. IP таймаутит) — поэтому HOSTKEY сам пингует дом.
|
||||
|
||||
## Контейнерный self-heal на хабе
|
||||
Уже есть до нас: все контейнеры `restart: always` + `watchtower` → при снятии блокировки/ребуте VM поднимаются сами.
|
||||
|
||||
## Чего НЕ покрывает
|
||||
Неоплата/выключение VM провайдером — самолечить нельзя (коробка не наша). Покрыто только алертом (слой 3, two-point).
|
||||
45
snippets/niikn-podkop/hub-backup-watchdog.sh
Normal file
45
snippets/niikn-podkop/hub-backup-watchdog.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
# hub-backup-watchdog.sh — ВНЕШНИЙ (truly-external) бэкап-сторож на HOSTKEY 151.241.234.241
|
||||
# (другой провайдер, чистый EU-интернет → TG напрямую). cron */5. Переживает падение дома/LXC137.
|
||||
# 1) Независимо следит за AdminVPS-хабом НИИКН 78.17.4.225 (ICMP+TCP 443/9443).
|
||||
# 2) Dead-man's switch: проверяет живость дома (git.dttb.ru). Дом недоступен → основной мониторинг
|
||||
# (LXC137) мог лечь → алертит отсюда, через независимый канал.
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
HUB=78.17.4.225
|
||||
HOME_URL=https://git.dttb.ru/
|
||||
CHAT=1292155421
|
||||
. /root/.tg-alert.env 2>/dev/null # TOKEN=...
|
||||
S_HUB=/root/.hub-backup.hub.alert
|
||||
S_HOME=/root/.hub-backup.home.state # "fails" — гистерезис для дома
|
||||
A_HOME=/root/.hub-backup.home.alert
|
||||
send(){ [ -n "$TOKEN" ] && curl -s --max-time 20 "https://api.telegram.org/bot${TOKEN}/sendMessage" \
|
||||
--data-urlencode "chat_id=$CHAT" --data-urlencode "text=$1" >/dev/null 2>&1; }
|
||||
tcp(){ timeout 5 bash -c "echo >/dev/tcp/$HUB/$1" 2>/dev/null && echo 1 || echo 0; }
|
||||
NOW=$(date +%s)
|
||||
|
||||
# 1. Независимая проверка хаба
|
||||
icmp=$(ping -c2 -W2 "$HUB" >/dev/null 2>&1 && echo 1 || echo 0)
|
||||
p443=$(tcp 443); p9443=$(tcp 9443)
|
||||
if [ "$p443" = 0 ] && [ "$p9443" = 0 ]; then
|
||||
msg="🚨 [внешний сторож HOSTKEY] VPN-хаб НИИКН ($HUB) лёг: TCP 443/9443 молчат (ICMP=$icmp). Весь обход недоступен. Проверь AdminVPS (неоплата?)."
|
||||
last=$(cat "$S_HUB" 2>/dev/null || echo 0); [ $((NOW-last)) -gt 3600 ] && { send "$msg"; echo "$NOW" > "$S_HUB"; }
|
||||
echo "ALERT: hub down"
|
||||
else
|
||||
[ -f "$S_HUB" ] && { send "✅ [внешний сторож HOSTKEY] VPN-хаб НИИКН ($HUB) снова в строю."; rm -f "$S_HUB"; }
|
||||
fi
|
||||
|
||||
# 2. Dead-man's switch: живость дома (gitea — стабильный публичный сервис dttb)
|
||||
if curl -s -o /dev/null --max-time 10 -w '%{http_code}' "$HOME_URL" 2>/dev/null | grep -qE '^(200|30.|40.)$'; then
|
||||
echo 0 > "$S_HOME"
|
||||
[ -f "$A_HOME" ] && { send "✅ [внешний сторож HOSTKEY] Дом dttb снова доступен — основной мониторинг (LXC137) жив."; rm -f "$A_HOME"; }
|
||||
else
|
||||
f=$(( $(cat "$S_HOME" 2>/dev/null || echo 0) + 1 )); echo "$f" > "$S_HOME"
|
||||
if [ "$f" -ge 2 ]; then
|
||||
msg="⚠️ [внешний сторож HOSTKEY] Дом dttb недоступен снаружи ($HOME_URL не отвечает, $f проверки подряд) — возможно лёг интернет/инфра дома, а с ним и основной сторож LXC137. Следи за хабом вручную; этот внешний сторож продолжает работать."
|
||||
last=$(cat "$A_HOME" 2>/dev/null || echo 0); [ $((NOW-last)) -gt 3600 ] && { send "$msg"; echo "$NOW" > "$A_HOME"; }
|
||||
echo "ALERT: home unreachable ($f)"
|
||||
else
|
||||
echo "home degraded $f/2"
|
||||
fi
|
||||
fi
|
||||
echo "done (hub 443=$p443 9443=$p9443 icmp=$icmp)"
|
||||
69
snippets/niikn-podkop/niikn-podkop-watchdog.sh
Normal file
69
snippets/niikn-podkop/niikn-podkop-watchdog.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
# niikn-podkop-watchdog.sh — внешний сторож обхода НИИКН (OpenWrt 192.168.1.50). На LXC137, cron */5.
|
||||
# Роутер лечится сам (podkop-selfcheck cron + boot-self-heal). Этот сторож делает ПРОБУ с позиции клиента
|
||||
# (netns-probe на роутере) и АЛЕРТИТ Олегу + эскалирует (heal→reboot) с гистерезисом, если не лечится.
|
||||
# Алертит отсюда, т.к. на коробке за обходом TG недостижим при сломанном обходе. Образец: benelux-podkop-watchdog.sh
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
ROUTER=192.168.1.50
|
||||
SSH="sshpass -p 1qaz!QAZ ssh -o StrictHostKeyChecking=no -o ConnectTimeout=8 root@$ROUTER"
|
||||
CFG=/root/.openclaw/openclaw.json
|
||||
CHAT=1292155421
|
||||
STATE=/root/.niikn-pk-wd.state
|
||||
ALERT=/root/.niikn-pk-wd.alert
|
||||
REBOOTS=/root/.niikn-pk-wd.reboots
|
||||
COOLDOWN=/run/niikn-pk-wd.cooldown
|
||||
COOLDOWN_SEC=300
|
||||
REBOOT_CAP=2
|
||||
TOKEN=$(grep -oE '[0-9]{8,}:[A-Za-z0-9_-]{30,}' "$CFG" 2>/dev/null | head -1)
|
||||
send(){
|
||||
[ -n "$TOKEN" ] && curl -s --max-time 20 "https://api.telegram.org/bot${TOKEN}/sendMessage" \
|
||||
--data-urlencode "chat_id=$CHAT" --data-urlencode "text=$1" >/dev/null 2>&1
|
||||
[ -f /root/.wd-mail.env ] && . /root/.wd-mail.env
|
||||
if [ -n "${MAILTO:-}" ]; then
|
||||
printf 'From: dttb watchdog <%s>\nTo: %s\nSubject: %s\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nDate: %s\n\n%s\n' \
|
||||
"$SMTPUSER" "$MAILTO" "[NIIKN podkop] watchdog" "$(date -R)" "$1" > /tmp/.niiknwd.eml
|
||||
curl -s --max-time 25 --url "smtp://${MAILHOST}:587" --ssl-reqd --resolve "${MAILHOST}:587:${MAILIP}" \
|
||||
--mail-from "$SMTPUSER" --mail-rcpt "$MAILTO" --user "${SMTPUSER}:${SMTPPASS}" --upload-file /tmp/.niiknwd.eml >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
NOW=$(date +%s); TODAY=$(date +%F)
|
||||
|
||||
# роутер/проба достижимы?
|
||||
if ! $SSH 'test -x /usr/local/bin/podkop-probe.sh' 2>/dev/null; then
|
||||
if ping -c2 -W2 "$ROUTER" >/dev/null 2>&1; then iss="• OpenWrt НИИКН пингуется, но SSH/probe недоступен (NetBird/dropbear?).\n"
|
||||
else iss="• OpenWrt НИИКН ($ROUTER) недоступен (ни ping, ни SSH) — туннель/роутер/VM лёг.\n"; fi
|
||||
h=$(printf '%s' "$iss" | md5sum | cut -d' ' -f1)
|
||||
[ "$(cat "$ALERT" 2>/dev/null)" = "$h" ] && exit 0
|
||||
echo "$h" > "$ALERT"; send "$(printf '⚠️ Обход НИИКН:\n%b' "$iss")"; echo "UNREACHABLE"; exit 0
|
||||
fi
|
||||
|
||||
$SSH '/usr/local/bin/podkop-probe.sh' 2>/dev/null; rc=$?
|
||||
|
||||
if [ "$rc" = "0" ]; then
|
||||
rm -f "$STATE"
|
||||
if [ -f "$ALERT" ]; then send "✅ Обход НИИКН снова работает (проба с клиента OK)."; rm -f "$ALERT"; fi
|
||||
echo "OK: обход НИИКН здоров (проба с клиента)."; exit 0
|
||||
fi
|
||||
[ "$rc" = "2" ] && { echo "infra (DNS/netns) — не лечим podkop"; exit 0; }
|
||||
|
||||
# rc=1 — сломан. Гистерезис: даём роутеру шанс полечиться самому (selfcheck) до 2 провалов.
|
||||
FAILS=0; STEP=0; [ -f "$STATE" ] && read -r FAILS STEP < "$STATE"; FAILS=$((${FAILS:-0}+1))
|
||||
if [ "$FAILS" -lt 2 ]; then echo "$FAILS $STEP" > "$STATE"; echo "DEGRADED $FAILS/2 (жду самолечения роутера)"; exit 0; fi
|
||||
if [ -f "$COOLDOWN" ] && [ $((NOW-$(cat "$COOLDOWN" 2>/dev/null||echo 0))) -lt "$COOLDOWN_SEC" ]; then echo "$FAILS $STEP" > "$STATE"; echo cooldown; exit 0; fi
|
||||
|
||||
iss="• Обход НИИКН сломан с позиции клиента ($FAILS проб подряд, роутер сам не вылечил).\n"; heal=""
|
||||
case "$STEP" in
|
||||
0) $SSH '/usr/local/bin/podkop-heal.sh' >/dev/null 2>&1
|
||||
heal="🔧 Шаг1: принудительный heal (restart podkop + cache + dnsmasq).\n"; STEP=1; echo "$NOW" > "$COOLDOWN" ;;
|
||||
1) RDAY=""; RCNT=0; [ -f "$REBOOTS" ] && read -r RDAY RCNT < "$REBOOTS"; [ "$RDAY" != "$TODAY" ] && { RDAY=$TODAY; RCNT=0; }
|
||||
if [ "${RCNT:-0}" -lt "$REBOOT_CAP" ]; then
|
||||
$SSH 'reboot' >/dev/null 2>&1; echo "$TODAY $((RCNT+1))" > "$REBOOTS"
|
||||
heal="🔧 Шаг2: heal не помог → перезагружаю роутер (ребут $((RCNT+1))/$REBOOT_CAP сегодня).\n"; STEP=2; echo "$NOW" > "$COOLDOWN"
|
||||
else iss="${iss}• Лимит ребутов на сегодня исчерпан.\n"; STEP=2; fi ;;
|
||||
*) iss="${iss}• Автолечение не помогло (все шаги пройдены) — нужно руками.\n" ;;
|
||||
esac
|
||||
echo "$FAILS $STEP" > "$STATE"
|
||||
h=$(printf '%s%s' "$iss" "$heal" | md5sum | cut -d' ' -f1)
|
||||
[ "$(cat "$ALERT" 2>/dev/null)" = "$h" ] && exit 0
|
||||
echo "$h" > "$ALERT"
|
||||
send "$(printf '⚠️ Обход НИИКН — сбой:\n%b\n%b' "$iss" "$heal")"
|
||||
19
snippets/niikn-podkop/podkop-heal.sh
Normal file
19
snippets/niikn-podkop/podkop-heal.sh
Normal file
@@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
# podkop-heal.sh (NIIKN OpenWrt) — лечение залипа forward/tproxy sing-box.
|
||||
# Чистый перезапуск podkop + сброс FakeIP-кэша + ОБЯЗАТЕЛЬНО dnsmasq restart (иначе старые FakeIP
|
||||
# у dnsmasq/клиентов рассинхронятся — грабля 2026-06-29), затем re-probe. Лок от гонок.
|
||||
LOCK=/tmp/.pkheal.lock
|
||||
now=$(date +%s)
|
||||
[ -f "$LOCK" ] && [ $((now - $(cat "$LOCK" 2>/dev/null || echo 0))) -lt 120 ] && exit 0
|
||||
echo "$now" > "$LOCK"
|
||||
logger -t podkop-heal "heal: podkop restart + cache flush + dnsmasq restart"
|
||||
/etc/init.d/podkop stop 2>/dev/null
|
||||
killall sing-box 2>/dev/null
|
||||
rm -f /tmp/sing-box/cache.db
|
||||
/etc/init.d/podkop start 2>/dev/null
|
||||
sleep 12
|
||||
/etc/init.d/dnsmasq restart 2>/dev/null
|
||||
sleep 3
|
||||
rm -f "$LOCK"
|
||||
/usr/local/bin/podkop-probe.sh
|
||||
exit $?
|
||||
26
snippets/niikn-podkop/podkop-probe.sh
Normal file
26
snippets/niikn-podkop/podkop-probe.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
# podkop-probe.sh (NIIKN OpenWrt 192.168.1.50) — проба обхода ИЗ-ЗА КЛИЕНТА.
|
||||
# netns-«LAN-клиент» на br-lan: трафик идёт client→MikroTik(.1)→OpenWrt-tproxy, как у реального ПК —
|
||||
# в отличие от роутерного curl (output-путь), который маскирует залип forward/tproxy.
|
||||
# exit 0 = обход у клиентов работает; 1 = сломан (повод лечить); 2 = инфра (не повод лечить podkop).
|
||||
NS=pkprobe; GW=192.168.1.1; DNS=192.168.1.50; CIP=192.168.1.242
|
||||
cleanup(){ ip netns del $NS 2>/dev/null; ip link del veth-h 2>/dev/null; }
|
||||
cleanup
|
||||
ip link add veth-h type veth peer name veth-p 2>/dev/null || exit 2
|
||||
ip netns add $NS 2>/dev/null || { cleanup; exit 2; }
|
||||
ip link set veth-p netns $NS
|
||||
ip link set veth-h master br-lan; ip link set veth-h up
|
||||
ip netns exec $NS ip link set lo up
|
||||
ip netns exec $NS ip link set veth-p up
|
||||
ip netns exec $NS ip addr add $CIP/24 dev veth-p
|
||||
ip netns exec $NS ip route add default via $GW
|
||||
FIP=$(ip netns exec $NS nslookup web.telegram.org $DNS 2>/dev/null | awk '/^Address[ :]/{a=$NF} END{print a}')
|
||||
case "$FIP" in
|
||||
198.1[89].*) : ;; # домен заворачивается в туннель — ок
|
||||
"") cleanup; exit 2 ;; # DNS молчит — инфра
|
||||
*) cleanup; exit 1 ;; # не FakeIP — списки/FakeIP сломаны
|
||||
esac
|
||||
CODE=$(ip netns exec $NS curl -s -o /dev/null -w '%{http_code}' --resolve web.telegram.org:443:"$FIP" --max-time 8 https://web.telegram.org/ 2>/dev/null)
|
||||
cleanup
|
||||
[ "$CODE" = "200" ] || [ "$CODE" = "302" ] && exit 0
|
||||
exit 1
|
||||
15
snippets/niikn-podkop/podkop-selfcheck.sh
Normal file
15
snippets/niikn-podkop/podkop-selfcheck.sh
Normal file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
# podkop-selfcheck.sh (NIIKN OpenWrt) — cron */5. Автономное самолечение с гистерезисом:
|
||||
# лечим только после 2 провалов подряд (не дёргаем podkop на одиночном блипе). exit 2 (инфра) не считаем.
|
||||
ST=/tmp/.pkprobe.fails
|
||||
/usr/local/bin/podkop-probe.sh; rc=$?
|
||||
if [ "$rc" = "1" ]; then
|
||||
f=$(( $(cat "$ST" 2>/dev/null || echo 0) + 1 )); echo "$f" > "$ST"
|
||||
logger -t podkop-selfcheck "probe broken ($f/2)"
|
||||
if [ "$f" -ge 2 ]; then
|
||||
logger -t podkop-selfcheck "healing"
|
||||
/usr/local/bin/podkop-heal.sh; echo 0 > "$ST"
|
||||
fi
|
||||
else
|
||||
echo 0 > "$ST"
|
||||
fi
|
||||
Reference in New Issue
Block a user