Manual:IP/DHCP Server: Difference between revisions
(35 intermediate revisions by 6 users not shown) | |||
Line 120: | Line 120: | ||
|default=static-only | |default=static-only | ||
|desc=[[M:IP/Pools | IP pool]], from which to take IP addresses for the clients. If set to <b>static-only</b>, then only the clients that have a static lease (added in [[#Leases | lease]] submenu) will be allowed. | |desc=[[M:IP/Pools | IP pool]], from which to take IP addresses for the clients. If set to <b>static-only</b>, then only the clients that have a static lease (added in [[#Leases | lease]] submenu) will be allowed. | ||
}} | |||
{{Mr-arg-table | |||
|arg=allow-dual-stack-queue | |||
|type=yes {{!}} no | |||
|default=yes | |||
|desc=Creates a single simple queue entry for both IPv4 and IPv6 addresses, uses the MAC address and DUID for identification. Requires [[ Manual:IPv6/DHCP_Server | IPv6 DHCP Server]] to have this option enabled as well to work properly. | |||
}} | }} | ||
Line 132: | Line 140: | ||
|arg=authoritative | |arg=authoritative | ||
|type=after-10sec-delay {{!}} after-2sec-delay {{!}} yes {{!}} no | |type=after-10sec-delay {{!}} after-2sec-delay {{!}} yes {{!}} no | ||
|default= | |default=yes | ||
|desc=Option changes the way how server responds to DHCP requests: | |desc=Option changes the way how server responds to DHCP requests: | ||
Line 166: | Line 174: | ||
}} | }} | ||
{{Mr-arg-table | |||
|arg=client-mac-limit | |||
|type=integer {{!}} unlimited | |||
|default=unlimited | |||
|desc=Specifies whether to limit specific number of clients per single MAC address or leave <var>unlimited</var>. | |||
Note that this setting should not be used in relay setups. | |||
}} | |||
{{Mr-arg-table | {{Mr-arg-table | ||
Line 171: | Line 186: | ||
|type=yes {{!}} no | |type=yes {{!}} no | ||
|default= | |default= | ||
|desc= | |desc=Allows to disable/enable conflict detection. If option is enabled, then whenever server tries to assign a lease it will send ICMP and ARP messages to detect whether such address in the network already exist. If any of above get reply address is considered already used. Conflict detection must be disabled when any kind of DHCP client limitation per port or per mac is used. | ||
}} | }} | ||
Line 211: | Line 226: | ||
* <var>leaseActMAC</var> - active mac address | * <var>leaseActMAC</var> - active mac address | ||
* <var>leaseActIP</var> - active IP address | * <var>leaseActIP</var> - active IP address | ||
* <var>lease-hostname</var> - client hostname | |||
* <var>lease-options</var> - array of received options | |||
}} | }} | ||
Line 226: | Line 243: | ||
|default= | |default= | ||
|desc=Reference name | |desc=Reference name | ||
}} | |||
{{Mr-arg-table | |||
|arg=parent-queue | |||
|type=string {{!}} none | |||
|default=none | |||
|desc= | |||
}} | }} | ||
Line 247: | Line 271: | ||
|arg=use-framed-as-classless | |arg=use-framed-as-classless | ||
|type=yes {{!}} no | |type=yes {{!}} no | ||
|default= | |default=yes | ||
|desc= | |desc=Forward RADIUS Framed-Route as a DHCP Classless-Static-Route to DHCP-client. Whenever both Framed-Route and Classless-Static-Route is received Classless-Static-Route is preferred. | ||
}} | }} | ||
Line 395: | Line 419: | ||
<td><var><b>address-list</b></var> (<em>string</em>; Default: <b></b>)</td> | <td><var><b>address-list</b></var> (<em>string</em>; Default: <b></b>)</td> | ||
<td>Address list to which address will be added if lease is bound.</td> | <td>Address list to which address will be added if lease is bound.</td> | ||
</tr> | |||
<tr> | |||
<td><var><b>allow-dual-stack-queue</b></var> (<em>yes | no</em>; Default: <b>yes</b>)</td> | |||
<td>Creates a single simple queue entry for both IPv4 and IPv6 addresses, uses the MAC address and DUID for identification. Requires [[ Manual:IPv6/DHCP_Server | IPv6 DHCP Server]] to have this option enabled as well to work properly.</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
Line 408: | Line 436: | ||
<td>If specified, must match DHCP 'client identifier' option of the request</td> | <td>If specified, must match DHCP 'client identifier' option of the request</td> | ||
</tr> | </tr> | ||
<tr> | |||
<td><var><b>dhcp-option</b></var> (<em>string</em>; Default: <b></b>)</td> | |||
<td>Add additional DHCP options from [[#Options | option list]].</td> | |||
</tr> | |||
<tr> | |||
<td><var><b>dhcp-option-set</b></var> (<em>string</em>; Default: <b></b>)</td> | |||
<td>Add additional set of DHCP options.</td> | |||
</tr> | |||
<tr> | |||
<td><var><b>insert-queue-before</b></var> (<em>bottom | first | name</em>;; Default: <b></b>)</td> | |||
<td>Specify where to place dynamic simple queue entries for static DCHP leases with <var>rate-limit</var> parameter set.</td> | |||
</tr> | |||
<tr> | <tr> | ||
<td><var><b>lease-time</b></var> (<em>time</em>; Default: <b>0s</b>)</td> | <td><var><b>lease-time</b></var> (<em>time</em>; Default: <b>0s</b>)</td> | ||
Line 417: | Line 458: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td><var><b> | <td><var><b>rate-limit</b></var> (<em>integer[/integer] [integer[/integer] [integer[/integer] [integer[/integer]]]];</em>; Default: <b></b>)</td> | ||
<td> | <td>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]]]]. All rates should be numbers with optional 'k' (1,000s) or 'M' (1,000,000s). If tx-rate is not specified, rx-rate is as tx-rate too. Same goes for tx-burst-rate and tx-burst-threshold and tx-burst-time. If both rx-burst-threshold and tx-burst-threshold are not specified (but burst-rate is specified), rx-rate and tx-rate is used as burst thresholds. If both rx-burst-time and tx-burst-time are not specified, 1s is used as default.</td> | ||
</tr> | |||
<tr> | |||
<td><var><b>server</b></var> (<em>string</em>)</td> | |||
<td>Server name which serves this client</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td><var><b>use-src-mac</b></var> (<em> | <td><var><b>use-src-mac</b></var> (<em>yes {{!}} no</em>; Default: <b>no</b>)</td> | ||
<td> | <td>When this option is set server uses source MAC address instead of received CHADDR to assign address.</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
Line 474: | Line 519: | ||
<td><var><b>radius</b></var> (<em>yes | no</em>)</td> | <td><var><b>radius</b></var> (<em>yes | no</em>)</td> | ||
<td>Shows if this dynamic lease is authenticated by RADIUS or not</td> | <td>Shows if this dynamic lease is authenticated by RADIUS or not</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
Line 495: | Line 532: | ||
</ul> | </ul> | ||
</td> | </td> | ||
</tr> | |||
<tr> | |||
<td><var><b>src-mac-address</b></var> (<em>MAC</em>; Default: <b></b>)</td> | |||
<td>Source MAC address</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
Line 514: | Line 555: | ||
</tr> | </tr> | ||
</table> | </table> | ||
< | |||
===Rate limiting=== | |||
It is possible to set a bandwidth to a specific IPv4 address by using DHCPv4 leases. This can be done by setting a rate limit on the DHCPv4 lease itself, by doing this a dynamic simple queue rule will be added for the IPv4 address that corresponds to the DHCPv4 lease. By using the <code>rate-limit</code> parameter you can conveniently limit a user's bandwidth. | |||
{{ Note | For any queues to work properly, the traffic must not be [[ Manual:IP/Fasttrack | FastTracked]], make sure your Firewall does not FastTrack traffic that you want to limit. }} | |||
First, make the DHCPv4 lease static, otherwise it will not be possible to set a rate limit to a DHCPv4 lease: | |||
<pre> | |||
[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 | |||
</pre> | |||
Then you can set a rate to a DHCPv4 lease that will create a new dynamic simple queue entry: | |||
<pre> | |||
[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 | |||
</pre> | |||
{{ Note | By default <code>allow-dual-stack-queue</code> is enabled, this will add a single dynamic simple queue entry for both DCHPv6 binding and DHCPv4 lease, without this option enabled separate dynamic simple queue entries will be added for IPv6 and IPv4. }} | |||
If <code>allow-dual-stack-queue</code> is enabled, then a single dynamic simple queue entry will be created containing both IPv4 and IPv6 addresses: | |||
<pre> | |||
[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 | |||
</pre> | |||
====RADIUS Support==== | |||
Since RouterOS v6.43 it is possible to use RADIUS to assign a rate-limit per lease, to do so you need to pass the <var>Mikrotik-Rate-Limit</var> attribute from your RADIUS Server for your lease. To achieve this you first need to set your DHCPv4 Server to use RADIUS for assigning leases. Below is an example how to set it up: | |||
<pre> | |||
/radius | |||
add address=10.0.0.1 secret=VERYsecret123 service=dhcp | |||
/ip dhcp-server | |||
set dhcp1 use-radius=yes | |||
</pre> | |||
After that you need to tell your RADIUS Server to pass the <var>Mikrotik-Rate-Limit</var> attribute. In case you are using FreeRADIUS with MySQL, then you need to add appropriate entries into '''radcheck''' and '''radreply''' tables for a MAC address, that is being used for your DHCPv4 Client. Below is an example for table entries: | |||
<pre> | |||
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'), | |||
</pre> | |||
==Alerts== | ==Alerts== | ||
Line 589: | Line 690: | ||
<p> | <p> | ||
With help of DHCP Option list, it is possible to define additional custom options for DHCP Server to advertise. Option precedence is as follows: | With the help of DHCP Option list, it is possible to define additional custom options for DHCP Server to advertise. Option precedence is as follows: | ||
*radius, | *radius, | ||
*lease, | *lease, | ||
Line 597: | Line 698: | ||
</p> | </p> | ||
<p> | <p> | ||
According to the DHCP protocol, a parameter is returned to the DHCP client only if it requests this parameter, specifying the respective code in DHCP request Parameter-List (code 55) attribute. If the code is not included in Parameter-List attribute, DHCP server will not send it to the DHCP client. | According to the DHCP protocol, a parameter is returned to the DHCP client only if it requests this parameter, specifying the respective code in DHCP request Parameter-List (code 55) attribute. If the code is not included in Parameter-List attribute, the DHCP server will not send it to the DHCP client. | ||
</p> | </p> | ||
Line 699: | Line 800: | ||
<br /> | <br /> | ||
This menu allows | This menu allows combining multiple options in option sets, which later can be used to override default DHCP server option set. | ||
{{Mr-arg-table-h | {{Mr-arg-table-h | ||
Line 720: | Line 820: | ||
|desc=List of options defined in options menu. | |desc=List of options defined in options menu. | ||
}} | }} | ||
==Vendor Classes== | |||
<br /> | |||
Since 6.45beta6 version RouterOS support vendor class id matcher. The vendor class is used by DHCP clients to optionally identify the vendor and configuration. | |||
{{Mr-arg-table-h | |||
|prop=Property | |||
|desc=Description | |||
}} | |||
{{Mr-arg-table | |||
|arg=name | |||
|type=string | |||
|default= | |||
|desc=Self explained | |||
}} | |||
{{Mr-arg-table | |||
|arg=sever | |||
|type=string | |||
|default=all | |||
|desc=Specific DHCP server to match | |||
}} | |||
{{Mr-arg-table | |||
|arg=address-pool | |||
|type=string | |||
|default= | |||
|desc=Address pool for a particular Vendor ID (VID) | |||
}} | |||
{{Mr-arg-table-end | |||
|arg=vid | |||
|type=string | |||
|default= | |||
|desc=Vendor Class ID matcher | |||
}} | |||
<br /> | |||
=== Example=== | |||
In the following configuration example, we will give an IP address from a particular pool for an Android based mobile phone. We will use the RouterBOARD with a default configuration | |||
<pre> | |||
/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 | |||
</pre> | |||
Configure <code>vendor-class-id</code> matcher. DHCP servers configuration remains default | |||
<pre> | |||
/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 | |||
</pre> | |||
Connect your mobile phone to the device to receive an IP address from 172.16.16.0 network | |||
<pre> | |||
[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" | |||
</pre> | |||
If you do not know your devices Vendor Class ID, you can turn on DHCP debug logs with <code>/system logging add topics=dhcp</code>. Then in the logging entries, you will see '''Class-ID''' | |||
<pre> | |||
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 | |||
</pre> | |||
==Configuration Examples== | ==Configuration Examples== | ||
<br> | |||
To simply configure DHCP server you can use a <code>setup</code> command. | |||
First, you configure IP address on the interface: | |||
<pre> | |||
[admin@MikroTik] > /ip address add address=192.168.88.1/24 interface=ether3 disabled=no | |||
</pre> | |||
Then you use <code>setup</code> command which will automatically ask necessary parameters: | |||
<pre> | |||
[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 | |||
</pre> | |||
That is all. You have configured an active DHCP server. | |||
{{cont}} | {{cont}} |
Latest revision as of 14:24, 21 January 2020
Applies to RouterOS: v3, v4, v5+
Summary
Standards: RFC 2131, RFC 3315, RFC 3633
Package: dhcp
The DHCP (Dynamic Host Configuration Protocol) is used for the easy distribution of IP addresses in a network. The MikroTik RouterOS implementation includes both server and client parts and is compliant with RFC 2131.
The router supports an individual server for each Ethernet-like interface. The MikroTik RouterOS DHCP server supports the basic functions of giving each requesting client an IP address/netmask lease, default gateway, domain name, DNS-server(s) and WINS-server(s) (for Windows clients) information (set up in the DHCP networks submenu)
In order for the DHCP server to work, IP pools must also be configured (do not include the DHCP server's own IP address into the pool range) and the DHCP networks.
It is also possible to hand out leases for DHCP clients using the RADIUS server; the supported parameters for a RADIUS server is as follows:
Access-Request:
- NAS-Identifier - router identity
- NAS-IP-Address - IP address of the router itself
- NAS-Port - unique session ID
- NAS-Port-Type - Ethernet
- Calling-Station-Id - client identifier (active-client-id)
- Framed-IP-Address - IP address of the client (active-address)
- Called-Station-Id - name of DHCP server
- User-Name - MAC address of the client (active-mac-address)
- Password - ""
Access-Accept:
- Framed-IP-Address - IP address that will be assigned to client
- Framed-Pool - ip pool from which to assign ip address to client
- Rate-Limit - Datarate limitation for DHCP clients. Format is: 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]]]]. All rates should be numbers with optional 'k' (1,000s) or 'M' (1,000,000s). If tx-rate is not specified, rx-rate is as tx-rate too. Same goes for tx-burst-rate and tx-burst-threshold and tx-burst-time. If both rx-burst-threshold and tx-burst-threshold are not specified (but burst-rate is specified), rx-rate and tx-rate are used as burst thresholds. If both rx-burst-time and tx-burst-time are not specified, 1s is used as default. Priority takes values 1..8, where 1 implies the highest priority, but 8 - the lowest. If rx-rate-min and tx-rate-min are not specified rx-rate and tx-rate values are used. The rx-rate-min and tx-rate-min values can not exceed rx-rate and tx-rate values.
- Ascend-Data-Rate - tx/rx data rate limitation if multiple attributes are provided, first limits tx data rate, second - rx data rate. If used together with Ascend-Xmit-Rate, specifies rx rate. 0 if unlimited
- Ascend-Xmit-Rate - tx data rate limitation. It may be used to specify tx limit only instead of sending two sequential Ascend-Data-Rate attributes (in that case Ascend-Data-Rate will specify the receive rate). 0 if unlimited
- Session-Timeout - max lease time (lease-time)
Note: DHCP server requires a real interface to receive raw ethernet packets. If the interface is a Bridge interface, then the Bridge must have a real interface attached as a port to that bridge which will receive the raw ethernet packets. It cannot function correctly on a dummy (empty bridge) interface.
Quick Setup Guide
RouterOS has a built in command that lets you easily set up a DHCP server. Let's say we want to configure DHCP server on ether1 interface to lease addresses from 192.168.0.2 to 192.168.0.254 which belong to the 192.168.0.0/24 network. The gateway and DNS server is 192.168.0.1.
From /ip dhcp-server
menu run setup command and follow instructions:
[admin@MikroTik] ip dhcp-server> setup Select interface to run DHCP server on dhcp server interface: ether1 Select network for DHCP addresses dhcp address space: 192.168.0.0/24 Select gateway for given network gateway for dhcp network: 192.168.0.1 Select pool of ip addresses given out by DHCP server addresses to give out: 192.168.0.2-192.168.0.254 Select DNS servers dns servers: 192.168.0.1 Select lease time lease time: 3d [admin@MikroTik] ip dhcp-server>
The wizard has made the following configuration based on the answers above:
[admin@MikroTik] ip dhcp-server> print Flags: X - disabled, I - invalid # NAME INTERFACE RELAY ADDRESS-POOL LEASE-TIME ADD-ARP 0 dhcp1 ether1 0.0.0.0 dhcp_pool1 3d no [admin@MikroTik] ip dhcp-server> network print # ADDRESS GATEWAY DNS-SERVER WINS-SERVER DOMAIN 0 192.168.0.0/24 192.168.0.1 192.168.0.1 [admin@MikroTik] ip dhcp-server> /ip pool print # NAME RANGES 0 dhcp_pool1 192.168.0.2-192.168.0.254 [admin@MikroTik] ip dhcp-server>
IPv6
Starting from v5.8 RouterOS supports IPv6 prefix delegation according to RFC 3315 and RFC 3633.
Starting from v5.9, DHCPv6 server configuration was moved to /ipv6 sub-menu. Read-more >>
General
Sub-menu: /ip dhcp-server
Property | Description |
---|---|
add-arp (yes | no; Default: no) | Whether to add dynamic ARP entry. If set to no either ARP mode should be enabled on that interface or static ARP entries should be administratively defined in /ip arp submenu. |
address-pool (string | static-only; Default: static-only) | IP pool, from which to take IP addresses for the clients. If set to static-only, then only the clients that have a static lease (added in lease submenu) will be allowed. |
allow-dual-stack-queue (yes | no; Default: yes) | Creates a single simple queue entry for both IPv4 and IPv6 addresses, uses the MAC address and DUID for identification. Requires IPv6 DHCP Server to have this option enabled as well to work properly. |
always-broadcast (yes | no; Default: no) | Always send replies as broadcasts even if destination IP is known. Will add additional load on L2 network. |
authoritative (after-10sec-delay | after-2sec-delay | yes | no; Default: yes) | Option changes the way how server responds to DHCP requests:
|
bootp-lease-time (forever | lease-time | time; Default: ) | Accepts two predefined options or time value:
|
bootp-support (none | static | dynamic; Default: static) | Support for BOOTP clients:
|
client-mac-limit (integer | unlimited; Default: unlimited) | Specifies whether to limit specific number of clients per single MAC address or leave unlimited. Note that this setting should not be used in relay setups. |
conflict-detection (yes | no; Default: ) | Allows to disable/enable conflict detection. If option is enabled, then whenever server tries to assign a lease it will send ICMP and ARP messages to detect whether such address in the network already exist. If any of above get reply address is considered already used. Conflict detection must be disabled when any kind of DHCP client limitation per port or per mac is used. |
delay-threshold (time | none; Default: none) | If secs field in DHCP packet is smaller than delay-threshold, then this packet is ignored. If set to none - there is no threshold (all DHCP packets are processed) |
dhcp-option-set (name | none; Default: ) | Use custom set of DHCP options defined in option sets menu. |
insert-queue-before (bottom | first | name; Default: ) | Specify where to place dynamic simple queue entries for static DCHP leases with rate-limit parameter set. |
interface (string; Default: ) | Interface on which server will be running. |
lease-script (string; Default: "") | Script that will be executed after lease is assigned or de-assigned. Internal "global" variables that can be used in the script:
|
lease-time (time; Default: 10m) | The time that a client may use the assigned address. The client will try to renew this address after a half of this time and will request a new address after time limit expires. |
name (string; Default: ) | Reference name |
parent-queue (string | none; Default: none) | |
relay (IP; Default: 0.0.0.0) | The IP address of the relay this DHCP server should process requests from:
|
src-address (IP; Default: 0.0.0.0) | The address which the DHCP client must send requests to in order to renew an IP address lease. If there is only one static address on the DHCP server interface and the source-address is left as 0.0.0.0, then the static address will be used. If there are multiple addresses on the interface, an address in the same subnet as the range of given addresses should be used. |
use-framed-as-classless (yes | no; Default: yes) | Forward RADIUS Framed-Route as a DHCP Classless-Static-Route to DHCP-client. Whenever both Framed-Route and Classless-Static-Route is received Classless-Static-Route is preferred. |
use-radius (yes | no | accounting; Default: no) | Whether to use RADIUS server:
|
Menu specific commands
Property | Description |
---|---|
setup () | Start DHCP server setup wizard, which guides you through the steps to easily create all necessary configuration. Read more>> |
Lease Store Configuration
Sub-menu: /ip dhcp-server config
This sub-menu allows the configuration of how often the DHCP leases will be stored on disk. If they would be saved on disk on every lease change, a lot of disk writes would happen which is very bad for Compact Flash (especially, if lease times are very short). To minimize writes on disk, all changes are saved on disk every store-leases-disk
seconds.
Additionally leases are always stored on disk on graceful shutdown and reboot.
Note: Manual changes to leases - addition/removal of static lease, removal of dynamic lease will cause changes to be pushed for this lease to storage.
This sub-menu has only one configurable property:
Property | Description |
---|---|
store-leases-disk (time | immediately | never; Default: 5m) | How frequently lease changes should be stored on disk |
Networks
Sub-menu: /ip dhcp-server network
Property | Description |
---|---|
address (IP/netmask; Default: ) | the network DHCP server(s) will lease addresses from |
boot-file-name (string; Default: ) | Boot file name |
caps-manager (string; Default: ) | Comma-separated list of IP addresses for one or more CAPsMAN system managers. DHCP Option 138 (capwap) will be used. |
dhcp-option (string; Default: ) | Add additional DHCP options from option list. |
dhcp-option-set (string; Default: ) | Add additional set of DHCP options. |
dns-none (yes | no; Default: no) | If set, then DHCP Server will not pass dynamic DNS servers configured on the router to the DHCP clients if no DNS Server in dns-server is set. By default if there are no DNS Servers configured, then the dynamic DNS Servers will be passed to DHCP clients. |
dns-server (string; Default: ) | the DHCP client will use these as the default DNS servers. Two comma-separated DNS servers can be specified to be used by the DHCP client as primary and secondary DNS servers |
domain (string; Default: ) | The DHCP client will use this as the 'DNS domain' setting for the network adapter. |
gateway (IP; Default: 0.0.0.0) | The default gateway to be used by DHCP Client. |
netmask (integer: 0..32; Default: 0) | The actual network mask to be used by DHCP client. If set to '0' - netmask from network address will be used. |
next-server (IP; Default: ) | IP address of next server to use in bootstrap. |
ntp-server (IP; Default: ) | the DHCP client will use these as the default NTP servers. Two comma-separated NTP servers can be specified to be used by the DHCP client as primary and secondary NTP servers |
wins-server (IP; Default: ) | The Windows DHCP client will use these as the default WINS servers. Two comma-separated WINS servers can be specified to be used by the DHCP client as primary and secondary WINS servers |
Leases
Sub-menu: /ip dhcp-server lease
DHCP server lease submenu is used to monitor and manage server's leases. The issued leases are showed here as dynamic entries. You can also add static leases to issue a specific IP address to a particular client (identified by MAC address) .
Generally, the DHCP lease it allocated as follows:
- an unused lease is in waiting state
- if a client asks for an IP address, the server chooses one
- if the client receives a statically assigned address, the lease becomes offered, and then bound with the respective lease time
- if the client receives a dynamic address (taken from an IP address pool), the router sends a ping packet and waits for answer for 0.5 seconds. During this time, the lease is marked testing
- in the case where the address does not respond, the lease becomes offered and then bound with the respective lease time
- in other case, the lease becomes busy for the lease time (there is a command to retest all busy addresses), and the client's request remains unanswered (the client will try again shortly)
A client may free the leased address. The dynamic lease is removed, and the allocated address is returned to the address pool. But the static lease becomes busy until the client reacquires the address.
Note: IP addresses assigned statically are not probed!
Properties
Property | Description |
---|---|
address (IP; Default: ) | Specify IP address (or ip pool) for static lease. If set to 0.0.0.0 - pool from server will be used |
address-list (string; Default: ) | Address list to which address will be added if lease is bound. |
allow-dual-stack-queue (yes | no; Default: yes) | Creates a single simple queue entry for both IPv4 and IPv6 addresses, uses the MAC address and DUID for identification. Requires IPv6 DHCP Server to have this option enabled as well to work properly. |
always-broadcast (yes | no; Default: ) | Send all replies as broadcasts |
block-access (yes | no; Default: no) | Block access for this client |
client-id (string; Default: ) | If specified, must match DHCP 'client identifier' option of the request |
dhcp-option (string; Default: ) | Add additional DHCP options from option list. |
dhcp-option-set (string; Default: ) | Add additional set of DHCP options. |
insert-queue-before (bottom | first | name;; Default: ) | Specify where to place dynamic simple queue entries for static DCHP leases with rate-limit parameter set. |
lease-time (time; Default: 0s) | Time that the client may use the address. If set to 0s lease will never expire. |
mac-address (MAC; Default: 00:00:00:00:00:00) | If specified, must match the MAC address of the client |
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]]]]. All rates should be numbers with optional 'k' (1,000s) or 'M' (1,000,000s). If tx-rate is not specified, rx-rate is as tx-rate too. Same goes for tx-burst-rate and tx-burst-threshold and tx-burst-time. If both rx-burst-threshold and tx-burst-threshold are not specified (but burst-rate is specified), rx-rate and tx-rate is used as burst thresholds. If both rx-burst-time and tx-burst-time are not specified, 1s is used as default. |
server (string) | Server name which serves this client |
use-src-mac (yes | no; Default: no) | When this option is set server uses source MAC address instead of received CHADDR to assign address. |
Warning: The always-broadcast
parameter will dynamically change. For the initial DHCP discover/offer/request/ack cycle a broadcast MAC address is going to be used, for lease renewal (request and ack) an unicast MAC address will be used. In case the DHCP Server keeps receiving DHCP requests while DHCP offer has been sent, then the always-broadcast
parameter will be turned on dynamically until the DHCP lease has been renewed successfully.
Read only properties
Property | Description |
---|---|
active-address (IP) | Actual IP address for this lease |
active-client-id (string) | Actual client-id of the client |
active-mac-address (MAC) | Actual MAC address of the client |
active-server (list) | Actual dhcp server, which serves this client |
agent-circuit-id (string) | Circuit ID of DHCP relay agent. If each character should be valid ASCII text symbol or else this value is displayed as hex dump. |
agent-remote-id (string) | Remote ID, set by DHCP relay agent |
blocked ( flag ) | Whether the lease is blocked |
expires-after (time) | Time until lease expires |
host-name (text) | Shows host name option from last received DHCP request |
radius (yes | no) | Shows if this dynamic lease is authenticated by RADIUS or not |
status (waiting | testing | authorizing | busy | offered | bound) | Lease status:
|
src-mac-address (MAC; Default: ) | Source MAC address |
Menu specific commands
Property | Description |
---|---|
check-status (id) | Check status of a given busy dynamic lease, and free it in case of no response |
make-static (id) | Convert a dynamic lease to a static one |
Rate limiting
It is possible to set a bandwidth to a specific IPv4 address by using DHCPv4 leases. This can be done by setting a rate limit on the DHCPv4 lease itself, by doing this a dynamic simple queue rule will be added for the IPv4 address that corresponds to the DHCPv4 lease. By using the rate-limit
parameter you can conveniently limit a user's bandwidth.
Note: For any queues to work properly, the traffic must not be FastTracked, make sure your Firewall does not FastTrack traffic that you want to limit.
First, make the DHCPv4 lease static, otherwise it will not be possible to set a rate limit to a DHCPv4 lease:
[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
Then you can set a rate to a DHCPv4 lease that will create a new dynamic simple queue entry:
[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
Note: By default allow-dual-stack-queue
is enabled, this will add a single dynamic simple queue entry for both DCHPv6 binding and DHCPv4 lease, without this option enabled separate dynamic simple queue entries will be added for IPv6 and IPv4.
If allow-dual-stack-queue
is enabled, then a single dynamic simple queue entry will be created containing both IPv4 and IPv6 addresses:
[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
RADIUS Support
Since RouterOS v6.43 it is possible to use RADIUS to assign a rate-limit per lease, to do so you need to pass the Mikrotik-Rate-Limit attribute from your RADIUS Server for your lease. To achieve this you first need to set your DHCPv4 Server to use RADIUS for assigning leases. Below is an example how to set it up:
/radius add address=10.0.0.1 secret=VERYsecret123 service=dhcp /ip dhcp-server set dhcp1 use-radius=yes
After that you need to tell your RADIUS Server to pass the Mikrotik-Rate-Limit attribute. In case you are using FreeRADIUS with MySQL, then you need to add appropriate entries into radcheck and radreply tables for a MAC address, that is being used for your DHCPv4 Client. Below is an example for table entries:
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'),
Alerts
Sub-menu: /ip dhcp-server alert
To find any rogue DHCP servers as soon as they appear in your network, DHCP Alert tool can be used. It will monitor the ethernet interface for all DHCP replies and check if this reply comes from a valid DHCP server. If a reply from an unknown DHCP server is detected, alert gets triggered:
[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>
When the system alerts about a rogue DHCP server, it can execute a custom script.
As DHCP replies can be unicast, the 'rogue dhcp detector' may not receive any offer to other dhcp clients at all. To deal with this, the rogue dhcp detector acts as a dhcp client as well - it sends out dhcp discover requests once a minute
Properties
Property | Description |
---|---|
alert-timeout (none | time; Default: none) | Time after which alert will be forgotten. If after that time the same server is detected, new alert will be generated. If set to none timeout will never expire. |
interface (string; Default: ) | Interface, on which to run rogue DHCP server finder. |
on-alert (string; Default: ) | Script to run, when an unknown DHCP server is detected. |
valid-server (string; Default: ) | List of MAC addresses of valid DHCP servers. |
Read only properties
Property | Description |
---|---|
unknown-server (string) | List of MAC addresses of detected unknown DHCP servers. Server is removed from this list after alert-timeout |
Menu specific commands
Property | Description |
---|---|
reset-alert (id) | Clear all alerts on an interface |
DHCP Options
Sub-menu: /ip dhcp-server option
With the help of DHCP Option list, it is possible to define additional custom options for DHCP Server to advertise. Option precedence is as follows:
- radius,
- lease,
- server,
- network.
This is the order in which client option request will be filled in.
According to the DHCP protocol, a parameter is returned to the DHCP client only if it requests this parameter, specifying the respective code in DHCP request Parameter-List (code 55) attribute. If the code is not included in Parameter-List attribute, the DHCP server will not send it to the DHCP client.
Properties
Property | Description |
---|---|
code (integer:1..254; Default: ) | dhcp option code. All codes are available at http://www.iana.org/assignments/bootp-dhcp-parameters |
name (string; Default: ) | Descriptive name of the option |
value (string; Default: ) | Parameter's value.
RouterOS has predefined variables that can be used:
For example if HOSTNAME is 'kvm', then raw value will be 0x0176617264736b766d. |
raw-value (HEX string ) | Read only field which shows raw dhcp option value (the format actually sent out) |
Example
Classless Route
A classless route adds specified route in clients routing table. In our example, it will add
- dst-address=160.0.0.0/24 gateway=10.1.101.1
- dst-address=0.0.0.0/0 gateway=10.1.101.1
According to RFC 3442: The first part is the netmask ("18" = netmask /24). Second part is
significant part of destination network ("A00000" = 160.0.0). Third part is IP address of
gateway ("0A016501" = 10.1.101.1). Then There are parts of the default route, destination netmask (0x00 = 0.0.0.0/0) followed by default route (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
Result:
[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
Much more robust way would be to use built in variables, previous example can be rewritten as:
/ip dhcp-server option add name=classless code=121 value="0x18A00000\$(NETWORK_GATEWAY)0x00\$(NETWORK_GATEWAY)"
Auto Proxy Config
/ip dhcp-server option add code=252 name=auto-proxy-config value="'http://autoconfig.something.lv/wpad.dat'"
DHCP Option Sets
Sub-menu: /ip dhcp-server option sets
This menu allows combining multiple options in option sets, which later can be used to override default DHCP server option set.
Property | Description |
---|---|
name (string; Default: ) | Name of the option set. |
options (list; Default: ) | List of options defined in options menu. |
Vendor Classes
Since 6.45beta6 version RouterOS support vendor class id matcher. The vendor class is used by DHCP clients to optionally identify the vendor and configuration.
Property | Description |
---|---|
name (string; Default: ) | Self explained |
sever (string; Default: all) | Specific DHCP server to match |
address-pool (string; Default: ) | Address pool for a particular Vendor ID (VID) |
vid (string; Default: ) | Vendor Class ID matcher |
Example
In the following configuration example, we will give an IP address from a particular pool for an Android based mobile phone. We will use the RouterBOARD with a default configuration
/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
Configure vendor-class-id
matcher. DHCP servers configuration remains default
/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
Connect your mobile phone to the device to receive an IP address from 172.16.16.0 network
[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"
If you do not know your devices Vendor Class ID, you can turn on DHCP debug logs with /system logging add topics=dhcp
. Then in the logging entries, you will see 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
Configuration Examples
To simply configure DHCP server you can use a setup
command.
First, you configure IP address on the interface:
[admin@MikroTik] > /ip address add address=192.168.88.1/24 interface=ether3 disabled=no
Then you use setup
command which will automatically ask necessary parameters:
[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
That is all. You have configured an active DHCP server.
[ Top | Back to Content ]