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

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

我管理一家小型企业的网络,该企业有一个 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,。末尾0x687474703a2f2f7465737400http://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;

相关内容