Несколько туннелей WireGuard к одному серверу, как заставить использовать разные интерфейсы.

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

У меня несколько WAN-соединений на маршрутизаторе, и я хотел бы создать туннель WireGuard на каждом интерфейсе WAN к одному и тому же серверу.

Я запустил разные работающие туннели к серверу, используя разные порты назначения, но, конечно, они используют шлюз по умолчанию и интерфейс.

Как заставить каждое соединение использовать отдельный интерфейс?

Мне удалось сделать это с помощью функциональности netns из iproute2. WireGuard будет отправлять зашифрованные пакеты через маршрут по умолчанию в пространстве имен, в котором он создан1, даже если позже он будет перемещен в другое пространство имен. Если у вас есть физические интерфейсы eth1 и eth2, вы можете переместить их в отдельные пространства имен и создать один туннель WireGuard в каждом пространстве имен. Затем вы можете переместить оба туннеля в пространство имен 1 и управлять ими как обычно, включая использование ip route для маршрутизации трафика через эти туннели.

$ ip netns add wan1
$ ip netns add wan2
# Внимание: если вы вводите эти команды через SSH, есть большая вероятность,
# что это разорвет ваше SSH-соединение. Будьте осторожны.
$ ip link set eth1 netns wan1
$ ip link set eth2 netns wan2
$ ip -n wan1 add wg1 type wireguard
$ ip -n wan2 add wg2 type wireguard
$ ip -n wan1 link set wg1 netns 1
$ ip -n wan2 link set wg2 netns 1

Я подозреваю, что ваши eth1 и eth2 будут “застрявшими” в своих собственных пространствах имен в результате этой настройки. Вы можете попробовать настроить мост вместо того, чтобы полностью перемещать интерфейсы, если это проблема.

Вы можете добавить правила маршрутизации на основе порта назначения — если порт конечной точки (удаленный) первого туннеля WireGuard был 51821, а второго — 51822, вы могли бы добавить следующие правила маршрутизации для использования таблицы маршрутизации 1 для первого и таблицы маршрутизации 2 для второго:

ip rule add dport 58121 table 1 priority 101
ip rule add dport 58122 table 2 priority 102

Затем, если ваши интерфейсы WAN — это eth1 и eth2 (и шлюз WAN, например, 203.0.113.1), вы можете установить маршрут по умолчанию для таблицы 1 на использование первого интерфейса и таблицы 2 на использование второго интерфейса:

ip route add default via 203.0.113.1 dev eth1 table 1
ip route add default via 203.0.113.1 dev eth2 table 2

В качестве альтернативы вы можете добавить правила маршрутизации на основе метки брандмауэра, которые вам могут (или не могут) показаться более удобными для поддержки, чем использование порта назначения. Если вы настроили один (локальный) интерфейс WireGuard с, скажем, FwMark = 11, а второй с FwMark = 22, вы можете использовать эти правила маршрутизации вместо:

ip rule add fwmark 11 table 1 priority 101
ip rule add fwmark 22 table 2 priority 102

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

Для настройки нескольких туннелей WireGuard на одном сервере с использованием различных WAN-интерфейсов требуется правильно настроить маршрутизацию и правила. Ниже представлены шаги, которые помогут вам достичь этой цели.

1. Создание пространств имен

Использование iproute2 и его функционала пространств имен (netns) позволяет вам разделить сетевые интерфейсы, что значительно упрощает маршрутизацию трафика через разные WAN-соединения. Эта методология предполагает, что вы создаете отдельные пространства имен для каждого из WAN-интерфейсов и связываете соответствующие туннели WireGuard с этими пространствами.

Шаги:

ip netns add wan1
ip netns add wan2
# Внимание: выполнение этих команд через SSH может вызвать разрыв соединения. Будьте осторожны.
ip link set eth1 netns wan1
ip link set eth2 netns wan2
ip -n wan1 add wg1 type wireguard
ip -n wan2 add wg2 type wireguard
# Перемещение интерфейсов WireGuard обратно в основное пространство имен
ip -n wan1 link set wg1 netns 1
ip -n wan2 link set wg2 netns 1

2. Конфигурация WireGuard

После создания интерфейсов WireGuard в пространствах имен вам необходимо сконфигурировать каждый туннель с использованием различных портов для удаленных конечных точек. Например, вы можете настроить один туннель на порту 51821, а второй — на порту 51822.

# Конфигурация для wg1
[Interface]
PrivateKey = <ваш_приватный_ключ_для_wg1>
Address = <адрес_вашего_туннеля_для_wg1>

[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = <IP_сервера>:51821
AllowedIPs = <разрешенные_IP_адреса>

# Конфигурация для wg2
[Interface]
PrivateKey = <ваш_приватный_ключ_для_wg2>
Address = <адрес_вашего_туннеля_для_wg2>

[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = <IP_сервера>:51822
AllowedIPs = <разрешенные_IP_адреса>

3. Настройка маршрутизации

После того как туннели WireGuard были настроены, вам необходимо отрегулировать маршрутизацию, чтобы каждый туннель мог использовать свой WAN-интерфейс.

Использование маршрутов на основе порта:

Если у вас есть два разных порта для туннелей, вы можете создать маршруты на основе номера порта:

ip rule add dport 51821 table 1 priority 101
ip rule add dport 51822 table 2 priority 102

ip route add default via <WAN_шлюз_1> dev eth1 table 1
ip route add default via <WAN_шлюз_2> dev eth2 table 2

Использование маркеров брандмауэра:

Этот метод более гибкий и может быть более предпочтительным в долгосрочной перспективе. Сначала вам нужно настроить маркеры для интерфейсов WireGuard:

# В конфигурации wg1
PostUp = ip rule add fwmark 11 table 1
PostDown = ip rule del fwmark 11 table 1

# В конфигурации wg2
PostUp = ip rule add fwmark 22 table 2
PostDown = ip rule del fwmark 22 table 2

И затем используйте правила маршрутизации, чтобы направлять трафик на основе этих маркеров:

ip rule add fwmark 11 table 1 priority 101
ip rule add fwmark 22 table 2 priority 102

ip route add default via <WAN_шлюз_1> table 1
ip route add default via <WAN_шлюз_2> table 2

Заключение

Следовательно, данная конфигурация позволит вам успешно установить несколько туннелей WireGuard, использующих различные WAN-интерфейсы, обеспечивая тем самым отказоустойчивость и увеличивая общую пропускную способность сети. Убедитесь, что каждая настройка полностью протестирована, чтобы гарантировать работоспособность всех подключений.

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

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