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