首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux服务器选项43供应商封装-选项,如何格式化/编码?

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

Server Fault用户
提问于 2011-10-04 12:07:16
回答 3查看 53.3K关注 0票数 6

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

我希望使用供应商封装选项选项将DHCP选项66和67的特定值发送到特定的供应商类别标识符。其目的是自动配置一些支持DHCP选项66/67和43/60的VoIP手机。

我已经找到了66个tftp服务器名和67个引导文件名来自动配置手机。当然,这些选项是全局的,并发送给所有DHCP客户端。我正在试验供应商级标识符和供应商封装选项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在“供应商封装选项”下的手册页

这些文档似乎表明这些选项是用HEX格式编码的,但是看看供应商封装的选项的手册页面示例.

代码语言:javascript
运行
复制
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的那批代码时,我得到以下信息:

????A?????????sundhcp-server17-1????????/export/root/i86pc

因此,我确信我没有正确地理解格式/编码。

这是IPCop的dhcpd.conf的片段

代码语言:javascript
运行
复制
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

我已经根据VoIP电话(Snom)在DHCP请求中提交的值设置了供应商类标识符。引导文件名和tftp-服务器名称是我希望在供应商封装的选项中编码的选项(66/67)。

斯诺姆在这里有一个关于他们维基的向导..。

http://wiki.snom.com/Networking/DHCP/Options#Auto_Provisioning_Options

(对不起,我的名声太低了,不能在一个问题上发布>2个链接)

这个wiki似乎意味着我需要将供应商类标识符编码为“n个octets字符串”。

此外,在wiki文章中给出的供应商封装选项的示例在从HEX转换到ASCII时也会返回胡言乱语。所以有些关键的事情我还不明白。

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

EN

回答 3

Server Fault用户

回答已采纳

发布于 2011-10-04 21:37:51

DHCP选项43是一个有点奇怪的野兽。供应商可以任意处理它-一些人期望选项号与DHCP选项号相匹配,另一些人则不这样认为。

基本结构是选项ID的1字节,选项数据(n)的长度为1字节,然后是实际选项数据的n字节,以及清洗和重复。

让我们以dhcp选项中的例子为例。他们把换行符插在战略位置上,以便于阅读。实际上,他们配置的设置就是:

代码语言:javascript
运行
复制
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的配置。
  • 以此类推,分三节

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

代码语言:javascript
运行
复制
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,在http://phone.example.com上的长度为24个字节,所以0x18
  • 字节3-26,数据。0x687474703a2f2f70686f6e652e6578616d706c652e636f6d
  • 字节27,选项代码67,0x43
  • phonesettings.txt上的字节28,长度为17字节,所以0x11
  • 字节29-45,数据。0x70686f6e6573657474696e67732e747874

因此,一个完整的配置字符串:

代码语言:javascript
运行
复制
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的缺点--他们可以做任何他们想做的事!

票数 11
EN

Server Fault用户

发布于 2014-03-14 05:50:42

这无疑是配置选项43的最快捷的方式。相反,您应该使用ISC的“供应商选项空间”语法,该语法允许您对配置的内容进行人工读取,并避免错误:

代码语言:javascript
运行
复制
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
EN

Server Fault用户

发布于 2016-07-22 10:01:30

记住要使用本地封装:

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/318292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档