如何将源 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


一个简单的作弊方法是 stracetruss 你的 DHCP 客户端,看看它做了什么。

【讨论】:

以上是关于如何将源 IP 地址设置为 0.0.0.0?的主要内容,如果未能解决你的问题,请参考以下文章

IP起始地址200.100.112.0最多可以实现几个C类网址聚合

电脑IP地址为0

我在获得客户端ip的时候,获得的ip地址为0:0:0:0:0:0:0:1

127.0.0.1和0.0.0.0地址的区别

如何限制单个 IP 地址对 Flask 的访问?

路由器安装到最后IP地址怎么刷新都是0,0,0,0  怎么回事啊?