2013-08-08 2 views
0

C, Eclipse, Ubuntu 12.04에서 코드를 작성하고 있습니다. 소켓을 열고 스푸핑 된 소스 IP에서 UDP 패킷을 보내고 있습니다. 가상 머신 (동일한 코드, 이클립스, 우분투 버전)에서 코드를 실행하면 모든 것이 정상이지만 지금은 실제 우분투 컴퓨터에서 실행하려고하면 제대로 작동하지 않습니다.C가 위장 된 IP로 UDP 패킷을 보낼 때 IP가 바뀌고 있습니다. Ubuntu 12.04

bzero(&spoof_addr, sizeof(spoof_addr)); 
spoof_addr.sin_family = AF_INET; 
spoof_addr.sin_port = htons(SERVERPORT); 
if (inet_aton("192.168.160.240", &spoof_addr.sin_addr)==0) 
{ 
    fprintf(stderr, "inet_aton() failed\n"); 
    exit(1); 
}  

if ((sockfd_spoofed = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
     err("socket"); 
    bind(sockfd_spoofed,(struct sockaddr*)&spoof_addr,sizeof(spoof_addr)); 

    //Send the packet 
    if (sendto(sockfd_spoofed, buf_port, 5, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1) 

문제는 우분투/커널이 내 소스 IP를 유일한 인터페이스의 실제 IP로 변경한다는 것입니다. Eclipse는 오류나 경고없이 실행됩니다. 따라서 패킷이 Eclipse 애플리케이션을 떠난 후에 IP가 변경되고 있음을 이해합니다. 다음과 같이 추가 IP를 추가하려고 시도했습니다. ifconfig eth0 : 1 192.168.160.240 넷 마스크 255.255.255.0 (가상 컴퓨터에서 작동)이지만 실제 PC에는 영향을주지 않습니다.

답변

2

UDP 패킷을 보낼 때 커널의 UDP 스택은 항상 헤더를 올바른 값으로 설정합니다.

보내지는 항목을보다 세부적으로 제어하려면 원시 소켓을 사용해야합니다.

wikipedia raw sockets

linux man page for raw sockest

이 열심히하고 루트 권한이 필요합니다 유의하십시오.

+0

고맙습니다. 당신 말이 맞아요. 이제 원시 소켓을 사용하고 작동합니다. 가상 머신에서 작동하는 것이 이상합니다. – Larisa

+0

@ yel이 답변을 귀하의 질문에, 나는 upvote 주셔서 감사 드리며 만약 당신이 대답을 옆에있는 확인란을 그것을 받아 들일 것입니다. 이것은 또한 다른 사람들이 앞으로이 문제를 볼 때 이것이이 문제에 대한 해답임을 알게 될 것입니다. – xaxxon