将 DHCP 特定的供应商选项发送到 Windows 服务器

Seo*_*man 6 dhcp windows windows-registry

我的目标是向 Windows 机器发送一些信息(url 和一次性令牌)。它适用于 GNU/Linux 服务器,因为我从 /var/lib/dh​​cp/dhcp.lease 或类似的地方获取信息。这是我的设置:

dhcp 服务器(GNU/Linux 服务器):

host windows {
            dynamic;
            hardware ethernet XX:XX:XX:XX:XX:XX;
            fixed-address 10.70.10.107;
            supersede vendor-encapsulated-options  "http://URL/TOKEN";
    }
Run Code Online (Sandbox Code Playgroud)

我发现在 Windows 服务器上获取此信息的唯一方法是在注册表中。正如我在此处添加的,在 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\Tcpip\Parameters\Interfaces{ID} 下,您可以找到名为DhcpInterfaceOptions 的键。

问题是关于这个密钥的信息被“损坏”了。我会试着解释一下。

使用 Wireshark,我可以从我的 DHCP 服务器看到一个格式良好的 DHCP 应答,并设置了 43 个选项。此选项包含我正在寻找的内容。当我尝试在注册表上阅读它时,它包含大量垃圾,并且缺少部分 url。

DHCP 选项 RFC 2132定义了以下协议:

Code   Len   Vendor-specific information
+-----+-----+-----+-----+---
|  43 |  n  |  i1 |  i2 | ...
+-----+-----+-----+-----+---
Run Code Online (Sandbox Code Playgroud)

我观察到 Windows 在获得选项后正在做类似的事情。我的意思是,如果Windows 所做的 URL 是“ http://URL/TOKEN ”,则将“h”设置为 ID,将“t”设置为长度,并在第二个“t”之后开始读取。我的 url 比最后一个 ASCII 可打印字符 (~) 长,我对此无能为力。

更新 1

WireShark 捕获:

Option: (t=43,l=16) Vendor-Specific Information
  Option: (43) Vendor-Specific Information
  Length: 16
  Value: 687474703a2f2f55524c2f544f4b454e (http://URL/TOKEN)
Run Code Online (Sandbox Code Playgroud)

Windows 注册表:

"DhcpInterfaceOptions"=hex:06,00,00,00,00,00,00,00,08,00,00,00,00,00,00,00,52,\
 45,b7,4f,0a,46,0a,01,08,08,08,08,03,00,00,00,00,00,00,00,04,00,00,00,00,00,\
 00,00,52,45,b7,4f,0a,46,0a,01,0f,00,00,00,00,00,00,00,0f,00,00,00,00,00,00,\
 00,52,45,b7,4f,74,50,1f,2b,6f,61,6f,75,75,6a,3f,64,6e,77,2e,00,01,00,00,00,\
 00,00,00,00,04,00,00,00,00,00,00,00,52,45,b7,4f,ff,ff,ff,00,36,00,00,00,00,\
 00,00,00,04,00,00,00,00,00,00,00,52,45,b7,4f,0a,46,0a,01,35,00,00,00,00,00,\
 00,00,01,00,00,00,00,00,00,00,52,45,b7,4f,05,00,00,00,fc,00,00,00,00,00,00,\
 00,00,00,00,00,00,00,00,00,2a,bd,b6,4f,33,00,00,00,00,00,00,00,04,00,00,00,\
 00,00,00,00,52,45,b7,4f,00,00,8c,a0
Run Code Online (Sandbox Code Playgroud)

更新 2

如果 url 比Windows 协议上定义的大小短,则该 url 不会显示在注册表中。在我的例子中,'h' 是标识符,'t' 是大小(116)。如果网址是:

http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

注册表包含我之前粘贴的内容。url 正好是 117 个字符,但我们使用 2 作为 id 和 size。这意味着数据是 115。不够。

如果我在我的网址中添加一个“A”:

http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

然后注册表包含:

"DhcpInterfaceOptions"=hex:68,00,00,00,00,00,00,00,74,00,00,00,01,00,00,00,62,\
0e,bb,4f,74,70,3a,2f,2f,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,06,00,00,00,00,00,\
00,00,08,00,00,00,00,00,00,00,62,0e,bb,4f,0a,46,0a,01,08,08,08,08,03,00,00,\
00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,4f,0a,46,0a,01,0f,00,00,00,\
00,00,00,00,0f,00,00,00,00,00,00,00,62,0e,bb,4f,75,61,4a,1f,31,4c,ca,11,55,\
6f,2e,63,1f,6d,fe,00,01,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,\
bb,4f,ff,ff,ff,00,33,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,\
4f,00,00,8c,a0,36,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,4f,\
0a,46,0a,01,35,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,62,0e,bb,4f,05,\
00,00,00
Run Code Online (Sandbox Code Playgroud)

41 是'A' 的十六进制表示。

Seo*_*man 2

实施的解决方案是:

dhcpd.conf:

option space yourCompany;
    option yourCompany.url code 128 = text;

class "vendor-classes" {
    match option vendor-class-identifier;
}

subclass "vendor-classes" "MSFT 5.0" {
    vendor-option-space yourCompany;
}
Run Code Online (Sandbox Code Playgroud)

在您的租约上,添加以下行:

supersede yourCompany.url = "http://URL"
Run Code Online (Sandbox Code Playgroud)

您可以将 .url 更改为您想要的任何内容。只需确保您更改了您公司空间中的选项名称即可。

使用此方法我可以在注册表中看到完整的 URL。