我正在用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。
发布于 2013-08-09 02:27:34
当您发送UDP数据包时,内核中的UDP堆栈总是会将报头设置为正确的值。
如果您希望更好地控制发送的内容,则需要使用原始套接字。
wikipedia raw sockets
linux man page for raw sockest
请注意,这很难,并且需要root权限。
https://stackoverflow.com/questions/18128361
复制相似问题