Разные маршруты по умолчанию для разных программ, как?

Linux, безопасность, сети и все что с этим связано
Spine
Заглянувший
Сообщения: 12
Зарегистрирован: 10 ноя 2007, 09:47
Откуда: Orsha
Контактная информация:

Разные маршруты по умолчанию для разных программ, как?

Сообщение Spine »

Имеем:
1. комп с Debian'ом (10.0.0.252)
2. шлюз в и-нет (10.0.0.242) - быстрое но дорогое подключение
3. PPPoE соединение (ppp0) - анлим, но медленный, IP соединения и IP шлюза - динамические

Требуется:
Запустить только одну программу через 10.0.0.242, а всё остальное должно ходить через ppp0.
По портам и IP фильтровать не получится т.к. они разные, да и остальные проги могут их использовать...

Собственно HOWTO?

Hermit
Неотъемлемая часть форума
Сообщения: 354
Зарегистрирован: 22 сен 2004, 13:47
Откуда: Minsk
Контактная информация:

Re: Разные маршруты по умолчанию для разных программ, как?

Сообщение Hermit »

Можно попробовать использовать cmd-owner модуля match, но, похоже, что поддержку cmd-owner убрали с 2.6.14.
Другой вариант - запускать программу скриптом, который после запуска создаст правило с --uid-owner.
В обоих случаях получится что-то вроде этого:

Код: Выделить всё

iptables -t mangle -A OUTPUT -m owner --cmd-owner apache -j MARK --set-mark 1
ip ro add table 10 default via 10.0.0.242 dev ethX
ip ru add fwmark 1 table 10

Spine
Заглянувший
Сообщения: 12
Зарегистрирован: 10 ноя 2007, 09:47
Откуда: Orsha
Контактная информация:

Re: Разные маршруты по умолчанию для разных программ, как?

Сообщение Spine »

man iptables мне вот что вдало:
owner
This module attempts to match various characteristics of the packet creator, for locally generated packets. This match is only valid in the OUTPUT and POSTROUTING chains.
Forwarded packets do not have any socket associated with them. Packets from kernel threads do have a socket, but usually no owner.

[!] --uid-owner username
[!] --uid-owner userid[-userid]
Matches if the packet socket’s file structure (if it has one) is owned by the given user. You may also specify a numerical UID, or an UID range.
[!] --gid-owner groupname
[!] --gid-owner groupid[-groupid]
Matches if the packet socket’s file structure is owned by the given group. You may also specify a numerical GID, or a GID range.
[!] --socket-exists
Matches if the packet is associated with a socket.
т.е. пошагово:
1. создаю пользователя, ну например "lanuser"
2. в скрипт запуска в /etc/init.d добавляю:

Код: Выделить всё

RUNASUSER=lanuser
start-stop-daemon --start --quiet --oknodo --user $RUNASUSER --pidfile $PIDFILE --startas $DAEMON  --chuid $RUNASUSER --
3. в скрипт в /etc/network/if-up.d дописываю:

Код: Выделить всё

iptables -t mangle -A OUTPUT -m owner --uid-owner lanuser -j MARK --set-mark 1
ip ro add table 10 default via 10.0.0.242 dev eth0
ip ru add fwmark 1 table 10
что я ещё упустил?

Hermit
Неотъемлемая часть форума
Сообщения: 354
Зарегистрирован: 22 сен 2004, 13:47
Откуда: Minsk
Контактная информация:

Re: Разные маршруты по умолчанию для разных программ, как?

Сообщение Hermit »

Spine, пробуй, должно работать :)

Spine
Заглянувший
Сообщения: 12
Зарегистрирован: 10 ноя 2007, 09:47
Откуда: Orsha
Контактная информация:

Re: Разные маршруты по умолчанию для разных программ, как?

Сообщение Spine »

что-то после добавления этих правил и запуска сервиса от левого пользователя забиндить нужные порты не получилось,
решил пойти от обратного - добавил себя любимого :)

Код: Выделить всё

iptables -t mangle -A OUTPUT -m owner --uid-owner spine -j MARK --set-mark 1
ip ro add table 10 default dev ppp0
ip ru add fwmark 1 table 10
Вроде работает как хотелось, единственный нюанс:
когда отваливается ррр0 пользователь начинает ходить через "default route" (10.0.0.242), а хочется чтоб он туда не совался...

пока добавил "левый" маршрут:

Код: Выделить всё

ip route add table 10 default via 10.7.19.254 dev eth0 metric 20
вроде всё встало на свои места, но терзают смутные сомнения что можно было сделать покрасивее...

Ответить