在开始配置前,必须理解DHCPv6的两种工作模式,这决定了客户端如何获取地址和其他信息:
1、有状态 (Stateful)
地址分配客户端从DHCPv6服务器获取IPv6地址、租约时间等信息。
其他配置同时从服务器获取DNS服务器、域名等其他信息。
类似IPv4的DHCP工作方式与大家熟知的IPv4 DHCP非常相似。
对应标志位路由器通告中的M
(Managed) 标志位设置为1
。
2、无状态 (Stateless)
地址分配客户端不从DHCPv6服务器获取IPv6地址,它们使用从路由器发送的路由器通告 中获取的前缀,通过SLAAC 自行生成地址。
其他配置仅从DHCPv6服务器获取DNS服务器、域名等其他信息。
对应标志位路由器通告中的O
(Other) 标志位设置为1
。
方案一:在 Linux 上使用 ISC DHCP Server (dhcpd)
ISC DHCP 是功能最全、最灵活的DHCP服务器之一。
在基于 Debian/Ubuntu 的系统上:
sudo apt update sudo apt install isc-dhcp-server
在基于 RHEL/CentOS/Rocky 的系统上:
sudo dnf install dhcp-server 或者使用 yum sudo yum install dhcp
步骤 2:配置/etc/dhcp/dhcpd6.conf
这是主要的配置文件,你需要根据你的网络情况进行修改。
示例:有状态 DHCPv6 配置
假设你的网络前缀是2001:db8:1234::/64
,你想要分配的地址范围是2001:db8:1234::1000
到2001:db8:1234::2000
。
sudo nano /etc/dhcp/dhcpd6.conf
设置全局参数 default-lease-time 600; # 默认租约时间(秒) max-lease-time 7200; # 最大租约时间(秒) authoritative; # 声明此服务器是该网络的权威服务器 定义一个子网 subnet6 2001:db8:1234::/64 { # 分配给客户端的地址范围 range6 2001:db8:1234::1000 2001:db8:1234::2000; # 设置DNS服务器和域名 option dhcp6.name-servers 2001:db8:1234::1, 2001:4860:4860::8888; option dhcp6.domain-search "example.com"; # 如果需要,可以设置固定的主机绑定(类似于IPv4的静态分配) # host special-client { # host-identifier option dhcp6.client-id 00:01:00:01:27:71:4e:fa:00:0c:29:aa:bb:cc; # fixed-address6 2001:db8:1234::babe; # } }
示例:无状态 DHCPv6 配置
如果你只想让DHCPv6服务器分发DNS信息,而不分配地址。
subnet6 2001:db8:1234::/64 { # 不定义 range6,即不分配地址 # 只提供其他配置信息 option dhcp6.name-servers 2001:db8:1234::1, 2001:4860:4860::8888; option dhcp6.domain-search "example.com"; # 无状态模式的关键设置 option dhcp6.info-refresh-time 1800; # 客户端刷新信息的时间间隔 }
编辑/etc/default/isc-dhcp-server
(Debian/Ubuntu) 或/etc/dhcp/dhcpd.conf
(RHEL) 来告诉服务器在哪个接口上提供DHCPv6服务。
Debian/Ubuntu:
sudo nano /etc/default/isc-dhcp-server
找到INTERFACESv6
行并修改:
INTERFACESv6="ens18" # 将 ens18 替换为你的实际接口名,如 eth0, enp0s3 等
RHEL/CentOS:
配置文件通常是/etc/sysconfig/dhcpd
。
sudo nano /etc/sysconfig/dhcpd
DHCPDARGS="-6 ens18" # 将 ens18 替换为你的实际接口名
重启服务(或启动) sudo systemctl restart isc-dhcp-server.service 设置开机自启 sudo systemctl enable isc-dhcp-server.service 检查服务状态,确保它正在运行 sudo systemctl status isc-dhcp-server.service
在你的网络网关(可能是同一个Linux服务器或路由器)上,你需要配置radvd 来发送路由器通告。
1、 安装 radvd:
sudo apt install radvd
2、 配置/etc/radvd.conf
:
对于有状态 DHCPv6(客户端从DHCPv6获取地址):
interface ens18 { AdvSendAdvert on; prefix 2001:db8:1234::/64 { AdvOnLink on; AdvAutonomous off; # 关键:关闭自主地址配置,强制使用DHCPv6获取地址 }; AdvManagedFlag on; # 关键:M标志位设为1,表示“使用有状态DHCPv6” };
对于无状态 DHCPv6(客户端自己生成地址,从DHCPv6获取DNS):
interface ens18 { AdvSendAdvert on; prefix 2001:db8:1234::/64 { AdvOnLink on; AdvAutonomous on; # 关键:开启自主地址配置,使用SLAAC }; AdvOtherConfigFlag on; # 关键:O标志位设为1,表示“从DHCPv6获取其他配置” };
3、 启动 radvd:
sudo systemctl restart radvd sudo systemctl enable radvd
方案二:在路由器/防火墙上配置(以 OPNsense 为例)
大多数现代路由器和防火墙都提供了图形化界面来配置DHCPv6,这通常更简单。
1、登录管理界面:通过浏览器登录你的路由器/防火墙管理界面(如 OPNsense, pfSense, OpenWrt等)。
2、导航到DHCPv6设置:通常在服务
->DHCPv6
->[接口]
或类似路径下。
3、配置模式:
路由器通告设置为Managed
(有状态)或Assisted
(无状态,对应O
标志位)。
DHCPv6范围在有状态下,设置一个要分配的IPv6地址范围(例如::1000
到::2000
)。
4、设置其他选项:填写要下发的DNS服务器、搜索域等。
5、保存并应用:保存配置后,服务通常会立即生效。
1、检查服务状态:sudo systemctl status isc-dhcp-server
2、查看日志:sudo journalctl -u isc-dhcp-server -f
或查看/var/log/syslog
。
3、客户端测试:在客户端上,使用ip a
查看是否获取到IPv6地址,使用systemd-resolve --status
或cat /etc/resolv.conf
查看是否获取到DNS。
4、防火墙:确保服务器的防火墙放行了UDP 546 和UDP 547 端口。
5、路由器通告标志位:最常见的问题,确保M
和O
标志位的设置与你的DHCPv6模式匹配。
希望这份详细的指南能帮助你成功配置DHCPv6服务器!
文章摘自:https://idc.huochengrm.cn/fwq/17862.html
评论