LostSoul Posted September 15, 2009 Posted September 15, 2009 Имеется сервер 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 - другой? Вставить ник Quote
Мартен Posted September 16, 2009 Posted September 16, 2009 распихать экземпляры по openvz виртуалкам Вставить ник Quote
m0sia Posted September 16, 2009 Posted September 16, 2009 В mangle маркировать через iptables match owner --cmd-owner name или --pid-owner processid(если известен пид процесса или строка запуска), и на соотвествующий fwmark весить policy routing табличку с нужным src полем. Вставить ник Quote
m0sia Posted September 16, 2009 Posted September 16, 2009 только что посмотрел. match owner processid и cmd-owner выкинули из ядра.. Вставить ник Quote
m0sia Posted September 16, 2009 Posted September 16, 2009 допустим сервер к которому коннектимся 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. Вроде бы должно работать. Вставить ник Quote
Мартен Posted September 16, 2009 Posted September 16, 2009 допустим сервер к которому коннектимся 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 Вставить ник Quote
m0sia Posted September 17, 2009 Posted September 17, 2009 допустим сервер к которому коннектимся 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. Так точно будет работать. Вставить ник Quote
vitalyb Posted September 17, 2009 Posted September 17, 2009 Если программа динамически слинкована можно через LD_PRELOAD подсунуть в bind() другие параметры. Если статически - наверняка можно просто пропатчить 4 байта в бинарнике. Иначе - openvz/xen/kvm/vmware по вкусу. Вставить ник Quote
LostSoul Posted September 17, 2009 Author Posted September 17, 2009 Если программа динамически слинкована можно через LD_PRELOAD подсунуть в bind() другие параметры.Если статически - наверняка можно просто пропатчить 4 байта в бинарнике. Иначе - openvz/xen/kvm/vmware по вкусу. вот про LD_PRELOAD можно подробнее?) Интерестно На тему mangle -- первое что попробовал. решение о маршрутизации принимается ДО прохода пакетом этой цепочки. Спасибо нашел сам http://www.ryde.net/code/bind.c.txt Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.