0

我正在用 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 运行时没有任何错误或警告。所以我明白,IP 在数据包离开 Eclipse 应用程序后会发生变化。我尝试像这样添加额外的IP:ifconfig eth0:1 192.168.160.240 netmask 255.255.255.0 up(这在虚拟机中有效)但不影响真实PC。

4

1 回答 1

2

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

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

维基百科原始套接字

原始 sockest 的 linux 手册页

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

于 2013-08-08T18:27:33.663 回答