WireGuard: автоподключение при входе в Linux
На сервере с автозапуском WireGuard всё просто: включили wg-quick@wg0 в systemd, и туннель поднимается при загрузке, ещё до входа в систему. На рабочем столе Linux эта схема часто не подходит — вы хотите, чтобы VPN включался именно когда вошёл конкретный пользователь, а не был поднят системно для всех и всегда. Разберём, как настроить автоподключение через профиль NetworkManager и через systemd user unit, привязанные к конкретной учётной записи, а не к загрузке машины.
Содержание
- Почему «при загрузке» и «при входе пользователя» — разные задачи
- Профиль NetworkManager: импорт и привязка к пользователю
- Автоподключение через GUI: где искать чекбокс
- Альтернатива: systemd user unit для тех, кто не хочет отдавать VPN в NetworkManager
- Права: как обойтись без пароля root на каждый вход
- Сравнение трёх вариантов автозапуска
- Проверка и отладка
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему «при загрузке» и «при входе пользователя» — разные задачи
Системный сервис wg-quick@wg0.service стартует на этапе multi-user.target, до графического логина и до того, как известно, кто вообще будет работать за машиной. Это правильно для сервера-шлюза или для одиночного ноутбука, где VPN нужен всегда и всем. Но на рабочей станции с несколькими пользователями или там, где VPN — это личный туннель конкретного человека, а не системная политика, системный сервис — избыточен и неудобен: он поднимает интерфейс ещё до входа, работает даже если вошёл кто-то другой, и не выключается при выходе из сессии.
Задача «подключить VPN при входе пользователя» решается на уровне сессии, а не на уровне загрузки ОС. Для этого есть два рабочих инструмента:
- NetworkManager с профилем подключения, привязанным к конкретной учётной записи (
connection.permissions); - systemd user unit — юнит, который живёт в пользовательском менеджере systemd и стартует вместе с сессией.
Оба варианта не требуют root-пароля на каждый вход и не трогают других пользователей системы. Ниже — оба по порядку, с плюсами и ограничениями каждого.
Профиль NetworkManager: импорт и привязка к пользователю
Если на машине уже используется NetworkManager (обычно так на GNOME, KDE, Cinnamon — любой десктоп с иконкой сети в трее), это самый быстрый путь. NetworkManager умеет WireGuard нативно начиная с версии 1.16, отдельный плагин не нужен.
Импортируйте существующий конфиг как подключение NM:
sudo nmcli connection import type wireguard file /etc/wireguard/wg0.conf
Команда создаёт подключение с именем wg0 (по умолчанию системное — видно всем, хранится в /etc/NetworkManager/system-connections/). Дальше нужны два свойства: включить автоподключение и — это ключевой момент темы — привязать профиль к конкретному пользователю, чтобы он поднимался именно при его входе, а не был доступен системно всем:
sudo nmcli connection modify wg0 connection.autoconnect yes
sudo nmcli connection modify wg0 connection.permissions "user:ivan:"
Второй параметр меняет поведение принципиально: без него любой пользователь машины может включить и выключить это подключение, а с автозапуском оно попробует подняться при первом же старте NetworkManager, то есть ещё до входа в графическую сессию. С connection.permissions профиль становится приватным для указанной учётки — NetworkManager активирует его только когда именно этот пользователь вошёл в систему, и не показывает подключение в списке другим.
Проверить, что профиль привязан правильно, можно так:
nmcli connection show wg0 | grep permissions
Если ответ содержит user:ivan: — всё настроено. Войдите под этой учётной записью, и через пару секунд после появления рабочего стола nmcli connection show --active покажет wg0 в списке активных без единого клика.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверАвтоподключение через GUI: где искать чекбокс
Не всем удобно работать через терминал, и в этом нет ничего плохого — GUI и nmcli меняют один и тот же профиль, результат идентичен. В настройках сети (GNOME Settings → Network, или апплет NetworkManager в трее KDE/XFCE) откройте созданное подключение WireGuard и включите переключатель «Подключаться автоматически» (Connect automatically). Там же обычно есть отдельная опция «Доступно только этому пользователю» (Make available to other users — снимите галочку) — это визуальный аналог connection.permissions из команды выше.
Разница между GUI и nmcli чисто в удобстве: если вы настраиваете одну машину для себя — проще кликнуть в интерфейсе; если разворачиваете один и тот же профиль на десятках рабочих станций через Ansible или скрипт — используйте nmcli, он детерминирован и не зависит от версии оболочки.
Альтернатива: systemd user unit для тех, кто не хочет отдавать VPN в NetworkManager
NetworkManager подходит не всем: если вы управляете туннелем напрямую через wg-quick (например, конфиг сложнее, чем поддерживает GUI-редактор NM, или вы принципиально держите сеть вне NM), автозапуск при входе можно сделать через пользовательский systemd-юнит — без root-сервиса и без NetworkManager вообще.
Создайте юнит в пользовательском каталоге:
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/wg-home.service
Содержимое:
[Unit]
Description=WireGuard tunnel wg0 (user session)
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/sudo /usr/bin/wg-quick up wg0
ExecStop=/usr/bin/sudo /usr/bin/wg-quick down wg0
[Install]
WantedBy=default.target
Включите юнит для текущего пользователя (без sudo — это пользовательский, а не системный менеджер):
systemctl --user daemon-reload
systemctl --user enable wg-home.service
WantedBy=default.target в пользовательском менеджере — это аналог «при входе в сессию»: default.target пользовательского systemd активируется, когда стартует сессия (графическая или через loginctl), и юнит поднимается вместе с ней. Это даёт то же поведение, что и привязка профиля NM к пользователю, но без зависимости от NetworkManager — годится и на минимальных окружениях без графической оболочки.
Обратите внимание на ExecStart с sudo: wg-quick требует root, а пользовательские юниты systemd запускаются от имени самого пользователя, без прав на управление сетевыми интерфейсами. Это главное ограничение подхода — без дополнительной настройки прав команда просто откажет с ошибкой доступа. Решение — в следующем разделе.
Права: как обойтись без пароля root на каждый вход
Юнит из примера выше не заработает «из коробки», потому что sudo wg-quick up wg0 в неинтерактивной сессии не может запросить пароль — а если запросит, автозапуск сорвётся. Дать пользователю запускать именно эти две команды без пароля можно точечным правилом sudoers, не открывая полный root-доступ:
sudo visudo -f /etc/sudoers.d/wg-home
ivan ALL=(root) NOPASSWD: /usr/bin/wg-quick up wg0, /usr/bin/wg-quick down wg0
Это разрешает пользователю ivan без пароля только поднимать и опускать конкретный туннель — ни другие команды, ни wg-quick с другими интерфейсами через это правило не выполнить. Такой узкий scope безопаснее, чем добавление пользователя в sudo/wheel целиком, и решает исходную задачу без компромиссов.
Если такой ручной scope кажется избыточным для вашей ситуации — например, машина однопользовательская и разграничение прав не критично, — путь через NetworkManager из предыдущих разделов проще: там root не нужен вовсе, потому что интерфейсом управляет системная служба NetworkManager, а не пользовательский процесс напрямую.
Сравнение трёх вариантов автозапуска
| Вариант | Когда стартует | Нужен root у пользователя | Привязка к учётке | Где хранится |
|---|---|---|---|---|
wg-quick@wg0.service (системный) | При загрузке ОС, до логина | Нет (уже root) | Нет, глобально | /etc/wireguard/ |
| Профиль NetworkManager | При входе привязанного пользователя | Нет | Да, через connection.permissions | /etc/NetworkManager/system-connections/ |
| systemd user unit | При старте пользовательской сессии | Да, точечный sudoers | Да, юнит принадлежит пользователю | ~/.config/systemd/user/ |
Для рабочего стола с одним активным VPN-пользователем обычно проще и надёжнее профиль NetworkManager — он не требует правки sudoers и корректно опускает туннель при выходе из сессии. Юнит systemd user стоит выбирать, если NetworkManager в системе не используется или конфиг WireGuard содержит директивы (например, сложный PostUp/PostDown), которые GUI-редактор NM не поддерживает напрямую.
Проверка и отладка
После настройки любого из вариантов не полагайтесь на «наверное заработает» — перелогиньтесь и проверьте состояние без ручного вмешательства.
Для варианта с NetworkManager:
nmcli connection show --active
nmcli device show wg0
Интерфейс wg0 должен появиться в списке активных подключений сразу после входа, без клика по иконке сети.
Для варианта с systemd user unit:
systemctl --user status wg-home.service
journalctl --user -u wg-home.service -b
Если юнит в состоянии failed, а в логе видно sudo: a password is required — значит, правило в /etc/sudoers.d/ не применилось или путь к wg-quick в правиле не совпадает с реальным (which wg-quick покажет актуальный путь, он может отличаться на разных дистрибутивах). Если юнит вовсе не стартовал — проверьте systemctl --user is-enabled wg-home.service, ответ должен быть enabled.
Отдельно стоит проверить случай выхода и повторного входа под другим пользователем на той же машине: туннель, привязанный к первой учётке, не должен подниматься под второй. Это и есть практическая проверка того, что автоподключение действительно привязано к пользователю, а не превратилось незаметно в системное.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Чем автоподключение при входе отличается от автозапуска при загрузке?
Автозапуск при загрузке (systemctl enable wg-quick@wg0) поднимает туннель системно, ещё до входа в систему, одинаково для всех. Автоподключение при входе привязано к конкретному пользователю и срабатывает только в его сессии — это тема данной статьи, подробнее про системный автозапуск и типичные проблемы после ребута — в статье про WireGuard, который не поднимается после перезагрузки.
Можно ли настроить автоподключение сразу для нескольких пользователей одной машины, но с разными туннелями?
Да — создайте отдельный профиль NM (или отдельный .service в ~/.config/systemd/user/ каждого пользователя) с уникальным именем интерфейса и своим connection.permissions. Управление учётками и правами для такого сценария разобрано в статье про пользователей и группы в Linux.
NetworkManager конфликтует с ручным wg-quick, если интерфейс называется одинаково?
Да, оба не должны управлять одним и тем же wg0 одновременно — либо весь туннель ведёт NM (импорт + nmcli), либо только wg-quick из systemd user unit. Смешивать оба на одном интерфейсе не стоит: получится гонка при поднятии/опускании.
Подключение не появляется в списке NetworkManager после nmcli connection import.
Чаще всего не выполнен nmcli connection reload, либо профиль создан для другого пользователя. Проверьте владельца через nmcli connection show wg0 | grep permissions и перезапустите NetworkManager: systemctl restart NetworkManager.
Как быстро проверить, с каким сервером в итоге соединяется этот автозапускаемый туннель?
Изначальную установку и структуру самого конфига WireGuard на сервере, к которому подключается клиент, удобно свериться со статьёй про установку WireGuard на VPS — там разобран серверный конфиг, который и импортируется на клиенте.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →