Предположим, у меня есть два сервера, 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 для этого?
Мне не удалось найти способ заставить 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 не поддерживает установку этой метки для каждого-пира.
Я оставлю этот вопрос открытым на случай, если кто-то найдет верный ответ на этот вопрос.