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] in the configuration file contains all general options. They will be discussed here.


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

really_do_it = yes

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

interface = eth0 eth1

The mcast address to listen at is ff02::1:2. Due to the facts that dhcpy6d at the moment works in local network segments only and to the restriction of MAC addresses only being usable there it will always have this value.

mcast = ff02::1:2

Exactly the same applies to the port dhcpy6d listens on. Probably senseless to change it but who knows.

port = 547

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.
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

The 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

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

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.

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

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

domain =

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

domain_search_list =

Logging is set by log, log_console and log_file. The first triggers logging. The second simply prints log messages on that console where dhcpy6d has been started. The logfile defined by the third 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

Logging via syslog is possible with log_syslog 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

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

Configuration of clients can be stored in a file or in a database. Databases MySQL 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

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

store_volatile = sqlite
store_sqlite_volatile = volatile.sqlite

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

If store_volatile is set to “mysql” the connection data for the MySQL database must be set.

store_volatile = mysql
store_mysql_host = localhost
store_mysql_db = dhcpy6d_db
store_mysql_user = dhcpy6d_user
store_mysql_password = dhcpy6d_password

The same MySQL settings are necessary if also client configuration is stored in MySQL database – but need to be set only once.

store_config = mysql
store_volatile = mysql
store_mysql_host = localhost
store_mysql_db = dhcpy6d_db
store_mysql_user = dhcpy6d_user
store_mysql_password = dhcpy6d_password

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

  • MAC
  • DUID
  • Hostname

Thus identification has to be at least one of “mac”, “duid”, “hostname”.

identification = mac hostname

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

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.

dns_update = yes

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==

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

dns_ignore_client = yes

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

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

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

information_refresh_time = 7200