| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Отправка перехваченного пакета |
| Автор: konshyn 22.11.2013, 17:40 | ||||||
| Ребят, нужна помощь. В общем, перехватываю IP пакеты. Полностью с IP заголовком и инкапсулированными данными. Но этот же пакет мне нужно самому и отправить. Т.е. я перехватил, а потом его же отправляю OC настроена на маршрутизацию. Но проходящие пакеты я блокирую. т.е. IPTABLES (FORWARD = DROP) Создаю сокет для отправки перехваченного пакета так:
потом использую опцию IP_HDRINCL
Затем происходит это:
в итоге rezult возвращает сколько байт он отправил, но! wireshark не показывает, что пакет был отправлен, он просто не видит этого пакета Выручайте, литература не помогла мне разобраться с сырыми сокетами и отправкой собственных пакетов. Уже больше двух месяцев переодически пытался разобраться, но все тщетно... Раньше не горело, сейчас горит. |
| Автор: tzirechnoy 22.11.2013, 22:13 |
| Думаете, кто-нибудь опять приведёт Вашы наброски к компилируемому виду, чтобы вяснить какую-то банальную ошыбку у Вас? Добавлено через 4 минуты и 48 секунд Ну и да, банально-системное: в iptables за самосгенерённые пакеты отвечает OUTPUT. Проверьте, что там тожэ не DROP. |
| Автор: konshyn 22.11.2013, 22:52 | ||
Вы не поверите, но сюда я обратился за помощью. Может кому-то и не будет лень привести все к компилируемому виду. А может кто-то уже сталкивался с такой проблемой и сразу даст понять, в чем ошибка или что нужно проверить в первую очередь. Политика для INPUT и OUTPUT - ACCEPT. |
| Автор: feodorv 23.11.2013, 03:34 |
| Снимите запрет на FORWARD; посмотрите, будет ли дублироваться пакет. |
| Автор: konshyn 25.11.2013, 08:54 | ||||
Не дублируется. Сделал компилируемый код в минимальном стиле:
|
| Автор: konshyn 25.11.2013, 09:16 | ||
| UPD: Хотя может и дублируются... как это определить? так выходят иногда одинаковые пакеты (мимо проходящие) вот скрин wireshark'a во время работы вышепредставленного кода ubuntu настроена на маршрутизацию, а политика FORWARD = DROP мой ip заканчивается xxx.xxx.xxx.137 (т.е. он здесь не фигурирует, т.к. фильтр стоит на xxx.xxx.xxx.198). xxx.xxx.xxx.198 - это тот, который отправляет все пакеты через меня. Добавлено @ 09:28 UPD2: И самое интересное наблюдение: Когда ставлю политику для FORWARD = ACCEPT, то пакеты дублируются! Мне начинает казаться, что все дело в ОС и в ее политике. feodorv, извините за ложную информацию
Недосып - страшная вещь:( |
| Автор: konshyn 25.11.2013, 11:24 |
| Не отправляются пакеты, даже если не настроена ОС на маршрутизацию. Т.е. как бы "отправляются". Возвращает сколько было отправлено.. и все. |
| Автор: konshyn 26.11.2013, 12:06 |
| Сорри, я разобрался в своей криворукости:( P.S. Эта тема похожа на блог программиста-неудачника |
| Автор: xvr 26.11.2013, 13:52 |
Так поделитесь с остальными, в чем было дело |
| Автор: konshyn 26.11.2013, 21:29 | ||||||
IP пакеты(чистые, т.е. заголовок IP и инкапсулированные данные) перехватывать в linux нельзя. По крайне мере я не нашел как это делается. Я создавал ПАКЕТНЫЙ сокет:
т.е. в моем сообщении был полностю eth-кадр: [ethernet заголовок[ip заголовок[..дальнейший стек и данные]]]; для отправки IP пакета сырой сокет использовал с опцией IP_HDRINCL; ну, и в коде, который написал выше, и в своей программе я делал одно и то же. копировал IP заголовок, чтобы определить структуру sockaddr_in для функции sendto, т.к. семейство и адрес получателя указывать обязательно т.е. функция sendto отправляет пакет на тот адрес, который указан в структуре sockaddr_in, и соответственно, ядро само заменит это поле в ip-пакете на адрес, который указан в структуре, а все остальное, кроме, вроде как чек-суммы - останется в том виде, как был заполнен пакет.
В моем recv_msg хранится eth-кадр, а нужно было отправлять IP-пакет, т.е. заголов ethernet нужно было убрать(первые 14 байт в пакете все портили)
то, что нужно было исправить, а точнее просто добавить, я взял в тройные круглые скобки. P.S. Как редактировать в теге [code] не знаю:( P.P.S. будьте внимательнее, господа |