Маршрутизация конкретного браузера через беспроводное соединение при сохранении других приложений на проводном соединении.

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

У меня настроена сеть с двумя соединениями: проводным и беспроводным. Моя цель – настроить маршрутизацию так, чтобы только Chrome использовал беспроводной интерфейс, тогда как все другие приложения и сеансы терминала должны использовать проводное подключение.
Я пробовал использовать команды маршрутизации, но у меня возникли трудности с поиском метода, который:

Направляет только трафик Chrome через беспроводное подключение
Поддерживает весь другой системный трафик на проводном интерфейсе
Не требует сложной настройки прокси или VPN

Как я могу достичь такой выборочной маршрутизации для одного приложения? Желательно, используя стандартные инструменты маршрутизации Linux или легкое решение.
Моя текущая сетевая настройка включает:

Проводной интерфейс: eth0
Беспроводной интерфейс: wlan0
Нужно направить Chrome специально через wlan0

Любые конкретные ограничения или предпочтительные методы приветствуются.

Этот скрипт оболочки настроит альтернативную таблицу маршрутизации на основе cgroups2. Он делает заданный IP-адрес шлюзом по умолчанию в новой таблице.

altgw-setup.sh: <dev> <alt gw IP> [FW mark ID]
где: 
        <dev> - сетевое устройство, используемое для достижения IP-адреса альтернативного шлюза                                                                                                   
        <alt gw IP> - IP-адрес альтернативного шлюза
        [FW mark ID] - необязательное значение для использования в качестве идентификатора метки брандмауэра (по умолчанию 11)
Создает альтернативную таблицу маршрутизации, которую можно прикрепить к индивидуальным процессам.

Итак, в вашем случае <dev> будет вашим беспроводным устройством (например, wlan0), а <alt gw IP> будет маршрутизатором в вашей беспроводной сети. Вы можете увидеть новую таблицу маршрутизации, запустив ip route show table altgw.

После настройки вам просто нужно добавить процессы chromium в файл /sys/fs/cgroup/altgw/cgroup.procs. Вы можете сделать это после запуска Chrome, вот так:

for p in $(pidof chromium); do # или любой другой браузер
    echo $p | sudo tee -a /sys/fs/cgroup/altgw/cgroup.procs
done

Или, возможно, проще, вы можете запустить новый сеанс оболочки, добавить его в altgw, а затем запустить chromium и любой другой сетевой инструмент из этого сеанса:

echo $$ | sudo tee -a /sys/fs/cgroup/altgw/cgroup.procs
chromium &

Все дочерние процессы, запущенные в этой оболочке, унаследуют alt gw, ЗА ИСКЛЮЧЕНИЕМ всего, что запущено через sudo или su или иным образом изменяет идентификатор пользователя дочернего процесса.

Изменено: включает скрипт в ответ для полноты, как предложил комментатор

#!/bin/sh
set -e

if ! mount | grep -q 'type cgroup2'; then
    echo "Этот скрипт зависит от поддержки ядра cgroup2. Либо она не загружена, либо у вас cgroup1" >&2;
    echo "Смотрите https://gist.github.com/kriswebdev/a8d291936fe4299fb17d3744497b1170 (на основе которого я создал этот скрипт) для более полного и надежного варианта этого скрипта." >&2;
    exit 1;
fi

FWMARK=11;
TABLE="altgw";
GROUP=$(id -g -n $USER)
DEV="$1";
ALTGWIP="$2";
# DEV=ens18
# ALTGWIP=192.168.1.5


usage() {
    echo "$0: <dev> <alt gw IP> [FW mark ID]" >&2;
    echo "где:" >&2;
    echo "  <dev> - сетевое устройство, используемое для достижения IP-адреса альтернативного шлюза" >&2;
    echo "  <alt gw IP> - IP-адрес альтернативного шлюза" >&2;
    echo "  [FW mark ID] - необязательное значение для использования в качестве идентификатора метки брандмауэра (по умолчанию $FWMARK)" >&2;
    echo "Создает альтернативную таблицу маршрутизации, которую можно прикрепить к индивидуальным процессам." >&2;
}

if test -z "$ALTGWIP" || test -z "$DEV"; then
    usage;
    exit 2;
fi

# создать cgroup для альтернативной таблицы маршрутизации
sudo mkdir -p /sys/fs/cgroup/$TABLE
sudo chown -R $USER:$GROUP /sys/fs/cgroup/$TABLE

# присвоить имя альтернативной таблице маршрутизации (это единственная часть этого скрипта, которая сохраняется, хотя мы перезаписываем ее каждый раз)
echo "$FWMARK $TABLE" | sudo tee /etc/iproute2/rt_tables.d/$TABLE-route.conf > /dev/null

# связать таблицу маршрутизации с меткой брандмауэра
sudo ip rule add fwmark $FWMARK table $TABLE

# добавить IP-адрес альтернативного маршрутизатора в качестве маршрута по умолчанию в новой таблице
sudo ip route add default via $ALTGWIP dev $DEV table $TABLE

# настроить "слабую" фильтрацию обратного пути. Я думаю, это необходимо, потому что 
# пакеты принимаются и оцениваются для RPF до того, как им присваивается fwmark, и 
# fwmarking перемещает пакет в контекст альтгв таблицы маршрутизации. Так что строгий 
# RPF может заблокировать пакет при оценке только по таблице маршрутизации по умолчанию, но, 
# по-видимому, слабый режим расширяется для проверки всех таблиц маршрутизации. Я не совсем 
# доволен этим объяснением, потому что
# обычно слабый режим RPF объясняется как проверка доступности через 
# любой сетевой интерфейс. Логично, что технические подробности 
# слабого режима открывают возможность проверки всех комбинаций сетевого интерфейса / таблицы маршрутизации, 
# но я не знаю, так ли это.
# см. https://en.wikipedia.org/wiki/Reverse-path_forwarding#Loose_mode
echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter > /dev/null;
echo 2 | sudo tee /proc/sys/net/ipv4/conf/$DEV/rp_filter > /dev/null;

# любые пакеты, связанные с cgroup, должны быть помечены меткой брандмауэра.
sudo iptables -t mangle -A OUTPUT -m cgroup --path $TABLE -j MARK --set-mark $FWMARK;
# и IP-адрес маскирован
sudo iptables -t nat -A POSTROUTING -m cgroup --path $TABLE -o $DEV -j MASQUERADE;

# показать новую таблицу
ip route show table $TABLE;

# выполнить трассировку перед использованием новой таблицы
traceroute -n 8.8.8.8

# преобразовать этот процесс для использования новой таблицы
echo $$ | sudo tee /sys/fs/cgroup/$TABLE/cgroup.procs 

# посмотреть, как изменится трассировка из-за использования новой таблицы этим процессом (и его дочерними процессами)
traceroute -n 8.8.8.8

echo
echo
echo "Теперь добавьте идентификатор процесса любого приложения в /sys/fs/cgroup/$TABLE/cgroup.procs, чтобы оно использовало новую таблицу маршрутизации."
echo "Самый простой способ сделать это - создать новый сеанс оболочки, добавить его в файл cgroup, затем запускать любые другие команды из этой оболочки: они унаследуют новую таблицу маршрутизации."
echo " например, echo \$\$ | sudo tee /sys/fs/cgroup/$TABLE/cgroup.procs ";
echo "Посмотрите на таблицу этой командой:";
echo "  ip route list table $TABLE";
echo "Точно так же добавляйте 'table altgw' к другим командам ip route, например, ip route add ... table altgw";

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

Оптимизация сетевого трафика на компьютере с несколькими сетевыми интерфейсами (как в вашем случае – с проводным и беспроводным подключением) может оказаться непростой задачей, особенно когда требуется направлять трафик конкретных приложений через определенный интерфейс. В этой ситуации основная задача – заставить ваш браузер Chrome использовать беспроводное соединение, в то время как остальные приложения продолжат использовать проводную сеть. Рассмотрим теоретическую основу, возможность реализации и методы применения в вашем случае.

Теория

Суть проблемы заключается в управлении маршрутизацией на уровне процесса, что требует изменения маршрута для конкретного приложения. Когда устройство подключено к двум сетям одновременно, операционная система автоматически выбирает основной маршрут на основании множественных факторов, таких как метрика маршрута и настройки маршрутизации. Однако, ситуации, когда необходимо направить трафик конкретного приложения через определенный интерфейс, требуют ручной настройки маршрутизации.

В операционных системах на базе Linux данной задачи можно добиться при помощи cgroups2 (контрольных групп), iproute2 и iptables. cgroups позволяют управлять ресурсами, назначенными процессам, и в данном контексте, они помогут ограничить маршруты конкретными процессами. Инструментарий iproute2 вместе с iptables позволяет управлять таблицами маршрутизации и применять необходимые правила.

Пример

Рассмотрим пример использования cgroups2 и iproute2 для достижения вашей цели.

  1. Создание альтернативной таблицы маршрутизации: Ключевой момент заключается в создании альтернативной таблицы маршрутизации, которая будет назначаться определенному маркеру (firewall mark). Создание такой таблицы выполняется при помощи утилит iproute2 и iptables. Основная идея заключена в том, чтобы назначить флаг пакету, исходящему из приложения Chrome, который затем будет направлен через нужную таблицу маршрутизации.

  2. Скрипт для управления маршрутизацией: Вы можете использовать сценарий, который автоматически создаст cgroup и настроит необходимые правила. В представленной конфигурации скрипта altgw-setup.sh:

    • Вам необходимо указать сетевой интерфейс и IP-адрес шлюза для беспроводной сети. В вашем случае, это wlan0 и IP вашего роутера соответственно.
    • Сценарий создает таблицу маршрутизации и назначает ей флаг для фильтрации пакетов. Он также настраивает правила iptables для пометки пакетов, прибывающих из определенных процессов.
  3. Запуск Chrome через созданные настройки: После настройки cgroup и таблицы маршрутизации, вам потребуется добавить процессы Chrome в эту группу. Это можно сделать путем добавления ID процессов в файл /sys/fs/cgroup/altgw/cgroup.procs. Это позволит Chrome использовать тот интерфейс, который вы указали в новой маршрутизационной таблице.

Применение

Используя вышеописанные инструменты, можно эффективно управлять маршрутизацией трафика на уровне отдельных приложений. Это подход применим не только к Chrome, но и к любым другим приложениям, которые вы бы хотели направить через определенный сетевой интерфейс. Однако, стоит отметить следующие нюансы:

  • Мониторинг и отладка: После настройки маршрутизации важно убедиться, что трафик действительно перенаправляется. Этого можно добиться с помощью утилит диагностики сетей, таких как traceroute, которые покажут маршрут пакетов.

  • Обновление конфигурации: Если сетевые параметры изменяются (например, IP адреса шлюзов), вам потребуется соответствующим образом обновить сценарий и настройки.

  • Обеспечение безопасности: Убедитесь, что маршрутизация не нарушает каких-либо политик безопасности, особенно если tрафик через беспроводную сеть требует определенного уровня защиты.

С учетом всех вышеописанных аспектов, применение таких методов маршрутизации может значительно повысить гибкость и контроль над сетевыми ресурсами в вашей конфигурации. Этот метод позволяет применять подходящее решение для вашей индивидуальной задачи без необходимости в сложных прокси-серверах или VPN.

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

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

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