LINUX.ORG.RU
ФорумAdmin

wireguard и повтороное подключение raspberry pi

 ,


0

3

Смысл в чем, есть wireguard server, куча клиентов, все работает норм, но это было пока не появились станции на raspberry pi. Эти падлы, не умеют нормально выключаться и просто вырубаются по питанию, это приводит к тому что raspberry выключен, а wireguard server все еще думает что соединение установлено и когда raspberry поднимается, то оно не может уже подключиться. Так как для сервера соеденение уже установлено. raspberry находятся за nat. Как это можно побороть? Перезапуск сервиса wireguard не хороший вариант, так как после перезапука они начанают работать, но при этом на минуту ложится все сеть wireguard.

Параметр PersistentKeepalive = 20 стоит. Не помогает


Когда крайний раз натыкался, это не лечилось. Подпишусь, может, кто добился корректной работы.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Прбовал прибить peer зависший:

wg set wg0 peer Un+7zzxxxxxricBdfla4x+nj2UU25hGGQ3+xx6GiIhE= remove

но это приводит только к опять же полному перезапуску все сети

Проще уже сразу выполнить systemctl restart wg-quick@wg0.service

iliaxxx
() автор топика

Может глушить ей сеть перед «выключением»? Перезапускаться всё равно с руки, тут ничего не сделать, только релюшками обвешаться...

kirill_rrr ★★★★★
()
Ответ на: комментарий от iliaxxx

Основной костыль - один пир - один интерфейс и да, рестарт. Но это тоже жопа.

Anoxemian ★★★★★
()
Ответ на: комментарий от iliaxxx

после wg set … remove

делай не рестарт, а релоад

The strip command is useful for reloading configuration files without disrupting active sessions:

       # wg syncconf wgnet0 <(wg-quick strip wgnet0)

или systemctl reload wg-quick@wg0.service

работает без разрывов

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от futurama

Хорошо, допустим

#wg set wg0 peer Un+……….= remove #systemctl reload wg-quick@wg0.service

Это рабочий вариант если у тебя есть один такой девайс, а у меня планируется больше 20. И каждый вот так ручками глушить…

Есть какой то автоматизированный вариант, что бы он раз в 30 секунд peer и если peer поднят а рукопожатия нет уже больше 20 секунд то он выполнял бы wg set wg0 peer с нужным ID remove и systemctl reload wg-quick@wg0.service

iliaxxx
() автор топика
Ответ на: комментарий от iliaxxx

wg show | grep -B3 'hours,' | awk '$1 == "peer:" {print "wg set wg0 peer",$2,"remove"}' | sh

systemctl reload wg-quick@wg0.service 

это grep -B3 'hours,' на строки latest handshake: … hours, …

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)
Ответ на: комментарий от futurama

Вот готовое решение, у меня сработало. Главное что бы rasberry хотя бы пару минут была бы выключена.

#!/bin/bash
# Автоматическое завершение peer'ов WireGuard без рукопожатия более 60 секунд

# Имя интерфейса (например wg0)
WG_INTERFACE="wg0"

# Лимит бездействия (в секундах)
INACTIVE_TIMEOUT=60

# Получаем текущее UNIX-время
NOW=$(date +%s)

# Проходим по всем peer'ам
sudo wg show "$WG_INTERFACE" | awk '
  /^peer:/ {peer=$2}
  /latest handshake:/ {
    if ($3 == "Never") {print peer, "0"}
    else {
      cmd = "date -d \"" $3" "$4" "$5" "$6" "$7" "$8"\" +%s"
      cmd | getline ts
      close(cmd)
      print peer, ts
    }
  }
' | while read PEER LAST_HANDSHAKE; do
    # Если рукопожатия не было никогда — считаем как 0
    if [[ "$LAST_HANDSHAKE" -eq 0 ]]; then
        AGE=$((INACTIVE_TIMEOUT + 1))
    else
        AGE=$((NOW - LAST_HANDSHAKE))
    fi

    if [[ "$AGE" -gt "$INACTIVE_TIMEOUT" ]]; then
        echo "⏱  Peer $PEER неактивен $AGE сек — удаляю..."
        sudo wg set "$WG_INTERFACE" peer "$PEER" remove
    else
        echo "✅ Peer $PEER активен ($AGE сек)"
    fi
done
systemctl reload wg-quick@wg0.service
iliaxxx
() автор топика
Последнее исправление: iliaxxx (всего исправлений: 1)
Ответ на: комментарий от iliaxxx

Вот в отредактированном варианте, а то в первом варианте с PATH проблемы, если выполнять через cron

#!/bin/bash
# /usr/local/bin/wg-clean.sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

WG_INTERFACE="wg0"
INACTIVE_TIMEOUT=60
NOW=$(date +%s)

# Проверяем, что интерфейс существует
if ! /usr/bin/wg show "$WG_INTERFACE" >/dev/null 2>&1; then
    echo "$(date) — интерфейс $WG_INTERFACE не найден."
    exit 0
fi

/usr/bin/wg show "$WG_INTERFACE" | awk '
  /^peer:/ {peer=$2}
  /latest handshake:/ {
    if ($3 == "Never") {print peer, "0"}
    else {
      cmd = "date -d \"" $3" "$4" "$5" "$6" "$7" "$8"\" +%s"
      cmd | getline ts
      close(cmd)
      print peer, ts
    }
  }
' | while read PEER LAST_HANDSHAKE; do
    if [[ "$LAST_HANDSHAKE" -eq 0 ]]; then
        AGE=$((INACTIVE_TIMEOUT + 1))
    else
        AGE=$((NOW - LAST_HANDSHAKE))
    fi

    if [[ "$AGE" -gt "$INACTIVE_TIMEOUT" ]]; then
        echo "$(date) — ⏱  Peer $PEER неактивен $AGE сек — удаляю..."
        /usr/bin/wg set "$WG_INTERFACE" peer "$PEER" remove
    else
        echo "$(date) — ✅ Peer $PEER активен ($AGE сек)"
    fi
done

/bin/systemctl reload wg-quick@wg0.service

И как настроить cron что бы выполнялось каждые 30 секунд

* * * * * /WGservise.sh
* * * * * sleep 30 && /WGservise.sh
iliaxxx
() автор топика

Параметр PersistentKeepalive = 20 стоит. Не помогает

Где? На raspberry ок. На сервере не нужен

И почему 20? Официальные доки wireguard рекомендуют 25

NyXzOr ★★★★★
()
Последнее исправление: NyXzOr (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

Не знаю, может быть не идеально, часть кода сделана при помощи ИИ. Но оно работает. Если есть идеи можешь свой вариант выложить, или посоветовать что можно тут оптимизировать.

Факт в том, что теперь raspberry подключается и не нужно в ручную лезть на сервер и прибивать сессию зависшую.

iliaxxx
() автор топика
Ответ на: комментарий от NyXzOr

25 тоже пробовал, ничего не меняется. 20 это текущее значение. Я пробовал как увеличивать, так и уменьшать это время.

iliaxxx
() автор топика
Ответ на: комментарий от iliaxxx

не вижу ответ на «Где?»

У меня на роутерах стоит wireguard и на телефонах. Сомневаюсь, что они умеет корректно закрывать соединения, если роутер выдернуть из розетки или если обрыв связи.

Вообще, вопрос к знатокам: в udp есть завершающий соединение «пакет»?

NyXzOr ★★★★★
()
Последнее исправление: NyXzOr (всего исправлений: 1)
Ответ на: комментарий от iliaxxx

Ну ты наворотил

При «latest handshake» > 60 сек, в выводе wg show появляется слово «minute»

latest handshake: 1 minute, 5 seconds ago
latest handshake: 2 minutes, 2 seconds ago

поэтому

wg show | grep -B3 'latest handshake:.*minute' | awk '$1 == "peer:" {print "wg set wg0 peer",$2,"remove"}'

прекрасно отработает

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)

А еще вам точно нужны периодические рукопожатия? Нужен доступ к raspberry с сервера?

NyXzOr ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.