DHCP Relay
DHCP 中继将客户端发往其他网络的 DHCP 与 DHCPv6 请求转发给 DHCP 服务器,并可选支持中继代理信息(option 82)与 VRF。
DHCP 中继
DHCP 中继将一个网络中 DHCP 客户端的请求转发给另一个网络中的 DHCP 服务器,并将响应送回客户端。当一个集中式 DHCP 服务器为多个并不直接相连的网络提供服务时,请使用 DHCP 中继。中继与 DHCP 服务器如何协同工作,请参阅 DHCP 概念。
DHCPv4 中继
子菜单: /ip/dhcp-relay
DHCP 中继在其接口上监听 DHCP 请求,并把每个请求转发给 dhcp-server 中列出的每一台 DHCP 服务器;它不会从中选择一台。它会把 local-address(未设置 local-address 时则使用其接口地址)写入转发请求的网关地址字段(giaddr)。DHCP 服务器将响应发送到该地址,并用它区分不同中继:请把服务器的 relay 属性设置为中继地址,如下例所示。新建中继默认处于禁用状态,添加后请启用。
所有中继属性请参阅 /ip/dhcp-relay CLI 参考。
中继代理信息(option 82)
使用 add-relay-info=yes 时,中继会向转发的请求添加中继代理信息选项(option 82)。Circuit ID 是请求进入的中继接口的 MAC 地址,Remote ID 是客户端的 MAC 地址,或 relay-info-remote-id 中设置的文本。
RouterOS DHCP 服务器会在租约中显示这些值(active-agent-circuit-id、active-agent-remote-id),并将它们传给租约脚本。静态租约可以通过这些值匹配客户端(agent-circuit-id、agent-remote-id),即使客户端 MAC 地址不同;使用 dynamic-lease-identifiers=opt-82 时,服务器仅依据 option 82 识别客户端。
配置示例
在本示例中,一台路由器 DHCP-Server 为两个网络 192.168.1.0/24 与 192.168.2.0/24 分配地址,这两个网络位于另一台路由器 DHCP-Relay 后方。

两台路由器使用以下地址。在 DHCP-Server 上:
/ip/address/add address=192.168.0.1/24 interface=To-DHCP-Relay
/ip/address/add address=10.1.0.2/24 interface=Public
在 DHCP-Relay 上:
/ip/address/add address=192.168.0.2/24 interface=To-DHCP-Server
/ip/address/add address=192.168.1.1/24 interface=Local1
/ip/address/add address=192.168.2.1/24 interface=Local2
DHCP 服务器设置
在 DHCP-Server 上,为每个经中继的网络添加地址池、DHCP 服务器与网络。两个服务器都运行在面向中继的接口上;relay 属性使每个服务器只应答从对应网络经中继转发的请求,并通过中继在该网络中的地址识别请求:
/ip/pool/add name=Local1-Pool ranges=192.168.1.11-192.168.1.100
/ip/pool/add name=Local2-Pool ranges=192.168.2.11-192.168.2.100
/ip/dhcp-server/add interface=To-DHCP-Relay relay=192.168.1.1 address-pool=Local1-Pool name=DHCP-1
/ip/dhcp-server/add interface=To-DHCP-Relay relay=192.168.2.1 address-pool=Local2-Pool name=DHCP-2
/ip/dhcp-server/network/add address=192.168.1.0/24 gateway=192.168.1.1 dns-server=159.148.60.20
/ip/dhcp-server/network/add address=192.168.2.0/24 gateway=192.168.2.1 dns-server=159.148.60.20
DHCP 服务器不需要到客户端网络的路由:它会将响应(包括发给续租客户端的响应)发送回请求来源的路由器。
DHCP 中继设置
在 DHCP-Relay 上,为每个本地接口添加一个中继。新建中继默认禁用,因此请使用 disabled=no 添加:
/ip/dhcp-relay/add name=Local1-Relay interface=Local1 dhcp-server=192.168.0.1 local-address=192.168.1.1 disabled=no
/ip/dhcp-relay/add name=Local2-Relay interface=Local2 dhcp-server=192.168.0.1 local-address=192.168.2.1 disabled=no
使用 /ip/dhcp-relay/monitor 查看中继转发了多少请求、送达了多少响应。
使用 VRF 的 DHCP 中继
当面向 DHCP 服务器的接口与中继的客户端接口位于不同 VRF 时,请将 dhcp-server-vrf 设置为服务器侧的 VRF。本示例沿用前面的设置,并让 DHCP-Relay 的每个接口位于各自的 VRF:
/ip/vrf
add interfaces=To-DHCP-Server name=vrf_server
add interfaces=Local1 name=vrf1
add interfaces=Local2 name=vrf2
/ip/dhcp-relay/set [find] dhcp-server-vrf=vrf_server
服务器将响应发送到中继的 local-address,该地址位于客户端 VRF,但响应会通过服务器侧接口到达 vrf_server。请使用 dst-nat 规则将它们重定向到中继的服务器侧地址:
/ip/firewall/nat
add action=dst-nat chain=dstnat dst-address=192.168.1.1 dst-port=67 in-interface=To-DHCP-Server protocol=udp src-address=192.168.0.1 to-addresses=192.168.0.2
add action=dst-nat chain=dstnat dst-address=192.168.2.1 dst-port=67 in-interface=To-DHCP-Server protocol=udp src-address=192.168.0.1 to-addresses=192.168.0.2
客户端使用单播消息向服务器续租,因此各 VRF 还需要到彼此网络的路由:
/ip/route
add dst-address=192.168.0.0/24 gateway=To-DHCP-Server@vrf_server routing-table=vrf1
add dst-address=192.168.0.0/24 gateway=To-DHCP-Server@vrf_server routing-table=vrf2
add dst-address=192.168.1.0/24 gateway=Local1@vrf1 routing-table=vrf_server
add dst-address=192.168.2.0/24 gateway=Local2@vrf2 routing-table=vrf_server
没有 dst-nat 规则时,客户端无法获得地址;没有路由时,客户端能获得地址但无法续租。
DHCPv6 中继
子菜单: /ipv6/dhcp-relay
DHCPv6 中继会把其接口上客户端发送的 DHCPv6 消息转发给 dhcp-server 中列出的服务器。它会把每条客户端消息封装在 Relay-Forward 消息中,其中还携带客户端的链路本地地址、Interface-ID 选项,以及默认情况下的客户端链路层地址(option 79,由 dhcp-options 设置)。除非你设置了 link-address(例如 DHCPv6 服务器应通过该地址识别客户端网络时,设置为客户端网络的地址),否则 Relay-Forward 消息的链路地址字段为 ::。服务器向中继回复,中继再把响应传回客户端。这样一台 DHCPv6 服务器即可服务多个无需直接相连的网络。
中继在 UDP 端口 547 接收客户端消息。如果路由器过滤入站流量,请在客户端侧接口允许 UDP 端口 547:RouterOS 的默认防火墙配置会在不在 LAN 接口列表中的接口上丢弃该流量。服务器的响应作为同一连接的一部分被接受。要转发客户端流量,路由器还需要启用 IPv6 转发,该功能默认启用。
所有中继属性请参阅 /ipv6/dhcp-relay CLI 参考。
到委派前缀的路由
当中继路由器同时是客户端的网关时,它需要到委派给客户端的前缀的路由。使用 store-relayed-bindings=yes 时,中继会从服务器的响应中读取绑定,将其列在 /ipv6/dhcp-relay/routes 中,并为每个委派前缀添加一条经客户端转发的路由。