12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
- <!ENTITY mdash "—" >
- ]>
- <chapter id="dhcp6">
- <title>The DHCPv6 Server</title>
- <section id="dhcp6-start-stop">
- <title>Starting and Stopping the DHCPv6 Server</title>
- <para>
- It is recommended that the Kea DHCPv6 server be started and stopped
- using <command>keactrl</command> (described in <xref linkend="keactrl"/>).
- However, it is also possible to run the server directly: it accepts
- the following command-line switches:
- </para>
- <itemizedlist>
- <listitem>
- <simpara>
- <command>-c <replaceable>file</replaceable></command> -
- specifies the configuration file. This is the only mandatory
- switch.</simpara>
- </listitem>
- <listitem>
- <simpara>
- <command>-d</command> - specifies whether the server
- logging should be switched to verbose mode. In verbose mode,
- the logging severity and debuglevel specified in the configuration
- file are ignored and "debug" severity and the maximum debuglevel
- (99) are assumed. The flag is convenient, for temporarily
- switching the server into maximum verbosity, e.g. when
- debugging.</simpara>
- </listitem>
- <listitem>
- <simpara>
- <command>-p <replaceable>port</replaceable></command> -
- specifies UDP port on which the server will listen. This is only
- useful during testing, as a DHCPv6 server listening on
- ports other than default DHCPv6 ports will not be able to
- handle regular DHCPv6 queries.</simpara>
- </listitem>
- <listitem>
- <simpara>
- <command>-v</command> - prints out Kea version and exits.
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- <command>-V</command> - prints out Kea extended version with
- additional parameters and exits.
- </simpara>
- </listitem>
- </itemizedlist>
- <para>
- When running in a console, the server can be shut down by
- pressing ctrl-c. It detects the key combination and shuts
- down gracefully.
- </para>
- <para>
- On start-up, the server will detect available network interfaces
- and will attempt to open UDP sockets on all interfaces
- mentioned in the configuration file.
- </para>
- <para>
- Since the DHCPv6 server opens privileged ports, it requires root
- access. Make sure you run this daemon as root.
- </para>
- </section>
- <section id="dhcp6-configuration">
- <title>DHCPv6 Server Configuration</title>
- <section>
- <title>Introduction</title>
- <para>
- This section explains how to configure the DHCPv6 server using the
- Kea configuration backend. (Kea configuration using any other
- backends is outside of scope of this document.) Before DHCPv6
- is started, its configuration file has to be created. The
- basic configuration looks as follows:
- <screen>
- {
- # DHCPv6 configuration starts on the next line
- "Dhcp6": {
- # First we set up global values
- "interfaces": [ "eth0" ],
- "renew-timer": 1000,
- "rebind-timer": 2000,
- "preferred-lifetime": 3000,
- "valid-lifetime": 4000,
- # Next we specify the type of lease database
- "lease-database": {
- "type": "memfile",
- "persist": true,
- "name": "/var/kea/dhcp6.leases"
- },
- # Finally, we list the subnets from which we will be leasing addresses.
- "subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- {
- "pool": "2001:db8:1::1-2001:db8:1::ffff"
- }
- ]
- }
- ]
- # DHCPv6 configuration ends with the next line
- }
- } </screen>
- </para>
- <para>The following paragraphs provide a brief overview of the parameters in
- the above example and
- their format. Subsequent sections of this chapter go into much greater detail
- for these and other parameters.</para>
- <para>The lines starting with a hash (#) are comments and are ignored by
- the server; they do not impact its
- operation in any way.</para>
- <para>The configuration starts in the first line with the initial
- opening curly bracket (or brace). Each configuration consists of
- one or more objects. In this specific example, we have only one
- object called Dhcp6. This is a simplified configuration, as usually
- there will be additional objects, like <command>Logging</command> or
- <command>DhcpDns</command>, but we omit them now for clarity. The Dhcp6
- configuration starts with the <command>"Dhcp6": {</command> line
- and ends with the corresponding closing brace (in the above example,
- the brace after the last comment). Everything defined between those
- lines is considered to be the Dhcp6 configuration.</para>
- <para>In the general case, the order in which those parameters appear does not
- matter. There are two caveats here though. The first one is to remember that
- the configuration file must be well formed JSON. That means that parameters
- for any given scope must be separated by a comma and there must not be a comma
- after the last parameter. When reordering a configuration file, keep in mind that
- moving a parameter to or from the last position in a given scope may require
- moving the comma as well. The second caveat is that it is uncommon — although
- legal JSON — to
- repeat the same parameter multiple times. If that happens, the last occurrence of a
- given parameter in a given scope is used while all previous instances are
- ignored. This is unlikely to cause any confusion as there are no real life
- reasons to keep multiple copies of the same parameter in your configuration
- file.</para>
- <para>Moving onto the DHCPv6 configuration elements,
- the line defining <command>interfaces</command> parameter specifies a list
- of network interfaces on which the server should listen.
- Lists are opened and closed with square brackets, with elements
- separated by commas. Had we wanted to listen on two interfaces, the line could
- look like this:
- <screen>
- "interfaces": [ "eth0", "eth1" ],
- </screen>
- As "<command>interfaces</command>" is not the last parameter in the
- configuration, a trailing comma is required.</para>
- <para>A number of other parameters follow. <command>valid-lifetime</command>
- defines for how long the addresses (leases) given out by the server are valid. If
- nothing changes, a client that got an address is allowed to use it for 4000
- seconds. (Note that integer numbers are specified as is, without any quotes
- around them.) The address will become deprecated in 3000 seconds (clients are
- allowed to keep old connections, but can't use this address for creating new
- connections). <command>renew-timer</command> and <command>
- rebind-timer</command> are values that define T1 and T2 timers that govern when
- the client will begin the renewal and rebind procedures.</para>
- <para>The next couple of lines define the lease database, the place where the server
- stores its lease information. This particular example tells the server to use
- <command>memfile</command>, which is the simplest (and fastest) database
- backend. It uses an in-memory database and stores leases on disk in a CSV
- file. This is a very simple configuration. Usually, lease database configuration
- is more extensive and contains additional parameters. Note that
- <command>lease-database</command>
- is an object and opens up a new scope, using an opening brace.
- Its parameters (just one in this example -- <command>type</command>)
- follow. Had there been more than one, they would be separated by commas. This
- scope is closed with a closing brace. As more parameters follow, a trailing
- comma is present.</para>
- <para>Finally, we need to define a list of IPv6 subnets. This is the
- most important DHCPv6 configuration structure as the server uses that
- information to process clients' requests. It defines all subnets from
- which the server is expected to receive DHCP requests. The subnets are
- specified with the <command>subnet6</command> parameter. It is a list,
- so it starts and ends with square brackets. Each subnet definition in
- the list has several attributes associated with it, so it is a structure
- and is opened and closed with braces. At minimum, a subnet definition
- has to have at least two parameters: <command>subnet</command> (that
- defines the whole subnet) and <command>pool</command> (which is a list of
- dynamically allocated pools that are governed by the DHCP server).</para>
- <para>The example contains a single subnet. Had more than one been defined,
- additional elements
- in the <command>subnet6</command> parameter would be specified and
- separated by commas. For example, to define two subnets, the following
- syntax would be used:
- <screen>
- "subnet6": [
- {
- "pools": [
- {
- "pool": "2001:db8:1::/112"
- }
- ],
- "subnet": "2001:db8:1::/64"
- },
- {
- "pools": [ { "pool": "2001:db8:2::1-2001:db8:2::ffff" } ],
- "subnet": "2001:db8:2::/64",
- "interface": "eth0"
- }
- ]
- </screen>
- Note that indentation is optional and is used for aesthetic purposes only.
- In some cases in may be preferable to use more compact notation.
- </para>
- <para>After all parameters are specified, we have two contexts open:
- global and Dhcp6, hence we need two closing curly brackets to close them.
- In a real life configuration file there most likely would be additional
- components defined such as Logging or DhcpDdns, so the closing brace would
- be followed by a comma and another object definition.</para>
- <para>Kea 0.9 does not have configuration syntax validation
- implemented yet. Such a feature is planned for the near future. For
- the time being, it is convenient to use on-line JSON validators and/or
- viewers to check whether the syntax is correct. One example of such a
- JSON validator is available at <ulink url="http://jsonviewer.stack.hu/"/>.
- </para>
- </section>
- <section>
- <title>Lease Storage</title>
- <para>All leases issued by the server are stored in the lease database.
- Currently there are three database backends available:
- memfile (which is the default backend), MySQL and PostgreSQL.</para>
- <section>
- <title>Memfile - Basic Storage for Leases</title>
- <para>The server is able to store lease data in different repositories. Larger
- deployments may elect to store leases in a database. <xref
- linkend="database-configuration6"/> describes this option. In typical
- smaller deployments though, the server will use a CSV file rather than a database to
- store lease information. As well as requiring less administration, an
- advantage of using a file for storage is that it
- eliminates a dependency on third-party database software.</para>
- <para>The configuration of the file backend (Memfile) is controlled through
- the Dhcp6/lease-database parameters. <!-- @todo: we don't have default
- parameters. Let's comment this out When default parameters are used, the
- Memfile backend will write leases to a disk in the
- [kea-install-dir]/var/kea/kea-leases4.csv. -->
- The following configuration sets the name of the lease file to
- <filename>/tmp/kea-leases6.csv</filename>:
- <screen>
- "Dhcp6": {
- "lease-database": {
- <userinput>"type": "memfile"</userinput>,
- <userinput>"persist": true</userinput>,
- <userinput>"name": "/tmp/kea-leases6.csv"</userinput>
- }
- ...
- }
- </screen>
- </para>
- <para>The "persist" parameter controls whether the leases are written to disk.
- It is strongly recommended that this parameter is set to true at all times
- during the normal operation of the server. (Not writing leases to disk will
- mean that if a server is restarted (e.g. after a power failure), it will not
- know what addresses have been assigned. As a result, it may hand out addresses
- to new clients that are already in use.)
- </para>
- </section>
- <section id="database-configuration6">
- <title>Database Configuration</title>
- <note>
- <para>Database access information must be configured for the DHCPv6 server,
- even if it has already been configured for the DHCPv4 server. The servers
- store their information independently, so each server can use a separate
- database or both servers can use the same database.</para>
- </note>
- <para>Database configuration is controlled through the Dhcp6/lease-database
- parameters. The type of the database must be set to "mysql" or "postgresql",
- e.g.
- <screen>
- "Dhcp6": { "lease-database": { <userinput>"type": "mysql"</userinput>, ... }, ... }
- </screen>
- Next, the name of the database is to hold the leases must be set: this is the
- name used when the lease database was created (see <xref linkend="mysql-database-create"/>
- or <xref linkend="pgsql-database-create"/>).
- <screen>
- "Dhcp6": { "lease-database": { <userinput>"name": "<replaceable>database-name</replaceable>" </userinput>, ... }, ... }
- </screen>
- If the database is located on a different system than the DHCPv6 server, the
- database host name must also be specified (although it should be noted that this
- configuration may have a severe impact on server performance):
- <screen>
- "Dhcp6": { "lease-database": { <userinput>"host": <replaceable>remote-host-name</replaceable>"</userinput>, ... }, ... }
- </screen>
- The usual state of affairs will be to have the database on the same machine as
- the DHCPv6 server. In this case, set the value to the empty string:
- <screen>
- "Dhcp6": { "lease-database": { <userinput>"host" : ""</userinput>, ... }, ... }
- </screen>
- </para>
- <para>Finally, the credentials of the account under which the server will
- access the database should be set:
- <screen>
- "Dhcp6": { "lease-database": { <userinput>"user": "<replaceable>user-name</replaceable>"</userinput>,
- <userinput>"password": "<replaceable>password</replaceable>"</userinput>,
- ... },
- ... }
- </screen>
- If there is no password to the account, set the password to the empty string
- "". (This is also the default.)</para>
- </section>
- </section>
- <section id="dhcp6-interface-selection">
- <title>Interface selection</title>
- <para>The DHCPv6 server has to be configured to listen on specific network
- interfaces. The simplest network interface configuration tells the server to
- listen on all available interfaces:
- <screen>
- "Dhcp6": { <userinput>"interfaces": ["*"]</userinput>, ... }</screen>
- The asterisk plays the role of a wildcard and means "listen on all interfaces".
- However, it is usually a good idea to explicitly specify interface names:
- <screen>
- "Dhcp6": { <userinput>"interfaces": [ "eth1", "eth3" ]</userinput>, ... }</screen>
- </para>
- <para>It is possible to use wildcard interface name (asterisk) concurrently
- with explicit interface names:
- <screen>
- "Dhcp6": { <userinput>"interfaces": [ "eth1", "eth3", "*" ]</userinput>, ... }</screen>
- It is anticipated that this will form of usage only be used where it is desired to
- temporarily override a list of interface names and listen on all interfaces.
- </para>
- </section>
- <section id="ipv6-subnet-id">
- <title>IPv6 Subnet Identifier</title>
- <para>
- The subnet identifier is a unique number associated with a particular subnet.
- In principle, it is used to associate clients' leases with respective subnets.
- When the subnet identifier is not specified for a subnet being configured, it will
- be automatically assigned by the configuration mechanism. The identifiers
- are assigned from 1 and are monotonically increased for each subsequent
- subnet: 1, 2, 3 ....
- </para>
- <para>
- If there are multiple subnets configured with auto-generated identifiers and
- one of them is removed, the subnet identifiers may be renumbered. For example:
- if there are four subnets and the third is removed the last subnet will be assigned
- the identifier that the third subnet had before removal. As a result, the leases
- stored in the lease database for subnet 3 are now associated with
- subnet 4, which may have unexpected consequences. In the future it is planned
- to implement a mechanism to preserve auto-generated subnet ids upon removal
- of one of the subnets. Currently, the only remedy for this issue is to
- manually specify a unique subnet identifier for each subnet.
- </para>
- <para>
- The following configuration will assign the specified subnet
- identifier to the newly configured subnet:
- <screen>
- "Dhcp6": {
- "subnet6": [
- "subnet": "2001:db8:1::/64",
- <userinput>"id": 1024</userinput>,
- ...
- ]
- }
- </screen>
- This identifier will not change for this subnet unless the "id" parameter is
- removed or set to 0. The value of 0 forces auto-generation of the subnet
- identifier.
- </para>
- <!-- @todo: describe whether database needs to be updated after changing
- id -->
- </section>
- <section id="dhcp6-unicast">
- <title>Unicast traffic support</title>
- <para>
- When the DHCPv6 server starts, by default it listens to the DHCP traffic
- sent to multicast address ff02::1:2 on each interface that it is
- configured to listen on (see <xref linkend="dhcp6-interface-selection"/>).
- In some cases it is useful to configure a server to handle incoming
- traffic sent to the global unicast addresses as well. The most common
- reason for that is to have relays send their traffic to the server
- directly. To configure the server to listen on a specific unicast address, the
- notation to specify interfaces has been extended. An interface name can be
- optionally followed by a slash, followed by the global unicast address on which
- the server should listen. This will be done in addition to normal
- link-local binding + listening on ff02::1:2 address. The sample commands
- listed below show how to listen on 2001:db8::1 (a global address)
- configured on the eth1 interface.
- </para>
- <para>
- <screen>
- "Dhcp6": {
- <userinput>"interfaces": [ "eth1/2001:db8::1"],</userinput>
- ...
- }</screen>
- When this configuration gets committed, the server will start to listen on
- eth1 on link-local address, multicast group (ff02::1:2) and 2001:db8::1.
- </para>
- <para>
- It is possible to mix interface names, wildcards and interface name/addresses
- on the Dhcp6/interface list. It is not possible to specify more than one
- unicast address on a given interface.
- </para>
- <para>
- Care should be taken to specify proper unicast addresses. The server will
- attempt to bind to those addresses specified, without any additional checks.
- This approach is selected on purpose, so the software can be used to
- communicate over uncommon addresses if the administrator so desires.
- </para>
- </section>
- <section id="dhcp6-address-config">
- <title>Subnet and Address Pool</title>
- <para>
- The essential role of a DHCPv6 server is address assignment. For this,
- the server has to be configured with at least one subnet and one pool of dynamic
- addresses to be managed. For example, assume that the server
- is connected to a network segment that uses the 2001:db8:1::/64
- prefix. The Administrator of that network has decided that addresses from range
- 2001:db8:1::1 to 2001:db8:1::ffff are going to be managed by the Dhcp6
- server. Such a configuration can be achieved in the following way:
- <screen>
- "Dhcp6": {
- <userinput>"subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- {
- "pool": "2001:db8:1::1-2001:db8:1::ffff"
- }
- ],
- ...
- }
- ]</userinput>
- }</screen>
- Note that subnet is defined as a simple string, but the pool parameter
- is actually a list of pools: for this reason, the pool definition is
- enclosed in square brackets, even though only one range of addresses
- is specified.</para>
- <para>Each <command>pool</command> is a structure that contains the
- parameters that describe a single pool. Currently there is only one
- parameter, <command>pool</command>, which gives the range of addresses
- in the pool. Additional parameters will be added in future releases of
- Kea.</para>
- <para>It is possible to define more than one pool in a
- subnet: continuing the previous example, further assume that
- 2001:db8:1:0:5::/80 should also be managed by the server. It could be written as
- 2001:db8:1:0:5:: to 2001:db8:1::5:ffff:ffff:ffff, but typing so many 'f's
- is cumbersome. It can be expressed more simply as 2001:db8:1:0:5::/80. Both
- formats are supported by Dhcp6 and can be mixed in the pool list.
- For example, one could define the following pools:
- <screen>
- "Dhcp6": {
- <userinput>"subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- { "pool": "2001:db8:1::1-2001:db8:1::ffff" },
- { "pool": "2001:db8:1:05::/80" }
- ]</userinput>,
- ...
- }
- ]
- }</screen>
- The number of pools is not limited, but for performance reasons it is recommended to
- use as few as possible.
- </para>
- <para>
- The server may be configured to serve more than one subnet. To add a second subnet,
- use a command similar to the following:
- <screen>
- "Dhcp6": {
- <userinput>"subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- { "pool": "2001:db8:1::1-2001:db8:1::ffff" }
- ]
- },
- {
- "subnet": "2001:db8:2::/64",
- "pools": [
- { "pool": "2001:db8:2::/64" }
- ]
- },
- </userinput>
- ...
- ]
- }</screen>
- In this example, we allow the server to
- dynamically assign all addresses available in the whole subnet. Although
- rather wasteful, it is certainly a valid configuration to dedicate the
- whole /64 subnet for that purpose. Note that the Kea server does not preallocate
- the leases, so there is no danger in using gigantic address pools.
- </para>
- <para>
- When configuring a DHCPv6 server using prefix/length notation, please pay
- attention to the boundary values. When specifying that the server can use
- a given pool, it will also be able to allocate the first (typically network
- address) address from that pool. For example for pool 2001:db8:2::/64 the
- 2001:db8:2:: address may be assigned as well. If you want to avoid this,
- use the "min-max" notation.
- </para>
- </section>
- <section>
- <!-- @todo: add real meat to the prefix delegation config this is just place holder stuff -->
- <title>Subnet and Prefix Delegation Pools</title>
- <para>
- Subnets may also be configured to delegate prefixes, as defined in
- <ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink>.
- A subnet may have one or more prefix delegation pools. Each pool has
- a prefixed address, which is specified as a prefix and a prefix length,
- as well as a delegated prefix length. <command>delegated-len</command>
- must not be shorter (that is it must be numerically greater or equal)
- than <command>prefix-len</command>.
- If both <command>delegated-len</command>
- and <command>prefix-len</command> are equal, the server will be able to
- delegate only one prefix. The delegated <command>prefix</command> does
- not have to match the <command>subnet</command> prefix.
- </para>
- <para> Below is a sample subnet configuration which enables prefix
- delegation for the subnet:
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "2001:d8b:1::/64",
- <userinput>"pd-pools": [
- {
- "prefix": "3000:1::",
- "prefix-len": 64,
- "delegated-len": 96
- }
- ]</userinput>
- }
- ],
- ...
- }</screen>
- </para>
- </section>
- <section id="dhcp6-std-options">
- <title>Standard DHCPv6 options</title>
- <para>
- One of the major features of a DHCPv6 server is to provide configuration
- options to clients. Although there are several options that require
- special behavior, most options are sent by the server only if the client
- explicitly requests them. The following example shows how to
- configure DNS servers, which is one of the most frequently used
- options. Numbers in the first column are added for easier reference and
- will not appear on screen. Options specified in this way are considered
- global and apply to all configured subnets.
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "dns-servers",
- "code": 23,
- "space": "dhcp6",
- "csv-format": true,
- "data": "2001:db8::cafe, 2001:db8::babe"</userinput>
- },
- ...
- ]
- }
- </screen>
- </para>
- <para>
- The <command>option-data></command> line creates a new entry in
- the option-data table. This table contains
- information on all global options that the server is supposed to configure
- in all subnets. The <command>name</command> line specifies the option name.
- (For a complete list
- of currently supported names, see <xref
- linkend="dhcp6-std-options-list"/>.) The next line specifies the option code,
- which must match one of the values from that list. The line beginning with
- <command>space</command> specifies the option space, which must always be set
- to "dhcp6" as these are standard DHCPv6 options. For other name spaces,
- including custom option spaces, see <xref
- linkend="dhcp6-option-spaces"/>. The next line specifies the format in
- which the data will be entered: use of CSV (comma separated values) is
- recommended. The <command>data</command> line gives the actual value to be sent to
- clients. Data is specified as normal text, with values separated by
- commas if more than one value is allowed.
- </para>
- <para>
- Options can also be configured as hexadecimal values. If "csv-format" is
- set to false, the option data must be specified as a string of hexadecimal
- numbers. The
- following commands configure the DNS-SERVERS option for all
- subnets with the following addresses: 2001:db8:1::cafe and
- 2001:db8:1::babe.
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "dns-servers",
- "code": 23,
- "space": "dhcp6",
- "csv-format": false,
- "data": "2001 0DB8 0001 0000 0000 0000 0000 CAFE
- 2001 0DB8 0001 0000 0000 0000 0000 BABE"</userinput>
- },
- ...
- ]
- }
- </screen>
- The value for the setting of the "data" element is split across two
- lines in this document for clarity: when entering the command, the
- whole string should be entered on the same line. Care should be taken
- to use proper encoding when using hexadecimal format as Kea's ability
- to validate data correctness in hexadecimal is limited.
- </para>
- <para>
- Most of the parameters in the "option-data" structure are optional and
- can be omitted in some circumstances as discussed in the
- <xref linkend="dhcp6-option-data-defaults"/>.
- </para>
- <para>
- It is possible to override options on a per-subnet basis. If
- clients connected to most of your subnets are expected to get the
- same values of a given option, you should use global options: you
- can then override specific values for a small number of subnets.
- On the other hand, if you use different values in each subnet,
- it does not make sense to specify global option values
- (Dhcp6/option-data), rather you should set only subnet-specific values
- (Dhcp6/subnet[X]/option-data[Y]).
- </para>
- <para>
- The following commands override the global
- DNS servers option for a particular subnet, setting a single DNS
- server with address 2001:db8:1::3.
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- <userinput>"option-data": [
- {
- "name": "dns-servers",
- "code": 23,
- "space": "dhcp6",
- "csv-format": true,
- "data": "2001:db8:1::3"
- },
- ...
- ]</userinput>,
- ...
- },
- ...
- ],
- ...
- }
- </screen>
- </para>
- <para>
- The currently supported standard DHCPv6 options are
- listed in <xref linkend="dhcp6-std-options-list"/>.
- The "Name" and "Code"
- are the values that should be used as a name in the option-data
- structures. "Type" designates the format of the data: the meanings of
- the various types is given in <xref linkend="dhcp-types"/>.
- </para>
- <para>
- Some options are designated as arrays, which means that more than one
- value is allowed in such an option. For example the option dns-servers
- allows the specification of more than one IPv6 address, allowing
- clients to obtain the addresses of multiple DNS servers.
- </para>
- <!-- @todo: describe record types -->
- <para>
- The <xref linkend="dhcp6-custom-options"/> describes the configuration
- syntax to create custom option definitions (formats). It is generally not
- allowed to create custom definitions for standard options, even if the
- definition being created matches the actual option format defined in the
- RFCs. There is an exception from this rule for standard options for which
- Kea does not provide a definition yet. In order to use such options,
- a server administrator must create a definition as described in
- <xref linkend="dhcp6-custom-options"/> in the 'dhcp6' option space. This
- definition should match the option format described in the relevant
- RFC but the configuration mechanism would allow any option format as it has
- no means to validate the format at the moment.
- </para>
- <para>
- <table frame="all" id="dhcp6-std-options-list">
- <title>List of standard DHCPv6 options</title>
- <tgroup cols='4'>
- <colspec colname='name'/>
- <colspec colname='code' align='center'/>
- <colspec colname='type' align='center'/>
- <colspec colname='array' align='center'/>
- <thead>
- <row><entry>Name</entry><entry>Code</entry><entry>Type</entry><entry>Array?</entry></row>
- </thead>
- <tbody>
- <!-- Our engine uses those options on its own, admin must not configure them on his own
- <row><entry>clientid</entry><entry>1</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>serverid</entry><entry>2</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>ia-na</entry><entry>3</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>ia-ta</entry><entry>4</entry><entry>uint32</entry><entry>false</entry></row>
- <row><entry>iaaddr</entry><entry>5</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>oro</entry><entry>6</entry><entry>uint16</entry><entry>true</entry></row> -->
- <row><entry>preference</entry><entry>7</entry><entry>uint8</entry><entry>false</entry></row>
- <!-- Our engine uses those options on its own, admin must not configure them on his own
- <row><entry>elapsed-time</entry><entry>8</entry><entry>uint16</entry><entry>false</entry></row>
- <row><entry>relay-msg</entry><entry>9</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>auth</entry><entry>11</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>unicast</entry><entry>12</entry><entry>ipv6-address</entry><entry>false</entry></row>
- <row><entry>status-code</entry><entry>13</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>rapid-commit</entry><entry>14</entry><entry>empty</entry><entry>false</entry></row>
- <row><entry>user-class</entry><entry>15</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>vendor-class</entry><entry>16</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>vendor-opts</entry><entry>17</entry><entry>uint32</entry><entry>false</entry></row>
- <row><entry>interface-id</entry><entry>18</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>reconf-msg</entry><entry>19</entry><entry>uint8</entry><entry>false</entry></row>
- <row><entry>reconf-accept</entry><entry>20</entry><entry>empty</entry><entry>false</entry></row> -->
- <row><entry>sip-server-dns</entry><entry>21</entry><entry>fqdn</entry><entry>true</entry></row>
- <row><entry>sip-server-addr</entry><entry>22</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>dns-servers</entry><entry>23</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>domain-search</entry><entry>24</entry><entry>fqdn</entry><entry>true</entry></row>
- <!-- <row><entry>ia-pd</entry><entry>25</entry><entry>record</entry><entry>false</entry></row> -->
- <!-- <row><entry>iaprefix</entry><entry>26</entry><entry>record</entry><entry>false</entry></row> -->
- <row><entry>nis-servers</entry><entry>27</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>nisp-servers</entry><entry>28</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>nis-domain-name</entry><entry>29</entry><entry>fqdn</entry><entry>true</entry></row>
- <row><entry>nisp-domain-name</entry><entry>30</entry><entry>fqdn</entry><entry>true</entry></row>
- <row><entry>sntp-servers</entry><entry>31</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>information-refresh-time</entry><entry>32</entry><entry>uint32</entry><entry>false</entry></row>
- <row><entry>bcmcs-server-dns</entry><entry>33</entry><entry>fqdn</entry><entry>true</entry></row>
- <row><entry>bcmcs-server-addr</entry><entry>34</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>geoconf-civic</entry><entry>36</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>remote-id</entry><entry>37</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>subscriber-id</entry><entry>38</entry><entry>binary</entry><entry>false</entry></row>
- <row><entry>client-fqdn</entry><entry>39</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>pana-agent</entry><entry>40</entry><entry>ipv6-address</entry><entry>true</entry></row>
- <row><entry>new-posix-timezone</entry><entry>41</entry><entry>string</entry><entry>false</entry></row>
- <row><entry>new-tzdb-timezone</entry><entry>42</entry><entry>string</entry><entry>false</entry></row>
- <row><entry>ero</entry><entry>43</entry><entry>uint16</entry><entry>true</entry></row>
- <row><entry>lq-query</entry><entry>44</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>client-data</entry><entry>45</entry><entry>empty</entry><entry>false</entry></row>
- <row><entry>clt-time</entry><entry>46</entry><entry>uint32</entry><entry>false</entry></row>
- <row><entry>lq-relay-data</entry><entry>47</entry><entry>record</entry><entry>false</entry></row>
- <row><entry>lq-client-link</entry><entry>48</entry><entry>ipv6-address</entry><entry>true</entry></row>
- </tbody>
- </tgroup>
- </table>
- </para>
- </section>
- <section id="dhcp6-custom-options">
- <title>Custom DHCPv6 options</title>
- <para>It is also possible to define options other than the standard ones.
- Assume that we want to define a new DHCPv6 option called "foo" which will have
- code 100 and will convey a single unsigned 32 bit integer value. We can define
- such an option by using the following commands:
- <screen>
- "Dhcp6": {
- "option-def": [
- {
- <userinput>"name": "foo",
- "code": 100,
- "type": "uint32",
- "array": false,
- "record-types": "",
- "space": "dhcp6",
- "encapsulate": ""</userinput>
- }, ...
- ],
- ...
- }
- </screen>
- The "false" value of the "array" parameter determines that the option does
- NOT comprise an array of "uint32" values but rather a single value. Two
- other parameters have been left blank: "record-types" and "encapsulate".
- The former specifies the comma separated list of option data fields if the
- option comprises a record of data fields. The "record-fields" value should
- be non-empty if the "type" is set to "record". Otherwise it must be left
- blank. The latter parameter specifies the name of the option space being
- encapsulated by the particular option. If the particular option does not
- encapsulate any option space it should be left blank. Note that the above
- set of comments define the format of the new option and do not set its
- values.
- </para>
- <para>Once the new option format is defined, its value is set
- in the same way as for a standard option. For example the following
- commands set a global value that applies to all subnets.
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "foo",
- "code": 100,
- "space": "dhcp6",
- "csv-format": true,
- "data": "12345"</userinput>
- }, ...
- ],
- ...
- }
- </screen>
- </para>
- <para>New options can take more complex forms than simple use of
- primitives (uint8, string, ipv6-address etc): it is possible to
- define an option comprising a number of existing primitives.
- </para>
- <para>
- Assume we want to define a new option that will consist of an IPv6
- address, followed by an unsigned 16 bit integer, followed by a
- boolean value, followed by a text string. Such an option could
- be defined in the following way:
- <screen>
- "Dhcp6": {
- "option-def": [
- {
- <userinput>"name": "bar",
- "code": 101,
- "space": "dhcp6",
- "type": "record",
- "array": false,
- "record-types": "ipv4-address, uint16, boolean, string",
- "encapsulate": ""</userinput>
- }, ...
- ],
- ...
- }
- </screen>
- The "type" is set to "record" to indicate that the option contains
- multiple values of different types. These types are given as a comma-separated
- list in the "record-types" field and should be those listed in <xref linkend="dhcp-types"/>.
- </para>
- <para>
- The values of the option are set as follows:
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "bar",
- "space": "dhcp6",
- "code": 101,
- "csv-format": true,
- "data": "2001:db8:1::10, 123, false, Hello World"</userinput>
- }
- ],
- ...
- }</screen>
- <command>csv-format</command> is set <command>true</command> to indicate
- that the <command>data</command> field comprises a command-separated list
- of values. The values in the "data" must correspond to the types set in
- the "record-types" field of the option definition.
- </para>
- <note>
- <para>In the general case, boolean values are specified as <command>true</command> or
- <command>false</command>, without quotes. Some specific boolean parameters may
- accept also <command>"true"</command>, <command>"false"</command>,
- <command>0</command>, <command>1</command>, <command>"0"</command> and
- <command>"1"</command>. Future Kea versions will accept all those values
- for all boolean parameters.</para>
- </note>
- </section>
- <section id="dhcp6-vendor-opts">
- <title>DHCPv6 vendor specific options</title>
- <para>
- Currently there are three option spaces defined: dhcp4 (to be used
- in DHCPv4 daemon) and dhcp6 (for the DHCPv6 daemon); there is also
- vendor-opts-space, which is empty by default, but options can be
- defined in it. Those options are called vendor-specific information
- options. The following examples show how to define an option "foo"
- with code 1 that consists of an IPv6 address, an unsigned 16 bit integer
- and a string. The "foo" option is conveyed in a vendor specific
- information option. This option comprises a single uint32 value
- that is set to "12345". The sub-option "foo" follows the data
- field holding this value.
- <screen>
- "Dhcp6": {
- "option-def": [
- {
- <userinput>"name": "foo",
- "code": 1,
- "space": "vendor-encapsulated-options-space",
- "type": "record",
- "array": false,
- "record-types": "ipv6-address, uint16, string",
- "encapsulates": ""</userinput>
- }
- ],
- ...
- }</screen>
- (Note that the option space is set to <command>vendor-opts-space</command>.)
- Once the option format is defined, the next step is to define actual values
- for that option:
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "foo"
- "space": "vendor-encapsulated-options-space",
- "code": 1,
- "csv-format": true,
- "data": "2001:db8:1::10, 123, Hello World"</userinput>
- },
- ...
- ],
- ...
- }</screen>
- We should also define values for the vendor-opts, that will convey our
- option foo.
- <screen>
- "Dhcp6": {
- "option-data": [
- ...,
- {
- <userinput>"name": "vendor-encapsulated-options"
- "space": "dhcp6",
- "code": 17,
- "csv-format": true,
- "data": "12345"</userinput>
- }
- ],
- ...
- }</screen>
- </para>
- </section>
- <section id="dhcp6-option-spaces">
- <title>Nested DHCPv6 options (custom option spaces)</title>
- <para>It is sometimes useful to define completely new option
- spaces. This is useful if the user wants his new option to
- convey sub-options that use a separate numbering scheme, for
- example sub-options with codes 1 and 2. Those option codes
- conflict with standard DHCPv6 options, so a separate option
- space must be defined.
- </para>
- <para>Note that it is not required to create a new option space when
- defining sub-options for a standard option because it is
- created by default if the standard option is meant to convey
- any sub-options (see <xref linkend="dhcp6-vendor-opts"/>).
- </para>
- <para>
- Assume that we want to have a DHCPv6 option called "container"
- with code 102 that conveys two sub-options with codes 1 and 2.
- First we need to define the new sub-options:
- <screen>
- "Dhcp6": {
- "option-def": [
- {
- <userinput>"name": "subopt1",
- "code": 1,
- "space": "isc",
- "type": "ipv6-address".
- "record-types": "",
- "array": false,
- "encapsulate ""
- },
- {
- "name": "subopt2",
- "code": 2,
- "space": "isc",
- "type": "string",
- "record-types": "",
- "array": false
- "encapsulate": ""</userinput>
- }
- ],
- ...
- }</screen>
- Note that we have defined the options to belong to a new option space
- (in this case, "isc").
- </para>
- <para>
- The next step is to define a regular DHCPv6 option and specify that it
- should include options from the isc option space:
- <screen>
- "Dhcp6": {
- "option-def": [
- ...,
- {
- <userinput>"name": "container",
- "code": 102,
- "space": "dhcp6",
- "type": "empty",
- "array": false,
- "record-types": "",
- "encapsulate": "isc"</userinput>
- }
- ],
- ...
- }</screen>
- The name of the option space in which the sub-options are defined is set in
- the <command>encapsulate</command> field. The <command>type</command> field
- is set to <command>empty</command> which limits this option to only carrying
- data in sub-options.
- </para>
- <para>
- Finally, we can set values for the new options:
- <screen>
- "Dhcp6": {
- "option-data": [
- {
- <userinput>"name": "subopt1",
- "space": "isc",
- "code": 1,
- "csv-format": true,
- "data": "2001:db8::abcd"</userinput>
- },
- }
- <userinput>"name": "subopt2",
- "space": "isc",
- "code": 2,
- "csv-format": true,
- "data": "Hello world"</userinput>
- },
- {
- <userinput>"name": "container",
- "space": "dhcp6",
- "code": 102,
- "csv-format": true,
- "data": ""</userinput>
- }
- ],
- ...
- }
- </screen>
- Even though the "container" option does not carry any data except
- sub-options, the "data" field must be explicitly set to an empty value.
- This is required because in the current version of Kea, the default
- configuration values are not propagated to the configuration parsers: if the
- "data" is not set the parser will assume that this parameter is not
- specified and an error will be reported.
- </para>
-
- <para>Note that it is possible to create an option which carries some data
- in addition to the sub-options defined in the encapsulated option space.
- For example, if the "container" option from the previous example was
- required to carry an uint16 value as well as the sub-options, the "type"
- value would have to be set to "uint16" in the option definition. (Such an
- option would then have the following data structure: DHCP header, uint16
- value, sub-options.) The value specified with the "data" parameter — which
- should be a valid integer enclosed in quotes, e.g. "123" — would then be
- assigned to the uint16 field in the "container" option.
- </para>
- </section>
- <section id="dhcp6-option-data-defaults">
- <title>Unspecified parameters for DHCPv6 option configuration</title>
- <para>In many cases it is not required to specify all parameters for
- an option configuration and the default values can be used. However, it is
- important to understand the implications of not specifing some of them
- as it may result in configuration errors. The list below explains
- the behavior of the server when a particular parameter is not explicitly
- specified:
- <itemizedlist>
- <listitem>
- <simpara><command>name</command> - the server requires an option name or
- option code to identify an option. If this parameter is unspecified, the
- option code must be specified.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>code</command> - the server requires an option name or
- option code to identify an option. This parameter may be left unspecified if
- the <command>name</command> parameter is specified. However, this also
- requires that the particular option has its definition (it is either a
- standard option or an administrator created a definition for the option
- using an 'option-def' structure), as the option definition associates an
- option with a particular name. It is possible to configure an option
- for which there is no definition (unspecified option format).
- Configuration of such options requires the use of option code.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>space</command> - if the option space is unspecified it
- will default to 'dhcp6' which is an option space holding DHCPv6 standard
- options.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>data</command> - if the option data is unspecified it
- defaults to an empty value. The empty value is mostly used for the
- options which have no payload (boolean options), but it is legal to specify
- empty values for some options which carry variable length data and which
- spec allows for the length of 0. For such options, the data parameter
- may be omitted in the configuration.</simpara>
- </listitem>
- <listitem>
- <simpara><command>csv-format</command> - if this value is not specified
- and the definition for the particular option exists, the server will assume
- that the option data is specified as a list of comma separated values to be
- assigned to individual fields of the DHCP option. If the definition
- does not exist for this option, the server will assume that the data
- parameter contains the option payload in the binary format (represented
- as a string of hexadecimal digits). Note that not specifying this
- parameter doesn't imply that it defaults to a fixed value, but
- the configuration data interpretation also depends on the presence
- of the option definition. An administrator must be aware if the
- definition for the particular option exists when this parameter
- is not specified. It is generally recommended to not specify this
- parameter only for the options for which the definition exists, e.g.
- standard options. Setting <command>csv-format</command> to an explicit
- value will cause the server to strictly check the format of the option
- data specified.
- </simpara>
- </listitem>
- </itemizedlist>
- </para>
- </section>
- <section id="dhcp6-config-subnets">
- <title>IPv6 Subnet Selection</title>
- <para>
- The DHCPv6 server may receive requests from local (connected to the
- same subnet as the server) and remote (connecting via relays) clients.
- As the server may have many subnet configurations defined, it must select
- an appropriate subnet for a given request.
- </para>
- <para>
- The server can not assume which of the configured subnets are local. In IPv4
- it is possible as there is a reasonable expectation that the
- server will have a (global) IPv4 address configured on the interface,
- and can use that information to detect whether a subnet is local or
- not. That assumption is not true in IPv6, the DHCPv6 server must be able
- to operate while only having link-local addresses. Therefore an optional
- "interface" parameter is available within a subnet definition
- to designate that a given subnet is local, i.e. reachable directly over
- the specified interface. For example the server that is intended to serve
- a local subnet over eth0 may be configured as follows:
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "2001:db8:beef::/48",
- "pools": [
- {
- "pool": "2001:db8:beef::/48"
- }
- ],
- <userinput>"interface": "eth0"</userinput>
- }
- ],
- ...
- }
- </screen>
- </para>
- </section>
- <section id="dhcp6-relays">
- <title>DHCPv6 Relays</title>
- <para>
- A DHCPv6 server with multiple subnets defined must select the
- appropriate subnet when it receives a request from a client. For clients
- connected via relays, two mechanisms are used:
- </para>
- <para>
- The first uses the linkaddr field in the RELAY_FORW message. The name
- of this field is somewhat misleading in that it does not contain a link-layer
- address: instead, it holds an address (typically a global address) that is
- used to identify a link. The DHCPv6 server checks if the address belongs
- to a defined subnet and, if it does, that subnet is selected for the client's
- request.
- </para>
- <para>
- The second mechanism is based on interface-id options. While forwarding a client's
- message, relays may insert an interface-id option into the message that
- identifies the interface on the relay that received the message. (Some
- relays allow configuration of that parameter, but it is sometimes
- hardcoded and may range from the very simple (e.g. "vlan100") to the very cryptic:
- one example seen on real hardware was "ISAM144|299|ipv6|nt:vp:1:110"). The
- server can use this information to select the appropriate subnet.
- The information is also returned to the relay which then knows the
- interface to use to transmit the response to the client. In order for
- this to work successfully, the relay interface IDs must be unique within
- the network and the server configuration must match those values.
- </para>
- <para>
- When configuring the DHCPv6 server, it should be noted that two
- similarly-named parameters can be configured for a subnet:
- <itemizedlist>
- <listitem><simpara>
- "interface" defines which local network interface can be used
- to access a given subnet.
- </simpara></listitem>
- <listitem><simpara>
- "interface-id" specifies the content of the interface-id option
- used by relays to identify the interface on the relay to which
- the response packet is sent.
- </simpara></listitem>
- </itemizedlist>
- The two are mutually exclusive: a subnet cannot be both reachable locally
- (direct traffic) and via relays (remote traffic). Specifying both is a
- configuration error and the DHCPv6 server will refuse such a configuration.
- </para>
- <para>
- To specify interface-id with value "vlan123", the following commands can
- be used:
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "2001:db8:beef::/48",
- "pools": [
- {
- "pool": "2001:db8:beef::/48"
- }
- ],
- <userinput>"interface-id": "vlan123"</userinput>
- }
- ],
- ...
- }
- </screen>
- </para>
- </section>
- <section id="dhcp6-client-classifier">
- <title>Client Classification in DHCPv6</title>
- <note>
- <para>
- DHCPv6 server has been extended to support limited client classification.
- Although the current capability is modest, it is expected to be expanded
- in the future. It is envisaged that the majority of client classification
- extensions will be using hooks extensions.
- </para>
- </note>
- <para>In certain cases it is useful to differentiate between different types
- of clients and treat them differently. The process of doing classification
- is conducted in two steps. The first step is to assess an incoming packet and
- assign it to zero or more classes. This classification is currently simple,
- but is expected to grow in capability soon. Currently the server checks whether
- the incoming packet includes vendor class option (16). If it has, the content
- of that option is prepended with "VENDOR_CLASS_" then it is interpreted as a
- class. For example, modern cable modems will send this option with value
- "docsis3.0" and as a result the packet will belong to class
- "VENDOR_CLASS_docsis3.0".
- </para>
- <para>It is envisaged that the client classification will be used for changing
- behavior of almost any part of the DHCP engine processing, including assigning
- leases from different pools, assigning different option (or different values of
- the same options) etc. For now, there is only one mechanism that is taking
- advantage of client classification: subnet selection.</para>
- <para>
- Kea can be instructed to limit access to given subnets based on class information.
- This is particularly useful for cases where two types of devices share the
- same link and are expected to be served from two different subnets. The
- primary use case for such a scenario are cable networks. There are two
- classes of devices: the cable modem itself, which should be handed a lease
- from subnet A and all other devices behind modems that should get a lease
- from subnet B. That segregation is essential to prevent overly curious
- users from playing with their cable modems. For details on how to set up
- class restrictions on subnets, see <xref linkend="dhcp6-subnet-class"/>.
- </para>
- </section>
- <section id="dhcp6-subnet-class">
- <title>Limiting access to IPv6 subnet to certain classes</title>
- <para>
- In certain cases it beneficial to restrict access to certain subnets
- only to clients that belong to a given class. For details on client
- classes, see <xref linkend="dhcp6-client-classifier"/>. This is an
- extension of a previous example from <xref linkend="dhcp6-address-config"/>.
- Let's assume that the server is connected to a network segment that uses
- the 2001:db8:1::/64 prefix. The Administrator of that network has
- decided that addresses from range 2001:db8:1::1 to 2001:db8:1::ffff are
- going to be managed by the Dhcp6 server. Only clients belonging to the
- eRouter1.0 client class are allowed to use that pool. Such a
- configuration can be achieved in the following way:
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- {
- "pool": "2001:db8:1::-2001:db8:1::ffff"
- }
- ],
- <userinput>"client-class": "VENDOR_CLASS_eRouter1.0"</userinput>
- }
- ],
- ...
- }
- </screen>
- </para>
- <para>
- Care should be taken with client classification as it is easy for
- clients that do not meet class criteria to be denied any service altogether.
- </para>
- </section>
- <section id="dhcp6-ddns-config">
- <title>Configuring DHCPv6 for DDNS</title>
- <para>
- As mentioned earlier, kea-dhcp6 can be configured to generate requests to
- the DHCP-DDNS server (referred to here as "D2") to update
- DNS entries. These requests are known as NameChangeRequests or NCRs.
- Each NCR contains the following information:
- <orderedlist>
- <listitem><para>
- Whether it is a request to add (update) or remove DNS entries
- </para></listitem>
- <listitem><para>
- Whether the change requests forward DNS updates (AAAA records), reverse
- DNS updates (PTR records), or both.
- </para></listitem>
- <listitem><para>
- The FQDN, lease address, and DHCID
- </para></listitem>
- </orderedlist>
- The parameters controlling the generation of NCRs for submission to D2
- are contained in the "dhcp-ddns" section of kea-dhcp6
- configuration. The default values for this section appears as follows:
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"enable-updates": true,
- "server-ip": "127.0.0.1",
- "server-port": 53001,
- "sender-ip": "",
- "sender-port": 0,
- "max-queue-size": 1024,
- "ncr-protocol": "UDP",
- "ncr-format": "JSON",
- "override-no-update": false,
- "override-client-update": false,
- "replace-client-name": false,
- "generated-prefix": "myhost",
- "qualifying-suffix": "example.com"</userinput>
- },
- ...
- }
- </screen>
- </para>
- <section id="dhcpv6-d2-io-config">
- <title>DHCP-DDNS Server Connectivity</title>
- <para>
- In order for NCRs to reach the D2 server, kea-dhcp6 must be able
- to communicate with it. kea-dhcp6 uses the following configuration
- parameters to control how it communications with D2:
- <itemizedlist>
- <listitem><simpara>
- <command>enable-updates</command> - determines whether or not kea-dhcp6 will
- generate NCRs. If missing, this value is assumed to be false hence DDNS updates
- are disabled. To enable DDNS updates set this value to true:
- </simpara></listitem>
- <listitem><simpara>
- <command>server-ip</command> - IP address on which D2 listens for requests. The default is
- the local loopback interface at address 127.0.0.1. You may specify
- either an IPv4 or IPv6 address.
- </simpara></listitem>
- <listitem><simpara>
- <command>server-port</command> - port on which D2 listens for requests. The default value
- is 53001.
- </simpara></listitem>
- <listitem><simpara>
- <command>sender-ip</command> - IP address which kea-dhcp6 should use to send requests to D2.
- The default value is blank which instructs kea-dhcp6 to select a suitable
- address.
- </simpara></listitem>
- <listitem><simpara>
- <command>sender-port</command> - port which kea-dhcp6 should use to send requests to D2. The
- default value of 0 instructs kea-dhcp6 to select a suitable port.
- </simpara></listitem>
- <listitem><simpara>
- <command>max-queue-size</command> - maximum number of requests allowed to queue waiting to
- be sent to D2. This value guards against requests accumulating
- uncontrollably if they are being generated faster than they can be
- delivered. If the number of requests queued for transmission reaches
- this value, DDNS updating will be turned off until the queue backlog has
- been sufficiently reduced. The intent is to allow kea-dhcp6 to
- continue lease operations. The default value is 1024.
- </simpara></listitem>
- <listitem><simpara>
- <command>ncr-format</command> - Socket protocol use when sending requests to D2. Currently
- only UDP is supported. TCP may be available in an upcoming release.
- </simpara></listitem>
- <listitem><simpara>
- <command>ncr-protocol</command> - Packet format to use when sending requests to D2.
- Currently only JSON format is supported. Other formats may be available
- in future releases.
- </simpara></listitem>
- </itemizedlist>
- By default, kea-dhcp-ddns is assumed to running on the same machine as kea-dhcp6, and
- all of the default values mentioned above should be sufficient.
- If, however, D2 has been configured to listen on a different address or
- port, these values must altered accordingly. For example, if D2 has been
- configured to listen on 2001:db8::5 port 900, the following commands
- would be required:
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"server-ip": "2001:db8::5",
- "server-port": 900</userinput>,
- ...
- },
- ...
- }
- </screen>
- </para>
- </section>
- <section id="dhcpv6-d2-rules-config">
- <title>When does kea-dhcp6 generate DDNS request</title>
- <para>kea-dhcp6 follows the behavior prescribed for DHCP servers in
- <ulink url="http://tools.ietf.org/html/rfc4704">RFC 4704</ulink>.
- It is important to keep in mind that kea-dhcp6 provides the initial
- decision making of when and what to update and forwards that
- information to D2 in the form of NCRs. Carrying out the actual
- DNS updates and dealing with such things as conflict resolution
- are the purview of D2 (<xref linkend="dhcp-ddns-server"/>).</para>
- <para>
- This section describes when kea-dhcp6 will generate NCRs and the
- configuration parameters that can be used to influence this decision.
- It assumes that the "enable-updates" parameter is true.
- </para>
- <note>
- <para>
- Currently the interface between kea-dhcp6 and D2 only supports requests
- which update DNS entries for a single IP address. If a lease grants
- more than one address, kea-dhcp6 will create the DDNS update request for
- only the first of these addresses. Support for multiple address
- mappings may be provided in a future release.
- </para>
- </note>
- <para>
- In general, kea-dhcp6 will generate DDNS update requests when:
- <orderedlist>
- <listitem><para>
- A new lease is granted in response to a DHCP REQUEST
- </para></listitem>
- <listitem><para>
- An existing lease is renewed but the FQDN associated with it has
- changed.
- </para></listitem>
- <listitem><para>
- An existing lease is released in response to a DHCP RELEASE
- </para></listitem>
- </orderedlist>
- In the second case, lease renewal, two DDNS requests will be issued: one
- request to remove entries for the previous FQDN and a second request to
- add entries for the new FQDN. In the last case, a lease release, a
- single DDNS request to remove its entries will be made. The decision
- making involved when granting a new lease is more involved and is
- discussed next.
- </para>
- <para>
- kea-dhcp6 will generate a DDNS update request only if the DHCP REQUEST
- contains the FQDN option (code 39). By default kea-dhcp6 will
- respect the FQDN N and S flags specified by the client as shown in the
- following table:
- </para>
- <table id="dhcp6-fqdn-flag-table">
- <title>Default FQDN Flag Behavior</title>
- <tgroup cols='4' align='left'>
- <colspec colname='cflags'/>
- <colspec colname='meaning'/>
- <colspec colname='response'/>
- <colspec colname='sflags'/>
- <thead>
- <row>
- <entry>Client Flags:N-S</entry>
- <entry>Client Intent</entry>
- <entry>Server Response</entry>
- <entry>Server Flags:N-S-O</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0-0</entry>
- <entry>
- Client wants to do forward updates, server should do reverse updates
- </entry>
- <entry>Server generates reverse-only request</entry>
- <entry>1-0-0</entry>
- </row>
- <row>
- <entry>0-1</entry>
- <entry>Server should do both forward and reverse updates</entry>
- <entry>Server generates request to update both directions</entry>
- <entry>0-1-0</entry>
- </row>
- <row>
- <entry>1-0</entry>
- <entry>Client wants no updates done</entry>
- <entry>Server does not generate a request</entry>
- <entry>1-0-0</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- The first row in the table above represents "client delegation". Here
- the DHCP client states that it intends to do the forward DNS updates and
- the server should do the reverse updates. By default, kea-dhcp6 will honor
- the client's wishes and generate a DDNS request to D2 to update only
- reverse DNS data. The parameter, "override-client-update", can be used
- to instruct the server to override client delegation requests. When
- this parameter is true, kea-dhcp6 will disregard requests for client
- delegation and generate a DDNS request to update both forward and
- reverse DNS data. In this case, the N-S-O flags in the server's
- response to the client will be 0-1-1 respectively.
- </para>
- <para>
- (Note that the flag combination N=1, S=1 is prohibited according to
- RFC 4702. If such a combination is received from the client, the packet
- will be dropped by kea-dhcp6.)
- </para>
- <para>
- To override client delegation, issue the following commands:
- </para>
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"override-client-update": true</userinput>,
- ...
- },
- ...
- }
- </screen>
- <para>
- The third row in the table above describes the case in which the client
- requests that no DNS updates be done. The parameter, "override-no-update",
- can be used to instruct the server to disregard the client's wishes. When
- this parameter is true, kea-dhcp6 will generate DDNS update requests to
- kea-dhcp-ddns even if the client requests no updates be done. The N-S-O
- flags in the server's response to the client will be 0-1-1.
- </para>
- <para>
- To override client delegation, issue the following commands:
- </para>
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"override-no-update": true</userinput>,
- ...
- },
- ...
- }
- </screen>
- </section>
- <section id="dhcpv6-fqdn-name-generation">
- <title>kea-dhcp6 name generation for DDNS update requests</title>
- <para>Each NameChangeRequest must of course include the fully qualified domain
- name whose DNS entries are to be affected. kea-dhcp6 can be configured to
- supply a portion or all of that name based upon what it receives from
- the client in the DHCP REQUEST.</para>
- <para>The rules for determining the FQDN option are as follows:
- <orderedlist>
- <listitem><para>
- If configured to do so ignore the REQUEST contents and generate a
- FQDN using a configurable prefix and suffix.
- </para></listitem>
- <listitem><para>
- Otherwise, using the domain name value from the client FQDN option as
- the candidate name:
- <orderedlist>
- <listitem><para>
- If the candidate name is a fully qualified domain name then use it.
- </para></listitem>
- <listitem><para>
- If the candidate name is a partial (i.e. unqualified) name then
- add a configurable suffix to the name and use the result as the FQDN.
- </para></listitem>
- <listitem><para>
- If the candidate name is a empty then generate a FQDN using a
- configurable prefix and suffix.
- </para></listitem>
- </orderedlist>
- </para></listitem>
- </orderedlist>
- To instruct kea-dhcp6 to always generate a FQDN, set the parameter
- "replace-client-name" to true:
- </para>
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"replace-client-name": true</userinput>,
- ...
- },
- ...
- }
- </screen>
- <para>
- The prefix used when generating a FQDN is specified by the
- "generated-prefix" parameter. The default value is "myhost". To alter
- its value, simply set it to the desired string:
- </para>
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"generated-prefix": "another.host"</userinput>,
- ...
- },
- ...
- }
- </screen>
- <para>
- The suffix used when generating a FQDN or when qualifying a partial name
- is specified by the <command>qualifying-suffix</command> parameter. There
- is no default value. To set its value simply set it to the desired string:
- </para>
- <screen>
- "Dhcp6": {
- "dhcp-ddns": {
- <userinput>"qualifying-suffix": "foo.example.org"</userinput>,
- ...
- },
- ...
- }
- </screen>
- </section>
- <para>
- When qualifying a partial name, kea-dhcp6 will construct a name with the
- format:
- </para>
- <para>
- [candidate-name].[qualifying-suffix].
- </para>
- <para>
- where candidate-name is the partial name supplied in the REQUEST.
- For example, if FQDN domain name value was "some-computer" and assuming
- the default value for qualifying-suffix, the generated FQDN would be:
- </para>
- <para>
- some-computer.example.com.
- </para>
- <para>
- When generating the entire name, kea-dhcp6 will construct name of the
- format:
- </para>
- <para>
- [generated-prefix]-[address-text].[qualifying-suffix].
- </para>
- <para>
- where address-text is simply the lease IP address converted to a
- hyphenated string. For example, if lease address is 3001:1::70E and
- default values are used for
- <command>generated-prefix</command> and <command>qualifying-suffix</command>, the
- generated FQDN would be:
- </para>
- <para>
- myhost-3001-1--70E.example.com.
- </para>
- </section>
- </section>
- <!-- Host reservation is a large topic. There will be many subsections,
- so it should be a section on its own. -->
- <section id="host-reservation-v6">
- <title>Host reservation in DHCPv6</title>
- <para>There are many cases where it is useful to provide a configuration on
- a per host basis. The most obvious one is to reserve specific, static IPv6
- address or prefix for exclusive use by a given client ‐ returning
- client will get the same address or prefix every time and other clients will
- never get that address. Other example may be a host that has specific
- requirements, e.g. a printer that needs additional options or a cable modem
- need specific parameter. Yes another possible use case for host reservation
- is to define unique host names for hosts. Although not all of those
- scenarios are possible yet, Kea software will support them in the near
- future.</para>
- <para>Hosts are defined as parameters for each subnet. Each host
- can be identified by either DUID or its hardware/MAC address. See
- <xref linkend="mac-in-dhcpv6"/> for details. There is an optional
- <command>reservations</command> array in the
- <command>Subnet6</command> structure. Each element in that array
- is a structure, that holds information about a single host. In
- particular, such a structure has to have an indentifer that
- uniquely identifies a host. In DHCPv6 context, such an identifier
- is a hardware (MAC) address or a DUID. Also, either one or more
- addresses or prefixes should be specified. It is possible to
- specify a hostname. Additional capabilities are planed.</para>
- <para>The following example shows how to reserve addresses and prefixes
- for specific hosts:
- <screen>
- "subnet6": [
- {
- "subnet": "2001:db8:1::/48",
- "pools": [ { "pool": "2001:db8:1::/80" } ],
- "pd-pools": [
- {
- "prefix": "2001:db8:1:8000::",
- "prefix-len": 56,
- "delegated-len": 64
- }
- ],
- <userinput>"reservations": [
- {
- "duid": "01:02:03:04:05:0A:0B:0C:0D:0E",
- "ip-addresses": [ "2001:db8:1::100" ]
- },
- {
- "hw-address": "00:01:02:03:04:05",
- "ip-addresses": [ "2001:db8:1::101" ]
- },
- {
- "duid": "01:02:03:04:05:06:07:08:09:0A",
- "ip-addresses": [ "2001:db8:1::102" ],
- "prefixes": [ "2001:db8:2:abcd::/64" ],
- "hostname": "foo.example.com"
- }
- ]</userinput>
- }
- ]
- </screen>
- This example makes 3 reservations. The first one reserves 2001:db8:1::100 address
- for the client using DUID 01:02:03:04:05:0A:0B:0C:0D:0E. The second one
- also reserves an address, but does so using MAC or hardware address, rather than
- DUID. The third example is most advanced. It reserves an address, a prefix and
- a hostname at the same time.
- </para>
- <para>Note that DHCPv6 allows for a single client to lease multiple addresses
- and multiple prefixes at the same time. In the upcoming Kea releases, it will
- be possible to have multiple addresses and prefixes reserved for a single
- host. Therefore <command>ip-addresses"</command> and <command>prefixes</command>
- are plural and are actually arrays. As of 0.9.1 having more than one IPv6
- address or prefix is only partially supported.</para>
- <para>Making a reservation for a mobile host that may visit multiple subnets
- requires a separate host definition in each subnet it is expected to visit.
- It is not allowed to define multiple host definitions with the same hardware
- address in a single subnet. It is a valid configuration, if such definitions
- are specified in different subnets, though.
- </para>
- <para>Adding host reservation incurs a performance penalty. In principle,
- when the server that does not support host reservation responds to a query,
- it needs to check whether there is a lease for a given address being
- considered for allocation or renewal. The server that also supports host
- reservation, has to perform additional checks: not only if the address is
- currently used (if there is a lease for it), but also whether the address
- could be used by someone else (if there is a reservation for it). That
- additional check incurs performance penalty.</para>
- <section id="reservation6-types">
- <title>Address/prefix reservation types</title>
- <para>In a typical scenario there's an IPv6 subnet defined with a certain
- part of it dedicated for dynamic address allocation by the DHCPv6
- server. There may be an additional address space defined for prefix
- delegation. Those dynamic parts is referred to as dynamic pools, address
- and prefix pools or simply pools. In principle the host reservation can
- reserve any address or prefix that belongs to the subnet. The reservations
- that specify an address that belong to configured pools are called
- <command>in-pool reservations</command>. In contract, those that do not
- belong to dynamic pools are called <command>out-of-pool
- reservations</command>. There is no formal difference in the reservation
- syntax. As of 0.9.1, both reservation types are handled
- uniformly. However, upcoming releases may offer improved performance if
- there are only out-of-pool reservations as the server will be able to skip
- reservation checks when dealing with existing leases. Therefore, system
- administrators are encouraged to use out-of-pool reservations, if
- possible.</para>
- </section>
- <section it="reservation6-conflict">
- <title>Conflicts in DHCPv6 reservations</title>
- <para>As reservations and lease information are kept in different places,
- conflict may arrise. Consider the following series of events. The server
- has configured 2001:db8::10 to 2001:db8::20 dynamic pool range. Host A
- requests an address and gets 2001:db8::10. Now the system administrator
- decides to reserve an address for host B. He decides to reserve 2001:db8::10
- for that purpose. In general, reserving an address that is currently
- assigned to someone else is not recommended, but there are valid use
- cases where such an operation is warranted.</para>
- <para>The server now has a conflict to resolve. Let's analyze the
- situation here. If host B boots up and request an address, the server is
- not able to assign the reserved address 2001:db8::10. A naive approach
- would to be immediately remove the lease for host A and create a new one
- for host B. That would not solve the problem, though, because as soon as
- host B get the address, it will detect that the address is already in use
- by someone else (host A) and would send Decline. Therefore in this
- situation, the server has to temporarily assign a different address (not
- matching what has been reserved) to host B.</para>
- <para>When the host A renews its address, the server will discover that
- the address being renewed is now reserved for someone else (host
- B). Therefore the server will remove the lease for 2001:db8::10 and select
- a new address and will create a new lease for it. It will send two
- addresses in its response: the old address with lifetimes set to 0 to
- explicitly indicate that it is no longer valid and a new address with
- non-zero lifetimes.When the host B renews its temporarily assigned
- address, the server will detect that the existing lease does not match
- reservation, so it will release the current address host B has and will
- create a new lease matching the reservation. Similar as before, the server
- will send two addresses: the temporary one with zeroed lifetimes and the
- new one that matches reservation with proper lifetimes set.</para>
- <para>This recovery will succeed, even if other hosts will attempt to get
- the reserved address. Had the host C requested address 2001:db8::10 after
- the reservation was made, the server will propose a different address.</para>
- <para>This recovery mechanism allows the server to fully recover from a
- case where reservations conflict with existing leases. This procedure
- takes time and will roughly take as long as renew-timer value specified.
- The best way to avoid such recovery is to not define new reservations that
- conflict with existing leases. Another recommendation is to use
- out-of-pool reservations. If the reserved address does not belong to a
- pool, there is no way that other clients could get this address (note that
- having multiple reservations for the same address is not allowed).
- </para>
- </section>
- <section id="reservation6-hostname">
- <title>Reserving a hostname</title>
- <!-- @todo: replace this with the actual text once #3689 is implemented -->
- <para>Reserving a hostname is currently not supported. It is possible
- to specify that information in the configuration file, but that data
- is not used by the server engine yet.</para>
- </section>
- <section id="reservation6-options">
- <title>Reserving specific options</title>
- <!-- @todo: replace this with the actual text once #3573 is implemented -->
- <para>Currently it is not possible to specify options in host
- reservation. Such a feature will be added in the upcoming Kea
- releases.</para>
- </section>
- <!-- @todo: add support for per IA reservation (that specifies IAID in
- the ip-addresses and prefixes) -->
- </section>
- <!-- end of host reservations section -->
- <section id="dhcp6-serverid">
- <title>Server Identifier in DHCPv6</title>
- <para>The DHCPv6 protocol uses a "server identifier" (also known
- as a DUID) for clients to be able to discriminate between several
- servers present on the same link. There are several types of
- DUIDs defined, but <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> instructs servers to use DUID-LLT if
- possible. This format consists of a link-layer (MAC) address and a
- timestamp. When started for the first time, the DHCPv6 server will
- automatically generate such a DUID and store the chosen value to
- a file. That file is read by the server
- and the contained value used whenever the server is subsequently started.
- </para>
- <para>
- It is unlikely that this parameter should ever need to be changed.
- However, if such a need arises, stop the server, edit the file and restart
- the server. (The file is named kea-dhcp6-serverid and by default is
- stored in the "var" subdirectory of the directory in which Kea is installed.
- This can be changed when Kea is built by using "--localstatedir"
- on the "configure" command line.) The file is a text file that contains
- double digit hexadecimal values
- separated by colons. This format is similar to typical MAC address
- format. Spaces are ignored. No extra characters are allowed in this
- file.
- </para>
- </section>
- <section id="stateless-dhcp6">
- <title>Stateless DHCPv6 (Information-Request Message)</title>
- <para>Typically DHCPv6 is used to assign both addresses and options. These
- assignments (leases) have state that changes over time, hence
- their name, stateful. DHCPv6 also supports a stateless mode,
- where clients request configuration options only. This mode is
- considered lightweight from the server perspective, as it does not require
- any state tracking; hence its name.</para>
- <para>The Kea server supports stateless mode. Clients can send
- Information-Request messages and the server will send back
- answers with the requested options (providing the options are
- available in the server configuration). The server will attempt to
- use per-subnet options first. If that fails - for whatever reason - it
- will then try to provide options defined in the global scope.</para>
- <para>Stateless and stateful mode can be used together. No special
- configuration directives are required to handle this. Simply use the
- configuration for stateful clients and the stateless clients will get
- just options they requested.</para>
- <para>This usage of global options allows for an interesting case.
- It is possible to run a server that provides just options and no
- addresses or prefixes. If the options have the same value in each
- subnet, the configuration can define required options in the global
- scope and skip subnet definitions altogether. Here's a simple example of
- such a configuration:
- <screen>
- "Dhcp6": {
- "interfaces": [ "ethX" ],
- <userinput>"option-data": [ {
- "name": "dns-servers",
- "data": "2001:db8::1, 2001:db8::2"
- } ]</userinput>,
- "lease-database": { "type": "memfile" }
- }
- </screen>
- This very simple configuration will provide DNS server information
- to all clients in the network, regardless of their location. Note the
- specification of the memfile lease database: this is required since,
- as of version 0.9.1, Kea requires a lease database to be specified
- even if it is not used.</para>
- </section>
- <section id="dhcp6-relay-override">
- <title>Using specific relay agent for a subnet</title>
- <para>
- The relay has to have an interface connected to the link on which
- the clients are being configured. Typically the relay has a global IPv6
- address configured on the interface that belongs to the subnet from which
- the server will assign addresses. In the typical case, the
- server is able to use the IPv6 address inserted by the relay (in the link-addr
- field in RELAY-FORW message) to select the appropriate subnet.
- </para>
- <para>
- However, that is not always the case. The relay
- address may not match the subnet in certain deployments. This
- usually means that there is more than one subnet allocated for a given
- link. The two most common examples where this is the case are long lasting
- network renumbering (where both old and new address space is still being
- used) and a cable network. In a cable network both cable modems and the
- devices behind them are physically connected to the same link, yet
- they use distinct addressing. In such case, the DHCPv6 server needs
- additional information (like the value of interface-id option or IPv6
- address inserted in the link-addr field in RELAY-FORW message) to
- properly select an appropriate subnet.
- </para>
- <para>
- The following example assumes that there is a subnet 2001:db8:1::/64
- that is accessible via relay that uses 3000::1 as its IPv6 address.
- The server will be able to select this subnet for any incoming packets
- that came from a relay that has an address in 2001:db8:1::/64 subnet.
- It will also select that subnet for a relay with address 3000::1.
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- {
- "pool": "2001:db8:1::1-2001:db8:1::ffff"
- }
- ],
- <userinput>"relay": {
- "ip-address": "3000::1"
- }</userinput>
- }
- ]
- }
- </screen>
- </para>
- </section>
- <section id="dhcp6-client-class-relay">
- <title>Segregating IPv6 clients in a cable network</title>
- <para>
- In certain cases, it is useful to mix relay address information,
- introduced in <xref linkend="dhcp6-relay-override"/> with client
- classification, explained in <xref linkend="dhcp6-subnet-class"/>.
- One specific example is a cable network, where typically modems
- get addresses from a different subnet than all devices connected
- behind them.
- </para>
- <para>
- Let's assume that there is one CMTS (Cable Modem Termination System)
- with one CM MAC (a physical link that modems are connected to).
- We want the modems to get addresses from the 3000::/64 subnet,
- while everything connected behind modems should get addresses from
- another subnet (2001:db8:1::/64). The CMTS that acts as a relay
- an uses address 3000::1. The following configuration can serve
- that configuration:
- <screen>
- "Dhcp6": {
- "subnet6": [
- {
- "subnet": "3000::/64",
- "pools": [
- { "pool": "3000::2 - 3000::ffff" }
- ],
- <userinput>"client-class": "VENDOR_CLASS_docsis3.0",
- "relay": {
- "ip-address": "3000::1"
- }</userinput>
- },
- {
- "subnet": "2001:db8:1::/64",
- "pools": [
- {
- "pool": "2001:db8:1::1-2001:db8:1::ffff"
- }
- ],
- <userinput>"relay": {
- "ip-address": "3000::1"
- }</userinput>
- }
- ]
- }
- </screen>
- </para>
- </section>
- <section id="mac-in-dhcpv6">
- <title>MAC/Hardware addresses in DHCPv6</title>
- <para>MAC/hardware addesses are available in DHCPv4 messages
- from the clients and administrators
- frequently use that information to perform certain tasks, like per host
- configuration, address reserveration for specific MAC addresses and other.
- Unfortunately, DHCPv6 protocol does not provide any completely reliable way
- to retrieve that information. To mitigate that issue a number of mechanisms
- have been implemented in Kea that attempt to gather that information. Each
- of those mechanisms works in certain cases, but may fail in other cases.
- Whether the mechanism works or not in the particular deployment is
- somewhat dependent on the network topology and the technologies used.</para>
- <para>Kea allows for configuration which of the supported methods should be
- used and in which order. This configuration may be considered a fine tuning
- of the DHCP deployment. In a typical deployment the default
- value of <command>"any"</command> is sufficient and there is no
- need to select specific methods. Changing the value of this parameter
- is the most useful in cases when an administrator wants to disable
- certain method, e.g. if the administrator trusts the network infrastructure
- more than the information provided by the clients themselves, the
- administrator may prefer information provided by the relays over that
- provided by the clients. The format of this parameter is as follows:
- <screen>
- "Dhcp6": {
- <userinput>"mac-sources": [ "method1", "method2", "method3", ... ]</userinput>,
- "subnet6": [ ... ],
- ...
- }
- </screen>
- When not specified, a special value of <emphasis>any</emphasis> is used, which
- instructs the server to attempt to use all the methods in sequence and use
- value returned by the first one that succeeds.</para>
- <para>Supported methods are:
- <itemizedlist>
- <listitem>
- <simpara><command>any</command> - not an actual method, just a keyword that
- instructs Kea to try all other methods and use the first one that succeeds.
- This is the default operation if no <command>mac-sources</command> are defined.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>raw</command> - In principle, a DHCPv6 server could use raw
- sockets to receive incoming traffic and extract MAC/hardware address
- information. This is currently not implemented for DHCPv6 and this value has
- no effect.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>duid</command> - DHCPv6 uses DUID identifiers instead of
- MAC addresses. There are currently four DUID types defined, with two of them
- (DUID-LLT, which is the default one and DUID-LL) convey MAC address information.
- Although RFC3315 forbids it, it is possible to parse those DUIDs and extract
- necessary information from them. This method is not completely reliable, as
- clients may use other DUID types, namely DUID-EN or DUID-UUID.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>ipv6-link-local</command> - Another possible aquisition
- method comes from the source IPv6 address. In typical usage, clients are
- sending their packets from IPv6 link-local addresses. There's a good chance
- that those addresses are based on EUI-64, which contains MAC address. This
- method is not completely reliable, as clients may use other link-local address
- types. In particular, privacy extensions, defined in RFC4941, do not use
- MAC addresses.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>client-link-addr-option</command> - One extension defined
- to alleviate missing MAC issues is client link-layer address option, defined
- in <ulink url="http://tools.ietf.org/html/rfc6939">RFC 6939</ulink>. This is
- an option that is inserted by a relay and contains information about client's
- MAC address. This method requires a relay agent that supports the option and
- is configured to insert it. This method is useless for directly connected
- clients. This parameter can also be specified as <command>rfc6939</command>,
- which is an alias for <command>client-link-addr-option</command>.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>remote-id</command> - <ulink
- url="http://tools.ietf.org/html/rfc4649">RFC 4649</ulink>
- defines remote-id option that is inserted by a relay agent. Depending
- on the relay agent configuration, the inserted option may convey client's
- MAC address information. This parameter can also be specified as
- <command>rfc4649</command>, which is an alias for <command>remote-id</command>.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>subscriber-id</command> - Another option
- that is somewhat similar to the previous one is subscriber-id,
- defined in <ulink url="http://tools.ietf.org/html/rfc4580">RFC
- 4580</ulink>. It is, too, inserted by a relay agent that is
- configured to insert it. This parameter can also be specified
- as <command>rfc4580</command>, which is an alias for
- <command>subscriber-id</command>. This method is currently not
- implemented.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>docsis-cmts</command> - Yet another possible source of MAC
- address information are DOCSIS options inserted by a CMTS that acts
- as a DHCPv6 relay agent in cable networks. This method attempts to extract
- MAC address information from suboption 1026 (cm mac) of the vendor specific option
- with vendor-id=4491. This vendor option is extracted from the relay-forward message,
- not the original client's message.
- </simpara>
- </listitem>
- <listitem>
- <simpara><command>docsis-modem</command> - Yet another possible source of MAC
- address information are DOCSIS options inserted by the cable modem itself.
- This method attempts to extract MAC address information from suboption 36 (device id)
- of the vendor specific option with vendor-id=4491. This vendor option is extracted from
- the original client's message, not from any relay options.
- </simpara>
- </listitem>
- </itemizedlist>
- </para>
- </section>
- <section id="dhcp6-std">
- <title>Supported DHCPv6 Standards</title>
- <para>The following standards are currently
- supported:</para>
- <itemizedlist>
- <listitem>
- <simpara><emphasis>Dynamic Host Configuration Protocol for IPv6</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink>:
- Supported messages are SOLICIT,
- ADVERTISE, REQUEST, RELEASE, RENEW, REBIND, CONFIRM and REPLY.</simpara>
- </listitem>
- <listitem>
- <simpara><emphasis>IPv6 Prefix Options for
- Dynamic Host Configuration Protocol (DHCP) version 6</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink>:
- Supported options are IA_PD and
- IA_PREFIX. Also supported is the status code NoPrefixAvail.</simpara>
- </listitem>
- <listitem>
- <simpara><emphasis>DNS Configuration options for Dynamic Host
- Configuration Protocol for IPv6 (DHCPv6)</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc3646">RFC 3646</ulink>:
- Supported option is DNS_SERVERS.</simpara>
- </listitem>
- <listitem>
- <simpara><emphasis>The Dynamic Host Configuration Protocol for IPv6 (DHCPv6)
- Relay Agent Remote-ID Option</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc4649">RFC 4649</ulink>:
- REMOTE-ID option is supported.</simpara>
- </listitem>
- <listitem>
- <simpara><emphasis>The Dynamic Host Configuration Protocol for IPv6 (DHCPv6) Client
- Fully Qualified Domain Name (FQDN) Option</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc4704">RFC 4704</ulink>:
- Supported option is CLIENT_FQDN.</simpara>
- </listitem>
- <listitem>
- <simpara><emphasis>Client Link-Layer Address Option in
- DHCPv6</emphasis>,
- <ulink url="http://tools.ietf.org/html/rfc6939">RFC
- 6939</ulink>: Supported option is client link-layer
- address option.</simpara>
- </listitem>
- </itemizedlist>
- </section>
- <section id="dhcp6-limit">
- <title>DHCPv6 Server Limitations</title>
- <para> These are the current limitations and known problems
- with the DHCPv6 server
- software. Most of them are reflections of the early stage of
- development and should be treated as <quote>not implemented
- yet</quote>, rather than actual limitations.</para>
- <itemizedlist>
- <listitem> <!-- see tickets #3234, #3281 -->
- <para>
- On-line configuration has some limitations. Adding new subnets or
- modifying existing ones work, as is removing the last subnet from
- the list. However, removing non-last (e.g. removing subnet 1,2 or 3 if
- there are 4 subnets configured) will cause issues. The problem is
- caused by simplistic subnet-id assignment. The subnets are always
- numbered, starting from 1. That subnet-id is then used in leases
- that are stored in the lease database. Removing non-last subnet will
- cause the configuration information to mismatch data in the lease
- database. It is possible to manually update subnet-id fields in
- MySQL or PostgreSQL database, but it is awkward and error prone
- process. A better reconfiguration support is planned.
- </para>
- </listitem>
- <listitem>
- <simpara>
- The server will allocate, renew or rebind a maximum of one lease
- for a particular IA option (IA_NA or IA_PD) sent by a client.
- <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> and
- <ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink> allow
- for multiple addresses or prefixes to be allocated for a single IA.
- </simpara>
- </listitem>
- <listitem>
- <simpara>Temporary addresses are not supported.</simpara>
- </listitem>
- <listitem>
- <simpara>
- Duplication report (DECLINE) and client reconfiguration (RECONFIGURE) are
- not yet supported.
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- The server doesn't act upon expired leases. In particular,
- when a lease expires, the server doesn't request removal of
- the DNS records associated with it.
- </simpara>
- </listitem>
- </itemizedlist>
- </section>
- <!--
- <section id="dhcp6-srv-examples">
- <title>Kea DHCPv6 server examples</title>
- <para>
- This section provides easy to use example. Each example can be read
- separately. It is not intended to be read sequentially as there will
- be many repetitions between examples. They are expected to serve as
- easy to use copy-paste solutions to many common deployments.
- </para>
- @todo: add simple configuration for direct clients
- @todo: add configuration for relayed clients
- @todo: add client classification example
- </section> -->
- </chapter>
|