Таймаут oneshot systemd для Wireguard(tuntap)

Вопрос или проблема

Среда

Это VPS сервер Ubuntu 22.04.5. Wireguard использует tuntap вместо модификации ядра.

Скрипт

/etc/wireguard/gw0.sh может корректно запустить wireguard, если выполнить его из командной строки:

# очистка
echo "$(date) - очистка"
/usr/sbin/ip link del gw0 2>&1
/usr/sbin/iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE 2>&1

# настройка
echo "$(date) - настройка"
#/usr/sbin/ip tuntap add dev gw0 mode tun
/usr/bin/wireguard gw0 2>&1
/usr/sbin/ip a add 10.0.0.1/24 dev gw0
/usr/bin/wg set gw0 listen-port 12345
/usr/bin/wg set gw0 private-key /etc/wireguard/gw0.key
# wg0
/usr/bin/wg set gw0 peer <wg0 key> allowed-ips 10.0.0.2/32
# wg1
/usr/bin/wg set gw0 peer <wg1 key> allowed-ips 10.0.0.3/32

# запуск
echo "$(date) - запуск"
/usr/sbin/ip link set gw0 up 2>&1
/usr/sbin/iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE 2>&1

# конец
echo "$(date) - конец"

exit 0

Вывод:

# /etc/wireguard/gw0.sh
Чт Дек  5 10:03:32 EST 2024 - очистка
Не удается найти устройство "gw0"
Чт Дек  5 10:03:32 EST 2024 - настройка
┌──────────────────────────────────────────────────────┐
│                                                      │
│   Запуск wireguard-go не требуется, поскольку это   │
│   ядро имеет первоклассную поддержку WireGuard. Для  │
│   получения информации об установке модуля ядра,    │
│   пожалуйста, посетите:                             │
│         https://www.wireguard.com/install/           │
│                                                      │
└──────────────────────────────────────────────────────┘
Чт Дек  5 10:03:32 EST 2024 - запуск
Чт Дек  5 10:03:33 EST 2024 - конец

Служба Systemd

/etc/systemd/system/gw0.service:

[Unit]
Description = Запуск Wireguard gw0
After = network-online.target
Wants = network-online.target
[Service]
Type = oneshot
ExecStart = /usr/bin/bash -c "/etc/wireguard/gw0.sh >> /tmp/gw0.log"

[Install]
WantedBy=multi-user.target

Запуск службы всегда приводит к ошибке тайм-аута, и ни один процесс wireguard не запускается:

# systemctl start gw0.service
Работа для gw0.service не удалась, потому что был превышен тайм-аут.
Смотрите "systemctl status gw0.service" и "journalctl -xeu gw0.service" для деталей.

# systemctl status gw0.service
× gw0.service - Запуск Wireguard gw0
     Loaded: загружен (/etc/systemd/system/gw0.service; отключено; предустановка поставщика: включено)
     Active: не удалось (Результат: тайм-аут) с Чт 2024-12-05 10:12:07 EST; 34с назад
    Процесс: 95515 ExecStart=/usr/bin/bash -c /etc/wireguard/gw0.sh >> /tmp/gw0.log (code=exited, status=0/SUCCESS)
   Main PID: 95515 (code=exited, status=0/SUCCESS)

Дек 05 10:10:37 mybox systemd[1]: Запуск Запуск Wireguard gw0...
Дек 05 10:12:07 mybox systemd[1]: gw0.service: Состояние 'stop-sigterm' истекло по времени. Убийство.
Дек 05 10:12:07 mybox systemd[1]: gw0.service: Не удалось с результатом 'тайм-аут'.
Дек 05 10:12:07 mybox systemd[1]: Не удалось запустить Запуск Wireguard gw0.

# journalctl -xeu gw0.service
Дек 05 10:10:37 mybox systemd[1]: Запуск Запуск Wireguard gw0...
░░ Тема: Начался запуск задания для юнита gw0.service
░░ Определено: systemd
░░ Поддержка: http://www.ubuntu.com/support
░░
░░ Началось выполнение задания для юнита gw0.service.
░░
░░ Идентификатор задания 2611.
Дек 05 10:12:07 mybox systemd[1]: gw0.service: Состояние 'stop-sigterm' истекло по времени. Убийство.
Дек 05 10:12:07 mybox systemd[1]: gw0.service: Не удалось с результатом 'тайм-аут'.
░░ Тема: Юнит не удался
░░ Определено: systemd
░░ Поддержка: http://www.ubuntu.com/support
░░
░░ Юнит gw0.service вошел в состояние 'не удалось' с результатом 'тайм-аут'.
Дек 05 10:12:07 mybox systemd[1]: Не удалось запустить Запуск Wireguard gw0.
░░ Тема: Запуск задания для юнита gw0.service не удался
░░ Определено: systemd
░░ Поддержка: http://www.ubuntu.com/support
░░
░░ Запуск задания для юнита gw0.service завершился с ошибкой.
░░
░░ Идентификатор задания 2611 и результат задания - неудача.

Тем не менее, /tmp/gw0.log показывает, что скрипт завершился:

Чт Дек  5 10:10:37 EST 2024 - очистка
Чт Дек  5 10:10:37 EST 2024 - настройка
┌──────────────────────────────────────────────────────┐
│                                                      │
│   Запуск wireguard-go не требуется, поскольку это   │
│   ядро имеет первоклассную поддержку WireGuard. Для  │
│   получения информации об установке модуля ядра,    │
│   пожалуйста, посетите:                             │
│         https://www.wireguard.com/install/           │
│                                                      │
└──────────────────────────────────────────────────────┘
Чт Дек  5 10:10:37 EST 2024 - запуск
Чт Дек  5 10:10:37 EST 2024 - конец

Вопрос

Кто-нибудь знает, как заставить gw0.service работать?

.

Ответ или решение

Чтобы разрешить проблему с тайм-аутом в сервисе gw0.service для Wireguard, используемого в системе на основе systemd, рассмотрим ключевые аспекты вашей ситуации.

Описание Проблемы

Ваша система на базе Ubuntu 22.04.5 использует Wireguard с TUN/TAP вместо модуля ядра, что может вызывать сложности при управлении запуском через systemd. Сначала, вы демонстрируете, что при ручном запуске скрипта /etc/wireguard/gw0.sh он работает корректно, но когда вы пытаетесь запустить сервис через systemd, он заканчивается ошибкой тайм-аута.

Пошаговое Решение

  1. Тип сервиса:
    У вас установлен тип сервиса как oneshot. Этот тип подходит для выполнения кратковременных задач, но может привести к тайм-ауту, если что-то идет не так. Попробуйте изменить тип на simple и добавить параметр RemainAfterExit=true. Это позволит командной оболочке работать в фоновом режиме и отмечать сервис как активный даже после завершения выполнения скрипта.

    Обновленный файл /etc/systemd/system/gw0.service:

    [Unit]
    Description=Start Wireguard gw0
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/bash /etc/wireguard/gw0.sh >> /tmp/gw0.log 2>&1
    RemainAfterExit=true
    
    [Install]
    WantedBy=multi-user.target
  2. Тайм-аут:
    По умолчанию systemd имеет тайм-аут в 90 секунд для единичных заданий. Вы можете увеличить его, добавив директиву TimeoutSec в раздел [Service]. Например, чтобы установить его на 300 секунд, используйте следующее:

    TimeoutSec=300
  3. Логи и Ошибки:
    Убедитесь, что вы отслеживаете логи выполнения. Вы уже используете /tmp/gw0.log для этого. В случае необходимости, добавьте дополнительную отладочную информацию в скрипт, чтобы точно видеть, где происходит сбой.

  4. Проверка Зависимостей:
    Убедитесь, что интерфейс сети venet0 активен и доступен перед запуском скрипта. Параметры After и Wants в юните уже привязываются к network-online.target, что должно быть достаточным.

  5. Перезагрузка daemon:
    После внесения изменений в файл юнита, не забудьте перезагрузить демон systemd:

    sudo systemctl daemon-reload
  6. Запуск и проверка:
    Попробуйте снова запустить вашу службу:

    sudo systemctl start gw0.service

    После этого проверьте статус:

    sudo systemctl status gw0.service

Заключение

Следуя вышеперечисленным рекомендациям, вы сможете устранить проблему тайм-аута и обеспечить корректный запуск Wireguard как сервиса systemd. Обновление типа сервиса и управление настройками тайм-аута в значительной степени повлияют на стабильность работы вашего Wireguard при управлении через systemd.

Оцените материал
Добавить комментарий

Капча загружается...