Уведомления о VPN
VPN-клиенты обычно «молча» теряют соединение и просто пытаются переподключиться. Заметить это сразу важно: иногда трафик начинает идти по основному каналу, а этого нельзя.
Linux + NetworkManager
Заголовок раздела «Linux + NetworkManager»NetworkManager умеет вызывать скрипты при поднятии/опускании интерфейса —
из директории /etc/NetworkManager/dispatcher.d/.
/etc/NetworkManager/dispatcher.d/90-notifly-vpn:
#!/usr/bin/env bashset -euset -a; source /etc/notifly.env; set +a
INTERFACE=$1ACTION=$2
# Реагируем только на VPN-интерфейсы (tun*/wg*/ppp*).case "$INTERFACE" in tun*|wg*|ppp*) ;; *) exit 0 ;;esac
send() { curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ --data "$(jq -n --arg t "$1" --arg m "$2" --argjson p "$3" \ '{title:$t, message:$m, priority:$p}')" >/dev/null}
case "$ACTION" in vpn-up) IP=$(ip -4 addr show "$INTERFACE" | awk '/inet /{print $2}') send "🟢 VPN $INTERFACE up" "IP: $IP" 3 ;; vpn-down) send "🔴 VPN $INTERFACE down" "Туннель закрыт. Проверьте подключение." 7 ;;esacsudo chmod 755 /etc/NetworkManager/dispatcher.d/90-notifly-vpnsudo chown root:root /etc/NetworkManager/dispatcher.d/90-notifly-vpnWireguard напрямую
Заголовок раздела «Wireguard напрямую»Если используете wg-quick без NetworkManager, добавьте в конфиг
/etc/wireguard/wg0.conf:
[Interface]PostUp = curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" -H "Content-Type: application/json" -d '{"title":"🟢 wg0 up","priority":3}'PostDown = curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" -H "Content-Type: application/json" -d '{"title":"🔴 wg0 down","priority":7}'(переменные подставьте через EnvironmentFile= в systemd-юните wg-quick@).
Watchdog: проверять, что туннель действительно живой
Заголовок раздела «Watchdog: проверять, что туннель действительно живой»Туннель может «висеть как поднятый», но трафик не идёт. Заведите проверку:
#!/usr/bin/env bashset -euset -a; source /etc/notifly.env; set +a
CHECK_HOST=10.10.0.1 # IP внутри VPN-сетиSTATE=/var/lib/notifly-vpn.statePREV=$(cat "$STATE" 2>/dev/null || echo OK)
if ping -c1 -W2 "$CHECK_HOST" >/dev/null 2>&1; then NOW=OKelse NOW=FAILfi
if [[ "$NOW" != "$PREV" ]]; then if [[ "$NOW" == "FAIL" ]]; then curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"title":"⚠️ VPN не отвечает","message":"Пинг до '"$CHECK_HOST"' не проходит.","priority":7}' >/dev/null else curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"title":"✅ VPN восстановлен","priority":3}' >/dev/null fifiecho "$NOW" > "$STATE"В cron каждую минуту:
* * * * * /usr/local/bin/notifly-vpn-check- Никаких «утечек» в обычный канал. Сразу видно, что VPN упал — успеете закрыть Slack/IDE.
- Контроль за сменой IP. Если IP внутри VPN изменился (другой сервер) — тоже сообщение.
- На корпоративе: push владельцу VPN-сервера о клиентских реконнектах.
Что улучшить дальше
Заголовок раздела «Что улучшить дальше»- Прикладывать в сообщение
tracerouteдо контрольного хоста. - На приоритете 9 + кастомный звук — отдельная мелодия для «VPN down».