Вопрос или проблема
У меня настроена сеть с двумя соединениями: проводным и беспроводным. Моя цель – настроить маршрутизацию так, чтобы только 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 для достижения вашей цели.
-
Создание альтернативной таблицы маршрутизации: Ключевой момент заключается в создании альтернативной таблицы маршрутизации, которая будет назначаться определенному маркеру (firewall mark). Создание такой таблицы выполняется при помощи утилит iproute2 и iptables. Основная идея заключена в том, чтобы назначить флаг пакету, исходящему из приложения Chrome, который затем будет направлен через нужную таблицу маршрутизации.
-
Скрипт для управления маршрутизацией: Вы можете использовать сценарий, который автоматически создаст cgroup и настроит необходимые правила. В представленной конфигурации скрипта altgw-setup.sh:
- Вам необходимо указать сетевой интерфейс и IP-адрес шлюза для беспроводной сети. В вашем случае, это wlan0 и IP вашего роутера соответственно.
- Сценарий создает таблицу маршрутизации и назначает ей флаг для фильтрации пакетов. Он также настраивает правила iptables для пометки пакетов, прибывающих из определенных процессов.
-
Запуск Chrome через созданные настройки: После настройки cgroup и таблицы маршрутизации, вам потребуется добавить процессы Chrome в эту группу. Это можно сделать путем добавления ID процессов в файл
/sys/fs/cgroup/altgw/cgroup.procs
. Это позволит Chrome использовать тот интерфейс, который вы указали в новой маршрутизационной таблице.
Применение
Используя вышеописанные инструменты, можно эффективно управлять маршрутизацией трафика на уровне отдельных приложений. Это подход применим не только к Chrome, но и к любым другим приложениям, которые вы бы хотели направить через определенный сетевой интерфейс. Однако, стоит отметить следующие нюансы:
-
Мониторинг и отладка: После настройки маршрутизации важно убедиться, что трафик действительно перенаправляется. Этого можно добиться с помощью утилит диагностики сетей, таких как
traceroute
, которые покажут маршрут пакетов. -
Обновление конфигурации: Если сетевые параметры изменяются (например, IP адреса шлюзов), вам потребуется соответствующим образом обновить сценарий и настройки.
-
Обеспечение безопасности: Убедитесь, что маршрутизация не нарушает каких-либо политик безопасности, особенно если tрафик через беспроводную сеть требует определенного уровня защиты.
С учетом всех вышеописанных аспектов, применение таких методов маршрутизации может значительно повысить гибкость и контроль над сетевыми ресурсами в вашей конфигурации. Этот метод позволяет применять подходящее решение для вашей индивидуальной задачи без необходимости в сложных прокси-серверах или VPN.
Напоследок, стоит подчеркнуть, что хотя настройка cgroups и альтернативных таблиц маршрутизации на Linux может показаться сложной, после первого успешного применения она открывает множество дополнительных возможностей для оптимизации и кастомизации сетевой инфраструктуры вашего устройства.