Linux DHCP 服务器选项 43 供应商封装选项,如何格式化/编码?

bat*_*tad 6 linux dhcp-server dhcp-option

我为一家小型企业管理网络,该企业有一个 IPCop 防火墙盒,为网络(以及各种其他服务)提供 DHCP 服务。IPCop 中的 DHCP 服务器似乎是 dhcpd,IPCop 提供了一个基于 Web 的前端来编辑配置文件。

我希望使用 vendor-encapsulated-options 选项将 DHCP 选项 66 和 67 的特定值发送到特定的供应商类标识符。目的是自动配置一些支持 DHCP 选项 66/67 和 43/60 的 VoIP 电话。

我已经设法让选项 66 tftp-server-name 和 67 bootfile-name 用于自动配置电话。但当然,这些选项是全局的,会发送到所有 DHCP 客户端。我正在尝试使用 vendor-class-indentifier 和 vendor-encapsulated-options DHCP 选项将自动配置信息仅发送到电话。我意识到这对于小型企业网络来说可能有点矫枉过正,但这只是为了拓宽我的知识面。

所以我开始阅读一些现有的信息,但我无法弄清楚如何在供应商封装的选项字符串中对选项 66/67 进行编码。
这是相关的 RFC ... http://tools.ietf.org/html/rfc2132#section-8第 8.4 节 这是 dhcpd http://www.daemon-systems.org/man/dhcp-options的手册页“供应商封装选项”下的.5.html

这些文件似乎表明这些选项以十六进制格式编码,但是查看供应商封装选项选项的手册页示例......

The value of this option can be set in one of two ways.  
The first way is to simply specify the data directly,  
using a text string or a colon-separated list of hexadecimal values.  
For example:  
       option vendor-encapsulated-options
           2:4:AC:11:41:1:
           3:12:73:75:6e:64:68:63:70:2d:73:65:72:76:65:72:31:37:2d:31:
           4:12:2f:65:78:70:6f:72:74:2f:72:6f:6f:74:2f:69:38:36:70:63;
Run Code Online (Sandbox Code Playgroud)

当我尝试将大量内容从 HEX 解码为 ASCII 时,我得到以下信息:
????A?????????sundhcp-server17-1????????/export/root/i86pc
所以我确定我没有正确理解格式/编码。

这是我从 IPCop 的 dhcpd.conf 中摘录的片段

subnet 192.168.1.0 netmask 255.255.255.0 #GREEN
{
        range 192.168.1.30 192.168.1.200;
        option subnet-mask 255.255.255.0;
        option domain-name "domain.com";
        option routers 192.168.1.1;
        option domain-name-servers 192.168.1.1;
        option ntp-servers 192.168.1.1;
        option netbios-name-servers 192.168.1.3;
        default-lease-time 43200;
        max-lease-time 172800;
        option vendor-encapsulated-options "hello";
        option vendor-class-identifier "snom320";
        option vendor-class-identifier "snom821";
        option bootfile-name "voipsettings/firstboot.xml";
        option tftp-server-name "http://username:password@intranet.domain.com";
} #GREEN
Run Code Online (Sandbox Code Playgroud)

我根据 DHCP 请求中 VoIP 电话 (Snom) 提交的值设置了供应商类标识符。bootfile-name 和 tftp-server-name 是我希望在供应商封装选项中编码的选项 (66/67)。
Snom 在他们的 wiki 上有一个指南......
http://wiki.snom.com/Networking/DHCP/Options#Auto_Provisioning_Options
(抱歉,我的声誉太低,无法在问题中发布 >2 个链接)
该 wiki 似乎表明我需要将供应商类标识符编码为“n 的字符串”八位字节”
此外,该维基文章中给出的供应商封装选项的示例在从十六进制转换为 ASCII 时也会返回乱码。所以有一些关键的东西我在这里不理解。

谁能告诉我如何正确格式化/编码这些 DHCP 选项?

Sha*_*den 11

DHCP Option 43 有点奇怪。供应商可以按照他们的意愿处理它 - 有些人希望选项编号与 DHCP 选项编号匹配,而其他人则不然。

基本结构是选项 ID 的 1 个字节,选项数据的长度 (n) 的 1 个字节,然后是实际选项数据的 n 个字节 - 并且,冲洗和重复。


让我们以 dhcp-options 中的示例为例。他们将换行符固定在重要位置以使其更易于阅读。实际上,他们配置的设置就是这样:

02:04:AC:11:41:01:03:12:73:75:6e:64:68:63:70:2d:73:65:72:76:65:72:31:37:2d:31:04:12:2f:65:78:70:6f:72:74:2f:72:6f:6f:74:2f:69:38:36:70:63;
Run Code Online (Sandbox Code Playgroud)

除非您知道要查找的内容,否则很难阅读。让我们分解部分:

  • 字节 1, 0x02. 这表示此块是选项编号 2 的配置。如何解释由供应商决定。
  • 字节2 0x04。这表示选项 2 的数据将占用接下来的 4 个字节。
  • 字节3-6 0xAC114101。这四个字节是实际数据。正如您在尝试解码时看到的那样,它不是可读数据。
  • 字节 7,下一个选项块开始0x03。整个链条重新开始,这表示以下配置适用于选项 3。
  • 依此类推,对于 3 个部分

另一个例子,来自 snom wiki 页面:

42:0c:68:74:74:70:3a:2f:2f:74:65:73:74:00:43:12:73:6e:6f:6d:2f:73:65:74:74:69:6e:67:73:2e:70:68:70:00;
Run Code Online (Sandbox Code Playgroud)
  • 字节 1, 0x42. 十六进制中的 42 是 66,对于选项代码 66。
  • 字节2 0x0c。长度为 12 个字节。
  • 字节3-14 0x687474703a2f2f7465737400。这是末尾http://test有一个空字节 ( 0x00)。不知道为什么他们在那里。
  • 字节15 0x43。选项 67。
  • 字节16 0x12。18 字节长度。
  • 字节17-34, 0x736e6f6d2f73657474696e67732e70687000snom/settings.php. 同样,末尾的空字节。

因此,假设您需要http://phone.example.com使用选项 66 和phonesettings.txt选项 67构建选项 43 。

  • 字节 1,选项代码 66, 0x42
  • 字节 2,长度为 24 字节http://phone.example.com,所以0x18
  • 字节 3-26,数据。 0x687474703a2f2f70686f6e652e6578616d706c652e636f6d
  • 字节 27,选项代码 67, 0x43
  • 字节 28,长度为 17 字节phonesettings.txt,所以0x11
  • 字节 29-45,数据。 0x70686f6e6573657474696e67732e747874

所以,一个完整的配置字符串:

42:18:68:74:74:70:3a:2f:2f:70:68:6f:6e:65:2e:65:78:61:6d:70:6c:65:2e:63:6f:6d:43:11:70:68:6f:6e:65:73:65:74:74:69:6e:67:73:2e:74:78:74;
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试将空字节添加到数据字符串的末尾(并相应地增加长度字段),如他们的示例所示 - 他们可能需要每个选项末尾的空字节或偶数字节对于每个选项的长度。这就是选项 43 的缺点——他们可以为所欲为!