Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как организована сетевая модель в Linux?


Автор: KaraKum 28.7.2009, 16:21
Доброе время суток.

Опишу задачу:
Есть сервер и два приложения (a и b), запущенные на разных компах. Приложение a подключено к серверу, приложение b нет. Нужно все пакеты, отправляемые из сервера приложению a, продублировать (отправить повторно) от компа, на котором запущено приложение a, компу, на котором запущено приложение b. То есть для приложения b создать иллюзию того, что с ним общается сервер (но на самом деле сервер общается с приложением a).
Как можно это осуществить (в Linuxe, соответственно)?
Приложения на основе сокетов писал, но они здесь, как я понял, не помогут.

P.S. Вообще хотелось бы найти литературу по поводу организации этой сетевой модели в Linux'e. Узнать как можно сканировать входящие и исходящие пакеты?. Как можно установить определённый адрес получателя (отправителя) или как вообще вручную (без сокетов) формировать пакеты?

Автор: MAKCim 28.7.2009, 18:09
в одной локалке сервер и клиенты находятся?

Автор: KaraKum 29.7.2009, 00:01
Нет - сервер и клиент (комп с приложением a) находятся по разные стороны интернета. В одной локалке будут компы с приложениями a и b - то есть комп с приложением a должен будет передавать по локалке (дублировать) все пакеты компу с приложением b, получаемые от сервера через www. При этом эти пакеты должны "выглядеть" для приложения b так, якобы они предназначались именно для него (а не для приложения a - как в действительности).

Хотелось бы, помимо ответа, узнать литературу, описывающую вообще всю эту модель (организацию портов, пакетов и так далее) или хотя бы знать название этой "науки", чтобы знать с чего начать искать.
P.S. "raw sockets" - правильное направление поиска?.

Автор: InvalidProperty 29.7.2009, 08:32
Цитата(KaraKum @  29.7.2009,  00:01 Найти цитируемый пост)
P.S. "raw sockets" - правильное направление поиска?. 

нет.

читай литературу "Стивенс_UNIX_Разработка сетевых приложений". Ее легко можно найти в сети - классная книга.

Кто будет инициировать работу с сервером? Приложение b? Оно якобы запрашивает соединения с сервером, а на самом деле траф идет через a или как? Если так, то почему бы просто порт на a не прокинуть к серверу?

Автор: KaraKum 29.7.2009, 09:27
Цитата(InvalidProperty @ 29.7.2009,  09:32)
Кто будет инициировать работу с сервером? Приложение b? Оно якобы запрашивает соединения с сервером, а на самом деле траф идет через a или как?

Немного не так - соединяться с сервером должно приложение a. Комп, на котором запущено это приложение a, должен все пакеты, посылаемые сервером приложению a, дублировать на комп (уже по локальной сети) с приложением b, при этом приложение b должно "думать", что все эти дублированные пакеты предназначаются именно для него. То есть пакеты, посылаемые сервером приложению a, должны доходить И до a, И до b.

P.S. Программы скомпилированы не мною и исходников нету, поэтому вручную на сокетах продублировать пакеты нельзя.

Автор: Pointer 29.7.2009, 09:56
Попробуй iptables. Что-то типа такого.
iptables -t nat -A POSTROUTING -p tcp -d SERVER_ADR --dport PORT_A  -j SNAT --to-source IP_B

Автор: KaraKum 29.7.2009, 11:05
Цитата(Pointer @ 29.7.2009,  10:56)
Попробуй iptables. Что-то типа такого.
iptables -t nat -A POSTROUTING -p tcp -d SERVER_ADR --dport PORT_A  -j SNAT --to-source IP_B

Спасибо за совет, но проблему "замены заголовка отправителя" это не решает.
Нашёл библиотеку libpcap (http://yuba.stanford.edu/~casado/pcap/section1.html) - похоже она решает проблему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)