Как Linux маршрутизирует трафик к пирами Wireguard?

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

Предположим, у меня есть интерфейс WireGuard (сконфигурированный с помощью wg-quick) «wg0», для которого определён «пир» с адресом «100.100.100.100» и разрешёнными IP «0.0.0.0/0».
Как же трафик для 100.100.100.100 находит свой путь, в то время как весь другой трафик проходит через интерфейс «wg0»?
В правилах маршрутизации или таблицах маршрутизации ничего не связано с 100.100.100.100, и “ip route get 100.100.100.100” возвращает что-то вроде:

100.100.100.100 dev wg0 table 100500 src 10.0.0.2

Таким образом, весь трафик для пирa должен отправляться через туннель, но он явно проходит через маршруты по умолчанию. Почему?

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

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

Вопрос о том, как Linux маршрутизирует трафик к пирами WireGuard, требует понимания работы сетевых интерфейсов и маршрутизации в Linux, а также особенностей конфигурации WireGuard.

Когда вы создаете интерфейс WireGuard, например, «wg0», и добавляете пира с IP-адресом «100.100.100.100» и заданием «0.0.0.0/0» в качестве allowed-ips, это означает, что весь трафик, который предназначен для этого пира, будет отправляться через интерфейс «wg0».

Как работает маршрутизация в данном случае?

  1. Allowed IPs: Список allowed-ips в конфигурации WireGuard определяет, какие IP-адреса направляются через конкретный интерфейс. В вашем случае значение «0.0.0.0/0» указывает на то, что всякий трафик будет перенаправляться через «wg0».

  2. Маршруты и таблицы маршрутизации: При использовании команды ip route get 100.100.100.100 и получении результата, подобного 100.100.100.100 dev wg0 table 100500 src 10.0.0.2, это значит, что системе известен путь к «100.100.100.100» через интерфейс «wg0». Это происходит благодаря тому, что WireGuard добавляет маршруты в специальную таблицу (в данном случае таблицу 100500), которая обрабатывает трафик для этого интерфейса.

  3. Маршрутизация по умолчанию: Ваша система, вероятно, имеет настроенный маршрут по умолчанию, который позволяет передавать трафик через другие интерфейсы, если он не соответствует более специфичным маршрутам. Однако, из-за конфигурации WireGuard и разрешенных IP-адресов, трафик для указанного пиринга (в данном случае для «100.100.100.100») перенаправляется через интерфейс «wg0».

Исключения для маршрутизации

Если вы хотите настроить исключения для маршрутизации трафика к пирами WireGuard, нужно учитывать следующее:

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

  2. Использование policy routing: Вы можете использовать policy routing с помощью дополнительных таблиц маршрутизации. Это можно сделать, добавив правила, которые устранят маршруты для определенных IP-адресов, направляя трафик по другим интерфейсам, вместо использования стандартного маршрута.

  3. ip rule: Например, с помощью команды ip rule add from <ваш_IP> table <новая_таблица>, вы можете настроить специфическую таблицу маршрутизации для определенных источников трафика.

Пример:

Если вы хотите исключить трафик для IP-адреса «192.168.1.1» от использования WireGuard, вы можете выполнить следующие команды:

# Добавляем маршруты для IP-адреса
ip route add 192.168.1.1 via <ваш_шлюз> dev <ваш_интерфейс>
# Увеличиваем приоритет маршрута (например, с помощью метрики)
ip route change default via <ваш_шлюз> dev <ваш_интерфейс> metric 100

Заключение

Таким образом, маршрутизация трафика к пирами WireGuard происходит благодаря механизму, встроенному в Linux, и особенностям конфигурации самого WireGuard. Для добавления исключений необходимо использовать более специфичные маршруты и применять правила маршрутизации. Это позволит вам контролировать, какой трафик проходит через интерфейс WireGuard, а какой — через другие интерфейсы.

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

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