如何将源 IP 地址设置为 0.0.0.0?
Posted
技术标签:
【中文标题】如何将源 IP 地址设置为 0.0.0.0?【英文标题】:How can I set the source IP address to 0.0.0.0? 【发布时间】:2015-03-05 12:43:36 【问题描述】:我想编写简单的 DHCP 客户端(它将在 WLAN 上工作)并且我在正确发送初始消息 DHCP DISCOVER
时遇到问题 - 它已发送(我在捕获 WLAN 接口时在 Wireshark 中看到它),但是源地址是我的适配器的地址。如何将 IP 设置为“0.0.0.0”?
这是我的代码的一部分:
sockaddr_in src_addr;
memset(&src_addr, 0, sizeof(struct sockaddr_in));
src_addr.sin_family = AF_INET;
src_addr.sin_port = htons(m_sport);
src_addr.sin_addr.s_addr = htonl(INADDR_ANY);
status = bind(m_sockfd, reinterpret_cast<sockaddr *>(&src_addr), sizeof(sockaddr_in));
当我尝试src_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
时,源地址仍然从 eth0 (10.132...) 设置。
【问题讨论】:
如果您使用的是 linux,防火墙的默认设置会阻止您欺骗 IP 地址 为什么要设置IP为0.0.0.0
?这是一个无效的 IP,可能会导致 Wireshark 出现问题。
@ʎǝʞuoɯɹǝqʎɔ 0.0.0.0
是一个有效的 IP 地址。在 dhcp 的上下文中,它用于指示尚未为设备分配 IP 地址。
因为我想发送 DHCP Discover 消息。在这种情况下,正确的地址是什么?当我使用dhclient
时,这个数据包的源地址是0.0.0.0
。
dhclient
使用 raw sockets 并在数据包前面手动添加 IP 标头。从绑定到0.0.0.0
的套接字发送本质上与从未绑定的套接字发送相同。根据路由表选择源IP。我简短:您需要使用原始套接字。
【参考方案1】:
内核通过在退出接口上使用 IP 填充“免费”源地址来为您提供服务。
如果您不希望这样,您可能必须使用原始套接字并提供您自己的 IP 标头和IP_HDRINCL
。寻找SOCK_RAW
。
一个简单的作弊方法是 strace
或 truss
你的 DHCP 客户端,看看它做了什么。
【讨论】:
以上是关于如何将源 IP 地址设置为 0.0.0.0?的主要内容,如果未能解决你的问题,请参考以下文章
IP起始地址200.100.112.0最多可以实现几个C类网址聚合