Jump to content

Recommended Posts

Posted

Имеется сервер 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 - другой?

 

 

Posted

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

 

Posted

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

 

 

 

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

 

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

Posted

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

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

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

 

Posted
Если программа динамически слинкована можно через 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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.