Как настроить интерфейс Wireguard для подключения к удаленному узлу через определенный сетевой интерфейс?

Как настроить интерфейс Wireguard для подключения к удаленному узлу через определенный сетевой интерфейс?

Предположим, у меня есть два сервера, gatewayкоторые видны публично в Интернете и appserverкоторые скрыты за nat/firewall. Также предположим, что каждый из этих двух серверов имеетдваинтерфейсы, подключенные к совершенно отдельным интернет-каналам связи (см. схему ниже).

Я хочу настроить два независимых туннеля Wireguard между двумя серверами с целью сохранения соединения серверов в случае отказа одного из них:

                   |     Internet     |        
[ gateway ]        |                  |        [appserver]
                   |                  | 
   (wg0) <-----> (ens1) < - - - - > (ens1) <----> (wg0)
                   |                  | 
                   |                  | 
                   |                  |        
   (wg1) <-----> (ens2) < - - - - > (ens2) <----> (wg1)
                   |                  | 
                   |                  | 

По умолчанию Wireguard, похоже, направляет весь трафик через шлюз по умолчанию системы. Поэтому при appserverпопытках подключения к gateway, он использует только один из двух интерфейсов:

                   |     Internet     |        
[ gateway ]        |                  |        [appserver]
                   |                  | 
   (wg0) <--+--> (ens1) < - - - - > (ens1) <--+--> (wg0)
            |      |                  |       |
            |      |                  |       |
            |      |                  |       | 
   (wg1) <--+    (ens2)      X      (ens2)    +--> (wg1)
                   |                  | 
                   |                  |

Поскольку некоторые сетевые инструменты позволяют устанавливать определенный сетевой интерфейс для использования при отправке сетевого трафика, может ли Wireguard делать то же самое? То есть, отправлять трафик только по ens1или ens2независимо от метрик маршрутизации по умолчанию? Если нет, как мне настроить сетевые системы Linux, чтобы они делали это вместо этого?

решение1

Мне не удалось найти способ заставить сам Wireguard подключаться через определенный интерфейс, поэтому в конечном итоге я остановился на простой маршрутизации трафика, направленного на , ens2путем добавления нового маршрута в appserverтаблицы маршрутизации :

ip route add $GATEWAY_ESN2_ADDR/32 via $APPSERVER_ESN2_ADDR_GW metric 50

APPSERVER_ESN2_ADDR_GW— это адрес appserverшлюзового маршрутизатора.

Исследуя этот вопрос, я заметил, что Wireguard позволяет вам устанавливать fwmark для исходящего трафика, принадлежащего определенному интерфейсу Wireguard, установив поле FwMarkпод [Interface]. На момент написания этой статьи (2021-09) Wireguard не поддерживает установку этой метки для каждого однорангового узла.

*Я оставлю этот вопрос открытым на случай, если кто-то найдет подходящее решение.

Связанный контент