DHCPv6 Server

RouterOS DHCPv6 服务器委派 IPv6 前缀(DHCPv6-PD)并向客户端分配 IPv6 地址,支持静态绑定、RADIUS 与按绑定限速。

DHCPv6 服务器

子菜单: /ipv6/dhcp-server

标准: RFC 8415

DHCPv6 服务器委派 IPv6 前缀(DHCPv6-PD)并向客户端分配 IPv6 地址。它通常运行在向下游路由器分发前缀的路由器上,例如 ISP 的客户路由器。服务器从 prefix-pool 指定的 IPv6 池获取前缀,从 address-pool 指定的 IPv6 池获取地址;地址池的前缀长度必须为 128。绑定也可以是静态绑定,或由 RADIUS 服务器分配。

每个绑定由客户端 DUID 与 IAID 标识。当客户端绑定到前缀后,服务器会通过客户端为该前缀添加动态路由(route-distance),使发往委派前缀的流量到达客户路由器。

多数主机只有在其网络上的路由器通告设置了 managed 标志时,才会通过 DHCPv6 请求地址。RouterOS 的 DHCPv6 服务器与客户端使用相同的 DUID。DHCPv6 工作方式请参阅 DHCP 概念。

配置示例

启用 IPv6 前缀委派

先创建 IPv6 池:

/ipv6/pool/add name=myPool prefix=2001:db8:7501::/60 prefix-length=62

prefix-length=62 表示客户端从 /60 池中获得 /62 前缀。

使用该池添加 DHCPv6 服务器:

/ipv6/dhcp-server/add name=myServer prefix-pool=myPool interface=local

可以使用 RouterOS DHCPv6 客户端测试服务器,或像本例一样在 Linux 主机上使用 wide-dhcpv6 客户端:

  1. 安装 wide-dhcpv6-client。

  2. 配置 /etc/wide-dhcpv6/dhcp6c.conf,在 eth2 上请求前缀,并从该前缀为 eth3 编号:

    interface eth2{
    send ia-pd 0;
    };
    
    id-assoc pd {
    prefix-interface eth3{
    sla-id 1;
    sla-len 2;
    };
    };
    
  3. 运行客户端:

    sudo dhcp6c -d -D -f eth2
    
  4. 检查 eth3 是否从委派前缀获得地址。

服务器会显示绑定。若要每次都为该客户端提供相同前缀,请将绑定设为静态:

[admin@MikroTik] > /ipv6/dhcp-server/binding/print
Flags: D - DYNAMIC
Columns: ADDRESS, DUID, SERVER, STATUS
#   ADDRESS             DUID                    SERVER    STATUS
0 D 2001:db8:7501::/62  0x0003000100241d1781f7  myServer  bound
[admin@MikroTik] > /ipv6/dhcp-server/binding/make-static 0

服务器还会通过客户端链路本地地址添加到委派前缀的路由:

[admin@MikroTik] > /ipv6/route/print where dst-address=2001:db8:7501::/62
Flags: D - DYNAMIC; A - ACTIVE; d - DHCP
Columns: DST-ADDRESS, GATEWAY, ROUTING-TABLE, DISTANCE
    DST-ADDRESS         GATEWAY                          ROUTING-TABLE  DISTANCE
DAd 2001:db8:7501::/62  fe80::224:1dff:fe17:81f7%local   main                  1

启用 IPv6 地址委派

地址服务器的配置与前缀服务器类似,但使用 address-pool 而非 prefix-pool,且地址池必须分配 /128 前缀。只提供静态绑定的服务器不需要地址池。

[admin@MikroTik] > /ipv6/pool/print detail
Flags: D - dynamic
0 name="myAddressPool" prefix=2001:db8:7501::/120 prefix-length=128
[admin@MikroTik] > /ipv6/dhcp-server/print detail
0 name="myDHCP" interface=ether2 prefix-pool=static-only
  address-pool=myAddressPool lease-time=3d rapid-commit=yes use-radius=no
  preference=255 dhcp-option="" route-distance=1 use-reconfigure=no
  address-lists="" duid="0x00030001b813f4840556"

这已足以服务 RouterOS DHCPv6 客户端等客户端。计算机主机会通过所在网络的路由器通告判断是否使用 DHCPv6。要让主机通过 DHCPv6 请求地址,请在接口的路由器通告中设置 managed address configuration 标志(managed-address-configuration)。此设置无需为 SLAAC 通告前缀:

[admin@MikroTik] > /ipv6/nd/print detail
Flags: X - disabled, I - invalid; * - default
0 interface=ether2 ra-interval=3m20s-10m ra-delay=3s mtu=unspecified
  reachable-time=unspecified retransmit-interval=unspecified
  ra-lifetime=30m ra-preference=medium hop-limit=unspecified
  advertise-mac-address=yes advertise-dns=yes
  managed-address-configuration=yes other-configuration=no

启用 managed 标志后,连接到 ether2 的计算机会收到路由器通告,通常会启动 DHCPv6 客户端请求地址。

警告

客户端对该配置的行为可能不同。例如 macOS 会在启动时获得地址,但没有通告前缀时,从睡眠状态恢复后可能不会续租,因为 macOS 没有 SLAAC 地址时不会使用 DHCPv6 客户端。其他客户端可能需要在通告前缀上设置 autonomous=no 后才使用 DHCPv6。请根据网络中的客户端调整配置。

属性

DHCPv6 服务器的全部属性请参阅 /ipv6/dhcp-server CLI 参考。以下行为需要额外说明。

服务器发起的续租

启用 use-reconfigure=yes 时,接受 Reconfigure 消息的客户端(例如设置了 allow-reconfigure=yes 的 RouterOS DHCPv6 客户端)会获得 reconfigure key。当服务器的 address-pool、lease-time 或 dhcp-option 变化,或绑定设置变化时,服务器会自动发送 Reconfigure 消息,使客户端立即续租并采用变化。绑定的 send-reconfigure 命令可手动发送一次。

客户端 DNS 条目

启用 add-dns-entries=yes 时,服务器会为每个地址绑定添加动态 DNS 条目(类型 AAAA)。名称由客户端发送的 FQDN 加上 add-dns-entries-suffix(默认 lan)组成,TTL 为租期。前缀绑定不会获得 DNS 条目。

绑定

子菜单: /ipv6/dhcp-server/binding

动态绑定与客户端 DUID 关联,因此 DUID 变化的客户端会获得不同于之前的前缀。静态绑定根据客户端 DUID 与 IAID,为客户端提供固定前缀或地址。全部绑定属性、状态值与命令请参阅 /ipv6/dhcp-server/binding CLI 参考。

限速

可以通过绑定的 rate-limit 属性限制客户端带宽。随后服务器会为该绑定的前缀或地址添加动态简单队列。

警告

队列不适用于 FastTracked 流量。请确保防火墙不会 FastTrack 需要限速的流量。 先将绑定设为静态,然后设置速率:

[admin@MikroTik] > /ipv6/dhcp-server/binding/make-static 0
[admin@MikroTik] > /ipv6/dhcp-server/binding/set 0 rate-limit=10M/10M
[admin@MikroTik] > /queue/simple/print
Flags: X - disabled, I - invalid, D - dynamic
0 D name="dhcp<6c3b6b7c413e fdb4:4de7:a3f8:418c::/66>" target=fdb4:4de7:a3f8:418c::/66 parent=none packet-marks="" priority=8/8
  queue=default-small/default-small limit-at=10M/10M max-limit=10M/10M

allow-dual-stack-queue 默认启用,因此同一客户端的 DHCPv6 绑定与 DHCP 租约共享一个动态简单队列。禁用后,服务器会为 IPv6 与 IPv4 分别创建队列。

RADIUS 支持

RADIUS 服务器可使用 Mikrotik-Rate-Limit 属性为每个 DHCPv6 绑定分配速率限制。先让 DHCPv6 服务器使用 RADIUS:

/radius
add address=10.0.0.1 secret=VERYsecret123 service=dhcp
/ipv6/dhcp-server
set dhcp1 use-radius=yes

然后配置 RADIUS 服务器发送该属性。以使用 MySQL 的 FreeRADIUS 为例,为客户端向 radcheck 与 radreply 表添加条目:

INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
('000c4200d464', 'Auth-Type', ':=', 'Accept');

INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
('000c4200d464', 'Delegated-IPv6-Prefix', '=', 'fdb4:4de7:a3f8:418c::/66'),
('000c4200d464', 'Mikrotik-Rate-Limit', '=', '10M');

只有当服务器将 DHCP 租约与 DHCPv6 绑定识别为同一客户端时,才会创建共享队列:识别依据可以是租约 MAC 地址,或 DHCP 客户端发送基于 DUID 的客户端标识符(RFC 4361)时使用 DUID。DHCPv6 客户端按设备生成 DUID,不一定根据其运行接口的 MAC 地址生成,因此服务器可能创建独立队列。