radvd配置DNS详解
radvd与DNS的关系
radvd(Router Advertisement Daemon)是IPv6网络中用于发送路由通告的核心服务,其核心功能是通过ICMPv6消息向客户端传递前缀、默认网关及DNS服务器等关键配置,在IPv6环境中,DNS配置的自动化交付依赖radvd的RDNSS(Recursive DNS Server)选项实现——当客户端通过SLAAC(无状态地址自动配置)获取IP时,会同步接收由radvd推送的DNS服务器地址,避免手动配置的繁琐。

radvd配置文件基础结构
radvd的配置文件通常为/etc/radvd.conf,采用XML格式定义多个接口规则,每个接口块需包含interface标签,内部通过子标签指定参数,以下是基础模板:
interface eth0 {
AdvSendAdvert on; # 启用该接口的路由通告
prefix 2001:db8::/64 {}; # 宣告的前缀范围
RDNSS 2001:4860:4860::8888 {}; # 推送的DNS服务器地址
DNSSL example.com {}; # 可选:推送DNS搜索域
};
- AdvSendAdvert:控制是否在该接口发送路由通告;
- prefix:宣告给客户端的IPv6前缀,客户端基于此生成本地地址;
- RDNSS: Recursive DNS Server的缩写,用于指定DNS服务器地址;
- DNSSL:DNS Search List,添加域名后缀以简化域名解析。
RDNSS配置细节
RDNSS是radvd配置DNS的核心字段,支持单地址或多地址列表。
RDNSS 2001:4860:4860::8888 2606:4700:4700::1111 {};
若需配置DNS搜索域,可使用DNSSL字段:
DNSSL local.example.com corp.net {};
注意:RDNSS地址需确保可达性,建议选择公共DNS(如Google 2001:4860:4860::8888、Cloudflare 2606:4700:4700::1111)或内网DNS服务器。

配置示例与验证步骤
示例配置文件
假设局域网接口为eth0,前缀为fd00::/64,DNS服务器为2001:db8::1,配置如下:
interface eth0 {
AdvSendAdvert on;
prefix fd00::/64 {};
RDNSS 2001:db8::1 {};
};
重启radvd服务
修改配置后,执行以下命令使更改生效:
sudo systemctl restart radvd sudo systemctl status radvd # 验证服务运行状态
客户端验证
在Linux客户端,使用ip -6 addr show查看IPv6地址(应包含fd00::前缀),并通过cat /var/lib/dhclient/dhclient6.leases(DHCPv6场景)或直接检查系统DNS配置确认:
resolvectl status # 显示当前DNS服务器(含IPv6)
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 客户端未收到RDNSS | radvd未启动/配置错误 | 检查systemctl status radvd日志 |
| DNS服务器不可达 | 防火墙阻断ICMPv6 | 开放防火墙ICMPv6相关规则 |
| 前缀正确但DNS缺失 | RDNSS语法错误 | 确认地址格式(如冒号分隔) |
高级配置技巧
- 多接口差异化配置:不同网卡可设置独立RDNSS,
interface wlan0 { AdvSendAdvert on; prefix 2001:db8:1::/64 {}; RDNSS 2001:db8:1::1 {}; }; - 结合DHCPv6优化:若同时使用DHCPv6,可通过
dhcp-range参数协调DNS分配,避免冲突。 - 安全性增强:限制RDNSS仅对信任网络可见,配合防火墙策略减少风险。
相关问答FAQs
Q1:为什么客户端能收到前缀却收不到DNS?
A:首先检查radvd配置中RDNSS字段是否正确(地址格式、括号闭合);其次确认防火墙是否允许ICMPv6流量(类型134/135);最后验证DNS服务器本身是否可达(可用ping6测试)。

Q2:能否在radvd中同时配置IPv4和IPv6的DNS?
A:radvd专为IPv6设计,无法直接处理IPv4 DNS,若需混合环境,建议通过DHCPv4(dnsmasq等工具)管理IPv4 DNS,而radvd专注于IPv6的RDNSS配置,两者互补实现全协议栈自动化。