![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
ДК2009 |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Не могу отправить принятый пакет!
(на приеме обычный код пассивного сниффера)
Дальше читаю служебную информацию из пакетов:
Далее необходимо отправить пакет получателю(его ip находится в поле destination ) Код C
Код компилируется без ошибок.При выполнении программы принимаю пакеты из интерфейса, читаю поля, но при попытке отправить пакет дальше получателю(машина-шлюз через который идет транзитный траффик) в QTCreator'e выводится строка : sendto failed Недопустимый аргумент!!!!!!!!!(подозреваю - buf) Что происходит с буфером buf при приеме пакета и как его отправить дальше что то не совсем понятно...(может в него необходимо добавить новое значение контрольной суммы или что либо наподобие) Чую что многого здесь не понимаю.....
|
||||||||||
|
|||||||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
buf - это весь пакет включая L2, L3, L4 заголовки, в sendto нужно передавать все, что дальше L4 т. е к buf нужно прибавить длину заголовков IP и TCP/UDP это раз во-вторых, если servaddr.sin_addr.s_addr соответствует тому же хосту, на котором работает снифер, то отправка не прокатит, т. к на пакетный сокет приходит _копия_ пакета и велика вероятность, что оригинал уже доставлен аналогично, если включен форвардинг пакетов, в этом случае оригинал уже может быть отправлен хосту адресату -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
1.Так а зачем прибавлять к buf длину заголовков IP и TCP/UDP если buf уже содержит эти все заголовки? что то я не пойму....
Или buf все таки содержит только пользовательские данные а рядом с ним в памяти содержатся заголовки? 2. похоже я там опечатался- servaddr.sin_addr.s_addr поменять на servaddr.sin_addr.d_addr. на этом компе forwarding отключен, пакеты идут на него транзитом с помощью подмены mac адресов путем статистических записей на клиентах и сервере(в arp таблицах).Т.е. я патаюсь сделать что то наподобие функции ip_forwarding только основная цель это вносить изменения в проходящий траффик(весь) !!!!!! Так что думаю оригинал проходить не должен дальше...... Будет ли такая система работать вообще? Спасибо за внимание!!! ![]() |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
про servaddr.sin_addr.d_addr ступил такого члена в данной структуре нет...
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в sendto нужно передавать только пользовательские данные у тебя же buf содержит весь пакет включая L2, L3, L4 поэтому если передать его как есть, то в пакете, который придет к адресату, будет куча "мусора" до фактических данных да -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
svlary |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
НЕ очень понял, как программа выполняется в креаторе, но ладно... По смыслу :
|
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Вот, это уже на правду похоже....
to MAKCim 1. Понятно, получается L2 L3 L4 уровни в sendto достравивает сама система? Что же тогда будет на передаче из сервера если на приеме будут пакеты служебные какие набудь, например ARP ICMP запросы, ответы?(все таки траффик нужно передавать не изменяя) будут ли "проходить" TCP пакеты устанавливающие соединения?(я как понимаю флаги SYN ACK то передаваться не будут.........) 2. Не подскажете что конкретно делает эта строка , а то везеде при описании только сленг используется в материалах: ip = (struct iphdr *)(buf + sizeof(struct ethhdr)); to svlary ■ Почему не сделали bzero(servaddr, sizeof(servaddr)) ? - Учту ■ Этот оператор : servaddr.sin_port=0 вызывает у меня большие сомнения. Что, в самом деле, на том конце кто-то слушает нулевой порт ?! Обычно пишется так : servaddr.sin_port=htons(DEST_PORT); - Как тогда передавать принятые IP,ARP,ICMP пакеты, ведь в них нет полей портов? ■ Может быть Вы перепутали этот параметр с третьим параметром ф-ции создания сокета ? У Вас написано htons(ETH_P_ALL), а по man для socket там должен стоять параметр : " protocol задает конкретный протокол, который используется на сокете. Обычно существует только один протокол, обеспечивающий конкретный тип сокета в заданном наборе протоколов. Однако, возможно существование нескольких таких протоколов -- тогда и используется этот параметр. Номер протокола зависит от используемого “домена коммуникации”, см. protocols(5). См. getprotoent(3), где описано, как сопоставлять имена протоколов их номерам." - т.е. к номеру порта пункта назначения этот параметр отношения не имеет. - в файле /usr/include/linux/if_ether.h прописана переменная ETH_P_ALL, на приеме работает отлично, принимает все пакеты с разбором заголовков всех трех уровней(L2-L4). Пробовал указывать IPPROTO_ICMP и пинговал данную машину - пинг не проходил, все та же ошибка в sendto() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
да вам для передачи также нужно использовать пакетный сокет (а не AF_INET) но в этом случае маршрктизацией вы сами будете заниматься (искать сетевой интерфейс для передачи) ;) Добавлено через 39 секунд получаем адрес ip заголовка -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
svlary |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Похоже, решение Вашей проблемы описано тут : Анализатор пакетов ICMP - своими руками А собака зарыта, похоже, вот здесь :
|
||||
|
|||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
1. На приеме я использую пакетный сокет(PF_PACKET,SOCK_RAW) для доступа к канальному уровню.
2. Далее нужно выделить польз-е данные и заголовки? 3. Потом отправить через этот же сокет поль-е данные но с флагами которые были в принятом пакете на всех уровнях...? В сыром сокете можно установить через setsockopt переменную IP_HDRINCL в 1 и создать свой IP заголовок. Можно ли создать свои заголовки в оставшихся канальном и транспортном уровнях? Вобщем как отправить принятые пакеты именно в первоначальном виде?использовать для каждого уровня свой сокет или все таки можно в моем сокете (sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) вручную набрать все заголовки? |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
только через пакетный сокет
у тебя же уже есть _весь_ пакет в buf изменяешь нужные данные, поправляешь контрольные суммы и передаешь через твой пакетный сокет этот буфер НО фишка в том, что если форвардинг на хосте отключен и адрес получателя в пакете не соответствует ни одному из локальных адресов сетевого интерфейса, через который он был получен, то генерируется ICMP вида "хост недоступен" как я уже говорил, пакетный сокет предствляет собой фильтр, который получает _копии_ пакетов, т. е. оригинал передается дальше по сетевой подсистеме и уже независимо от нас генерируется ICMP преодолеть это можно 2-мя путями 1. блокировать исходящий ICMP через netfilter/iptables 2. использовать цель QUEUE в iptables далее через netlink сокет получать уже оригиналы пакетов, фильтровать их, сопоставлять с копиями, полученными через iptables и через пакетный сокет отправлять дальше с ARP и прочими L3 еще сложнее -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Вообще общая задача для чего эта программа мне понадобилась состоит с следующем:
- в локальной сети несколько компов, один сервер. - необходимо организовать прохождение всего траффика между клиентами только через сервер! - на программном уровне(как я себе представляю) вносить изменения в проходящий траффик(отбросить n-й пакет,исказить содержимое и т.п.) Добавлено через 4 минуты и 13 секунд to MAKCim Понятно, я так и пытался изначально сделать......может из за контрольных сумм ошибка получается..... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
ДК2009,
что мешает сделать сервер дефолтным gateway'ем в локалке и настроить форвардинг через iproute2 на нем? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
пробовал прописать в route gateway default но из материалов узнал что на этот сервер пойдет траффик не предназначенный для локального адресата, да и прописать вроде не полусилось в таблицу маршрутизации, уже не помню почему
По проге: 1.получается что для пакетного сокета не нужно утанавливать никаких опций, подаешь на вход собранный вручную пакет и все. 2.Т.К. я пакет не меняю вообще то и суммы контрольные тоже не меняются, так? 3.на вход sendto нужно подать buf(адрес его начала а функция уже оправит то что содержится в куске длины buf+заголовки,ты кстати это уже писал))) а длину нужно сделать соотв-ю отправляемому пакету, для ICMP получается sendto(sd,buf,sizeof(buf + sizeof(struct ethhdr) + sizeof(struct iphdr)),0,(struct sockaddr *)&servaddr,fromlen)? попробовал, что то не хочет опять.... думал может не правильно пробую тестить......може например послать самому себе пинг а в servaddr в sendto записать сторонний ip?(думаю должен же логически пакет уйти даже если в source destination будут мой ip на входе) короче попробовал struct hostent* hp; servaddr.sin_family=AF_INET; hp = gethostbyname("192.168.1.15"); servaddr.sin_addr = *((struct in_addr *)hp->h_addr); servaddr.sin_port=0; не идет... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в смысле? на каждом клиенте настраиваем таблицу маршрутизации с одним маршрутом - через на сервер дальше настраиваем маршрутизацию на сервере: все пакеты, предназначенные для других клиентов диспетчеризируются клиентам -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |