Назад | Перейти на главную страницу

Маршрутизация IP-трафика на основе процесса к различным маршрутам / интерфейсам по умолчанию

Я пытаюсь определить, можно ли выборочно маршрутизировать IP-пакеты от процесса или группы процессов через определенный интерфейс, в то время как все остальные пакеты маршрутизируются через другой интерфейс. То есть мне нужен весь трафик от /usr/bin/testapp быть направленным через eth1 в то время как все остальные пакеты проходят eth0. Пакеты в этом случае могут быть TCP, UDP, ICMP и т. Д. И могут быть настроены конечными пользователями для использования различных портов.

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

--- редактировать ---

Здесь и во многих других местах есть полезный совет: маркировать пакеты на основе UID; это не совсем цель. Цель состоит в том, чтобы отметить / отфильтровать / направить на основе процесса независимо от пользователя. То есть, если alice, bob и charlie все запускают свой собственный экземпляр /usr/bin/testapp; все пакеты из всех трех экземпляров должны пройти eth1 а все остальные пакеты из системы должны пройти eth0.

Обратите внимание, что маркировки по порту источника / назначения, имени пользователя / UID и т. Д. Недостаточно, поскольку разные пользователи могут запускать testapp и они могут устанавливать разные порты в свои собственные ~/.config/testapp.conf или что угодно. Вопрос в фильтрации по процессам.

Один из доступных вариантов, хотя я не знаю, насколько он полезен, - это использовать /bin/(ba|z)?shоболочка вокруг собственного двоичного файла.

--- редактировать ---

Я имею в виду маршрутизацию в системе с современным ядром Linux, скажем 4.0 или выше. Если есть программные зависимости за пределами iproute2, nftables, conntrack и подобные инструменты, я хочу изучить решения с открытым исходным кодом, хотя базовые инструменты предпочтительнее.

Ваша маршрутизация пакетов через eth1 или eth0. таблицы mangle должны решить эту проблему. Для этого мне пришлось пометить пакеты и установить правила их обработки. Во-первых, добавьте правило, которое делает пакеты маршрутизации ядра помеченными 2 через таблицу

ip rule add fwmark 2 table 3

Добавьте маршрут для перенаправления трафика через другой интерфейс, предполагая, что шлюз - 10.0.0.1:

ip route add default via 10.0.0.1 table 3

Очистите кэш маршрутизации.

ip route flush cache

Теперь установите правило брандмауэра для маркировки назначенных пакетов:

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

Наконец, ослабьте проверку источника обратного пути. Некоторые предлагают вам установить его на 0, но 2 кажется лучшим выбором согласно https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt. Если вы пропустите это, вы получите пакеты (это можно подтвердить с помощью tcpdump -i tap0 -n), но пакеты не принимаются. Команда для изменения настройки для приема пакетов:

sysctl -w net.ipv4.conf.tap0.rp_filter=2

Ссылка : http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

Ну, учитывая то, что вы нам сказали:

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

мы можем начать помогать вам с этого момента. Однажды во FreeBSD jail Системный вызов появился с целью ограничить процесс или группу процессов каким-либо подразделом на системных ресурсах. В частности, можно указать IP-адрес, который эти «изолированные» процессы будут использовать для своей сетевой активности. Это было так удобно, что мне очень не хватало этой функции в Linux. Но у Linux тоже есть несколько способов добиться подобных результатов:

или, наиболее легковесным будет просто возиться с пространствами имен вручную: https://unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-binding-it-to-ip-address-of-choice

К сожалению, справочная страница расширений iptables (http://ipset.netfilter.org/iptables-extensions.man.html) заявляет, что модуль не соответствует вашим требованиям.

Я бы предложил то же самое, что и Маурисио Лопес.

Ты мог setuid или setgid целевое приложение для определенного пользователя или группы, так что независимо от того, кто изначально запустил приложение, оно всегда будет запускаться как конкретный пользователь или группа):

adduser specialrouteuser
chown specialrouteuser: /usr/bin/testapp
chmod +s /usr/bin/testapp

а затем используйте iptables owner расширение для соответствия этому конкретному UID или GID.

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

Вы можете запустить процесс с конкретным пользователем и сопоставить пакеты с iptable owner расширение. После сопоставления вы можете пометить его и использовать с другой таблицей маршрутизации, используйте POSTROUTING или любое другое решение, которое вам может понравиться.

это сообщение лучше объясняет сопоставление пакетов с owner.