Перейти к содержимому
Калькуляторы

Вопрос из темы 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 - другой?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

распихать экземпляры по openvz виртуалкам

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

допустим сервер к которому коннектимся 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. Вроде бы должно работать.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

допустим сервер к которому коннектимся 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

допустим сервер к которому коннектимся 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. Так точно будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

 

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.