根据RFC4704的说明,只有dhcpv6 statefull才支持主机名解析,也就是dhcp请求报文中的option39字段,stateless及SLAAC都是不支持的,这给主机名解析带来了一些难度,要实现主机名解析可以从以下两个方面入手:
1. 使用dhcpv6 statefull
dnsmasq和odhcpd都支持statefull功能,还需要注意以下方面
– 把RA报文的M和O位设置为1
其实不是也有的客户端都严格按照RA报文的标志来处理,像Windows10上就是始终会执行SLAAC 和DHCPv6两种请求
– 客户端请求报文携带option 39字段
在Windows上保持默认即可,部分Linux系统(Debian)需要在/etc/dhcp/dhclient.conf中 添加send fqdn.fqdn = gethostname();
据我测试macos上也存在这个问题,目前没有解决办法。
statefull和slaac是可以同时使用的,RA通告前缀的同时使用dhcpv6提供地址分配,这样客户端会 获得两个IP地址
- 使用dnsmasq ra-names功能
ra-names是根据dhcpv4中的主机名再结合mac地址计算出主机名与ipv6地址的绑定关系
这种方式有两个缺点:
一是,推算出来的ipv6地址不一定100%正确
二是,要通过DHCP获取ipv4地址,这对于单栈网络或静态配置的IP地址就不行。
好在statefull和ra-names功能是可以同时使有的,可以弥补彼此的不足
参考:
https://datatracker.ietf.org/doc/rfc4704/
https://serverfault.com/questions/1033682/dhclient-is-sending-host-name-for-ipv4-but-not-ipv6