Просьба внимательно прочитать вопрос - вопрос не про маршрутизацию внутри тоннеля WireGuard!
Обратите внимание, что вопрос сложнее чем кажется и требует понимания процессов маршрутизации в ядре Linux.
Речь в вопросе идёт о стандартном и ожидаемом поведении WireGuard, а все изменения конфигцрации системы выполняются утилитой wg-quick при поднятии интерфейса.
Предположим, что у нас (с помощью wg-quick) настроен тоннель WireGuard с именем интерфейса "wg0". В конфигурации описан peer с адресом 100.100.100.100 и allowed-ips 0.0.0.0/0.
Создаваемые WireGuard правила маршрутизации (ip rules) в таком случае предписывают для всего немаркированного трафика использовать таблицу маршрутизации 100500:
> ip rule
0: from all lookup local
32765: not from all fwmark 0x1234 lookup 100500
32766: from all lookup main
32767: from all lookup default
В таблице 100500 прописан маршрут по-умолчанию через тоннель WireGuard:
> ip route show table 100500
default dev wg0 scope link
192.168.0.1 dev wg0 scope link
Исходящий трафик к пиру 100.100.100.100 не маркирован и должен идти через тоннель.
Более того, если выполнить "
ip route get 100.100.100.100", то мы увидим что-то вроде:
100.100.100.100 dev wg0 table 100500 src 192.168.0.2
то есть трафик к самому пиру также должен идти через тоннель, что очевидно не так, так как в этом случае пропала бы связь с пиром и тоннель перестал бы работать.
Вопрос: каким образом после поднятия тоннеля WireGuard маршрутизируется трафик к пирам?
Важное замечание: Обратите внимание, что WG сколько-либо стандартным образом может маркировать только пакеты, которые порождаются в его сетевом интерфейсе или отправляются через его интерфейс.
В описании WG также написано, что маркируются пакеты, которые были инкапсулированы внутри тоннеля (т.е. были порождены его сетевым интерфейсом на локальной системе). Исходящий трафик к пирам не был порождён в интерфейсе WG.
Отправляемые пакеты сначала проходят процедуру роутинга, а уже потом могут попасть в сетевой интерфейс WG, где они могут быть промаркированы. Но тогда и они отправлены будут через этот же интерфейс!
Наблюдаемое поведение можно получить путём добавления pre-routing правил в файрвол, но никаких правил в nft/iptables WireGuard не создаёт.