摘要

/ip dhcp-client

DHCP(动态主机配置协议)是用来在网络中轻松分配IP地址的。MikroTik RouterOS的实现包括服务器和客户端两部分,并且符合RFC 2131的规定。

MikroTik RouterOS的DHCP客户端可以在任何类似以太网的接口上一次启用。该客户端将接受一个地址、网络掩码、默认网关和两个DNS服务器地址。收到的IP地址将被添加到带有各自净掩码的接口上。默认网关将作为一个动态条目添加到路由表中。如果DHCP客户端被禁用或不更新地址,动态默认路由将被删除。如果在DHCP客户端获得默认路由之前已经安装了一个默认路由,DHCP客户端获得的路由将被显示为无效。

RouterOS DHCP客户端要求提供以下选项:

  • 选项1 - SUBNET_MASK

  • 选项3 - GATEWAY_LIST

  • 选项6 - TAG_DNS_LIST

  • 选项33 - STATIC_ROUTE

  • 选项42 - NTP_LIST

  • 选项121 - CLASSLESS_ROUTE

DHCP选项

DHCP客户端有可能设置发送给DHCP服务器的选项。例如,主机名和MAC地址。其语法与DHCP服务器选项相同。

目前,有三个变量可以在选项中使用:

  • HOSTNAME;

  • CLIENT_MAC - 客户端接口MAC地址;

  • CLIENT_DUID - 路由器的客户DIUD,与用于DHCPv6客户的相同。按照RFC4361的规定

DHCP客户端默认选项包括这些默认选项:

名称 代码
clientid_duid 61 0xff$(CLIENT_DUID)
clientid 61 0x01$(CLIENT_MAC)
hostname 12 $(HOSTNAME)

属性

属性 说明
add-default-route (yes | no | special-classless; Default: yes) 是否在从DHCP服务器收到的路由表中安装默认路由。默认情况下,如果收到无类选项121,RouterOS客户端会遵守RFC的规定,忽略选项3。要强制客户端不忽略选项3,请设置_special-classless_。这个参数在v6rc12+中可用。
- yes - 如果收到无类路由,则添加无类路由,如果没有,则添加默认路由(旧行为)。
- special-classless - 如果收到无类路由,则同时添加无类路由和默认路由(MS风格)。
client-id (string; Default: ) 对于网络管理员或ISP建议的设置。如果不指定,将发送客户的MAC地址。
comment (string; Default: ) 客户端的简短描述。
default-route-distance (integer:0..255; Default: ) 默认路由的距离。如果 add-default-route 设置为“yes”,则适用。
disabled (yes | no; Default: yes)
host-name (string; Default: ) 客户端的主机名会被发送到DHCP服务器。如果不指定,将使用客户端的系统标识。
interface (string; Default: ) DHCP客户端将在哪个接口上运行。
script (script; Default: ) 当DHCP客户端获得一个新的租约或失去一个现有的租约时执行脚本。这个参数在v6.39rc33+中可用,这些是事件脚本可以访问的可用变量:
- bound - 1 - 租赁被添加/改变;0 - 租赁被删除
- server-address - 服务器地址
- lease-address - 由服务器提供的租赁地址
- interface - 客户端所配置的接口的名称
- gateway-address - 由服务器提供的网关地址
- vendor-specific - 存储从DHCP服务器收到的选项43的值
- lease-options - 一个接收到的选项数组的 实例
use-peer-dns (yes | no; Default: yes) 是否接受由 DHCP服务器 公布的 DNS 设置。会覆盖"/ip dns "子菜单中的设置。
use-peer-ntp (yes | no; Default: yes) 是否接受由 DHCP服务器 公布的 NTP 设置。(会覆盖在"/system ntp client "子菜单中的设置)

只读属性

属性 说明
address (IP/Netmask) IP地址和网络掩码,是由服务器分配给DHCP客户端的。
dhcp-server (IP) DHCP服务器的IP地址。
expires-after (time) 租约过期的时间(由DHCP服务器指定)。
gateway (IP) 由DHCP服务器分配的网关的IP地址。
invalid (yes | no) 显示一个配置是否无效。
netmask (IP)
primary-dns (IP) 第一个DNS解析器的IP地址,由DHCP服务器分配。
primary-ntp (IP) 第一台NTP服务器的IP地址,由DHCP服务器分配。
secondary-dns (IP) 第二个DNS解析器的IP地址,由DHCP服务器分配。
secondary-ntp (IP) 第二台NTP服务器的IP地址,由DHCP服务器分配。
status (bound | error | rebinding... | requesting... | searching... | stopped) 显示DHCP客户端的状态。

Menu specific commands

属性 说明
release (numbers) 释放当前的绑定,并重新启动DHCP客户端。
renew (numbers) 更新当前租约。如果更新操作不成功,客户端会尝试重新初始化租约(即开始租约请求程序(重新绑定),就像没有收到IP地址一样)。

配置实例

简单的 DHCP 客户端

在 ether1 接口上添加一个 DHCP 客户端:

/ip dhcp-client add interface=ether1 disabled=no

在接口添加后,可以用 "print"或 "print detail"命令来查看DHCP客户端获得了哪些参数:

[admin@MikroTik] ip dhcp-client> print detail
Flags: X - disabled, I - invalid
 0   interface=ether1 add-default-route=yes use-peer-dns=yes use-peer-ntp=yes
     status=bound address=192.168.0.65/24 gateway=192.168.0.1
     dhcp-server=192.168.0.1 primary-dns=192.168.0.1 primary-ntp=192.168.0.1
     expires-after=9m44s
[admin@MikroTik] ip dhcp-client>

如果DHCP客户端使用的接口是VRF配置的一部分,那么默认路由和其他从DHCP服务器接收的路由将被添加到VRF路由表。

可以用以下方法检查DHCP客户端的状态:

/ip dhcp-client print detail

租约脚本示例

当一个DHCP客户获得一个新的租约或失去一个现有的租约时,可以执行一个脚本。这是一个脚本的例子,它自动添加一个带有routing-mark=WAN1的默认路由,并在租约到期或被删除时将其删除。

/ip dhcp-client
add add-default-route=no dhcp-options=hostname,clientid disabled=no interface=ether2 script="{\r\
    \n    :local rmark \"WAN1\"\r\
    \n    :local count [/ip route print count-only where comment=\"WAN1\"]\r\
    \n    :if (\$bound=1) do={\r\
    \n        :if (\$count = 0) do={\r\
    \n            /ip route add gateway=\$\"gateway-address\" comment=\"WAN1\" routing-mark=\$rmark\r\
    \n        } else={\r\
    \n            :if (\$count = 1) do={\r\
    \n                :local test [/ip route find where comment=\"WAN1\"]\r\
    \n                :if ([/ip route get \$test gateway] != \$\"gateway-address\") do={\r\
    \n                    /ip route set \$test gateway=\$\"gateway-address\"\r\
    \n                }\r\
    \n            } else={\r\
    \n                :error \"Multiple routes found\"\r\
    \n            }\r\
    \n        }\r\
    \n    } else={\r\
    \n        /ip route remove [find comment=\"WAN1\"]\r\
    \n    }\r\
    \n}\r\
    \n"

当路由器(选项3)来自不同的子网时,解决默认网关问题

在某些情况下,管理员倾向于设置路由器选项,而该选项不能与所提供的IP的子网一起解决。例如,DHCP服务器向客户提供192.168.88.100/24,而选项3被设置为172.16.1.1。会导致一个未解决的默认路由:

#      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
0  DS  0.0.0.0/0                          172.16.1.1              1
1 ADC  192.168.88.0/24    192.168.88.100  ether1

为了解决这个问题,需要添加/32路由来解决ether1上的网关,可以通过在DHCP客户端每次获得地址时运行以下脚本来完成

/system script add name="dhcpL" source={ /ip address add address=($"lease-address" . "/32") network=$"gateway-address" interface=$interface }

现在可以进一步扩展这个脚本,检查地址是否已经存在,如果需要修改,就删除旧的地址

/system script add name="dhcpL" source={
  /ip address {
    :local ipId [find where comment="dhcpL address"]
    :if ($ipId != "") do={
      :if (!([get $ipId address] = ($"lease-address" . "/32") && [get $ipId network]=$"gateway-address" )) do={
        remove $ipId;
        add address=($"lease-address" . "/32") network=$"gateway-address" \
          interface=$interface comment="dhcpL address"
      }
    } else={
      add address=($"lease-address" . "/32") network=$"gateway-address" \
        interface=$interface comment="dhcpL address"
    }
  }
}

DHCPv6客户端

摘要

Sub-menu: /ipv6 dhcp-client

RouterOS中的DHCP-client可以成为DHCPv6-client和DHCP-PD客户端。它能够从DHCP-PD服务器获得前缀,也能从DHCPv6服务器获得DHCPv6状态地址。

属性

属性 说明
add-default-route (yes| no; Default: no) 客户端连接后是否添加默认的IPv6路由。
comment (string; Default: ) 客户端的简短描述
disabled (yes| no; Default: no)
interface (string; Default: ) DHCPv6客户端将运行的接口。
pool-name (string; Default: ) IPv6 pool的名称,收到的IPv6前缀将被加入其中。
pool-prefix-length (string; Default: ) IPv6 pool 设置的前缀长度参数,接收的IPv6前缀将被添加到其中。前缀长度必须大于接收的前缀长度,否则,前缀长度将被设置为接收的前缀长度+8位。
prefix-hint (string; Default: ) 包括一个首选的前缀长度。
request (prefix, address; Default: ) 选择DHCPv6请求是询问地址还是IPv6前缀,或者两者都询问。
script (string; Default: ) 在DHCP-客户端状态改变时运行这个脚本。可用的变量:
- pd-valid 如果客户端获得了前缀;
- pd-prefix 客户端获得的前缀,如果有的话;
- na-valid 如果地址是由客户获得的;
- na-address 客户端获得的地址,如果有的话;
- options 接收选项的数组(只有ROSv7)。
use-peer-dns (yes | no; Default: yes) 是否接受由IPv6 DHCP服务器公布的DNS设置。

只读属性

属性 说明
duid (string) 自动生成的DUID发送到服务器。DUID是使用路由器上可用的MAC地址之一生成的。
request (list) 指定请求的内容 - 前缀,地址,或两者。
dynamic (yes | no)
expires-after (time) IPv6前缀过期的时间(由DHCPv6服务器指定)。
invalid (yes | no) 显示配置是否无效。
prefix (IPv6 prefix) 显示从DHCPv6-PD服务器收到的IPv6前缀。
status (stopped | searching| requesting...| bound | renewing | rebinding | error | stopping) 显示DHCPv6客户端的状态:
- stopped dhcpv6 客户端已停止。
- searching 发送 "征求 "并试图获得 "通告"。
- requesting 发送 "request",等待 "reply"。
- bound 收到 "回复"。分配的前缀。
- renewing 发送 "续订",等待 "回复"。
- rebinding 发送了 "rebind",等待 "reply"。
- error 没有及时收到回复或发生其他错误。
- stopping 发送 "释放"。

菜单的具体命令

属性 说明
release (numbers) 释放当前的绑定并重新启动DHCPv6客户端。
renew (numbers) 更新当前租约。如果更新操作不成功,客户端会尝试重新初始化租约(也就是说,它启动租约请求程序(重新绑定),就像还没有收到IP地址一样)

脚本

可以添加一个脚本,当一个前缀或地址被获取并应用,或过期并被删除时,使用DHCP客户端执行。有几组分开的变量,它们的值由客户端根据前缀或地址状态的变化来设置,因为客户端可以获取这两种东西,而且每一种都会对路由器配置产生不同的影响。

dhcp-client的可用变量

  • pd-valid值 - 1或0 - 如果前缀被获取并应用或不应用

  • pd-prefix值ipv6/num (带掩码的ipv6前缀) - 前缀本身

  • na-valid值 - 1或0 - 如果地址被获取并且被应用或不被应用

  • na-address值 - ipv6地址 - 地址

IAID

为了确定使用什么IAID,将DHCP客户端运行的接口的内部ID从十六进制转换为十进制。

例如,DHCP客户端运行在PPPoE-out1接口上。要获得内部ID,请使用以下命令:

[admin@t36] /interface> :put [find name="pppoe-out1"] *15

现在将十六进制值15转换为十进制,会得到IAID=21

配置实例

简单的DHCPv6客户端

这个简单的例子演示了如何使DHCP客户端接收IPv6前缀并将其加入池中。

/ipv6 dhcp-client add request=prefix pool-name=test-ipv6 pool-prefix-length=64 interface=ether13

详细打印应显示客户的状态,可以验证是否收到前缀。

[admin@x86-test] /ipv6 dhcp-client> print detail
Flags: D - dynamic, X - disabled, I - invalid
 0 interface=bypass pool-name="test-ipv6" pool-prefix-length=64 status=bound
prefix=2001:db8:7501:ff04::/62 expires-after=2d23h11m53s request=prefix

注意,服务器给了前缀 2a02:610:7501:ff04::/62 。应该添加到IPv6池中

[admin@MikroTik] /ipv6 pool> print
Flags: D - dynamic
# NAME PREFIX REQUEST PREFIX-LENGTH
0 D test-ipv6 2001:db8:7501:ff04::/62 prefix 64

成功了! 现在你可以使用这个池子,例如,用于pppoe客户端。

使用接收到的前缀作为本地RA

考虑以下设置:

  • ISP将前缀2001:DB8::/62路由给路由器R1

  • 路由器R1运行DHCPv6服务器,将/64前缀委托给客户路由器CE1 CE2

  • 路由器CE1和CE2上的DHCP客户端从DHCP服务器(R1)接收委托的/64前缀。

  • 客户路由器使用收到的前缀在本地接口上设置RA。

配置

R1

/ipv6 route
add gateway=fe80::1:1%to-ISP

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

/ipv6 dhcp-server
 add address-pool=myPool disabled=no interface=to-CE-routers lease-time=3m name=server1

CE1

/ipv6 dhcp-client
add interface=to-R1 request=prefix pool-name=my-ipv6

/ipv6 address
add address=::1/64 from-pool=my-ipv6 interface=to-clients advertise=yes

CE2

/ipv6 dhcp-client
 add interface=to-R1 request=prefix pool-name=my-ipv6
/ipv6 address add address=::1/64 from-pool=my-ipv6 interface=to-clients advertise=yes

检查状态

配置完成后可以验证每个CE路由器是否收到自己的前缀

服务器设置:

[admin@R1] /ipv6 dhcp-server binding> print
 Flags: X - disabled, D - dynamic
# ADDRESS DUID IAID SERVER STATUS
 1 D 2001:db8:1::/64 0019d1393536 566 server1 bound
2 D 2001:db8:2::/64 0019d1393535 565 server1 bound

客户端设置:

[admin@CE1] /ipv6 dhcp-client> print
Flags: D - dynamic, X - disabled, I - invalid
# INTERFACE STATUS REQUEST PREFIX
0 to-R1 bound prefix 2001:db8:1::/64

[admin@CE1] /ipv6 dhcp-client> /ipv6 pool print
Flags: D - dynamic
# NAME PREFIX PREFIX-LENGTH
0 D my-ipv6 2001:db8:1::/64 64

还可以看到IPv6地址自动从前缀池中添加:

[admin@CE1] /ipv6 address> print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
# ADDRESS FROM-POOL INTERFACE ADVERTISE 0 G 2001:db8:1::1/64 to-clients yes
..

而池子的使用情况显示,'地址’在分配池子

[admin@CE1] /ipv6 pool used> print
 POOL PREFIX OWNER INFO
my-ipv6 2001:db8:1::/64 Address to-clients

DHCP服务器

摘要

DHCP是用来在网络中轻松分配IP地址的。MikroTik RouterOS的实现包括服务器和客户端两部分,并且符合RFC 2131的规定。

路由器支持每个类似以太网的接口的单独服务器。MikroTik RouterOS DHCP服务器支持给每个请求的客户提供IP地址/网络掩码租约、默认网关、域名、DNS-服务器和WINS-服务器(针对Windows客户)信息的基本功能(在DHCP网络子菜单中设置)。

为了让DHCP服务器工作,还必须配置IP池(不要把DHCP服务器自己的IP地址纳入池子范围)和DHCP网络。

也可以使用RADIUS服务器为DHCP客户发放租约;RADIUS服务器支持的参数如下:

访问-请求:

  • NAS-Identifier - 路由器身份

  • NAS-IP-Address - 路由器本身的IP地址

  • NAS-Port - 唯一的会话ID

  • NAS-Port-Type–以太网

  • Calling-Station-Id - 客户端标识(active-client-id)。

  • Framed-IP-Address - 客户端的IP地址(active-address)

  • Called-Station-Id - DHCP服务器的名称

  • User-Name - 客户端的MAC地址(active-mac-address)

  • 密码 - ""

访问-接受:

  • 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,000s)或’M'(1,000,000s)。如果没有指定tx-rate,rx-rate也是tx-rate。tx-bulst-rate和tx-bulst-threshold以及tx-bulst-time也是如此。如果没有指定rx-burst-threshold和tx-burst-threshold(但指定了burst-rate),则rx-rate和tx-rate被用作burst阈值。如果没有指定rx-burst-time和tx-burst-time,则使用1s作为默认值。优先级取值为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

  • 会话超时–最大租赁时间(lease-time)

DHCP服务器需要一个真实的接口来接收原始以太网数据包。如果该接口是一个网桥接口,那么网桥必须有一个真实的接口作为端口连接到该网桥,以接收原始以太网数据包。它不能在一个假的(空桥)接口上正常工作。

DHCP服务器属性

属性 说明
add-arp (yes | no; Default: no) 是否添加动态ARP条目。如果设置为no,则应在该接口上启用ARP模式,或者在 /ip arp 子菜单中管理定义静态ARP条目。
IP address pool (string | static-only; Default: static-only) IP地址池,用于为客户获取IP地址。如果设置为static-only,那么只有拥有静态租约的客户(在租约子菜单中添加)才会被允许。
allow-dual-stack-queue (yes | no; Default: yes) 为IPv4和IPv6地址创建一个简单的队列条目,并使用MAC地址和DUID进行识别。需要IPv6 DHCP服务器也启用这个选项才能正常工作。
always-broadcast (yes| no; Default: no) 始终以广播的形式发送回复,即使目的地IP是已知的。会增加L2网络的额外负载。
authoritative (after-10sec-delay | after-2sec-delay| yes | no; Default: yes) 选项改变了服务器对DHCP请求的响应方式:
- yes 回应客户对本服务器不可用的地址的请求,DHCP服务器将发送一个否定的确认(DHCPNAK);
- no DHCP服务器忽略客户对该服务器不可用的地址的请求;
- after-10sec-delay "secs < 10 "将按 "no"设置的情况处理,"secs >= 10"的请求将按 "yes"情况处理;
- 在 "secs<2 "的情况下,after-2sec-delay请求将按照 "no"的设置进行处理,在 "secs>=2"的情况下,将按照 "yes"的设置进行处理;
如果所有 "secs < x" 的请求都应该被忽略,那么应该使用 "delay-threshold=x" 设置。
bootp-lease-time (forever | lease-time | time; Default: forever) 接受两个预定义的选项或时间值:
- forever,永不过期
- lease-time 使用租赁时间参数中的时间
bootp-support (none | static | dynamic; Default: static) Support for BOOTP客户:
- none,不响应BOOTP请求
- static 只向BOOTP客户提供静态租约
- dynamic 为BOOTP客户端提供静态和动态租约
client-mac-limit (integer | unlimited; Default: unlimited) 指定是否限制每个单一MAC地址的特定客户数量或不限制。注意,这个设置不能在中继设置中使用。
conflict-detection (yes | no; Default: yes) 允许禁用/启用冲突检测。如果该选项启用,则每当服务器试图分配一个租约时,将发送ICMP和ARP消息来检测网络中是否已经存在这样的地址。如果上述任何一个得到回复的地址被认为已经使用。
delay-threshold (time | none; Default: none) 如果DHCP数据包中的秒字段小于延迟阈值,这个数据包将被忽略。如果设置为none,则没有阈值(所有DHCP数据包都被处理)。
dhcp-option-set (name | none; Default: none) 使用选项集菜单中定义的自定义DHCP选项。
insert-queue-before (bottom | first | name; Default: first) 指定设置了限速参数的静态DCHP租约的动态简单队列条目的位置。
interface (string; Default: ) DHCP服务器将运行的接口。
lease-script (string; Default: "") 一个在分配或取消租赁后执行的脚本。内部的全局变量,可以在脚本中使用:
- leaseBound 如果绑定,则设置为 "1",否则设置为 "0"
- leaseServerName DHCP服务器名称
- leaseActMAC 活动的MAC地址
- leaseActIP 活动的 IP 地址
- lease-hostname 客户端主机名
- lease-options 一个接收选项的数组
lease-time (time; Default: 30m) 客户端可以使用分配的地址的时间。客户端将在这个时间的一半后尝试更新这个地址,并在时间限制到期后请求一个新的地址。
name (string; Default: ) 参考名称
parent-queue (string | none; Default: none) 为这个租约动态创建的队列将被配置为指定父队列的子队列。
relay (IP; Default: 0.0.0.0) 这个DHCP服务器应该处理来自中继的请求的IP地址:
- 0.0.0.0 该DHCP服务器将只用于客户的直接请求(不允许DHCP中继)。
- 255.255.255.255 DHCP服务器应该用于任何来自DHCP中继的请求,除了那些由存在于 /ip dhcp-server 子菜单中的另一个DHCP服务器处理的请求。
server-address (IP; Default: 0.0.0.0) 在客户端启动过程的下一步要使用的服务器IP地址(例如,在为接口分配了几个地址的情况下,要分配一个特定的服务器地址)
use-framed-as-classless (yes | no; Default: yes) 将RADIUS有框路由作为DHCP无框-静态路由转发给DHCP-客户端。当同时收到Framed-Route和Classless-Static-Route时,首选Classless-Static-Route。
use-radius (yes | no| accounting; Default: no) 是否使用RADIUS服务器:
- no 不使用RADIUS;
- yes 使用RADIUS进行会计和租赁;
- accounting仅使用RADIUS进行会计处理。

租约

Sub-menu: /ip dhcp-server lease

DHCP服务器租约子菜单被用来监视和管理服务器租约。所发布的租约在这里显示为动态条目。也可以添加静态租约,向特定客户(通过MAC地址识别)发出特定的IP地址。

一般来说,DHCP租约的分配方式如下:

  • 未使用的租约处于 "等待 "状态

  • 如果一个客户要求一个IP地址,服务器会选择一个

  • 如果客户收到一个静态分配的地址,租约就会被提供,然后与各自的租约时间绑定

  • 如果客户端收到一个动态地址(从IP地址池中获取),路由器将发送一个ping包,并等待0.5秒的答复。在这段时间内,租赁被标记为测试

  • 在地址没有回应的情况下,租约变为提供,然后与各自的租约时间绑定

  • 在其他情况下,租约在租约时间内变得繁忙(有一个命令是重新测试所有繁忙的地址),客户的请求仍然没有得到回应(客户将很快再次尝试)。

客户端可以释放租赁的地址。动态租约被删除,分配的地址被退回到地址池中。但是静态租约变得繁忙,直到客户端重新获得地址。

静态分配的IP地址不会被探测到!

特定的菜单命令

check-status (id) 检查一个给定的繁忙状态(状态为冲突或拒绝),动态租约,如果没有回应,则释放它。
make-static (id) 将一个动态租约转换为静态租约。

存储配置

Sub-menu: /ip dhcp-server config

这个子菜单配置DHCP租约在磁盘上的存储频率。如果每次租约变化都保存在磁盘上,就会发生大量的磁盘写入,这对Compact Flash非常不利(特别是如果租约时间很短)。为了尽量减少对磁盘的写入,所有的变化都会在每一个存储-租赁-磁盘的秒数上保存。此外,在宽松的关机和重启时,租约总是被保存在磁盘上。

对租约的手动更改-增加/删除静态租约,删除动态租约将导致该租约的更改被推送到存储。

速率限制

通过使用DHCPv4租约,可以为特定的IPv4地址设置带宽。可以通过在DHCPv4租约上设置速率限制来实现,这样做,一个动态的简单队列规则将添加到与DHCPv4租约相对应的IPv4地址上。通过使用 rate-limit 参数可以方便地限制一个用户的带宽。

为了使任何队列正常工作,流量不能被快速跟踪,请确保防火墙不对你想限制的流量进行快速跟踪。

首先,使DHCPv4租约成为静态的,否则,就不可能为DHCPv4租约设置速率限制:

[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

可以给DHCPv4租约设置一个速率,它将创建一个新的动态简单队列条目:

[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<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是启用的,这将为DCHPv6绑定和DHCPv4租赁添加一个单一的动态简单队列条目,如果不启用这个选项,将为IPv6和IPv4添加单独的动态简单队列条目。

如果启用 allow-dual-stack-queue ,那么将创建一个包含IPv4和IPv6地址的单一动态简单队列条目:

[admin@MikroTik] > /queue simple print
Flags: X - disabled, I - invalid, D - dynamic
 0  D name="dhcp-ds<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

网络

Sub-menu: /ip dhcp-server network

属性

属性 说明
address (IP/netmask; Default: ) 网络DHCP服务器将向其租赁地址
boot-file-name (string; Default: ) 启动文件名
caps-manager (string; Default: ) 一个逗号分隔的IP地址列表,用于一个或多个CAPsMAN系统管理器。将使用DHCP选项138(capwap)。
dhcp-option (string; Default: ) 从选项列表中添加额外的DHCP选项。
dhcp-option-set (string; Default: ) 添加额外的DHCP选项集。
dns-none (yes | no; Default: no) 如果设置了,如果没有设置DNS-server中的DNS服务器,DHCP服务器就不会把配置在路由器上的动态DNS服务器传给DHCP客户。默认情况下,如果没有配置DNS服务器,那么动态DNS服务器将被传递给DHCP客户端。
dns-server (string; Default: ) DHCP客户端将使用这些作为默认的DNS服务器。可以指定两个用逗号分隔的DNS服务器,由DHCP客户端作为主要和次要DNS服务器使用。
domain (string; Default: ) DHCP客户端将使用这个作为网络适配器的 "DNS域 "设置。
gateway (IP; Default: 0.0.0.0) DHCP客户端使用的默认网关。
netmask (integer: 0..32; Default: 0) DHCP客户端将使用的实际网络掩码。如果设置为'0' - 将使用网络地址的掩码。
next-server (IP; Default: ) 下一个服务器的IP地址,在启动时使用。
ntp-server (IP; Default: ) DHCP客户端将使用这些作为默认的NTP服务器。可以指定两个用逗号隔开的NTP服务器,由DHCP客户端作为主要和次要NTP服务器使用。
wins-server (IP; Default: ) Windows DHCP客户端将使用这些作为默认的WINS服务器。可以指定两个用逗号隔开的WINS服务器,作为DHCP客户端的主要和次要WINS服务器。

RADIUS支持

从RouterOS v6.43开始,可以使用RADIUS为每个租约分配一个速率限制,要实现这一点,需要从RADIUS服务器为租约传递Mikrotik-Rate-Limit属性。要实现这一点,首先需要将DHCPv4服务器设置为使用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,那么要在 radcheckradreply 表中为DHCPv4客户端使用的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服务器。如果检测到一个来自未知DHCP服务器的回复,就会触发警报:

[admin@MikroTik] ip dhcp-server alert>/log print
00:34:23 dhcp,critical,error,warning,info,debug dhcp alert on Public:
    discovered unknown dhcp server, mac 00:02:29:60:36:E7, ip 10.5.8.236
[admin@MikroTik] ip dhcp-server alert>

当系统对一个流氓DHCP服务器发出警报时,可以执行一个自定义脚本。

由于DHCP的回复可以是单播的,流氓DHCP检测器可能根本就没有收到对其他DHCP客户端的任何提议。为了处理这个问题,流氓DHCP检测器也充当了DHCP客户端-它每分钟发出一次DHCP发现请求。

在被配置为DHCP客户端的设备上,不推荐使用DHCP警报。因为警报本身会产生DHCP发现数据包,它可能会影响DHCP客户端本身的运行。只在作为DHCP服务器或使用静态IP地址的设备上使用这个功能。

Sub-menu: /ip dhcp-server alert

属性

属性 说明
alert-timeout (none time; Default: 1h)
interface (string; Default: ) 在这个接口上运行流氓DHCP服务器搜索器。
on-alert (string; Default: ) 当检测到一个未知的DHCP服务器时运行的脚本。
valid-server (string; Default: ) 有效DHCP服务器的MAC地址列表。

只读属性

属性 说明
unknown-server (string) 检测到的未知DHCP服务器的MAC地址列表。警报超时后,该服务器将从该列表中删除

Menu specific commands

属性 说明
reset-alert (id) 清除接口上的所有警告

DHCP选项

Sub-menu: /ip dhcp-server option

在DHCP选项列表的帮助下,可以定义额外的自定义选项供DHCP服务器公布。选项的优先顺序如下:

  • 雷达

  • 租赁

  • 服务器

  • 网络

这是客户端选项请求将被填入的顺序。

根据DHCP协议,只有当DHCP客户端请求该参数,并在DHCP请求的Parameter-List(代码55)属性中指定相应的代码时,该参数才会返回给DHCP客户端。如果该代码没有包含在Parameter-List属性中,DHCP服务器将不会把它发送给DHCP客户端,但是从RouterOS v7.1rc5开始,即使DHCP-客户端没有请求这样的参数,也可以从服务器端强制执行DHCP选项:

ip/dhcp-server/option/set force=yes

属性

属性 说明
code (integer:1..254; Default: ) dhcp选项代码。所有代码都可以在 http://www.iana.org/assignments/bootp-dhcp-parameters 看到
name (string; Default: ) 选项的描述性名称
value (string; Default: ) 参数值。选项的可用数据类型是:
- 'test' -> ASCII到Hex 0x74657374
- '10.10.10.10' -> Unicode IP 到十六进制 0x0a0a0a0a
- s'10.10.10.10' -> ASCII到十六进制 0x31302e31302e31302e3130
- s'160' -> ASCII转为十六进制 0x313630
- '10' -> 十进制到十六进制 0x0a
- 0x0a0a --> 没有转换
- \$(VARIABLE) -> 硬编码值
RouterOS有预定义的变量可供使用:
- HOSTNAME - 客户端主机名
- RADIUS_MT_STR1 - 来自radius MT attr nr. 24的信息
- RADIUS_MT_STR2 - 来自radius MT attr nr. 25
- REMOTE_ID - 代理商远程ID
- NETWORK_GATEWAY - 来自 /ip dhcp-server network 的第一个网关,注意,如果从租赁中使用,这个选项将不起作用。
现在也可以将数据类型合并为一个,例如: "0x01'vards'\$(HOSTNAME)"
例如,如果HOSTNAME是'kvm',那么原始值将是0x0176617264736b766d。
raw-value (HEX string ) 只读字段,显示原始DHCP选项值(实际发送的格式)。

DHCP选项集

Sub-menu: /ip dhcp-server option sets

这个菜单允许在选项集中组合多个选项,以后可以用来覆盖默认的DHCP服务器选项集。

例子

无类路由

无类别路由在客户的路由表中添加一个指定的路由。在我们的例子中,它将添加

  • dst-address=160.0.0.0/24 gateway=10.1.101.1

  • dst-address=0.0.0.0/0 gateway=10.1.101.1

根据RFC 3442:第一部分是网络掩码("18"=netmask/24)。第二部分是目的网络的重要部分("A00000"=160.0.0)。第三部分是网关的IP地址("0A016501"=10.1.101.1)。然后是默认路由的部分,目的网络掩码(0x00=0.0.0.0/0),然后是默认路由(0x0A016501=10.1.101.1)。

/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: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf,
m - mme, B - blackhole, U - unreachable, P - prohibit
 #      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
 0 ADS  0.0.0.0/0                          10.1.101.1         0
 1 ADS  160.0.0.0/24                       10.1.101.1         0

一个更可靠的方法是使用内部变量,前面的例子可以改写为:

/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'"

供应商类

从6.45beta6版本开始,RouterOS支持厂商类、ID匹配器。供应商类被DHCP客户端用来选择性地识别供应商和配置。

从RouterOS v7.4beta4开始,供应商类-ID匹配器变成了通用匹配器。

例子

在下面的配置例子中,从一个特定的池子里为一个基于Android的手机提供一个IP地址。将使用RouterBOARD的默认配置

/ip pool
add name=default-dhcp ranges=192.168.88.10-192.168.88.254
add name=pool-for-VID ranges=172.16.16.10-172.16.16.120

配置 vendor-class-id 。DHCP服务器的配置仍然是默认的

/ip dhcp-server
add address-pool=default-dhcp disabled=no interface=bridge name=defconf
/ip dhcp-server network
add address=192.168.88.0/24 comment=defconf gateway=192.168.88.1
/ip dhcp-server vendor-class-id
add address-pool=pool-for-VID name=samsung server=defconf vid=android-dhcp-9

将手机连接到设备上,从172.16.16.0网络接收一个IP地址。

[admin@mikrotik] > /ip dhcp-server lease print detail
Flags: X - disabled, R - radius, D - dynamic, B - blocked
 0 D address=172.16.16.120 mac-address=30:07:4D:F5:07:49 client-id="1:30:7:4d:f5:7:49" address-lists="" server=defconf dhcp-option=""
     status=bound expires-after=8m55s last-seen=1m5s active-address=172.16.16.120 active-mac-address=30:07:4D:F5:07:49
     active-client-id="1:30:7:4d:f5:7:49" active-server=defconf host-name="Galaxy-S8"

如果不知道设备的Vendor Class ID,可以用 /system logging add topics=dhcp 打开DHCP调试日志。然后,在日志条目中会看到 Class-ID

10:30:31 dhcp,debug,packet defconf received request with id 4238230732 from 0.0.0.0
10:30:31 dhcp,debug,packet     secs = 3
10:30:31 dhcp,debug,packet     ciaddr = 0.0.0.0
10:30:31 dhcp,debug,packet     chaddr = 30:07:4D:F5:07:49
10:30:31 dhcp,debug,packet     Msg-Type = request
10:30:31 dhcp,debug,packet     Client-Id = 01-30-07-4D-F5-07-49
10:30:31 dhcp,debug,packet     Address-Request = 172.16.16.120
10:30:31 dhcp,debug,packet     Server-Id = 192.168.88.1
10:30:31 dhcp,debug,packet     Max-DHCP-Message-Size = 1500
10:30:31 dhcp,debug,packet     Class-Id = "android-dhcp-9"
10:30:31 dhcp,debug,packet     Host-Name = "Galaxy-S8"
10:30:31 dhcp,debug,packet     Parameter-List = Subnet-Mask,Router,Domain-Server,Domain-Name,Interface-MTU,Broadcast-Address,Address-Time,Ren
ewal-Time,Rebinding-Time,Vendor-Specific
10:30:31 dhcp,info defconf assigned 172.16.16.120 to 30:07:4D:F5:07:49
10:30:31 dhcp,debug,packet defconf sending ack with id 4238230732 to 172.16.16.120
10:30:31 dhcp,debug,packet     ciaddr = 0.0.0.0
10:30:31 dhcp,debug,packet     yiaddr = 172.16.16.120
10:30:31 dhcp,debug,packet     siaddr = 192.168.88.1
10:30:31 dhcp,debug,packet     chaddr = 30:07:4D:F5:07:49
10:30:31 dhcp,debug,packet     Msg-Type = ack
10:30:31 dhcp,debug,packet     Server-Id = 192.168.88.1
10:30:31 dhcp,debug,packet     Address-Time = 600
10:30:31 dhcp,debug,packet     Domain-Server = 192.168.88.1,10.155.0.1,10.155.0.126

通用匹配器

自从RouterOS 7.4beta4 (2022-Jun-15 14:04)以来,供应商-ID匹配器被转换为一个通用匹配器。通用匹配器允许匹配任何DHCP选项。

举个例子,匹配DHCP选项60,类似于vendor-id类匹配器:

/ip dhcp-server matcher
add address-pool=pool1 code=60 name=test value=android-dhcp-11

匹配客户-ID,选项61被配置为十六进制值:

/ip dhcp-server matcher
add address-pool=pool1 code=61 name=test value=0x016c3b6bed8364

使用字符串匹配代码12:

/ip dhcp-server matcher
add address-pool=testpool code=12 name=test server=dhcp1 value="MikroTik"

配置实例

设置

要简单地配置DHCP服务器,可以使用setup命令。

首先在接口上配置一个IP地址:

[admin@MikroTik] > /ip address add address=192.168.88.1/24 interface=ether3 disabled=no

然后用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 DNS servers

dns servers: 10.155.126.1,10.155.0.1,
Select lease time

lease time: 10m

这样就配置了一个活跃的DHCP服务器。

手动配置

要手动配置DHCP服务器以响应本地请求,必须配置以下内容:

  • 一个IP池用于发放地址,确保网关/DHCP服务器地址不在该池中。

/ip pool add name=dhcp_pool0 ranges=192.168.88.2-192.168.88.254

  • 一个 网络 表示DHCP-server将租赁地址的子网,以及其他信息,如网关、DNS-server、NTP-server、DHCP选项,等等。

/ip dhcp-server network add address=192.168.88.0/24 dns-server=192.168.88.1 gateway=192.168.88.1

  • 在这个例子中,设备本身是作为网关的,所以将 地址 添加到网桥接口:

/ip address add address=192.168.88.1/24 interface=bridge1 network=192.168.88.0

  • 最后,添加 DHCP服务器,这里添加先前创建的地址池,并指定DHCP服务器应该在哪个接口上工作

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

DHCPv6服务器

摘要

标准: RFC 3315, RFC 3633

单一的DUID用于客户和服务器的识别,只有IAID在客户之间有所不同,与他们分配的接口相对应。

客户端绑定会创建一个动态池,其超时时间设置为绑定的过期时间(注意现在动态池可以有超时时间),每次绑定被更新时都会更新。

当一个客户被绑定到一个前缀时,DHCP服务器会添加路由信息以知道如何到达被分配的前缀。

服务器中的客户端绑定不再显示MAC地址(像v5.8中那样),而是使用DUID(十六进制)和IAID。升级后,MAC地址将被自动转换为DUID,但由于DUID类型和IAID未知,它们应该由用户进一步更新;

RouterOS DHCPv6服务器只能委托IPv6前缀,不能委托地址。

常规的

Sub-menu: /ipv6 dhcp-server

这个子菜单列出并允许配置DHCP-PD服务器。

DHCPv6服务器属性

属性 说明
address-pool (enum | static-only; Default: static-only) IPv6 pool,从中为客户提取IPv6前缀。
*allow-dual-stack-queue (yes | no; Default: yes*) 为IPv4和IPv6地址创建一个简单的队列条目,并使用MAC地址和DUID进行识别。需要IPv6 DHCP服务器也启用这个选项才能正常工作。
binding-script (string; Default: ) 在分配或取消绑定后执行的脚本。可以在脚本中使用的内部 "全局 "变量:
- bindingBound 如果绑定,设置为 "1",否则设置为 "0"
- bindingServerName dhcp服务器名称
- bindingDUID DUID
- bindingAddress 活动地址
- bindingPrefix 活动前缀
dhcp-option (string; Default: none) 选项列表 中添加额外的DHCP选项。
disabled (yes | no; Default: no) DHCP-PD服务器是否参与前缀分配过程。
interface (string; Default: ) 服务器在哪个接口上运行。
lease-time (time; Default: 3d) 客户端可以使用分配地址的时间。客户端将在这个时间的一半后尝试更新这个地址,并在时间限制到期后请求一个新的地址。
name (string; Default: ) 参考名称

只读属性

属性 说明
dynamic (yes | no)
invalid (yes | no)

绑定

Sub-menu: /ipv6 dhcp-server binding

DUID只用于动态绑定,如果它发生变化,那么客户端将收到一个与之前不同的前缀。

属性 说明
address (IPv6 prefix; Default: ) 将分配给客户端的IPv6前缀。
allow-dual-stack-queue (yes | no; Default: yes) 为IPv4和IPv6地址创建一个简单的队列条目,使用MAC地址和DUID进行识别。需要IPv4 DHCP服务器也启用该选项才能正常工作。
comment (string; Default: ) 项目的简短描述。
disabled (yes | no; Default: no) 项目是否被禁用
dhcp-option (string; Default: ) 从选项列表中添加额外的DHCP选项。
*dhcp-option-set (string; Default: ) 添加额外的DHCP选项集。
life-time (time; Default: 3d) 绑定过期的时间段。
duid (hex string; Default: ) DUID值。只能以十六进制格式指定。
iaid (integer [0..4294967295]; Default: ) 身份协会标识符,是客户ID的一部分。
prefix-pool (string; Default: ) 正在向DHCPv6客户端公布的前缀池。
rate-limit (integer[/integer] [integer[/integer] [integer[/integer] [integer[/integer]]]]; Default: ) Adds a dynamic simple queue to limit IP's bandwidth to a specified rate. Requires the lease to be static. Format is: rx-rate[/tx-rate] [rx-burst-rate[/tx-burst-rate] [rx-burst-threshold[/tx-burst-threshold] [rx-burst-time[/tx-burst-time]]]]. 所有的速率都应该是数字,可以选择'k'(1,000s)或'M'(1,000,000s)。如果没有指定tx-rate,rx-rate也是tx-rate。tx-bulst-rate和tx-bulst-threshold以及tx-bulst-time也是如此。如果没有指定rx-burst-threshold和tx-burst-threshold(但指定了burst-rate),则rx-rate和tx-rate被用作burst阈值。如果没有指定rx-burst-time和tx-burst-time,则使用1s作为默认值。
server (string| all; Default: all) 服务器的名称。如果设置为 所有,那么绑定就适用于所有创建的DHCP-PD服务器。

只读属性

属性 说明
dynamic (yes | no) 项目是否是动态创建的。
expires-after (time) 绑定过期的时间段。
last-seen (time) 客户端最后一次被看到的时间段。
status (waiting | offered | bound) 有三种状态值可以选择:
- waiting 如果不使用静态绑定,则显示为静态绑定。对于动态绑定,如果以前使用过,则显示此状态,服务器将等待10分钟,让老客户获得此绑定,否则绑定将被清除,前缀将提供给其他客户。
- offered 如果收到了 请求 信息,并且服务器以 通告 信息作为回应,但没有收到 请求。在这个状态下,客户端有2分钟的时间来获得这个绑定,否则,它将被释放或改变状态为 等待 的静态绑定。
- bound 当前绑定。

例如,动态分配的/62前缀

[admin@RB493G] /ipv6 dhcp-server binding> print detail
 Flags: X - disabled, D - dynamic
0 D address=2a02:610:7501:ff00::/62 duid="1605fcb400241d1781f7" iaid=0
 server=local-dhcp life-time=3d status=bound expires-after=2d23h40m10s
last-seen=19m50s
1 D address=2a02:610:7501:ff04::/62 duid="0019d1393535" iaid=2
server=local-dhcp life-time=3d status=bound expires-after=2d23h43m47s
last-seen=16m13s

菜单的具体命令

属性 说明
make-static () 设置动态绑定为静态

速率限制

可以通过使用 DHCPv6 绑定来设置特定 IPv6 地址的带宽。这可以通过在DHCPv6绑定本身上设置速率限制来实现,通过这样做,一个动态的简单队列规则将被添加到与DHCPv6绑定相对应的IPv6地址上。通过使用 rate-limit 参数,可以方便地限制用户的带宽。

为了使任何队列正常工作,流量必须不被快速跟踪,请确保防火墙不对想限制的流量进行快速跟踪。

首先,使DHCPv6绑定成为静态的,否则就不能为DHCPv6绑定设置速率限制:

[admin@MikroTik] > /ipv6 dhcp-server binding print
Flags: X - disabled, D - dynamic
# ADDRESS DUID SERVER STATUS
0 D fdb4:4de7:a3f8:418c::/66 0x6c3b6b7c413e DHCPv6_Server bound

[admin@MikroTik] > /ipv6 dhcp-server binding make-static 0

[admin@MikroTik] > /ipv6 dhcp-server binding print
Flags: X - disabled, D - dynamic
# ADDRESS DUID SERVER STATUS
0 fdb4:4de7:a3f8:418c::/66 0x6c3b6b7c413e DHCPv6_Server bound

可以给DHCPv6绑定设置一个速率,它将创建一个新的动态简单队列条目:

[admin@MikroTik] > /ipv6 dhcp-server binding set 0 rate-limit=10M/10
[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 burst-limit=0/0
burst-threshold=0/0 burst-time=0s/0s bucket-size=0.1/0.1

默认情况下,allow-dual-stack-queue 被启用,这将为DCHPv6绑定和DHCPv4租赁添加一个单一的动态简单队列条目,如果不启用这个选项,将为IPv6和IPv4添加单独的动态简单队列条目。

如果 allow-dual-stack-queue 被启用,那么将创建一个包含IPv4和IPv6地址的单一动态队列条目:

[admin@MikroTik] > /queue simple print
Flags: X - disabled, I - invalid, D - dynamic
 0 D name="dhcp-ds<6C:3B:6B:7C:41:3E>" target=192.168.1.200/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支持

从RouterOS v6.43开始,可以用RADIUS为每个DHCPv6绑定分配一个速率限制,要实现这一点,需要从RADIUS服务器为DHCPv6绑定传递Mikrotik-Rate-Limit属性。要实现这一点,首先需要将DHCPv6服务器设置为使用RADIUS来分配绑定。下面是一个设置的例子:

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

之后需要告诉RADIUS服务器传递Mikrotik-rate-Limit属性。如果用的是带有MySQL的FreeRADIUS,那么需要在 radcheckradreply 表中为一个MAC地址添加适当的条目,该地址用于DHCPv6客户端。下面是一个表项例子:

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');

默认情况下,allow-dual-stack-queue是启用的,如果IPv4租约的MAC地址(或DUID,如果DHCPv4客户端支持RFC4361中的 "Node-specific Client Identifiers"),将添加一个动态队列条目,但DHCPv6客户端的DUID并不总是基于DHCPv6客户端运行的接口的MAC地址,DUID是以每个设备为单位生成的。由于这个原因,可能不会创建一个单一的动态队列条目,而会创建单独的动态队列条目。

配置实例

启用 IPv6 前缀授权

现在已经有一个正在运行的DHCP服务器。

要启用IPv6前缀委托,首先要创建一个地址池:

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

注意,前缀长度是62位,这意味着客户将从/60池中接收/62前缀。

下一步是启用DHCP-PD:

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

为了测试服务器,将在ubuntu机器上设置owe-dhcpv6:

  • 安装owe-dhcpv6-client

  • 像上面那样编辑"/etc/wide-dhcpv6/dhcp6c.conf"。

也可以用RouterOS作为DHCP-PD客户端。

interface eth2{
send ia-pd 0;
};

id-assoc pd {
prefix-interface eth3{
sla-id 1;
sla-len 2;
};
};
  • 运行DHCP-PD客户端:

sudo dhcp6c -d -D -f eth2

  • 确认前缀被添加:

mrz@bumba:/media/aaa$ ip -6 addr
 ..
2: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
 inet6 2001:db8:7501:1:200:ff:fe00:0/64 scope global
 valid_lft forever preferred_lft forever
 inet6 fe80::224:1dff:fe17:81f7/64 scope link
 valid_lft forever preferred_lft forever
  • 可以让特定客户的绑定成为静态的,以便它收到相同的前缀:

[admin@RB493G] /ipv6 dhcp-server binding> print
Flags: X - disabled, D - dynamic
# ADDRESS DU IAID SER.. STATUS 0 D 2001:db8:7501:1::/62 16 0 loc.. bound
[admin@RB493G] /ipv6 dhcp-server binding> make-static 0
  • DHCP-PD还将分配给前缀的路由安装到IPv6路由表:

[admin@RB493G] /ipv6 route> print
 Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 # DST-ADDRESS GATEWAY DISTANCE
...
2 ADS 2001:db8:7501:1::/62 fe80::224:1dff:fe17:8... 1

DHCP中继

摘要

Sub-menu: /ip dhcp-relay

DHCP中继的目的是在DHCP客户和DHCP服务器之间充当一个代理。在DHCP服务器与DHCP客户不在同一广播域的网络中,它很有用。

DHCP中继不会在DHCP-服务器列表中选择特定的DHCP服务器,它只是将传入的请求发送到所有列出的服务器。

属性

属性 说明
add-relay-info (yes | no; Default: no) 如果根据RFC 3046启用,则添加DHCP中继代理信息。代理电路ID子选项包含接口的MAC地址,代理远程ID子选项包含接收请求的客户端的MAC地址。
如果DHCP数据包中的secs字段小于延迟阈值,那么这个数据包将被忽略。
dhcp-server (string; Default: ) DHCP服务器的IP地址列表,DHCP请求应该被转发到这些地址。
interface (string; Default: ) DHCP中继工作的接口名称。
local-address (IP; Default: 0.0.0.0) 这个DHCP中继的唯一IP地址,需要DHCP服务器来区分中继。如果设置为 0.0.0.0 - IP地址将自动选择。
relay-info-remote-id (string; Default: ) 指定的字符串将被用来构建选项82,而不是客户的MAC地址。选项82包括:接收数据包的接口+客户的MAC地址或 relay-info-remote-id
name (string; Default: ) 中继的描述名称。

配置实例

考虑一下有几个 "在其他路由器后面 "的IP网络,想把所有的DHCP服务器放在一个路由器上。要实现这一点,需要在网络上有一个 DHCP 中继器,把客户的 DHCP 请求转发给 DHCP 服务器。

这个例子说明如何配置一个DHCP服务器和一个为2个IP网络服务的DHCP中继器–192.168.1.0/24和192.168.2.0/24,它们在一个路由器DHCP-Relay后面。

IP地址配置

DHCP-服务器的IP地址:

[admin@DHCP-Server] ip address> print
Flags: X - disabled, I - invalid, D - dynamic
 #   ADDRESS            NETWORK         BROADCAST       INTERFACE
 0   192.168.0.1/24     192.168.0.0     192.168.0.255   To-DHCP-Relay
 1   10.1.0.2/24    10.1.0.0    10.1.0.255  Public
[admin@DHCP-Server] ip address>

DHCP-Relay的IP地址:

/ip pool add name=Local1-Pool ranges=192.168.1.11-192.168.1.100
/ip pool add name=Local1-Pool ranges=192.168.2.11-192.168.2.100
[admin@DHCP-Server] ip pool> print
 # NAME                                         RANGES
 0 Local1-Pool                                  192.168.1.11-192.168.1.100
 1 Local2-Pool                                  192.168.2.11-192.168.2.100
[admin@DHCP-Server] ip pool>

DHCP服务器的设置

要在DHCP-服务器路由器上设置2个DHCP服务器,需要添加2个池。对于网络192.168.1.0/24和192.168.2.0:

/ip pool add name=Local1-Pool ranges=192.168.1.11-192.168.1.100
/ip pool add name=Local1-Pool ranges=192.168.2.11-192.168.2.100
[admin@DHCP-Server] ip pool> print
 # NAME                                         RANGES
 0 Local1-Pool                                  192.168.1.11-192.168.1.100
 1 Local2-Pool                                  192.168.2.11-192.168.2.100
[admin@DHCP-Server] ip pool>

创建DHCP服务器:

/ip dhcp-server add interface=To-DHCP-Relay relay=192.168.1.1 \
   address-pool=Local1-Pool name=DHCP-1 disabled=no
/ip dhcp-server add interface=To-DHCP-Relay relay=192.168.2.1 \
   address-pool=Local2-Pool name=DHCP-2 disabled=no
[admin@DHCP-Server] ip dhcp-server> print
Flags: X - disabled, I - invalid
 #   NAME         INTERFACE     RELAY           ADDRESS-POOL LEASE-TIME ADD-ARP
 0   DHCP-1       To-DHCP-Relay 192.168.1.1     Local1-Pool  3d00:00:00
 1   DHCP-2       To-DHCP-Relay 192.168.2.1     Local2-Pool  3d00:00:00
[admin@DHCP-Server] ip dhcp-server>

配置相应的网络:

/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
[admin@DHCP-Server] ip dhcp-server network> print
 # ADDRESS            GATEWAY         DNS-SERVER      WINS-SERVER     DOMAIN
 0 192.168.1.0/24     192.168.1.1     159.148.60.20
 1 192.168.2.0/24     192.168.2.1     159.148.60.20
[admin@DHCP-Server] ip dhcp-server network>

DHCP中继配置

DHCP-服务器的配置已经完成。现在配置DHCP-Relay:

/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
[admin@DHCP-Relay] ip dhcp-relay> print
Flags: X - disabled, I - invalid
 #   NAME                        INTERFACE      DHCP-SERVER     LOCAL-ADDRESS
 0   Local1-Relay                Local1         192.168.0.1     192.168.1.1
 1   Local2-Relay                Local2         192.168.0.1     192.168.2.1
[admin@DHCP-Relay] ip dhcp-relay>