我管理一家小型企业的网络,该企业有一个 IPCop 防火墙,为网络提供 DHCP 服务(以及各种其他服务)。IPCop 中的 DHCP 服务器似乎是 dhcpd,IPCop 提供了一个基于 Web 的前端来编辑配置文件。
我希望使用 vendor-encapsulated-options 选项将 DHCP 选项 66 和 67 的特定值发送到特定的 vendor-class-identifier。目的是自动配置一些支持 DHCP 选项 66/67 和 43/60 的 VoIP 电话。
我已经设法让选项 66 tftp-server-name 和 67 bootfile-name 运行以自动配置电话。但当然这些选项是全局的,并发送给所有 DHCP 客户端。我希望尝试使用 vendor-class-indentifier 和 vendor-encapsulated-options DHCP 选项将自动配置信息仅发送给电话。我意识到这对于小型企业网络来说可能有点过头了,但这一切都是为了拓宽我的知识面。
因此我开始阅读一些现有的信息,但就是搞不清楚如何在供应商封装选项字符串中对选项 66/67 进行编码。
以下是相关的 RFC...https://www.rfc-editor.org/rfc/rfc2132#section-8第 8.4 节 这是 dhcpd 的手册页http://www.daemon-systems.org/man/dhcp-options.5.html在“供应商封装选项”下
这些文档似乎表明选项要以十六进制格式进行编码,但是查看 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;
当我尝试将该批数据从十六进制解码为 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
我已根据 VoIP 电话 (Snom) 在 DHCP 请求中提交的值设置了供应商类别标识符。bootfile-name 和 tftp-server-name 是我希望在供应商封装选项中编码的选项 (66/67)。Snom 的
wiki 上有一个指南...
http://wiki.snom.com/Networking/DHCP/Options#Auto_Provisioning_Options
(抱歉,我的声誉太低,无法在一个问题中发布 >2 个链接)
该 wiki 似乎建议我需要将供应商类别标识符编码为“n 个八位字节的字符串”
此外,该 wiki 文章中给出的供应商封装选项示例在从十六进制转换为 ASCII 时也会返回乱码。所以这里有一些关键的东西我不明白。
有人能告诉我如何正确格式化/编码这些 DHCP 选项吗?
答案1
DHCP 选项 43 有点奇怪。供应商可以按照自己的意愿处理它 - 一些供应商希望选项编号与 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,。
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;
- 字节 1,
0x42
.42 十六进制为 66,代表选项代码 66。 - 字节 2,。
0x0c
长度为 12 个字节。 - 字节 3-14,。末尾
0x687474703a2f2f7465737400
有http://test
一个空字节 ( )。不知道他们为什么在那里放这个。0x00
- 字节 15,.
0x43
选项 67。 - 字节16,
0x12
.18字节长度。 - 字节 17-34,
0x736e6f6d2f73657474696e67732e70687000
...snom/settings.php
同样,末尾有一个空字节。
因此,假设您需要构建一个选项 43,并将其http://phone.example.com
作为选项 66 和phonesettings.txt
选项 67。
- 字节 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;
如果这不起作用,请尝试将空字节添加到数据字符串的末尾(并相应地增加长度字段),如他们的示例中所示 - 他们可能希望在每个选项的末尾都有空字节,或者每个选项的长度都有偶数个字节。这就是选项 43 的缺点 - 他们可以为所欲为!
答案2
这绝对是配置选项 43 的最糟糕的方式。您应该使用 ISC 的“供应商选项空间”语法,它允许您人工读取您配置的内容并避免错误:
option space db;
option db.db-server code 1 = ip-address;
option db.loginid code 2 = text;
option db.db-name code 3 = text;
让-伊夫·比西奥
答案3
记得使用本地封装:
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;