LINUX.ORG.RU
ФорумAdmin

NetworkManager traffic splitting

 , , , ,


0

1

Ситуация такая. Есть ноутбук, на нём KDE и NetworkManager. В сеть выходит по WiFi, там всё один раз настроено и забыто.

Ещё настроен ещё один интерфейс, допустим, wireguard (не важно, с openvpn работает также, допущу, что с более экзотическими хитрыми протоколами принцип будет тот же). Подключается по требованию.

Физически компьютер находится в России, а сервер wireguard в стране ЕС, и таким образом немного помогает обходить издержки «изношенного оборудования google» для просмотра YouTube (например), и не только.

Хочется включить это соедиенение и забыть (также как с wifi), чтобы всегда просто работало, но чтобы не весь трафик шёл через другую страну, разумеется. В первую очередь чтобы всякие яндексы, госуслуги, банки и т.п. шли напрямую. И быстрее, и надёжнее, и безопаснее.

Пытаюсь понять, как настраиваются маршруты в NetworkManager - и не понимаю. я там указываю адрес, маску и шлюз, и всё. Допустим, для примера хочу 2ip.ru пускать напрямую (через него удобно тестировать), а всё остальное пусть идёт по wireguard.

После подключения вижу новую строчку (route)

Было

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         MyRouter        0.0.0.0         UG    600    0        0 wlp0s20f3
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp0s20f3

Стало

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         MyRouter        0.0.0.0         UG    600    0        0 wlp0s20f3
2ip.ru          MyRouter        255.255.255.255 UGH   50     0        0 wg0
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp0s20f3

Всё хорошо, но Iface неправильный, он подставляет wg0, хотя должен быть wlp0s20f3. Если набрать curl 2ip.ru, то показывает мой ЕС-адрес. Но если добавить правило вручную командой ip route add 188.40.167.82 via 192.168.1.254 dev wlp0s20f3, то всё работает, как я и планировал, трафик идёт напрямую.

Но добавлять все эти команды вручную (да ещё и root права может нужны, хотя решаемо) неудобно… а объяснить это делать пожилому человеку (например), вообще задача часто нерешаемая (научить нажать на кнопку с грехом пополам вроде получилось).

Я чего-то не понимаю в NetworkManager, и он всё-таки позволяет делать то, что я хочу, сделать разделение трафика в зависимости от правил по двум интерфейсам, а не по одному?.. или если он это не умеет в 2025 году(!), то по какой причине? А можно ли как-то научить?

Там ещё кропотливая работа по составлению длинного списка маршрутов предстоит (то ли по доменным именам, то ли по geoip), но этом, допустим, ладно (плюс не хочется таблицу маршрутизации неадекватно длинной делать, хочется базовые диапазоны адресов покрыть, не более), но это ладно. Допустим, хочу для начала хотя 2ip.ru работать в обход wireguard, как?

Может, есть какое-то средство поднять виртуальный tun/tap интерфейс, к которому подключится networkmanager (а не напрямую к wireguard) и весь трафик будет через него пускать, а уж он сам будет решать, куда подключаться (хоть к wireguard, хоть к vless), и как именно трафик распределять?

wireguard

Так он же не работает. Но ладно, по делу:

Допустим, для примера хочу 2ip.ru пускать напрямую (через него удобно тестировать), а всё остальное пусть идёт по wireguard.

Можно реализовать через nmcli или же через создание сервиса для твоего инита, скорее всего для системд. В nmcli просто - nmcli connection modify "TvoyWiFi" +ipv4.routes "188.40.167.82/32 192.168.1.254" где 188.40.167.82 - 2ip.ru

Я чего-то не понимаю в NetworkManager, и он всё-таки позволяет делать то, что я хочу, сделать разделение трафика в зависимости от правил по двум интерфейсам, а не по одному?.. или если он это не умеет в 2025 году(!), то по какой причине? А можно ли как-то научить?

Разделение делается через PBR, а настраивается тут - /etc/iproute2/rt_tables

Хочется включить это соедиенение и забыть (также как с wifi), чтобы всегда просто работало, но чтобы не весь трафик шёл через другую страну, разумеется. В первую очередь чтобы всякие яндексы, госуслуги, банки и т.п. шли напрямую. И быстрее, и надёжнее, и безопаснее.

Советую не убивать себе голову и посредством GeoIP и ipset отделить весь российский трафик от остального (который собственно и будет идти через вг)

Berliner
()

Две таблицы маршрутизации, маркировка пакетов по IP адресу источника и ip rule, чтобы перенаправлять пакеты через таблицу маршрутизации, где маршрут по умолчанию проложен через VPN.

Делай сам.

Ещё неплохо применять либо в iptables, либо в nftables списки адресов, чтобы оперировать маркировкой пакетов на основе списка адресов (сетей) назначения.

Если всё это сложно - можно немного проще, подними у себя локальный прокси сервер squid, в нём опиши правила для каких доменов с какого IP адреса отправлять пакеты, а уже для IP адреса отправления напиши один ip rule.

Условно, будет отправляться либо с IP адреса VPN соединения, либо с твоего локального IP адреса.

Это чтобы не возиться со списками адресов и сетей, так сможешь оперировать доменными именами.

Либо вообще как сказали уже ранее в браузере прокси, в одном включил - ходишь через VPN, во втором - без VPN.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от Berliner

и посредством GeoIP и ipset

Ты ещё не забывай, что с DNS тоже не всё так просто. Простые DNS запросы при разрешении доменных имён, доступ к которым блокируется могут подменяться и выдаваться IP из сегмента РФ.

Ну и для каждого пакета дёргать geoip будет дорого.

kostik87 ★★★★★
()
Ответ на: комментарий от Berliner

Можно реализовать через nmcli или же через создание сервиса для твоего инита, скорее всего для системд. В nmcli просто - nmcli connection modify «TvoyWiFi» +ipv4.routes «188.40.167.82/32 192.168.1.254» где 188.40.167.82 - 2ip.ru

Так именно это и не работает.

Советую не убивать себе голову и посредством GeoIP и ipset отделить весь российский трафик от остального (который собственно и будет идти через вг)

Допустим, у меня будет длинный скрипт (или не очень длинный), работающий через sudo и вызывающий много раз «ip route add …» или что-то аналогичное. Как его запустить при поднятии соединения в networkmanager и наоборот, откатить при отключении?

BattleCoder ★★★★★
() автор топика