Advanced программинг: Level 7 routing на ПХП

simplyAl

Новичок
Advanced программинг: Level 7 routing на ПХП

Нужно сделать L7 роутинг с самописной логикой (функционала патча L7 для iptables не хватает) на ПХП.

Вариант №1
Client
|
Level 7 Router (PHP)
|
Load Balancer
|
Content Server

ХТТП запрос GET "/pfix/123"
где 123 - идентификатор контента (это может быть изображение например или любой другой файл),

Запрос попадет на "роутер", где логика приобразует его в GET "/_ID_/123" и передает запрос дальше на балансер, который по признаку /_ID_/ выбирает правильное зеркало (Content Server).

Проблема:
Запрос на балансер нужно перекинуть так, чтобы балансер думал, что запрос пришел от Client'a! Т.е. когда пакет дойдет до балансера, в src_ip должен стоять IP адрес клиента, а не роутера. И при этом логинка роутера (та которая меняет "GET /pfix/123" на "GET /_ID_/123") должна быть релизована на ПХП.

Вариант №2
Роутер объеденить с балансером, получится

Client
|
Load Balancer <-> PHP Level7
|
Content Server

Например, на балансер приходит запрос GET "/pfix/123". Перед тем как начать выбирать зеркало, балансер передает ХТТП запрос на какой-то локальный процесс (через пайп или shared memory) и получает от него модифийированный GET "/_ID_/123", с которым дальше балансер рабоатет по бычной схеме.

Тогда вопрос: как в линуксе перехватывать пакеты (запросы), запихивать их в программу (можно тело пакета целиком), от этой программы получать модифицированный пакет и дальше работать с ним по обычной схеме? При этом программа, модифицирующая пакет, должна быть написана на ПХП (можно в виде демона).

Буду благодарен за любые идеи.
 

uliss

Новичок
[off]
Роутер на PHP :) Ну-ну

ЗЫ. Автор скорее всего ответит - не надо спрашивать у меня, почему именно на PHP
 

simplyAl

Новичок
uliss
вы правы, так и отвечу:)

Кстати, никто не в курсе кол-во сегментов, которые можно выделять в shared memory как-то ограничено? Например их может быть 1-2 млн по 32 байта длиной каждый?
 

si

Administrator
Кстати, никто не в курсе кол-во сегментов, которые можно выделять в shared memory как-то ограничено? Например их может быть 1-2 млн по 32 байта длиной каждый?
настройками ядра. очевидно что лучше выделять все-таки большими кусками
 

uliss

Новичок
Parameters for shared memory
kernel.shmmni: maximum number of shared segments, system wide
kernel.shmall: maximum shared memory, system wide
kernel.shmmax: maximum shared memory segment size

и man sysctl
 

simplyAl

Новичок
по shared memory - спасибо, я не знал что эти настройки в ядре.

ну дак и все таки, как на ПХП отфорвардить ТСР пакет заглянув внутрь и не меняя в нем src_ip?
 

simplyAl

Новичок
StUV
Можно обойтись без форвардинга.
Например, балансер можно настроить так чтобы он смотрел не признак в запросе, а например на маркировку пакета.

Потом написать userspace модуль к iptables на Сях.
Таблетки завернуть на дампинг пакетов в очерель, модуль повесить хендлером на эту самую очередь. Потом из модуля ставить пакетам марки в засивимости от GET запроса, и ACCPTить сами пакеты. Дальше они будут доходить до балансера, который в зачисимости от марка будет перекидывать запрос на зеркало.

Навернаяка из модуля в таблетках можно и "пересобрать пакет" (или по крайней мере его payload) с модифифированным GETом, но смысла нет - т.к. из модуля уже можно ставить марки - по ним балансер намного быстрее рабоатет, т.к. это Level3-4, а не Level7.

Но в таком случае логику, которая опраделяет какой марк поставить пакету нужно писать на Сях. Я мне эту логику нужно сделать на ПХП.
 

StUV

Rotaredom
simplyAl
твои слова
При этом программа, модифицирующая пакет, должна быть написана на ПХП (можно в виде демона).
если можно в виде демона - почему бы не на Сях ? =)
 
Сверху