Маршрутизация трафика через определенный интерфейс для процесса в linux

можно ли маршрутизировать трафик, используемый процессом, через определенный интерфейс?

например, сетевой трафик по скачать приложение должно всегда использовать интерфейс wlan0 тогда как все другие применения на машине должны использовать eth0.

возможно ли иметь такое правило в Linux?

6
задан MariusMatutiae
13.01.2023 17:30 Количество просмотров материала 3239
Распечатать страницу

5 ответов

Это можно сделать с помощью сетевых пространств имен Linux.

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

Update: из ядра 3.14 еще проще использовать контрольные группы, как описано в этот статья. Вы должны:

1) определите группу управления net_cls для аннотирования пакетов из данного процесса с помощью classid (или группы процессов, обратите внимание, что между ними не должно быть родительско-дочерних отношений)

2) используйте модуль iptables cgroup (добавленный в Linux 3.14) для fwmark The packets

3) Используйте политику маршрутизации (правило ip добавить fwmark ....) создать новую таблицу маршрутизации для отмеченных пакетов

преимущество что мы не делаем нужно сделать мостовую вещь, и все гораздо более динамично благодаря cgroups.

20
отвечен chripell 2023-01-15 01:18

я ооочень боролся с этим, так что вот полное решение. Он протестирован на Ubuntu 15 и 16. Вы можете особенно использовать его с OpenVPN для маршрутизации определенных приложений за пределами интерфейса VPN-туннеля.

полное решение "cgroup"

как это работает?

  • ядро Linux поместит приложение в группа контроля. Сетевой трафик от приложений в этой группе будет идентифицироваться по идентификатору класса на сетевом контроллере уровень.
  • iptables пометит этот трафик и заставит его выйти с правильным IP
  • ip route будет обрабатывать отмеченный трафик в другой таблице маршрутизации с маршрутом по умолчанию на любой IP-адрес шлюза, который вы хотите.

автоматизированный скрипт

я сделалnovpn.sh скрипт для автоматизации установки и запуска зависимостей. Проверена на Ubuntu.

сначала запустите VPN.

wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/cf8b37fbe6c3f50a0be825eb77cafa3e0134946f/novpn.sh
# If you don't use eth0, edit the script setting.
sudo chmod +x novpn.sh
./novpn.sh traceroute www.google.com
./novpn.sh --help

руководство HowTo

Сначала установите поддержку и инструменты cgroup:

sudo apt-get install cgroup-lite cgmanager cgroup-tools

перезагрузка (может не потребоваться).

вам нужны iptables 1.6.0+. получить iptables 1.6.0 релиз Источник, извлеките его, затем запустите это (--disable-nftables флаг позволит избежать ошибок) из iptables source dir:

sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr      \
            --sbindir=/sbin    \
            --disable-nftables \
            --enable-libipq    \
            --with-xtlibdir=/lib/xtables
make
sudo make install
iptables --version

теперь, реальная конфигурация. Определите группу управления с именем novpn. Процессы в этой cgroup будет иметь classid 0x00110011 (11:11).

sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid

теперь мы предположим, что интерфейс, который вы хотите использовать для конкретного приложения eth0 С IP шлюза 10.0.0.1. заменить это то, что вы действительно хотите (получить информацию от ip route). Еще как root:

# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11

# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE

# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables

# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn

# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn

# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

наконец, запустите приложение на определенном интерфейсе:

exit
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
# Close all Firefox windows first
cgexec -g net_cls:novpn firefox

или, если вы хотите переместить уже запущенный процесс в cgroup, хорошо... вы не можете! это, кажется, связано с Функция NAT (маскарад): iptables -nvL -t nat не совпадает при переключении cgroup, но iptables -nvL -t mangle не совпадает.

# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
sudo echo 1234 > /sys/fs/cgroup/net_cls

кредиты: нет ответа не работали, как ожидалось, но смесь из них сделал: chripell ответ evolware статья на процесс маршрутизации взять 2: с помощью контрольных групп, iptables и маршрутизации политики,как сделать так, чтобы конкретный процесс не проходил через соединение OpenVPN?,Kill switch для OpenVPN на основе iptables

12
отвечен KrisWebDev 2023-01-15 03:35

несколько человек написали оболочки совместимости, которые используют функцию LD_PRELOAD Linux для достижения этого:

2
отвечен grawity 2023-01-15 05:52

сочетание отличные ответы mariusmatutiae и KrisWebDev я создал широко модифицированную версию KrisWebDev отлично novpn.sh сценарий. В то время как сценарий KrisWebDev разработан, чтобы поцарапать более конкретный зуд (запуск и перемещение процессов внутри/вне VPN), моя версия позволяет запускать в основном любую команду в указанной вами сетевой среде. Вы можете указать интерфейс для привязки, маршрут по умолчанию, указать свои собственные правила iptables, статические маршруты, указать "тест", чтобы подтвердить все работает, как вы хотите, прежде чем запускать команду... п.) Это позволяет использовать несколько файлов конфигурации, так что вы можете определить любое количество конкретных сетевых сред, которые вы можете запускать команды/процессы внутри.

Я разместил его как суть здесь: https://gist.github.com/level323/54a921216f0baaa163127d960bfebbf0

он может даже очистить вверх таблицы cgroup/iptables/трассы потом!

обратная связь приветствовать.

PS-он предназначен для Debian 8 (Jessie)

2
отвечен allnatural 2023-01-15 08:09

не в программе, нет. Вы можете сделать это по порту или по ip-адресу и т. д., или приложение само может привязаться (и использовать) определенную сетевую карту.

вы не можете настроить правило, чтобы сделать это.

0
отвечен Majenko 2023-01-15 10:26

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх