For a minimal set of options to get dhcpy6d running see minimal settings.

Boolean settings can be done with 1/0, on/off or yes/no values.

The Section [dhcpy6d]

The section [dhcpy6d] in the configuration file contains all general options. This section will be discussed here.



General Settings

Setting really_do_it

Let dhcpy6d really_do_it and respond to client requests – might be of use for debugging and testing.


really_do_it = yes

Setting interface

The interfaces the server listens on is defined with keyword interface. Multiple interfaces have to be separated by spaces or comma.


interface = eth0 eth1

Setting exclude_interface

The interfaces the server does not listen on. Multiple interfaces have to be separated by spaces or comma. All interfaces not mentioned here will be used for listening. Added in version 1.2.0.


exclude_interface = eth1

Setting serverduid

The server DUID should be configured with serverduid. If there is none dhcpy6d creates a new one at every startup. Windows clients might run a little bit wild when server DUID changed. You are free to compose your own as long as it follows RFC 3315. Please note that it has to be in hexadecimal format – no octals, no “-“, just like in the example below.
On Debian/Ubuntu systems when installed as package the DUID is noted in /etc/default/dhcpy6d.
The example here is a DUID-LLT (Link-layer Address Plus Time) even if it should be a DUID-TLL as timestamp comes first. It is composed of DUID-type(LLT=1) + Hardware-type(Ethernet=1) + Unixtime-in-hex + MAC-address what makes a 0001 + 0001 + 11fb5dc9+01023472a6c5 = 0001000111fb5dc901023472a6c5:


serverduid = 0001000111fb5dc901023472a6c5

Setting server_preference

Determines the priority of the server. Setups with failover capability might have use for it. The maximum value is 255 which means highest priority.


server_preference = 255

Settings user and group

For security reasons dhcpy6d can be run as non-root user and group. Both IDs can be set with user and group:


user = dhcpy6d
group = dhcpy6d

Setting nameserver

Nameservers to be replied to request option 23 are defined with nameserver. If more than one is needed they have to be separated by spaces or comma.


nameserver = fd00::53:1 fd00::53:2

Setting domain

The domain to be used with FQDN hostnames for option 39.


domain =

Setting domain_search_list

Domain search lists to be used with option 24. If none is given the value of domain above is used. Multiple domains have to be separated by space or comma.


domain_search_list =

Setting ntp_server

Can be unicast addresses, multicast addresses or FQDNs following RFC 5908 for DHCPv6 option 56. Multiple NTP servers have to be separated by space or comma.


ntp_server = 2001:db8::123

Settings log, log_console and log_file

Logging is set by log, log_console and log_file.

  • log triggers logging.
  • log_console simply prints log messages on that console where dhcpy6d has been started.
  • The logfile defined by log_file has to be created by the user manually in advance before starting the server.


log = yes
log_console = no
log_file = /path/to/dhcpy6d/log/file

Settings log_syslog, log_syslog_destination and log_syslog_facility

Logging via syslog is possible with log_syslog being set. An UDP syslog server may be used if log_syslog_destination points to it. Optionally a port other than default 514 can be set when adding : to the destination. The default syslog facility is “daemon” but can be set with log_syslog_facility.


log_syslog = yes
log_syslog_destination = syslogserver
log_syslog_facility = local1

Setting log_mac_llip

Logging of discovered MAC/LLIP pairs of clients might be pretty verbose in larger setups and with disabled MAC/LLIP pair caching, this it is configurable with log_mac_llip:

log_mac_llip = no

Settings store_config and store_file_config

Configuration of clients can be stored in a file or in a database. The SQL databases MySQL, PostgreSQL and SQLite are supported at the moment, thus possible values are “file”, “mysql” and “sqlite”. To disable any client configuration source it has to be “none”. If store_config is set to “file” a file has to be set to get client configuration with store_file_config.


store_config = file
store_file_config = /path/to/client/conf/file

Settings store_volatile and store_sqlite_volatile

Volatile data like leases and the mapping between Link Local Addresses and MAC addresses can be stored in a MySQL, PostgreSQL or SQLite database, so the possible values for store_volatile are “mysql”, “postgresql” and “sqlite”. If set to “sqlite” a SQLite database file must be given.


store_volatile = sqlite
store_sqlite_volatile = volatile.sqlite

Setting store_sqlite_config

If store_config is set to “sqlite” a SQLite file must be set as source for client configuration.


store_config = sqlite
store_sqlite_config = /path/to/sqlite/config/file

Database Settings store_db_host, store_db_db, store_db_user and store_db_password

Volatile Data

If store_volatile is set to “mysql” or “postgresql” the connection data for the according SQL database must be set.

store_volatile = mysql
store_db_host = localhost
store_db_db = dhcpy6d_db
store_db_user = dhcpy6d_user
store_db_password = dhcpy6d_password

Client Config Data

If the client configuration should be stored in a MySQL or PostgreSQL database as well, the same database needs to be used. Accordingly the same MySQL or PostgreSQL settings are used and only need to be set once.

store_config = mysql
store_volatile = mysql
store_db_host = localhost
store_db_db = dhcpy6d_db
store_db_user = dhcpy6d_user
store_db_password = dhcpy6d_password

Client Config Schema Version 1 vs 2

In case that:

  • the clients should be able to request prefixes,
  • the routes to the prefixes should individually per client be configurable if they point to the link-local address or not,
  • the client configuration is stored in a database,

then the configuration database schema has to be set to version 2 because version 1 does not know this option. The default value is 1.

store_schema_version = 2

Client Configuration

The configured clients will be identified by at least one attribute. Attributes are

  • MAC
  • DUID
  • Hostname

Setting identification

Has to be at least one of “mac”, “duid”, “hostname”.


identification = mac hostname

Setting identification_mode

If more than one identification attribute has been set, identification_mode can be one of “match_all” or “match_some”. The first means that all attributes have to match to identify a client and the latter is more tolerant. This might be interesting if there are some dualboot clients whose MAC addresses match but their DUIDs don’t.


identification_mode = match_all

Setting ignore_mac

If serving only for delivering addresses regardless of classes (e.g. on PPP interface) MACs do not need to be investigated, thus ignore_mac can be enabled.


ignore_mac =yes

Setting dns_update

Dhcpy6d allows to update DNS dynamically with dns_update. This works at the moment only with Bind DNS, but might be extended to others, maybe via call of an external command. Here the general settings like which server and credentials are to be used. Details like updates zones belong to address configuration.


dns_update = yes

Settings dns_update_nameserver, dns_rndc_key and dns_rndc_secret

When connecting to a Bind DNS server its address and RNDC data must be set with dns_update_nameserver, dns_rndc_key and dns_rndc_secret.


dns_update_nameserver = fd00::53:1
dns_rndc_key = rndc-key
dns_rndc_secret = VDE8dje4sWsd93SKksdkk==

Setting dns_use_rndc

Alternatively if no RNDC is used it might be omitted by disabling it via dns_use_rndc.


dns_update_nameserver = fd00::53:1
dns_use_rndc = no

Setting dns_ignore_client

Clients may request that they update DNS. If these wishes shall be ignored dns_ignore_client is the right switch.


dns_ignore_client = yes

Setting dns_use_client_hostname

For DNS updates dhcpy6d can use the hostname supplied by the client or the one configured for the client in the database, set by dns_use_client_hostname.


dns_use_client_hostname = no

Settings preferred_lifetime. valid_lifetime, t1 and t2

The various lifetimes an address has can be configured globally for all addresses, but if needed, they could get extra settings. Here are the general preferred_lifetime. valid_lifetime, t1 and t2.


preferred_lifetime = 43200
valid_lifetime = 64800
t1 = 21600
t2 = 32400

Setting information_refresh_time

The lifetime of information given to clients after an information-request message is set with information_refresh_time:


information_refresh_time = 7200

©2022 Henri Wahl et al.