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

我管理一个小型企业的网络,该企业有一个IPCop防火墙盒,为网络(以及其他各种服务)提供DHCP服务. IPCop中的DHCP服务器似乎是dhcpd,IPCop提供了一个基于Web的前端来编辑配置文件.

我希望使用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选项?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用位运算来实现该功能,具体步骤如下: 1. 将IPv4地址和掩码转换成32位的二进制形式。 2. 对掩码进行取反操作,得到反码。 3. 将反码转换成十进制形式,得到掩码中0的个数。 4. 对IPv4地址进行位与操作,将掩码中为1的位保留下来,为0的位全部置为0,得到网络地址。 5. 然后从网络地址+1开始,每次加1,直到达到掩码中为0的个数的所有可能值,即可得到所有的IPv4地址。 以下是Java代码示例: ```java public static List<String> getAllIPv4(String ip, String mask) { List<String> ips = new ArrayList<>(); String[] ipsArr = ip.split("\\."); String[] maskArr = mask.split("\\."); int[] ipv4 = new int[4]; int[] ipv4Mask = new int[4]; for (int i = 0; i < 4; i++) { ipv4[i] = Integer.parseInt(ipsArr[i]); ipv4Mask[i] = Integer.parseInt(maskArr[i]); } int maskValue = (ipv4Mask[0] << 24) + (ipv4Mask[1] << 16) + (ipv4Mask[2] << 8) + ipv4Mask[3]; int reverseMaskValue = ~maskValue; int zeroCount = Integer.bitCount(reverseMaskValue); int networkAddress = (ipv4[0] << 24) + (ipv4[1] << 16) + (ipv4[2] << 8) + ipv4[3]; networkAddress = networkAddress & maskValue; for (int i = 1; i < (1 << zeroCount) - 1; i++) { int currentAddress = networkAddress + i; StringBuilder sb = new StringBuilder(); for (int j = 0; j < 4; j++) { sb.append(currentAddress >> (24 - j * 8) & 0xff); if (j != 3) { sb.append("."); } } ips.add(sb.toString()); } return ips; } ``` 该方法接收两个参数,分别是IPv4地址和掩码,返回值是一个List类型的所有IPv4地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值