我正在用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。
答案 0 :(得分:2)
发送UDP数据包时,内核中的UDP堆栈总是将标头设置为正确的值。
如果您想要更多地控制发送的内容,则需要使用原始套接字。
linux man page for raw sockest
请注意这很难,需要root权限。