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