1

マルチホームマシン(複数のインターフェイス)でPythonからDHCPリクエストを直接(ライブラリなしで)送信する方法を学ぼうとしています。pydhcplib を見てきましたが、まだわかりません。

このコードは、特定のインターフェイス (私の場合は eth3 - IP が割り当てられていません) で DHCP パケットを送信しますが、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

Advanced Interprocess Communication Tutorialについてはすでにご存知だと思います。

ネタバレ注意:一番下の行に直接ジャンプしたい場合は、DHCP クエリのレシピをご覧ください。

編集:

特別な値 INADDR_ANY (0.0.0.0、または Python ソケットの空の文字列 '') は IP アドレスではありません。

「アドレスが INADDR_ANY (< netinet/in.h > で定義されているマニフェスト定数) として指定されている場合、システムはそのアドレスを「任意の有効なアドレス」として解釈します。

RFC 2131 から:

(クライアントの TCP/IP ソフトウェアが完全に構成される前に) 初期構成に DHCP を使用するクライアントの場合、DHCP はクライアントの TCP/IP ソフトウェアの創造的な使用と RFC 1122 の自由な解釈を必要とします。TCP/IP ソフトウェアは、受け入れる必要があります。 IP アドレスが設定される前に、クライアントのハードウェア アドレスに配信された IP パケットを IP 層に転送します。DHCP サーバーと BOOTP リレー エージェントは、TCP/IP ソフトウェアが構成される前に、ハードウェア ユニキャスト データグラムを受け入れることができないクライアントに DHCP メッセージを配信できない場合があります。

おそらく、イーサネット インターフェイスが既に構成されており、有効な IP アドレスを持っているシステムでこのプログラムを実行していると思われます。ソース IP アドレスを 0.0.0.0 にしたい理由はわかりませんが、ifconfig を使用してインターフェイス IP を 0.0.0.0 に設定すると、必要な効果が得られます。

または、RAW ソケットを使用して、IP および UDP ヘッダーを自分で構築して、何かを含めることもできます。

于 2012-09-25T10:45:20.937 に答える