Перейти к содержимому

Уведомления о VPN

VPN-клиенты обычно «молча» теряют соединение и просто пытаются переподключиться. Заметить это сразу важно: иногда трафик начинает идти по основному каналу, а этого нельзя.

NetworkManager умеет вызывать скрипты при поднятии/опускании интерфейса — из директории /etc/NetworkManager/dispatcher.d/.

/etc/NetworkManager/dispatcher.d/90-notifly-vpn:

#!/usr/bin/env bash
set -eu
set -a; source /etc/notifly.env; set +a
INTERFACE=$1
ACTION=$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
;;
esac
Окно терминала
sudo chmod 755 /etc/NetworkManager/dispatcher.d/90-notifly-vpn
sudo chown root:root /etc/NetworkManager/dispatcher.d/90-notifly-vpn

Если используете 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/local/bin/notifly-vpn-check
#!/usr/bin/env bash
set -eu
set -a; source /etc/notifly.env; set +a
CHECK_HOST=10.10.0.1 # IP внутри VPN-сети
STATE=/var/lib/notifly-vpn.state
PREV=$(cat "$STATE" 2>/dev/null || echo OK)
if ping -c1 -W2 "$CHECK_HOST" >/dev/null 2>&1; then
NOW=OK
else
NOW=FAIL
fi
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
fi
fi
echo "$NOW" > "$STATE"

В cron каждую минуту:

* * * * * /usr/local/bin/notifly-vpn-check
  • Никаких «утечек» в обычный канал. Сразу видно, что VPN упал — успеете закрыть Slack/IDE.
  • Контроль за сменой IP. Если IP внутри VPN изменился (другой сервер) — тоже сообщение.
  • На корпоративе: push владельцу VPN-сервера о клиентских реконнектах.
  • Прикладывать в сообщение traceroute до контрольного хоста.
  • На приоритете 9 + кастомный звук — отдельная мелодия для «VPN down».