Linux DHCP服务器选项43 vendor-encapsulated-options,如何格式化/编码?

我pipe理一个小型企业的networking,它有一个为networking(和其他各种服务)提供DHCP服务的IPCop防火墙。 IPCop中的DHCP服务器似乎是dhcpd,IPCop提供了一个基于Web的前端来编辑configuration文件。

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

我已经设法得到选项66 tftp-server-name和67 bootfile-name工作自动configuration电话。 但是,这些选项当然是全局的,并发送给所有的DHCP客户端。 我正在尝试使用vendor-class-identifier和vendor-encapsulated-options DHCP选项来将自动configuration信息仅发送给手机。 我意识到这可能是一个小型企业networking矫枉过正,但这是所有扩大我的知识。

所以我开始阅读一些信息,我只是不能解决如何在供应商封装的选项string中编码选项66/67。
这里是相关的RFC … http://tools.ietf.org/html/rfc2132#section-8 8.4节这里是dhcpd的手册页http://www.daemon-systems.org/man/dhcp-options .5.html下的“供应商封装选项”

这些文件似乎表明,选项将被编码为hex格式,然而看看供应商封装选项的手册页示例…

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; 

当我尝试和hex解码从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:[email protected]"; } #GREEN 

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

任何人都可以给我一个如何正确格式化/编码这些DHCP选项的破败?

DHCP Option 43是一个奇怪的野兽。 供应商可以对其进行处理,但有些人希望选项号码与DHCP选项号码匹配,而另一些则不会。

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


我们来看一下dhcp-options的例子。 他们已经把战线上的新线卡住了,以便于阅读。 实际上,他们configuration的设置就是这样的:

 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; 

除非你知道你在找什么,否则很难阅读。 我们来分解一下部分:

  • 字节0x02 。 这表示这个块是configuration选项编号2.如何解释取决于供应商。
  • 字节0x04 。 这表示选项2的数据将占用接下来的4个字节。
  • 字节0xAC114101 。 这四个字节是实际的数据。 正如您在尝试对其进行解码时看到的那样,这是不可读的数据。
  • 字节7, 下一个选项块 0x03 。 整个链条重新开始,这就是说,下面的configuration是为选项3。
  • 等3个部分

另一个例子,从snom维基页面:

 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; 
  • 字节0x42 。 hex中的42是66,代码为66。
  • 字节0x0c 。 长度为12字节。
  • 字节0x687474703a2f2f7465737400 。 这是http://test与一个空字节( 0x00 )结束。 不知道为什么他们那里。
  • 字节0x43 。 选项67。
  • 字节0x12 。 18个字节的长度。
  • 字节0x736e6f6d2f73657474696e67732e70687000snom/settings.php 。 同样,结尾的空字节。

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

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

所以,一个完整的configurationstring:

 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; 

如果这不起作用,请尝试在数据string的末尾添加空字节(并相应地增加长度字段) – 它们可能需要每个选项末尾的空字节或偶数字节每个选项的长度。 这是选项43的缺点 – 他们可以做任何他们想要的!

这绝对是configuration选项43的最通用的方法。您应该使用ISC的“供应商选项空间”语法,让您阅读您所configuration的内容并避免错误:

 option space db; option db.db-server code 1 = ip-address; option db.loginid code 2 = text; option db.db-name code 3 = text; 

Jean-Yves Bisiaux

请记住使用本地封装:

 option space cisco; option cisco.wlc code 241 = array of ip-address; option local-encapsulation code 43 = encapsulate cisco; option cisco.wlc 10.7.3.6, 10.7.3.2;