Вопрос или проблема
Предположим, у меня есть интерфейс 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».
Как работает маршрутизация в данном случае?
-
Allowed IPs: Список allowed-ips в конфигурации WireGuard определяет, какие IP-адреса направляются через конкретный интерфейс. В вашем случае значение «0.0.0.0/0» указывает на то, что всякий трафик будет перенаправляться через «wg0».
-
Маршруты и таблицы маршрутизации: При использовании команды
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), которая обрабатывает трафик для этого интерфейса. -
Маршрутизация по умолчанию: Ваша система, вероятно, имеет настроенный маршрут по умолчанию, который позволяет передавать трафик через другие интерфейсы, если он не соответствует более специфичным маршрутам. Однако, из-за конфигурации WireGuard и разрешенных IP-адресов, трафик для указанного пиринга (в данном случае для «100.100.100.100») перенаправляется через интерфейс «wg0».
Исключения для маршрутизации
Если вы хотите настроить исключения для маршрутизации трафика к пирами WireGuard, нужно учитывать следующее:
-
Настройка более специфичных маршрутов: Вы можете добавить более специфичные маршруты для трафика, который не должен проходить через WireGuard. Например, если у вас есть другой сетевой интерфейс, который вы хотите использовать для определенных адресов, вы можете добавить маршрут с более высоким приоритетом.
-
Использование policy routing: Вы можете использовать policy routing с помощью дополнительных таблиц маршрутизации. Это можно сделать, добавив правила, которые устранят маршруты для определенных IP-адресов, направляя трафик по другим интерфейсам, вместо использования стандартного маршрута.
-
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, а какой — через другие интерфейсы.