Привет, всем!Я программирую под unix совсем немного времени... Возникла проблема, решение которой, теперь я думаю под силу человеку, знающему функционирование обработки сетевых потоков.
Вот вкратце суть моей задачи. На узле А нужно ловить все пакеты, направленные в определенную сеть, отсекать эти пакеты и пересылать их на узел B. Т.е. на узле А нужно ловить нужные пакеты, инкапсулировать их в UDP пакеты и пересылать на узел B. А на узле B нужно "отпустить" этот пакет будто он сам пришел на узел В и дальше он идет обычными средствами туда, куда и направлялся.
Я использую ubuntu 10. Для перехвата пакетов использую iptalbes/libipq.
Инкапсулирую перехваченный пакет как он пришел (без его изменения). А потом на узле получив пакет, пытаюсь "положить" его на дальнейшую обработку. Для этого я использую библиотеку libnet.
1. Открываю сокет int libnet_open_raw_sock(int protocol);
2. Записываю полученный пакет int libnet_write_ip(int sock, u_char *packet, int len);
Wireshark перехватывает этот пакет. Т.е. вроде бы он записался нормально. Но система как будто НЕ ОБРАБАТЫВАЕТ эти пакеты. Пакеты в систему падают, wireshark их ловит, но система на них не реагирует.
Вот тут у меня и вопрос. Можно ли так делать? Я отправляю перехваченный пакет на узел B.
(т.е. я отправляю m->payload, где m - это объект ipq_packet_msg_t). А на узле B просто записываю в raw_sock эти данные. Сколько байт получил на узле А, столько же и записал в raw_sock на узле B.
Есть тут какие-нибудь противоречия? Почему система их не обрабатывает?
Я решил, что система не обрабатывает эти пакеты, потому что я на узле А перехватываю ICMP пакеты пинга узла B, передаю эти пакеты в инкапсулированном виде на узел В. На узле B вторая программа ожидает эти пакеты, "разворачивает" их из UDP и "отпускает" на обработку путем записи в raw_sock. Но пинги назад не возвращаются!! Хотя wireshark перехватил пакет, который пришел в систему с пингом...
Очень надеюсь на вашу помощь!
Спасибо!