OpenBSD as an IPv6 router

NIL*This blog post is an update (OpenBSD 6.5 at that time) of this very same

article I published in June 2018. Due to rtadvd replaced by rad, this text

was not useful anymore.*

I subscribed to a VPN service from the french association Grifon ([Grifon

website[FR]](https://grifon.fr) to get an IPv6 access to the world and play

with IPv6. I will not talk about the VPN service, it would be pointless.

I now have an IPv6 prefix of 48 bits which can theorically have 2^80 addresses.

I would like my computers connected through the VPN to let others computers in

my network to have IPv6 connectivity.

On OpenBSD, this is very easy to do. If you want to provide IPv6 to Windows

devices on your network, you will need one more.

In my setup, I have a tun0 device which has the IPv6 access and re0 which is my

LAN network.

First, configure IPv6 on your lan:

# ifconfig re0 inet6 autoconf

that's all, you can add a new line "inet6 autoconf" to your file

`/etc/hostname.if` to get it at boot.

Now, we have to allow IPv6 to be routed through the differents

interfaces of the router.

# sysctl net.inet6.ip6.forwarding=1

This change can be made persistent across reboot by adding

`net.inet6.ip6.forwarding=1` to the file `/etc/sysctl.conf`.

Automatic addressing

Now we have to configure the daemon **rad** to advertise the we are routing,

devices on the network should be able to get an IPv6 address from its

advertisement.

The minimal configuration of **/etc/rad.conf** is the following:

interface re0 {

prefix 2a00:5414:7311::/48

}

In this configuration file we only define the prefix available, this is

equivalent to a dhcp addresses range. Others attributes could provide DNS

servers to use for example, see rad.conf man page.

Then enable the service at boot and start it:

# rcctl enable rad

# rcctl start rad

Tweaking resolv.conf

By default OpenBSD will ask for IPv4 when resolving a hostname (see

resolv.conf(5) for more explanations). So, you will never have IPv6

traffic until you use a software which will request explicit IPv6

connection or that the hostname is only defined with a AAAA field.

# echo "family inet6 inet4" >> /etc/resolv.conf.tail

The file **resolv.conf.tail** is appended at the end of resolv.conf

when dhclient modifies the file **resolv.conf**.

Microsoft Windows

If you have Windows systems on your network, they won't get addresses

from **rad**. You will need to deploy dhcpv6 daemon.

The configuration file for what we want to achieve here is pretty

simple, it consists of telling what range we want to allow on DHCPv6

and a DNS server. Create the file `/etc/dhcp6s.conf`:

interface re0 {

address-pool pool1 3600;

};

pool pool1 {

range 2a00:5414:7311:1111::1000 to 2a00:5414:7311:1111::4000;

};

option domain-name-servers 2001:db8::35;

Note that I added "**1111**" into the range because it should not be on the

same network than the router. You can replace 1111 by what you want, even CAFE

or 1337 if you want to bring some fun to network engineers.

Now, you have to install and configure the service:

# pkg_add wide-dhcpv6

# touch /etc/dhcp6sctlkey

# chmod 400 /etc/dhcp6sctlkey

# echo SOME_RANDOM_CHARACTERS | openssl enc -base64 > /etc/dhcp6sctlkey

# echo "dhcp6s -c /etc/dhcp6s.conf re0" >> /etc/rc.local

The openbsd package wide-dhcpv6 doesn't provide a rc file to

start/stop the service so it must be started from a command line, a

way to do it is to type the command in `/etc/rc.local` which is run at

boot.

The openssl command is needed for dhcpv6 to start, as it requires a

base64 string as a secret key in the file */etc/dhcp6sctlkey*.