1

我正在尝试学习如何在多宿主机器(多个接口)上直接(无库)从 python 发送 DHCP 请求。我看过 pydhcplib,但还是不明白。

此代码在特定接口上发送 DHCP 数据包(在我的情况下为 eth3 - 未分配 IP),但它使用 eth0 IP 地址发送。如何将我的 src IP 更改为 0.0.0.0?dhcp-message 在此示例中被截断

LOCAL_PORT=68
SERVER_PORT=67
LOCAL_IP="0.0.0.0"
BCAST_IP="255.255.255.255"
LISTEN_DEV="eth3"
MSG_SIZE=2048
Conn=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Conn.settimeout(5)
Conn.setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,LISTEN_DEV+'\0')
Conn.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
Conn.bind((LOCAL_IP, LOCAL_PORT))
# Create DHCP-Discovery
msg="010106003f7d1664......"
Conn.sendto(msg.decode("hex"),(BCAST_IP,SERVER_PORT))
received = Conn.recv(MSG_SIZE)
Conn.close()
4

1 回答 1

2

我假设您已经了解高级进程间通信教程

剧透警报:如果您想直接跳到底线,请查看DHCP 查询配方

编辑:

特殊值 INADDR_ANY(0.0.0.0,或 python 套接字中的空字符串 '')不是 IP 地址。

“当地址被指定为 INADDR_ANY(定义在 <netinet/in.h> 中的清单常量)时,系统会将地址解释为‘任何有效地址’。”

来自 RFC 2131:

如果客户端使用 DHCP 进行初始配置(在客户端的 TCP/IP 软件完全配置之前),DHCP 需要创造性地使用客户端的 TCP/IP 软件和对 RFC 1122 的自由解释。TCP/IP 软件应该接受在配置IP地址之前,将任何发送到客户端硬件地址的IP数据包转发到IP层;在配置 TCP/IP 软件之前,DHCP 服务器和 BOOTP 中继代理可能无法将 DHCP 消息传递给无法接受硬件单播数据报的客户端。

假设您在已经配置以太网接口并具有有效 IP 地址的系统上运行此程序。我不确定为什么您希望源 IP 地址为 0.0.0.0,但也许您可以使用 ifconfig 将接口 IP 设置为 0.0.0.0 以获得您想要的效果。

或者您可以使用 RAW 套接字并自己构建 IP 和 UDP 标头以包含任何内容。

于 2012-09-25T10:45:20.937 回答