Несколько туннелей WireGuard одновременно: как организовать
Пошаговое руководство по настройке нескольких одновременных туннелей WireGuard: раздельные конфигурации, маршрутизация, policy routing и диагностика.
Содержание
Зачем нужны несколько туннелей WireGuard
Один интерфейс WireGuard удобен для базовых сценариев, но часто требуется одновременно подключиться к нескольким VPN-серверам: рабочему, личному, к облачной инфраструктуре или к серверам в разных регионах. Без корректной организации туннели конфликтуют по маршрутам и адресам, что приводит к потере связи и нестабильности.
В этой статье мы разберём, как настроить несколько туннелей WireGuard на Linux-хосте, используя стандартные инструменты. Не потребуется ничего, кроме самого WireGuard, утилиты ip и базового понимания сетей.
Варианты организации нескольких туннелей
Есть два принципиальных подхода: запуск нескольких процессов wireguard-go (в userspace) или использование нескольких сетевых интерфейсов, создаваемых штатным модулем ядра. Второй вариант — основной, так как он производительнее и поддерживается из коробки в большинстве дистрибутивов.
Для изоляции можно также применять сетевые пространства имён (network namespaces), но это сложнее и оправдано только для строгой изоляции трафика. Мы сосредоточимся на классическом подходе: несколько интерфейсов на одном хосте.
Пошаговая настройка нескольких интерфейсов WireGuard
Рассмотрим пример с двумя туннелями: рабочим (wg0) и личным (wg1). Каждый туннель использует свой конфигурационный файл и уникальный порт.
- Создайте конфигурацию для первого туннеля в
/etc/wireguard/wg0.conf:[Interface] Address = 10.0.0.1/24 PrivateKey = <приватный_ключ_wg0> ListenPort = 51820 [Peer] PublicKey = <публичный_ключ_рабочего_сервера> AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = vpn.work.example.com:51820 - Создайте конфигурацию для второго туннеля в
/etc/wireguard/wg1.conf:[Interface] Address = 10.20.0.2/24 PrivateKey = <приватный_ключ_wg1> ListenPort = 51821 [Peer] PublicKey = <публичный_ключ_личного_сервера> AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = vpn.personal.example.com:51821 - Включите интерфейсы вручную или через systemd:
sudo wg-quick up wg0иsudo wg-quick up wg1. Если используете wg-quick, он добавит маршруты по умолчанию для каждого интерфейса, что вызовет конфликт. Поэтому обязательно перейдите к шагу 4.
Маршрутизация и приоритеты: как направить трафик в нужный туннель
Два интерфейса с одинаковыми AllowedIPs = 0.0.0.0/0 создадут два default route. Чтобы указать, какой туннель использовать для определённых подсетей или как основной, применяется policy routing.
- Убедитесь, что включён IP forwarding:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward(для постоянно — в/etc/sysctl.conf). - Создайте отдельные таблицы маршрутизации для каждого туннеля. Отредактируйте
/etc/iproute2/rt_tables, добавив:100 wg0table 200 wg1table - Настройте маршруты в эти таблицы. Например, для wg0:
sudo ip route add table wg0table default dev wg0 sudo ip route add table wg0table 10.0.0.0/24 dev wg0 - Добавьте правила, чтобы выбирать таблицу по источнику или по цели:
Либо для каждой подсети:sudo ip rule add from 10.0.0.0/24 table wg0table priority 100 sudo ip rule add from 10.20.0.0/24 table wg1table priority 200sudo ip rule add to 192.168.1.0/24 table wg0table priority 300 sudo ip rule add to 192.168.2.0/24 table wg1table priority 400
Если нужно один туннель как шлюз по умолчанию, а второй — только для конкретных подсетей, оставьте в основном туннеле AllowedIPs = 0.0.0.0/0, а у второго задайте точные подсети в AllowedIPs и не добавляйте default route. Тогда конфликт маршрутов не возникнет, а policy routing понадобится только для исходящих подключений с конкретных интерфейсов.
Проверка и диагностика нескольких туннелей
После настройки убедитесь, что каждый интерфейс поднят: sudo wg show покажет состояние всех туннелей. Проверьте таблицы маршрутизации: ip route show table wg0table. Отправьте ping с нужного интерфейса: ping -I wg0 10.0.0.1.
Частая проблема — симметричная маршрутизация: пакеты уходят через один туннель, а возвращаются через другой. Решение — добавить правила для обратного трафика, используя маркировку (fwmark) или конкретные источники. Также проверьте правила firewall: не блокирует ли он порты 51820/51821 (можно включить именно эти порты, а не все подряд).
Автозапуск и управление системой
Для автоматического старта при загрузке включите systemd-сервисы: sudo systemctl enable wg-quick@wg0 wg-quick@wg1. Однако учтите, что systemd не гарантирует порядок поднятия, поэтому добавьте зависимости в unit-файлах или напишите собственный скрипт. В дистрибутивах с NetworkManager можно настроить подключения через GUI или nmcli.
Если интерфейсы должны работать параллельно, проверьте, что net.ipv4.ip_forward включён до старта. В некоторых системах удобнее использовать сетевые пространства имён — тогда туннели полностью независимы и конфликты маршрутов исключены. Это рекомендуемый вариант для сложных сценариев, но требует дополнительной настройки.
Планируйте подсети так, чтобы они не пересекались (например, 10.0.0.0/24 и 10.20.0.0/24). В противном случае маршрутизация станет непредсказуемой.
Мини-чеклист
- Создайте отдельный файл конфигурации для каждого туннеля в /etc/wireguard/
- Назначьте каждому интерфейсу уникальный ListenPort и не пересекающиеся подсети Address
- Проверьте, что включён ip_forward: sysctl net.ipv4.ip_forward=1
- Настройте policy routing (ip rule + отдельные таблицы), если туннели имеют одинаковые AllowedIPs
Частые ошибки
- Использование одинаковых подсетей в разных туннелях, что приводит к конфликту маршрутов
- Отсутствие policy routing при нескольких default gateway — трафик уходит в случайный туннель
- Неправильные правила firewall: блокировка портов WireGuard или запрет форвардинга
- Игнорирование порядка запуска служб wg-quick — интерфейсы могут не подняться корректно
Источники и документация
FAQ
Можно ли запустить два туннеля WireGuard одновременно на одном устройстве?
Да, если создать два разных сетевых интерфейса (wg0, wg1) с уникальными портами и адресами. WireGuard позволяет работать с произвольным числом интерфейсов, ограничение — только ресурсы ядра и конфликты маршрутов, которые решаются настройками.
Как избежать конфликта маршрутов, когда оба туннеля имеют AllowedIPs = 0.0.0.0/0?
Используйте policy routing: создайте отдельные таблицы маршрутизации для каждого интерфейса и добавьте правила ip rule, чтобы выбирать таблицу по источнику или назначению. Тогда маршрут по умолчанию будет выбираться осознанно, а не случайно.
Нужно ли включать IP forwarding для нескольких клиентских туннелей?
Если вы подключаетесь только с локального хоста и не планируете пропускать трафик других устройств через туннель, forwarding не обязателен. Но для корректной работы политик маршрутизации и балансировки он обычно включается.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ