我希望使用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选项来仅将自动配置信息发送到手机.我意识到这对于小型企业网络来说可能有些过分,但这都是为了拓宽我的知识面.
所以我开始阅读那里的一些信息,我无法弄清楚如何在vendor-encapsulated-options字符串中编码选项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格式编码,但是查看vendor-encapsulated-options选项的手册页示例…
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解码为ASCII时,我得到以下内容:
????甲????????? sundhcp-server17-1 ???????? /出口/根/了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
我根据DHCP请求中的VoIP电话(Snom)提交的值设置了供应商类标识符. bootfile-name和tftp-server-name是我希望在vendor-encapsulated-options中编码的选项(66/67).
Snom在这里有他们维基的指南……
http://wiki.snom.com/Networking/DHCP/Options#Auto_Provisioning_Options
(道歉,我的声誉太低,无法在一个问题中发布> 2个链接)
那个wiki似乎暗示我需要将vendor-class-identifier编码为“n个字节的字符串”
此外,该维基文章中给出的供应商封装选项的示例在从HEX转换为ASCII时也会返回乱码.所以有一些关键的东西,我在这里不理解.
任何人都可以告诉我如何正确格式化/编码这些DHCP选项?
解决方法
基本结构是1个字节用于选项ID,1个字节用于选项数据的长度(n),然后是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;
除非你知道你在寻找什么,否则很难阅读.让我们分解部分:
>字节1,002.这表示此块是配置选项编号2.如何解释这取决于供应商.
>字节2,0×04.这表示选项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;
>字节1,042.对于选项代码66,42 in hex为66.
>字节2,0x0c.长度为12个字节.
>字节3-14,0x687474703a2f2f7465737400.这是http://在末尾用空字节(0x00)测试.不知道他们为什么那样.
>字节15,0×43.选项67.
>字节16,0×12. 18字节长度.
>字节17-34,0x736e6f6d2f73657474696e67732e70687000. SNOM / settings.PHP中.同样,结尾处的空字节.
所以,假设您需要构建一个选项43,其中http://phone.example.com作为选项66,phonesettings.txt作为选项67.
>字节1,选项代码66,0×42
>字节2,http://phone.example.com上的24字节长度,所以0x18
>字节3-26,数据. 0x687474703a2f2f70686f6e652e6578616d706c652e636f6d
>字节27,选项代码67,0×43
>字节28,在phonesettings.txt上长度为17个字节,所以为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;
如果这不起作用,请尝试将空字节添加到数据字符串的末尾(并相应地增加长度字段),如同在他们的示例中一样 – 它们可能要求每个选项末尾的空字节或偶数个字节对于每个选项的长度.这是选项43的缺点 – 他们可以做任何他们想做的事!