我正在尝试学习如何在多宿主机器(多个接口)上直接(没有库)从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()
答案 0 :(得分:2)
我假设您已经了解Advanced Interprocess Communication Tutorial。
剧透警告:如果您想直接跳到底线,请查看DHCP Query recipe。
编辑:
特殊值INADDR_ANY(0.0.0.0,或python套接字中的空字符串')不是IP地址。
“将地址指定为INADDR_ANY(清单常量) 在<中定义netinet / in.h>),系统将地址解释为'any 有效地址'。“
来自RFC 2131:
如果客户端使用DHCP进行初始配置 (在客户端的TCP / IP软件完全之前 配置),DHCP需要创造性地使用客户端的TCP / IP 软件和RFC 1122的自由解释.TCP / IP 软件应该接受并向IP层转发任何IP数据包 在IP地址之前传送到客户端的硬件地址 配置; DHCP服务器和BOOTP中继代理可能无法 将DHCP消息传递给无法接受硬件的客户端 配置TCP / IP软件之前的单播数据报。
据推测,您在已配置以太网接口且具有有效IP地址的系统上运行此程序。我不确定为什么你希望源IP地址为0.0.0.0,但也许你可以使用ifconfig将接口IP设置为0.0.0.0以获得你想要的效果。
或者您可以使用RAW套接字并自己构建IP和UDP标头以包含任何内容。