>День добрый всем!
>никто случайно не знает как в проге на сях(ядро 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 это было описано.