Table of Contents
DHCPv6
The big downside of IPv6 addresses is their length. While manually configured
addresses can be chosen to allow for a short textual representation by using
the ::
abbreviation, using auto-configuration tends to produce addresses
which are quite the opposite - constructing a 64bit host part by expansion of
the 48bit MAC address renders even the shortest prefix nearly unrecognizable.
Using DHCPv6 might cause relief to this misery due to it's possibility to have a static lease for identified hosts. This is how to get things going.
ISC DHCPD Setup
Sadly, it is not possible for now to use the same instance of dhcpd
for
both IPv4 and IPv6 address configuration. Therefore one has to maintain a
separate dhcpd6.conf, as well.
- /etc/dhcpd6.conf
option domain-name "ip6.local"; default-lease-time 600; max-lease-time 7200; authoritative; subnet6 dead:beef::/64 { range6 dead:beef::1000 dead:beef::ffff; } host workstation { host-identifier option dhcp6.client-id 00:01:00:01:1c:42:94:23:00:ff:17:0b:ac:49; fixed-address6 dead:beef::3; }
The above config will dynamically assign addresses in the prefix
dead:beef::/64
, with host parts from 1000
till ffff
. The host named
workstation
(only by dhcpd
, not anywhere else) gets dead:beef::3
iff it identifies correctly (see below).
Start the dedicated dhcpd
for IPv6 like so:
dhcpd -6 -cf /etc/dhcpd6.conf <iface>
DHCPCD Setup
The scope of this article covers using dhcpcd
as DHCP client only, not
least because it is able to simultaneously configure an interface with IPv4 and
IPv6 address.
- /etc/dhcpcd.duid
00:01:00:01:1c:42:94:23:00:ff:17:0b:ac:49
The above file should exist in every system where dhcpcd
is installed. If
not, one might just create it - it's contents are supposed to be rather random,
with focus on hopefully having a unique DUID for every host in the same
network.
Firing up dhcpcd
is then as easy as this:
dhcpcd <iface>
Combining with Stateless Auto-Configuration
Since one can't assume every host joining the network to implement DHCPv6
(yet), it is desirable to offer stateless auto-configuration as well. This is
surprisingly easy, only two additional lines have to be added to radvd.conf
to make radvd
and dhcpd
get along with each other:
- /etc/radvd.conf
interface <iface> { AdvSendAdvert on; # here we go AdvManagedFlag on; AdvOtherConfigFlag on; prefix dead:beef::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; RDNSS dead:beef::1 { AdvRDNSSLifetime 86400; }; };
First things first, standard stateless auto-config options above: radvd
is
told to advertise the prefix dead:beef::/64
for autonomous configuration on
interface <iface>
. Besides, dead:beef::1
is advertised as nameserver to
use.
Now for the interesting part: AdvManagedFlag
signals hosts to use stateful
auto-configuration in addition to the stateless configured ones.
AdvOtherConfigFlag
enables the same for non-address information.
As the attentive reader might have guessed already, just adding the above two
lines to radvd.conf leads to DHCPv6-aware hosts assigning a stateful as
well as a stateless address to the configured interface, at least when using
dhcpcd
. This might even be called a feature, as it makes dhcpcd
establish a working interface configuration no matter what style of
auto-configuration is necessary. On the other hand, I have not found a way to
tell dhcpcd
to prefer stateful over stateless and fall back to the later
only if no DHCPv6 lease was received in time. From this point of view the
behaviour is rather that of a bug than anything else. At least it is possible
though to turn stateless auto-configuration off in dhcpcd
by adding the
following statement to dhcpcd.conf:
- /etc/dhcpcd.conf
ipv6ra_noautoconf
If I wanted to configure the interface statelessly, I would not run
dhcpcd
in the first place, would I?
Notes
Remarkably, none of the autoconf
or accept_ra
sysctl settings have to
be switched off in order for this to work.