Вопрос или проблема
Среда
Это 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, он заканчивается ошибкой тайм-аута.
Пошаговое Решение
-
Тип сервиса:
У вас установлен тип сервиса как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
-
Тайм-аут:
По умолчанию systemd имеет тайм-аут в 90 секунд для единичных заданий. Вы можете увеличить его, добавив директивуTimeoutSec
в раздел[Service]
. Например, чтобы установить его на 300 секунд, используйте следующее:TimeoutSec=300
-
Логи и Ошибки:
Убедитесь, что вы отслеживаете логи выполнения. Вы уже используете/tmp/gw0.log
для этого. В случае необходимости, добавьте дополнительную отладочную информацию в скрипт, чтобы точно видеть, где происходит сбой. -
Проверка Зависимостей:
Убедитесь, что интерфейс сетиvenet0
активен и доступен перед запуском скрипта. ПараметрыAfter
иWants
в юните уже привязываются кnetwork-online.target
, что должно быть достаточным. -
Перезагрузка daemon:
После внесения изменений в файл юнита, не забудьте перезагрузить демон systemd:sudo systemctl daemon-reload
-
Запуск и проверка:
Попробуйте снова запустить вашу службу:sudo systemctl start gw0.service
После этого проверьте статус:
sudo systemctl status gw0.service
Заключение
Следуя вышеперечисленным рекомендациям, вы сможете устранить проблему тайм-аута и обеспечить корректный запуск Wireguard как сервиса systemd. Обновление типа сервиса и управление настройками тайм-аута в значительной степени повлияют на стабильность работы вашего Wireguard при управлении через systemd.