Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка перехваченного пакета, не отправляет пакет(наверное) 
V
    Опции темы
konshyn
Дата 22.11.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Ребят, нужна помощь.

В общем, перехватываю IP пакеты.
Полностью с IP заголовком и инкапсулированными данными.
Но этот же пакет мне нужно самому и отправить. Т.е. я перехватил, а потом его же отправляю

OC настроена на маршрутизацию. Но проходящие пакеты я блокирую. т.е. IPTABLES (FORWARD = DROP)
Создаю сокет для отправки перехваченного пакета так:
Код

sd_send = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);   


потом использую опцию IP_HDRINCL
Код

setsockopt(sd_send, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));


Затем происходит это:

Код

    struct iphdr    ip;
    struct sockaddr_in  sin;
    
    memset((void*)&sin, 0, sizeof(struct sockaddr_in));
    memcpy((void*)&ip, tmp_move_element->pack, sizeof(struct iphdr));
    
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = ip.daddr;
    
    struct in_addr ad_in;
    printf("Длина заголовка - %d, ", (ip.ihl * 4));
    printf("Длина пакета - %d\n", ntohs(ip.tot_len));
    ad_in.s_addr = ip.saddr;
    printf("IP адрес отправителя - %s\n", inet_ntoa(ad_in));
    ad_in.s_addr = ip.daddr;
    printf("IP адрес получателя - %s\n", inet_ntoa(ad_in));
    
    
    int rezult = sendto(sd_send, tmp_move_element->pack, ntohs(ip.tot_len), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr));
    if (rezult < 0)
    {                                       
....


в итоге rezult возвращает сколько байт он отправил, но! wireshark не показывает, что пакет был отправлен, он просто не видит этого пакета 

Выручайте, литература не помогла мне разобраться с сырыми сокетами и отправкой собственных пакетов. Уже больше двух месяцев переодически пытался разобраться, но все тщетно... Раньше не горело, сейчас горит.



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
tzirechnoy
Дата 22.11.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Думаете, кто-нибудь опять приведёт Вашы наброски к компилируемому виду, чтобы вяснить какую-то банальную ошыбку у Вас?

Добавлено через 4 минуты и 48 секунд
Ну и да, банально-системное: в iptables за самосгенерённые пакеты отвечает OUTPUT. Проверьте, что там тожэ не DROP.
PM MAIL   Вверх
konshyn
Дата 22.11.2013, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 22.11.2013,  22:13)
Думаете, кто-нибудь опять приведёт Вашы наброски к компилируемому виду, чтобы вяснить какую-то банальную ошыбку у Вас?

Добавлено @ 22:18
Ну и да, банально-системное: в iptables за самосгенерённые пакеты отвечает OUTPUT. Проверьте, что там тожэ не DROP.

Вы не поверите, но сюда я обратился за помощью. 
Может кому-то и не будет лень привести все к компилируемому виду.
А может кто-то уже сталкивался с такой проблемой и сразу даст понять, в чем ошибка или что нужно проверить в первую очередь.

Политика для INPUT и OUTPUT - ACCEPT.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
feodorv
Дата 23.11.2013, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



Снимите запрет на FORWARD; посмотрите, будет ли дублироваться пакет.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
konshyn
Дата 25.11.2013, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 23.11.2013,  03:34)
Снимите запрет на FORWARD; посмотрите, будет ли дублироваться пакет.

 Не дублируется. smile

Сделал компилируемый код в минимальном стиле:

Код


#include        <arpa/inet.h>
#include        <cstdlib>
#include        <linux/if_ether.h>
#include        <linux/if_packet.h>
#include        <linux/ip.h>
#include        <linux/if.h>
#include        <netinet/in.h>
#include        <pthread.h>
#include        <stdio.h>
#include        <string.h>
#include        <sys/ioctl.h>
#include        <unistd.h>


int main(int argc, char** argv) 
{
    int                     iface_index = -1;
    int                     eth0_recv = -1;
    int                     tc_error = -1;
    int                     sd_send = -1;
    int                     on_off;
    unsigned char           recv_msg[3000];
    struct iphdr            ip;
    struct in_addr          ad_in;
    struct ifreq            ifr;
    struct sockaddr_in      sin;
    struct sockaddr_ll      s_ll = {0};
    
    memset((void *)&ifr, 0, sizeof(struct ifreq));
    memset((void *)&sin, 0, sizeof(struct sockaddr_in));
    
    eth0_recv = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
    if (eth0_recv < 0)
    {
        perror("socket");
        return -1;
    }
    
    sprintf(ifr.ifr_name, "%s", "eth0");
    
    if (ioctl(eth0_recv, SIOCGIFINDEX, &ifr) < 0)
    {
        perror("ioctl SIOCGIFINDEX");
        return (-1);
    }
    
    iface_index = ifr.ifr_ifindex;
    printf("%d\n", iface_index);
    
    s_ll.sll_family = PF_PACKET;    // Тип сокета
    s_ll.sll_protocol = htons(ETH_P_IP);   //Тип применяемого протокола
    s_ll.sll_ifindex = ifr.ifr_ifindex; //индекс сетевого интерфейса
    
    tc_error = bind(eth0_recv, (struct sockaddr *)&s_ll, sizeof(struct sockaddr_ll));
    if (tc_error < 0)
    {
        perror("bind");
        close(eth0_recv);
        return (-1);
    }
    
    sd_send = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    if (sd_send < 0)
    {
        perror("socket");
        exit(1);
    }
    on_off = 1;
    if (setsockopt(sd_send, IPPROTO_IP, IP_HDRINCL, &on_off, sizeof(on_off)) < 0) 
    {
        perror("setsockopt");
        exit(1);
    }


    while(true)
    {
        memset(recv_msg, 0, sizeof(recv_msg));
        tc_error = recvfrom(eth0_recv, (char *)recv_msg, 3000, 0, NULL, NULL);    
        
        if (tc_error < 0)
        {
            perror("recvfrom");
            close(eth0_recv);

            return (-1);
        }
        
        memcpy((void*)&ip, recv_msg + ETH_HLEN, sizeof(struct iphdr));
        printf("Длина заголовка - %d, ", (ip.ihl * 4));
        printf("Длина пакета - %d\n", ntohs(ip.tot_len));
        ad_in.s_addr = ip.saddr;
        printf("IP адрес отправителя - %s\n", inet_ntoa(ad_in));
        ad_in.s_addr = ip.daddr;
        printf("IP адрес получателя - %s\n", inet_ntoa(ad_in));
        printf("\n\n");
        
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = ip.daddr;
        
        tc_error = sendto(sd_send, recv_msg, ntohs(ip.tot_len), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr));
        printf(" отправлено %d\n\n", tc_error);
        if (tc_error < 0)
        {
            perror("sendto");
            //return -1;
        }
        


    }
    return 0;
}



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
  Дата 25.11.2013, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



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, извините за ложную информацию
Цитата

 Не дублируется. smile

Недосып - страшная вещь:(

Это сообщение отредактировал(а) konshyn - 25.11.2013, 09:30

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Снимок_экрана_от_2013_11_25_09_07_20.png 418,91 Kb


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 25.11.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Не отправляются пакеты, даже если не настроена ОС на маршрутизацию.
Т.е. как бы "отправляются". Возвращает сколько было отправлено.. и все.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 26.11.2013, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Сорри, я разобрался в своей криворукости:(

P.S. Эта тема похожа на блог программиста-неудачника

Это сообщение отредактировал(а) konshyn - 26.11.2013, 12:06


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
xvr
Дата 26.11.2013, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(konshyn @  26.11.2013,  12:06 Найти цитируемый пост)
Сорри, я разобрался в своей криворукости:(

Так поделитесь с остальными, в чем было дело  smile 
PM MAIL   Вверх
konshyn
Дата 26.11.2013, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(xvr @  26.11.2013,  13:52 Найти цитируемый пост)
Так поделитесь с остальными, в чем было дело  smile  


IP пакеты(чистые, т.е. заголовок IP и инкапсулированные данные) перехватывать в linux нельзя. По крайне мере я не нашел как это делается.
Я создавал ПАКЕТНЫЙ сокет:
Код

eth0_recv = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
 

т.е. в моем сообщении был полностю eth-кадр: [ethernet заголовок[ip заголовок[..дальнейший стек и данные]]];
для отправки IP пакета сырой сокет использовал с опцией IP_HDRINCL;
ну, и в коде, который написал выше, и в своей программе я делал одно и то же.
копировал IP заголовок, чтобы определить структуру sockaddr_in для функции sendto, т.к. семейство и адрес получателя указывать обязательно
т.е. функция sendto отправляет пакет на тот адрес, который указан в структуре sockaddr_in, и соответственно, ядро само заменит это поле в ip-пакете на адрес, который указан в структуре, а все остальное, кроме, вроде как чек-суммы - останется в том виде, как был заполнен пакет.

Код

        memcpy((void*)&ip, recv_msg [color=blue]+ ETH_HLEN[/color], sizeof(struct iphdr));

        ad_in.s_addr = ip.daddr;
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = ip.daddr;
        
        tc_error = sendto(sd_send, recv_msg, ntohs(ip.tot_len), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr));

В моем recv_msg хранится eth-кадр, а нужно было отправлять IP-пакет, т.е. заголов ethernet нужно было убрать(первые 14 байт в пакете все портили)

Код

tc_error = sendto(sd_send, recv_msg ((( + ETH_HLEN))), ntohs(ip.tot_len), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr));

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

P.S. Как редактировать в теге [code] не знаю:(

P.P.S. будьте внимательнее, господа  smile 


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1077 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.