The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"ip+pptp заголовки"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"ip+pptp заголовки"
Сообщение от hrendel emailИскать по авторуВ закладки(ok) on 16-Ноя-04, 23:07  (MSK)
Всем доброго времени суток.
Сетка три интерфейса один в нет ed1, два rl0,ed0 в локалки, система FreBSD.
Задача подсчет трафика локальных пользователей. Поставили mpd.
ip сервака 192.168.40.1
ip машины 192.168.40.22
Когда создается vpn соединение машине вадается новый ip 192.168.40.201
слушаю(с помощью libpcap) интерфейс ловлю пакет pptp:
|заголовок Ethernet|заголовок ip|заголовок gre|заголовок ppp| данные | окончание кадра|
данные:
|ip пакет|
как достать данные из первых двух заголовков понятно, но мне нужно определить выделенный mpd ip-шник, а вот как достать не знаю:(
Если кто знает как помогите советом облазил весь /usr/include
ничего не нашел, в нете о формате кадров gre и ppp тоже ничего толком найти не удалось.
зарание спасибо за советы
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "ip+pptp заголовки"
Сообщение от kir Искать по авторуВ закладки(??) on 17-Ноя-04, 15:10  (MSK)

  вобще это конечно старнно выделять айпи клинету из той же сети в которой находиться vpn сервер...

- ip adress'a выдаются на этапе IPCP обмена в протоколе PPP

- что конретно вы хотите?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "ip+pptp заголовки"
Сообщение от hrendel Искать по авторуВ закладки(??) on 17-Ноя-04, 16:23  (MSK)
>  вобще это конечно старнно выделять айпи клинету из той же
>сети в которой находиться vpn сервер...
> - ip adress'a выдаются на этапе IPCP обмена в протоколе PPP
этот ip  я взял для примера
> - что конретно вы хотите?
Была поставлена задача подсчет трафика интернет пользователя. На начальном этапе было решено сделать так:
1 ползователь заходит на сайт и регистрируется,
2 открывает себе доступ в нет(скрипт записывал ip клиета и время входа)
(прописывается правило в firewol-е)
ipfw add $number allow ip from any to $user_ip
ipfw add $number allow ip from $user_ip to any
Позавершении работы пользователь закрывает себе доступ(удаляется правило)
Я написал снифер с помощью libpcap он слушал интерфейс и записывал инфорсмацию о каждом пакете в базу.
Для отчета по статистике делался запрос в таблицу регистрации чтобы узнать когда пользователь сидел в нете, затем выбиралась его статистика.
Теперь решено сделать допуск кользователей с помощью mpd(проподает проблема следить все ли пользователи прекратили работу корректно, зайдя на сайт и закрыв себе нет, куча бесхозных правил файрвола).
Выделяем подсеть например 192.168.30.0/255
При регистрации mpd позволяет запускать внешнюю прогу авторизации, таким образом мы узнаем когда пользователь зарегистрировался. Кроме того каждому пользователю выделяется свой ip.
Новозникает проблема описанная выше.
ПРИМЕР СНИФЕРА:
#########################
#include <stream.h>
#include <pcap.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <net/ethernet.h>
#include <mysql.h>
#include <time.h>
#include "sql.h"

#define ETHER_H sizeof(struct ether_header);

void if_ether(u_char*, const struct pcap_pkthdr *, const  u_char *);
void if_tcp(const u_char* p);
MYSQL* conn = NULL;

int main()
{
        char err[PCAP_ERRBUF_SIZE];
        bpf_u_int32 SubNet, NetMask;
        pcap_t *pd;
        char mem;
        int op;
/*      if((conn = do_connect(NULL, NULL, NULL, "db_trafic", 0, NULL, 0)) == NULL)
        {
                cout << "База данных не создана!!!" << endl << "Создаем базуданных..." << endl;
                if((create_db()) == false)
                {
                        cout << "Ошибка!!! База данных не создана!!!" << endl;
                        return 0;
                }
                else
               else
                {
                        cout << "Создание базы данных прошло успешно" << endl;
                        if((conn = do_connect(NULL, NULL, NULL, "db_trafic", 0, NULL, 0)) == NULL)
                        {
                                cout << "Ни фига не выходит..." << endl;
                                return 0;
                        }
                }
        }
*/
        char *device = "rl0";
        cout << "Сетевое устройство:" << device << endl;
        if((pd = pcap_open_live(device, 2000, 1 ,100, err)) == NULL)
                cout << "Open pcap error:" << err << endl;
        if((op = pcap_snapshot(pd)) > 0)
                cout << "SNAPLEN = " << op << endl;
        if((pcap_lookupnet(device, &SubNet, &NetMask, err)) == NULL)
                cout << "Error look net:" << pcap_geterr(pd) << endl;
        if((pcap_loop(pd, -1, if_ether, NULL)) < 0)
                cout << "ERROR!!!" << pcap_geterr(pd) << endl;
//      do_disconnect(conn);
        return 0;
}

void if_ether(u_char* user, const struct pcap_pkthdr* h, const u_char* p)
{
        u_int length = h->len - ETHER_H;
        struct ip *ip;
        register struct tcphdr *tcp;
        register struct udphdr *udp;
        char *dst, *src, *proto;
        u_int from_port, to_port;
        time_t timer;
        timer = time(NULL);
        ip = (struct ip*)(p + 14);
        src = new char(100);
       dst = new char(100);
        sprintf(src, "%s", inet_ntoa(ip->ip_src));
        sprintf(dst, "%s", inet_ntoa(ip->ip_dst));
        switch(ip->ip_p)
        {
                case IPPROTO_ICMP:
                        proto = "ICMP";
                        from_port =0;
                        to_port =0;
                        break;
                case IPPROTO_TCP:
                        proto = "TCP";
                        tcp = (struct tcphdr*)((int)ip + sizeof(*ip));
                        from_port = htons(tcp->th_sport);
                        to_port = htons(tcp->th_dport);
                        break;
                case IPPROTO_UDP:
                        proto = "UDP";
                        udp = (struct udphdr*)((int)ip + sizeof(*ip));
                        from_port = htons(udp->uh_sport);
                        to_port = htons(udp->uh_dport);
                        break;
                case IPPROTO_GRE:
                        proto = "GRE";
                        break;
        default:
                        proto = "NONE";
                        from_port = 0;
                        to_port = 0;
                        break;
        }
        if(ip->ip_v != 0)
        {
//              cout << "\n\nfrom_ip:" << src << "";
//              cout << "to_ip:" << dst << "";
//              cout << "proto:" << proto << "";
//              cout << "from_p:" << from_port << "";
//              cout << "to_p:" << to_port << "";
//              cout << "Len:" << length << "\n\n"<<  endl;
        }
        char *query = new char(100);
//      sprintf(query, "INSERT INTO trafic VALUES('%s','%s', '%s', %d, %d, %d, %d)", src, dst, proto, from_port, to_port, leng
//      if((do_request(conn, query)) == false) cout << "Хрен вам запрос" << endl;
//      cout << query << endl;
        delete query;
        delete src;
        delete dst;
        return;
}
###############################
Пробле в том что достать ваделенные mpd ip адреса клиентов,
для этого надо знать структуру ip, grep, ppp пакетов, а точнее их заголовков, про я нашел а вот про все остальное никак
Структура pptp пакета
|заголовок Ethernet|заголовок ip|заголовок gre|заголовок ppp| данные | окончание кадра|
данные:
|ip пакет|
первый заголовок ip содержит реальные ip адреса клиетов а не выделенные mpd.
Вот вчем заключается проблема

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "ip+pptp заголовки"
Сообщение от kir Искать по авторуВ закладки(??) on 17-Ноя-04, 20:30  (MSK)

mpd умеет работать по radius протоколу и отдавать всю эту инфу
в самом крайнем случае man mpd на  - он может вешаться на локальный порт и с консоли можно получить все то что вы хотите
и не извращайтесь пожалуста!!!!!!!!!!!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "ip+pptp заголовки"
Сообщение от hrendel emailИскать по авторуВ закладки(??) on 18-Ноя-04, 13:35  (MSK)
Спасибо за совет уважаемый kir.
Про mpd+Radius я знал, благо на это тему достаточно инфы и в нете и на opennet.ru в часности.
Но я пишу по этой теме диплом, поэтому хотелось бы всетаки разобраться с заголовками.
Я не спорю что предложенный вами способ возможно в чем то лучше и красивее и скорее всего я им воспользуюсь чуть позже, но в данный момент мне поздно давать заднюю.

ЗЫ: а как же считать тех кто с нета к нам ходит и ssh, почту?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "ip+pptp заголовки"
Сообщение от kir Искать по авторуВ закладки(??) on 18-Ноя-04, 15:12  (MSK)
>Спасибо за совет уважаемый kir.
>Про mpd+Radius я знал, благо на это тему достаточно инфы и в
>нете и на opennet.ru в часности.
>Но я пишу по этой теме диплом, поэтому хотелось бы всетаки разобраться
>с заголовками.
>Я не спорю что предложенный вами способ возможно в чем то лучше
>и красивее и скорее всего я им воспользуюсь чуть позже, но
>в данный момент мне поздно давать заднюю.
>
>ЗЫ: а как же считать тех кто с нета к нам ходит
>и ssh, почту?

  с самого начала нужно было сказать что вы знаете про radius+mpd и про telnet 127.0.0.1 5005 кажись по умолчанию порт консили mpd сервера


тогда праивльно сформулируйте вопрос!
вы хотите узнать про инкапсуляцию ppp протокола ?
{ethernet {ip {udp|tcp{gre{ppp{ ...}}}}}}

или о принципах работы vpn?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "ip+pptp заголовки"
Сообщение от hrendel emailИскать по авторуВ закладки(??) on 18-Ноя-04, 23:51  (MSK)
>  с самого начала нужно было сказать что вы знаете про
>radius+mpd и про telnet 127.0.0.1 5005 кажись по умолчанию порт консили
>mpd сервера
>
>
> тогда праивльно сформулируйте вопрос!
> вы хотите узнать про инкапсуляцию ppp протокола ?
Вчасности и про это тоже.
> {ethernet {ip {udp|tcp{gre{ppp{ ...}}}}}}
Насколько я понял, кадр pptp выглядит следующим образом:
{ethernet {ip {gre {ppp{ip {udp|tcp|etc...}}}}}}
libpcap передает указатель на ethernet пакет,(тестовый пример программы, которой я пользуюсь можно посмотреть выше) я здвигаю указатель на 14 байт иполучаю указатель на ip пакет, из заголовка которого я вытаскиваю внешние ip по которым проходит соединение. Далее сдвигаюсь на размер ip заголовка, получаю указатель либо на tcp,udp,icmp, и в часности то, что мне нужно, gre заголовок. С tcp, udp все понятно и работает. Вопрос в том какова структура gre заголовка, и можно ли из него достать внутренние ip адреса соединения.
В /usr/include/net нашел хидер if_gre.h, там описана структура
struct gre_softc {
        struct ifnet sc_if;
        LIST_ENTRY(gre_softc) sc_list;
        int gre_unit;
        int gre_flags;
        struct in_addr g_src;   /* source address of gre packets */
        struct in_addr g_dst;   /* destination address of gre packets */
и т.д.
}
Я так понял что это как раз структура заголовка gre пакета. Подключил объявил указатель на него.
struct gre_soft *gr;
сдвигаю ip заголовок
gr = (struct gre_softc*)((int)ip + sizeof(*ip));
компилю все без ошибок, добавляю следующие строки
sprintf(src, "%s", inet_ntoa(gr->g_src));
sprintf(dst, "%s", inet_ntoa(gr->g_dst));
выдает следующее
main_prog.cpp: In function `void if_ether(u_char *, const pcap_pkthdr *, const u_char *)':
main_prog.cpp:106: invalid use of undefined type `struct gre_softc'
main_prog.cpp:68: forward declaration of `struct gre_softc'
main_prog.cpp:107: invalid use of undefined type `struct gre_softc'
main_prog.cpp:68: forward declaration of `struct gre_softc'
*** Error code 1
Вот на чем в данный момент, закончились мои изыскания.
> или о принципах работы vpn?
Кое что про работу VPN я уже знаю из следующих статей
http://www.hardline.ru/4/49/4189/
http://kunegin.narod.ru/ref5/ipsec/doc07.htm
http://www.opennet.ru/base/net/mpd_pptp_vpn.txt.html
Есть информация и про ppp
http://www.opennet.ru/docs/RUS/inet_book/3/ppp_35.html
Из следующей статьи я почерпнул, что информацию которая мне нужна всетаки можно достать из пакета pptp:
http://program.rin.ru/razdel/html/932-2.html

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "ip+pptp заголовки"
Сообщение от kir Искать по авторуВ закладки(??) on 19-Ноя-04, 12:35  (MSK)
>>  с самого начала нужно было сказать что вы знаете про
>>radius+mpd и про telnet 127.0.0.1 5005 кажись по умолчанию порт консили
>>mpd сервера
>>
>>
>> тогда праивльно сформулируйте вопрос!
>> вы хотите узнать про инкапсуляцию ppp протокола ?
>Вчасности и про это тоже.
>> {ethernet {ip {udp|tcp{gre{ppp{ ...}}}}}}

>Насколько я понял, кадр pptp выглядит следующим образом:
>{ethernet {ip {gre {ppp{ip {udp|tcp|etc...}}}}}}
     нет
попытаюсь обьяснить
есть два компьютера  A ip(1.1.1.1) <--> B ip(1.1.1.2)
допустим A это роутер который имеет выход в интернет и на нем запущен vpn сервер
B это клиент

1. vpn сервер запускаеться поверх tcp/ip обычно по порту 1723 и слушает инкапсулироване tcp/ip за которыми идут фреймы gre протокола

2. и так клиент B коннектиться(посылает) запрос tcp/ip{gre} - на указаный айпи 1.1.1.1:1723

3. сервер принимает запрос - обрабатывает его и создает соединение
     server A ip(1.1.1.1) <---{ tcp/ip {gre {.....} } }---> B ip(1.1.1.2) client

      и так мы получаем gre тунель

4. инкапсуляция PPP
    server A ip(1.1.1.1) <---{ tcp/ip {gre { PPP {....} } } }---> B ip(1.1.1.2) client
5. клиент  B ip(1.1.1.2)  начинает этап инициализации PPP протокола
    етапы инициализации PPP протокола AUTH{PAP|CHAP-MD5|CHAP-MS1|CHAPMS-2},IPCP,CCP,LCP.... etc (советую найти полную документацию и почитать)

6. на этапе инициализации IPCP клинет<->сервер договариваються об выделении ip адрессов для отдельных виртуальных интерфейсов котрые создадуться(подымуться) в случае успешного соедениения

7.в случае успеха вся схема р выглядит следующим образом

interface PPP0  ip(2.2.2.1) <--> ip(2.2.2.2) (в созданом виртуальном интерфейсе разворачиваються/заворачиваються(инкапсулируються) фреймы PPP {пришедшие через тунель gre до уровня tcp/ip}/{пришедшие с вернего уровня tcp/ip})  - со стороны сервера
  
server A ip(1.1.1.1) <---{ tcp/ip {gre { PPP {....} } } }---> B ip(1.1.1.2) client

interface PPP0  ip(2.2.2.2) <--> ip(2.2.2.1) (в созданом виртуальном интерфейсе разворачиваються/заворачиваються(инкапсулируються) фреймы PPP {пришедшие через тунель gre до уровня tcp/ip}/{пришедшие с вернего уровня tcp/ip})   - со стороны клиента

возможно немного не понятно - но извиняюсь я учителем работать не нанимался.

>libpcap передает указатель на ethernet пакет,(тестовый пример программы, которой я пользуюсь можно
>посмотреть выше) я здвигаю указатель на 14 байт иполучаю указатель на
>ip пакет, из заголовка которого я вытаскиваю внешние ip по которым
>проходит соединение. Далее сдвигаюсь на размер ip заголовка, получаю указатель либо
>на tcp,udp,icmp, и в часности то, что мне нужно, gre заголовок.
>С tcp, udp все понятно и работает. Вопрос в том какова
>структура gre заголовка, и можно ли из него достать внутренние ip
>адреса соединения.
>В /usr/include/net нашел хидер if_gre.h, там описана структура
>struct gre_softc {
>        struct ifnet sc_if;
>        LIST_ENTRY(gre_softc) sc_list;
>        int gre_unit;
>        int gre_flags;
>        struct in_addr g_src;  
> /* source address of gre packets */
>        struct in_addr g_dst;  
> /* destination address of gre packets */
>и т.д.
>}
>Я так понял что это как раз структура заголовка gre пакета. Подключил
>объявил указатель на него.

   это все не то
   о структуре gre протокола можете найти в rfc или в pptpd(/usr/ports/net/poptop/) или mpd(/usr/ports/net/mpd)


>struct gre_soft *gr;
>сдвигаю ip заголовок
>gr = (struct gre_softc*)((int)ip + sizeof(*ip));
>компилю все без ошибок, добавляю следующие строки
>sprintf(src, "%s", inet_ntoa(gr->g_src));
>sprintf(dst, "%s", inet_ntoa(gr->g_dst));
>выдает следующее
>main_prog.cpp: In function `void if_ether(u_char *, const pcap_pkthdr *, const u_char *)':
>
>main_prog.cpp:106: invalid use of undefined type `struct gre_softc'
>main_prog.cpp:68: forward declaration of `struct gre_softc'
>main_prog.cpp:107: invalid use of undefined type `struct gre_softc'
>main_prog.cpp:68: forward declaration of `struct gre_softc'
>*** Error code 1

>Вот на чем в данный момент, закончились мои изыскания.
>> или о принципах работы vpn?

>Кое что про работу VPN я уже знаю из следующих статей
>http://www.hardline.ru/4/49/4189/
>http://kunegin.narod.ru/ref5/ipsec/doc07.htm
>http://www.opennet.ru/base/net/mpd_pptp_vpn.txt.html
>Есть информация и про ppp
>http://www.opennet.ru/docs/RUS/inet_book/3/ppp_35.html
>Из следующей статьи я почерпнул, что информацию которая мне нужна всетаки можно
>достать из пакета pptp:
>http://program.rin.ru/razdel/html/932-2.html


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру