Jump to content
Калькуляторы

Вопрос из темы Advanced routing Linux

Имеется сервер Linux Centos 5.

На сервере прикручено 3 алиаса , IP-адреса из одной подсети. допустим 62.0.0.2 , 62.0.0.3 , 62.0.0.4

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

Программа биндит локальный TCP-сокет к локальному адресу 0.0.0.0 и коннектится по TCP к хосту, обслуживающему ее запросы.

 

Задача - запустить 3 экземпляра программы как-то так, чтоб экземпляр 1 осуществлял подключения к удаленному хосту используя IP первого алиаса, второй экземпляр IP второго алиаса, третий - третий IP.

 

Точнее сказать цель чтоб целевой хост ( к которому идут подключения ) видел эти 3 экземляра как-бы запущенными на 3 разных серверах)))

 

IP целевого хоста ( куда идет подключения ) тоже прибит гвоздями внутри программы....

 

есть какие-то идеи на тему ip rule чтоб скажем процесс запущенный под одним uid использовал один локальный IP при коннектах, а под другим uid - другой?

 

 

Share this post


Link to post
Share on other sites

В mangle маркировать через iptables match owner --cmd-owner name или --pid-owner processid(если известен пид процесса или строка запуска), и на соотвествующий fwmark весить policy routing табличку с нужным src полем.

 

Share this post


Link to post
Share on other sites

только что посмотрел. match owner processid и cmd-owner выкинули из ядра..

Share this post


Link to post
Share on other sites

допустим сервер к которому коннектимся 62.0.0.10

 

ip route add table client1 62.0.0.10 via 62.0.0.2

ip route add table client2 62.0.0.10 via 62.0.0.3

ip route add table client3 62.0.0.10 via 62.0.0.4

 

ip rule add fwmark 0x01 table client1

ip rule add fwmark 0x02 table client2

ip rule add fwmark 0x03 table client3

 

iptables -t mangle -A OUTPUT -m owner --uid-owner client1 -j MARK --set-mark 0x01

iptables -t mangle -A OUTPUT -m owner --uid-owner client2 -j MARK --set-mark 0x02

iptables -t mangle -A OUTPUT -m owner --uid-owner client3 -j MARK --set-mark 0x03

 

вроде вот так. клиентов запускаем под разными юзерами client1, client2, client3. Вроде бы должно работать.

 

 

 

Share this post


Link to post
Share on other sites
допустим сервер к которому коннектимся 62.0.0.10

 

ip route add table client1 62.0.0.10 via 62.0.0.2

ip route add table client2 62.0.0.10 via 62.0.0.3

ip route add table client3 62.0.0.10 via 62.0.0.4

 

ip rule add fwmark 0x01 table client1

ip rule add fwmark 0x02 table client2

ip rule add fwmark 0x03 table client3

 

iptables -t mangle -A OUTPUT -m owner --uid-owner client1 -j MARK --set-mark 0x01

iptables -t mangle -A OUTPUT -m owner --uid-owner client2 -j MARK --set-mark 0x02

iptables -t mangle -A OUTPUT -m owner --uid-owner client3 -j MARK --set-mark 0x03

 

вроде вот так. клиентов запускаем под разными юзерами client1, client2, client3. Вроде бы должно работать.

не так.

ip route add table client1 62.0.0.10 via $gw src  62.0.0.2
ip route add table client2 62.0.0.10 via $gw src 62.0.0.3
ip route add table client3 62.0.0.10 via $gw src  62.0.0.4

 

Share this post


Link to post
Share on other sites
допустим сервер к которому коннектимся 62.0.0.10

 

ip route add table client1 62.0.0.10 via 62.0.0.2

ip route add table client2 62.0.0.10 via 62.0.0.3

ip route add table client3 62.0.0.10 via 62.0.0.4

 

ip rule add fwmark 0x01 table client1

ip rule add fwmark 0x02 table client2

ip rule add fwmark 0x03 table client3

 

iptables -t mangle -A OUTPUT -m owner --uid-owner client1 -j MARK --set-mark 0x01

iptables -t mangle -A OUTPUT -m owner --uid-owner client2 -j MARK --set-mark 0x02

iptables -t mangle -A OUTPUT -m owner --uid-owner client3 -j MARK --set-mark 0x03

 

вроде вот так. клиентов запускаем под разными юзерами client1, client2, client3. Вроде бы должно работать.

не так.

ip route add table client1 62.0.0.10 via $gw src  62.0.0.2
ip route add table client2 62.0.0.10 via $gw src 62.0.0.3
ip route add table client3 62.0.0.10 via $gw src  62.0.0.4

Я тут подумал и провел эксперимент. Не будет такая схема работать. Даже если bind на 0.0.0.0, то при connect на 62.0.0.10 ядро сначала посмотрит в дефолтной таблице и отправит пакет с дефолтного адреса. А уже потом этот пакет промаркируется и завернется в нужную таблицу. Но это ужен не поможет, тк src уже проставлен.

 

Может быть тогда как-нибудь со SNAT поиграть: устанавливать TOS соответсвующего приложения и на внешнем linux роутере SNAT'ить в разные адреса на основе этого TOS. Так точно будет работать.

Share this post


Link to post
Share on other sites

Если программа динамически слинкована можно через LD_PRELOAD подсунуть в bind() другие параметры.

Если статически - наверняка можно просто пропатчить 4 байта в бинарнике.

Иначе - openvz/xen/kvm/vmware по вкусу.

 

Share this post


Link to post
Share on other sites
Если программа динамически слинкована можно через LD_PRELOAD подсунуть в bind() другие параметры.

Если статически - наверняка можно просто пропатчить 4 байта в бинарнике.

Иначе - openvz/xen/kvm/vmware по вкусу.

вот про LD_PRELOAD можно подробнее?) Интерестно

 

На тему mangle -- первое что попробовал. решение о маршрутизации принимается ДО прохода пакетом этой цепочки.

 

 

Спасибо нашел сам

http://www.ryde.net/code/bind.c.txt

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this