在C Ubuntu 12.04中发送带有欺骗IP的UDP数据包时,IP正在发生变化

时间:2013-08-08 14:15:09

标签: sockets ubuntu-12.04 spoofing

我正在用C,Eclipse,Ubuntu 12.04编写代码。我打开一个套接字并从欺骗性的源IP发送UDP数据包。 当我在虚拟机中运行代码时(相同的代码,Eclipse,Ubuntu版本)一切正常,但是现在当我尝试在真正的Ubuntu机器上运行它时,它无法正常工作。

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)

问题是Ubuntu / kernel将我的源IP更改为我所拥有的唯一接口的真实IP。 Eclipse运行时没有任何错误或警告。所以我理解,在数据包离开Eclipse应用程序后,IP正在发生变化。 我试图像这样添加额外的IP:      ifconfig eth0:1 192.168.160.240 netmask 255.255.255.0 up(这在虚拟机中有效)但不影响真正的PC。

1 个答案:

答案 0 :(得分:2)

发送UDP数据包时,内核中的UDP堆栈总是将标头设置为正确的值。

如果您想要更多地控制发送的内容,则需要使用原始套接字。

wikipedia raw sockets

linux man page for raw sockest

请注意这很难,需要root权限。