DHCP Server

RouterOS DHCP 服务器从 IP 池向客户端分配 IPv4 地址和网络设置,支持静态租约、网络、DHCP 选项与选项集、选项匹配器、RADIUS、速率限制以及发现恶意 DHCP 服务器。

DHCP 服务器

子菜单: /ip/dhcp-server

DHCP 服务器向路由器所服务网络中的客户端分配 IPv4 地址和网络设置。它从 IP 池租用地址,并发送匹配的 DHCP 网络设置:网关、DNS 服务器、域名、NTP 和 WINS 服务器以及其他选项。它还可以分发绑定到特定客户端的静态租约,并从 RADIUS 服务器获取租约。有关 DHCP 交互、租约和续租的工作方式,请参阅 DHCP 概念。

DHCP 服务器需要:

  • 服务器接口上的 IP 地址。没有地址时服务器会显示为无效。
  • 用于分配地址的 IP 池(/ip/pool)。请勿将路由器自身地址包含在池中。
  • DHCP 网络(/ip/dhcp-server/network),包含发送给该子网客户端的设置。
  • DHCP 服务器本身(/ip/dhcp-server),将接口与池关联起来。

setup 命令可一步创建池、网络和服务器。以下配置示例展示两种方式。

每个接口可以为直连客户端运行一个 DHCP 服务器。对于经由 DHCP 中继到达的请求,同一接口上可以运行多个服务器,每个中继地址一个(参见 relay 属性)。

警告

DHCP 服务器需要一个真实接口来接收原始以太网数据包。在 bridge 上运行时,bridge 至少需要一个接收这些数据包的端口;服务器在空 bridge 上无法正常工作。

配置示例

快速配置

setup 命令可一步创建 IP 池、网络和 DHCP 服务器。它会依次询问每个值,并根据接口地址给出建议值。

首先为接口添加 IP 地址:

/ip/address/add address=192.168.88.1/24 interface=ether3

然后运行 setup,确认或更改每个建议值:

[admin@MikroTik] > /ip/dhcp-server/setup
Select interface to run DHCP server on
dhcp server interface: ether3
Select network for DHCP addresses
dhcp address space: 192.168.88.0/24
Select gateway for given network
gateway for dhcp network: 192.168.88.1
Select pool of ip addresses given out by DHCP server
addresses to give out: 192.168.88.2-192.168.88.254
Select whether the DHCP server sends DNS servers to clients
send dns: yes
Select DNS servers (leave empty to use servers from DNS settings)
dns servers: 192.168.88.1
Select lease time
lease time: 1800s

现在 DHCP 服务器已在 ether3 上生效。

手动配置

要手动配置相同的 DHCP 服务器,请自行创建每个部分:

  1. 在服务器运行的接口上添加路由器的 IP 地址。本示例中路由器同时也是网络网关:

    /ip/address/add address=192.168.88.1/24 interface=bridge1
    
  2. 创建用于分配地址的 IP 池。请勿将路由器自身地址包含在池中:

    /ip/pool/add name=dhcp_pool0 ranges=192.168.88.2-192.168.88.254
    
  3. 添加网络条目,包含发送给客户端的设置,例如网关和 DNS 服务器:

    /ip/dhcp-server/network/add address=192.168.88.0/24 dns-server=192.168.88.1 gateway=192.168.88.1
    
  4. 在接口上添加 DHCP 服务器并关联 IP 池:

    /ip/dhcp-server/add address-pool=dhcp_pool0 interface=bridge1 name=dhcp1
    

属性

DHCP 服务器的所有属性请参阅 /ip/dhcp-server CLI 参考。以下行为需要进一步说明。

对未知地址的请求

从其他网络迁移过来、或服务器已无其租约的客户端,可能请求服务器无法提供的地址。设置 authoritative=yes(默认值)时,服务器会以 DHCPNAK 响应此类请求,客户端会立即重新开始,而不必等待请求超时。设置 authoritative=no 时,服务器会忽略广播的此类请求(例如来自重新绑定状态的客户端),交由其他服务器处理。单播续租请求会得到完整设置的应答:DHCPNAK,或当请求地址在池中空闲时分配新租约。

要让其他服务器先应答(例如以本路由器作为备份的主服务器),请设置 delay-threshold。服务器会忽略请求,直到客户端已尝试达到设定时间,该时间由客户端在请求的 secs 字段中报告。

DHCP 中继后的客户端

仅当设置了 relay 属性时,服务器才会应答中继请求:可设置为中继的地址(即中继的 local-address),或设置为 255.255.255.255 以接受任何中继。这样同一接口上可以运行多个服务器,每个中继一个。完整示例请参阅 DHCP 中继。

客户端的 DNS 条目

设置 add-dns-entries=yes 后,服务器会为每个已绑定租约添加动态 DNS 条目(A 类型),客户端因此可以通过路由器的 DNS 解析器按名称访问。名称是客户端发送的主机名加上 add-dns-entries-suffix(默认为 lan),例如 laptop.lan,条目的 TTL 为租约时间。当网络没有 domain 时,服务器还会将该后缀作为域名发送给客户端。

网络

子菜单: /ip/dhcp-server/network

网络条目保存发送给地址属于该网络的客户端的设置:网关、DNS 和 NTP 服务器、域名、选项以及网络启动设置。未设置 dns-server 或 ntp-server 时,服务器会发送路由器自身使用的 DNS 或 NTP 服务器;设置 dns-none 或 ntp-none 则不发送任何服务器。所有属性请参阅 /ip/dhcp-server/network CLI 参考。

租约

子菜单: /ip/dhcp-server/lease

租约菜单以动态条目形式显示服务器已分配的租约,以及您添加的静态租约。静态租约可用于为客户端指定固定地址、来自特定池的地址或独立设置。所有租约属性、状态值和命令请参阅 /ip/dhcp-server/lease CLI 参考。

客户端请求地址时,服务器按以下方式选择:

  • 拥有静态租约的客户端会获得其租约地址。静态地址不进行冲突检查。
  • 其他客户端会从池中获得空闲地址。启用 conflict-detection(默认)时,服务器会先通过 ARP 请求和 ICMP 回显请求检查该地址,这会使提供地址的过程延迟约半秒。如果其他主机应答,该地址会在租约时间内保留为 conflict 状态的租约,服务器则向客户端提供另一个空闲地址。

随后服务器提供该地址,客户端请求后租约即绑定。当客户端释放地址或租约到期时,动态租约会被移除,地址返回池中;静态租约则保留,并在客户端再次出现时继续使用。

租约存储

服务器会定期将租约保存到磁盘,默认每 5 分钟一次,以减少对闪存的写入。该间隔和 RADIUS 计费设置位于 /ip/dhcp-server/config,请参阅 /ip/dhcp-server/config CLI 参考。

速率限制

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

警告

队列不会作用于 FastTrack 处理的流量。请确保防火墙没有对要限制的流量启用 FastTrack。

只有静态租约可以设置速率限制,因此请先将租约设为静态:

[admin@MikroTik] > /ip/dhcp-server/lease/print 
Flags: X - disabled, R - radius, D - dynamic, B - blocked 
 #   ADDRESS               MAC-ADDRESS       HOST-NAME               SERVER               RATE-LIMIT               STATUS 
 0 D 192.168.88.254        6C:3B:6B:7C:41:3E MikroTik                DHCPv4_Server                                 bound 

[admin@MikroTik] > /ip/dhcp-server/lease/make-static 0

[admin@MikroTik] > /ip/dhcp-server/lease/print 
Flags: X - disabled, R - radius, D - dynamic, B - blocked 
 #   ADDRESS               MAC-ADDRESS       HOST-NAME               SERVER               RATE-LIMIT               STATUS 
 0   192.168.88.254        6C:3B:6B:7C:41:3E MikroTik                DHCPv4_Server                                 bound

然后设置速率限制。服务器会为该租约创建动态简单队列:

[admin@MikroTik] > /ip/dhcp-server/lease/set 0 rate-limit=10M/10M

[admin@MikroTik] > /queue/simple/print 
Flags: X - disabled, I - invalid, D - dynamic 
 0  D name="dhcp-ds<MikroTik/6C:3B:6B:7C:41:3E>" target=192.168.88.254/32 parent=none packet-marks="" priority=8/8 queue=default-small/default-small limit-at=10M/10M max-limit=10M/10M burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s 
      bucket-size=0.1/0.1

说明

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

共享队列同时包含 IPv4 和 IPv6 地址:

[admin@MikroTik] > /queue/simple/print 
Flags: X - disabled, I - invalid, D - dynamic 
 0  D name="dhcp-ds<MikroTik/6C:3B:6B:7C:41:3E>" target=192.168.88.254/32,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 burst-limit=0/0 burst-threshold=0/0 
      burst-time=0s/0s bucket-size=0.1/0.1 

RADIUS 支持

DHCP 服务器也可以从 RADIUS 服务器获取租约(use-radius=yes)。它会发送并接受以下 RADIUS 属性。

Access-Request

  • NAS-Identifier:路由器标识。
  • NAS-IP-Address:路由器自身的 IP 地址。
  • NAS-Port:配置 DHCP 服务器的接口 ID。该值与 IF-MIB::ifIndex 相同。
  • NAS-Port-Id:配置 DHCP 服务器的接口名称。
  • NAS-Port-Type:Ethernet。
  • Calling-Station-Id:客户端标识符(active-client-id)。
  • Framed-IP-Address:客户端 IP 地址(active-address)。
  • Called-Station-Id:DHCP 服务器名称。
  • User-Name:客户端 MAC 地址(active-mac-address)。
  • Password:" "。

Access-Accept

  • Framed-IP-Address:将分配给客户端的 IP 地址。
  • Framed-Pool:用于向客户端分配 IP 地址的 IP 池。
  • Rate-Limit:DHCP 客户端的数据速率限制。格式为:rx-rate[/tx-rate] [rx-burst-rate[/tx-burst-rate] [rx-burst-threshold[/tx-burst-threshold] [rx-burst-time[/tx-burst-time][priority] [rx-rate-min[/tx-rate-min]]]]。所有速率应为数字,可带 'k'(1,000)或 'M'(1,000,000)。如果未指定 tx-rate,则 rx-rate 同时作为 tx-rate。tx-burst-rate、tx-burst-threshold 和 tx-burst-time 同理。如果 rx-burst-threshold 和 tx-burst-threshold 均未指定(但指定了 burst-rate),则使用 rx-rate 和 tx-rate 作为突发阈值。如果 rx-burst-time 和 tx-burst-time 均未指定,默认使用 1s。Priority 取值为 1..8,1 表示最高优先级,8 表示最低。如果未指定 rx-rate-min 和 tx-rate-min,则使用 rx-rate 和 tx-rate 值。rx-rate-min 和 tx-rate-min 不能超过 rx-rate 和 tx-rate。
  • Ascend-Data-Rate:TX/RX 数据速率限制。如果提供多个属性,第一个限制 tx 数据速率,第二个限制 RX 数据速率。与 Ascend-Xmit-Rate 一起使用时,指定 RX 速率。0 表示不限制。
  • Ascend-Xmit-Rate:tx 数据速率限制。可仅用于指定 TX 限制,而不发送两个连续的 Ascend-Data-Rate 属性(此时 Ascend-Data-Rate 将指定接收速率)。0 表示不限制。
  • Session-Timeout:最大租约时间(lease-time)。

按租约限制速率

RADIUS 服务器可以使用 Mikrotik-Rate-Limit 属性为每个租约分配速率限制。首先将 DHCP 服务器设置为使用 RADIUS:

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

然后配置 RADIUS 服务器发送 Mikrotik-Rate-Limit 属性。对于使用 MySQL 的 FreeRADIUS,请在 radcheck 和 radreply 表中为客户端 MAC 地址添加条目,例如:

INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES
('00:0C:42:00:D4:64', 'Auth-Type', ':=', 'Accept');

INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES
('00:0C:42:00:D4:64', 'Framed-IP-Address', '=', '192.168.88.254'),
('00:0C:42:00:D4:64', 'Mikrotik-Rate-Limit', '=', '10M');

警报

DHCP 警报会在接口上发现恶意 DHCP 服务器。它会监视接口上的 DHCP 应答,并检查每个应答是否来自有效的 DHCP 服务器。来自未知服务器的应答会被记录,警报还可以运行脚本:

[admin@MikroTik] > /log/print where topics~"dhcp"
 00:34:23 dhcp,critical,error dhcp alert on Public: discovered unknown dhcp server, mac 00:02:29:60:36:E7, ip 10.5.8.236

由于 DHCP 应答可以是单播的,警报可能看不到其他服务器发送给客户端的提供消息。因此警报还会充当 DHCP 客户端:大约每分钟发送一次自己的 DHCPDISCOVER。

警告

请勿在同一接口上既是 DHCP 客户端的路由器上使用 DHCP 警报:警报发送的 DHCPDISCOVER 消息可能干扰 DHCP 客户端。请在 DHCP 服务器上或使用静态 IP 地址的路由器上使用警报。

子菜单: /ip/dhcp-server/alert

新警报创建后处于禁用状态,添加后请启用。所有警报属性请参阅 /ip/dhcp-server/alert CLI 参考。

DHCP 选项

子菜单: /ip/dhcp-server/option

可以定义 DHCP 服务器发送的附加选项。当同一选项在多个层级设置时,按以下顺序优先:

  1. RADIUS。
  2. 租约。
  3. 服务器。
  4. 网络。

仅当客户端在参数请求列表(选项 55)中请求某选项时,服务器才会发送该选项。要在客户端未请求时也发送选项,请在该选项上设置 force,例如以下示例中的 auto-proxy-config 选项:

/ip/dhcp-server/option/set [find name=auto-proxy-config] force=yes

所有选项属性(包括选项值的写法以及可包含的变量)请参阅 /ip/dhcp-server/option CLI 参考。

DHCP 选项集

子菜单: /ip/dhcp-server/option/sets

此菜单允许将多个选项组合为选项集,之后可用于覆盖默认的 DHCP 服务器选项集。

示例

无类路由

无类静态路由选项(选项 121,RFC 3442)向客户端发送路由。本示例发送到 160.0.0.0/24 的路由和一条默认路由,二者均经由 10.1.101.1。该值由以下部分组成:

  • 18:前缀长度 24。
  • A00000:目标地址的有效字节,160.0.0。
  • 0A016501:网关 10.1.101.1。
  • 00:前缀长度 0,即默认路由。
  • 0A016501:默认路由的网关 10.1.101.1。

收到选项 121 的客户端会忽略路由器选项(选项 3),因此这里也需要包含默认路由。

/ip/dhcp-server/option
add code=121 name=classless value=0x18A000000A016501000A016501
/ip/dhcp-server/network
set 0 dhcp-option=classless

客户端上的结果:

[admin@MikroTik] > /ip/route/print
Flags: D - DYNAMIC; A - ACTIVE; c - CONNECT, d - DHCP
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS   GATEWAY     DISTANCE
DAd 0.0.0.0/0     10.1.101.1         1
DAd 160.0.0.0/24  10.1.101.1         1

使用 $(NETWORK_GATEWAY) 变量时,网关取自网络设置,而无需写入值中:

/ip/dhcp-server/option
add name=classless code=121 value="0x18A00000\$(NETWORK_GATEWAY)0x00\$(NETWORK_GATEWAY)"

自动代理配置

/ip/dhcp-server/option 
  add code=252 name=auto-proxy-config value="'https://autoconfig.something.lv/wpad.dat'"

选项匹配器

选项匹配器通过客户端请求中的任意 DHCP 选项识别 DHCP 客户端,并从特定 IP 池为其分配地址。它会精确比较选项(exact),或在选项中的任意位置查找值(substring)。当选项包含的内容多于要匹配的部分时(例如厂商类标识符还包含设备型号或 MAC 地址),请使用子字符串匹配。

说明

当两个子字符串匹配器匹配同一选项时(例如一个匹配 “ABC”,另一个匹配 “ABCDE”,而选项值为 “ABCDEF”),实际应用哪一个是不确定的。

说明

拥有静态租约的客户端会保留其静态地址,即使匹配器也匹配它们。

所有匹配器属性请参阅 /ip/dhcp-server/matcher CLI 参考。

选项匹配器示例

按精确的 Vendor class identifier(DHCP 选项 60)匹配 dhcp1 服务器客户端,并从 pool1 分配地址:

/ip/dhcp-server/matcher
add address-pool=pool1 code=60 matching-type=exact name=test1 server=dhcp1 value=android-dhcp-11

按配置为十六进制值的精确 Client Id(DHCP 选项 61)匹配所有 DHCP 服务器上的客户端,并从 pool2 分配地址:

/ip/dhcp-server/matcher
add address-pool=pool2 code=61 matching-type=exact name=test2 server=all value=0x016c3b6bed8364

按 Hostname(DHCP 选项 12)部分匹配 dhcp2 服务器客户端,并从 pool3 分配地址:

/ip/dhcp-server/matcher
add address-pool=pool3 code=12 matching-type=substring name=test3 server=dhcp2 value=MikroTik