URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3213
[ Назад ]

Исходное сообщение
"подмена ip отправителя в проге на сях"

Отправлено Arifolth , 27-Июл-04 16:56 
День добрый всем!
никто случайно не знает как в проге на сях(ядро 2ю2) реализовать подмену ip адреса отправителя TCP/UDP пакета?
подробнее:
есть внешняя сеть(где находиться машина отправитель A), есть типа шлюз(B) с двумя интерфейсами(на нём же крутиться прога о которой идёт реч), и есть внутренняя сеть (в ней получатель - C)

отправитель посылает пакет шлюзу на внешний интерфейс на определённый порт, а шлюз форвардит этот пакет через внутренний интерфейс во внутреннюю сетть получателю на другой порт(это называется DNAT)

проблема заключается в том что када [C] посылает(в случае c TCP) ответный пакет то он естественно приходит на внутренний интерфейс шлюза где его не ждут =)
а должен уходить к [A] во внешнюю сеть прямо с [C]
[B] при отсылке пакета с внутреннего интерфейса должен штамповать на нём не свой ip а ip того от кого он этот пакет получил

жду предложений, мнений и т/ д/


Содержание

Сообщения в этом обсуждении
"подмена ip отправителя в проге на сях"
Отправлено genie , 28-Июл-04 03:12 
3 varianta:
1. Ispol'zovat' IPTables/IPFilter i delat' relay paketov
2. Napisat' svoi kernel module
3. Napisat' proxy, ot imeni kotorogo budet proishodit' rabota s klientom.

>День добрый всем!
>никто случайно не знает как в проге на сях(ядро 2ю2) реализовать подмену
>ip адреса отправителя TCP/UDP пакета?
>подробнее:
>есть внешняя сеть(где находиться машина отправитель A), есть типа шлюз(B) с двумя
>интерфейсами(на нём же крутиться прога о которой идёт реч), и есть
>внутренняя сеть (в ней получатель - C)
>
>отправитель посылает пакет шлюзу на внешний интерфейс на определённый порт, а шлюз
>форвардит этот пакет через внутренний интерфейс во внутреннюю сетть получателю на
>другой порт(это называется DNAT)
>
>проблема заключается в том что када [C] посылает(в случае c TCP) ответный
>пакет то он естественно приходит на внутренний интерфейс шлюза где его
>не ждут =)
>а должен уходить к [A] во внешнюю сеть прямо с [C]
>[B] при отсылке пакета с внутреннего интерфейса должен штамповать на нём не
>свой ip а ip того от кого он этот пакет получил
>
>
>жду предложений, мнений и т/ д/



"подмена ip отправителя в проге на сях"
Отправлено Arifolth , 28-Июл-04 09:18 
>3 varianta:
>1. Ispol'zovat' IPTables/IPFilter i delat' relay paketov
>2. Napisat' svoi kernel module
>3. Napisat' proxy, ot imeni kotorogo budet proishodit' rabota s klientom.
>
iptables неподходит -  ядро версии 2.2
там тока ipchains  а в них есть тока маскарадинг - это нат который работает из нутри наружу

а мне нужно снаружи вовнутрь соединения пробрасывать

прокси то я написал - который пробрасывает соединения снаружи вовнуть - но вот возникла проблема - subj этого треда - пакеты не могут вернуться отправителю - возвращаются проксе

ну то есть конечно можно сделать так чтобы прога ожидала ответа и пересылала его отправителю - НО ЭТО ТОЛЬКО В СЛУЧАЕ c TCP
а как быть с UDP??????? получатель **должен** знать адрес отправителя


"с кодом подмена ip отправителя"
Отправлено NaquAD , 19-Авг-04 04:23 
>День добрый всем!
>никто случайно не знает как в проге на сях(ядро 2ю2) реализовать подмену
>ip адреса отправителя TCP/UDP пакета?
>подробнее:
>есть внешняя сеть(где находиться машина отправитель A), есть типа шлюз(B) с двумя
>интерфейсами(на нём же крутиться прога о которой идёт реч), и есть
>внутренняя сеть (в ней получатель - C)
>
>отправитель посылает пакет шлюзу на внешний интерфейс на определённый порт, а шлюз
>форвардит этот пакет через внутренний интерфейс во внутреннюю сетть получателю на
>другой порт(это называется DNAT)
>
>проблема заключается в том что када [C] посылает(в случае c TCP) ответный
>пакет то он естественно приходит на внутренний интерфейс шлюза где его
>не ждут =)
>а должен уходить к [A] во внешнюю сеть прямо с [C]
>[B] при отсылке пакета с внутреннего интерфейса должен штамповать на нём не
>свой ip а ip того от кого он этот пакет получил
>
>
>жду предложений, мнений и т/ д/
Всё на C++;

На UDP:

#include <iostream.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <resolv.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/udp.h>
#include <fcntl.h>
#include <netinet/ip.h>
#include <netdb.h>

#define SA struct sockaddr

char* ConstructUDP(char* data,unsigned int fragment,unsigned int id,int data_len,char* source,char* dest,int dest_port,int so
urce_port,int *sz){
    *sz=data_len+sizeof(iphdr)+sizeof(udphdr);
    char* packet=new char[*sz];
    bzero(packet,*sz);
    iphdr* ip=(iphdr*)packet;
    udphdr* udp=(udphdr*)(packet+sizeof(iphdr));
    ip->version=4;
    ip->ihl=sizeof(iphdr)>>2;
    ip->tos=0;
    ip->tot_len=htons(sizeof(iphdr)+sizeof(udphdr)+data_len+4);
    ip->id=id;
    ip->frag_off=fragment;
    ip->ttl=0xFF;
    ip->saddr=inet_addr(source);
    ip->daddr=inet_addr(dest);
    ip->protocol=IPPROTO_UDP;
    ip->check=0;

    udp->dest=htons(dest_port);
    udp->source=htons(source_port);
    udp->len=htons(sizeof(udphdr)+data_len);
    udp->check=0;

    strncpy(packet+sizeof(udphdr)+sizeof(iphdr),data,data_len);
    return packet;
}


int main(int argc,char* argv[]){
    struct protoent* prt=getprotobyname("UDP");
    int sock=socket(AF_INET,SOCK_RAW,prt->p_proto),sz;
    if(sock<0){
        cout<<"Cann't create socket !\n";
        return 1;
    }
    int on=1;
    if(setsockopt(sock,SOL_IP,IP_HDRINCL,&on,sizeof(on))){
        cout<<"Cann't set sock opts !\n";
        close(sock);
        return 2;
    }
    char a[]="A very,very,veryvery,very,very,very long message !";
    char *packet=ConstructUDP(a,0,0,strlen(a)+1,"192.168.0.0","127.0.0.1",1234,432,&sz);
    struct sockaddr_in addr;
    bzero(&addr,sizeof(addr));
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    addr.sin_family=AF_INET;
    addr.sin_port=htons(1234);
    sendto(sock,packet,sz,0,(SA*)&addr,sizeof(addr));
    delete[] packet;
    close(sock);
    return 0;
}

Компилиться нормально. С TCP - только proxy, либо на машине-получателе модуль для ядра, которое будет подменять ip-адрес. В каком-то phrack'e это      было описано.


"с кодом подмена ip отправителя"
Отправлено Arifolth , 25-Авг-04 09:20 
>>День добрый всем!
>>никто случайно не знает как в проге на сях(ядро 2ю2) реализовать подмену
>>ip адреса отправителя TCP/UDP пакета?
>>подробнее:
>>есть внешняя сеть(где находиться машина отправитель A), есть типа шлюз(B) с двумя
>>интерфейсами(на нём же крутиться прога о которой идёт реч), и есть
>>внутренняя сеть (в ней получатель - C)
>>
>>отправитель посылает пакет шлюзу на внешний интерфейс на определённый порт, а шлюз
>>форвардит этот пакет через внутренний интерфейс во внутреннюю сетть получателю на
>>другой порт(это называется DNAT)
>>
>>проблема заключается в том что када [C] посылает(в случае c TCP) ответный
>>пакет то он естественно приходит на внутренний интерфейс шлюза где его
>>не ждут =)
>>а должен уходить к [A] во внешнюю сеть прямо с [C]
>>[B] при отсылке пакета с внутреннего интерфейса должен штамповать на нём не
>>свой ip а ip того от кого он этот пакет получил
>>
>>
>>жду предложений, мнений и т/ д/
>Всё на C++;
>
>На UDP:
>
>#include <iostream.h>
>#include <sys/types.h>
>#include <sys/socket.h>
>#include <resolv.h>
>#include <unistd.h>
>#include <arpa/inet.h>
>#include <netinet/udp.h>
>#include <fcntl.h>
>#include <netinet/ip.h>
>#include <netdb.h>
>
>#define SA struct sockaddr
>
>char* ConstructUDP(char* data,unsigned int fragment,unsigned int id,int data_len,char* source,char* dest,int dest_port,int so
>
>urce_port,int *sz){
>    *sz=data_len+sizeof(iphdr)+sizeof(udphdr);
>    char* packet=new char[*sz];
>    bzero(packet,*sz);
>    iphdr* ip=(iphdr*)packet;
>    udphdr* udp=(udphdr*)(packet+sizeof(iphdr));
>    ip->version=4;
>    ip->ihl=sizeof(iphdr)>>2;
>    ip->tos=0;
>    ip->tot_len=htons(sizeof(iphdr)+sizeof(udphdr)+data_len+4);
>    ip->id=id;
>    ip->frag_off=fragment;
>    ip->ttl=0xFF;
>    ip->saddr=inet_addr(source);
>    ip->daddr=inet_addr(dest);
>    ip->protocol=IPPROTO_UDP;
>    ip->check=0;
>
>    udp->dest=htons(dest_port);
>    udp->source=htons(source_port);
>    udp->len=htons(sizeof(udphdr)+data_len);
>    udp->check=0;
>
>    strncpy(packet+sizeof(udphdr)+sizeof(iphdr),data,data_len);
>    return packet;
>}
>
>
>int main(int argc,char* argv[]){
>    struct protoent* prt=getprotobyname("UDP");
>    int sock=socket(AF_INET,SOCK_RAW,prt->p_proto),sz;
>    if(sock<0){
>        cout<<"Cann't create socket !\n";
>
>        return 1;
>    }
>    int on=1;
>    if(setsockopt(sock,SOL_IP,IP_HDRINCL,&on,sizeof(on))){
>        cout<<"Cann't set sock opts
>!\n";
>        close(sock);
>        return 2;
>    }
>    char a[]="A very,very,veryvery,very,very,very long message !";
>    char *packet=ConstructUDP(a,0,0,strlen(a)+1,"192.168.0.0","127.0.0.1",1234,432,&sz);
>    struct sockaddr_in addr;
>    bzero(&addr,sizeof(addr));
>    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
>    addr.sin_family=AF_INET;
>    addr.sin_port=htons(1234);
>    sendto(sock,packet,sz,0,(SA*)&addr,sizeof(addr));
>    delete[] packet;
>    close(sock);
>    return 0;
>}
>
>Компилиться нормально. С TCP - только proxy, либо на машине-получателе модуль для
>ядра, которое будет подменять ip-адрес. В каком-то phrack'e это  
>   было описано.

Благодарю за ответ NaquAD
превосходный пример
прога и работает и компилиться
буду под себя переделывать