Originally Written by Aaron
Kaplan. Restructured and Added by
Tom Rhodes. Extended by Brad
Davis.
IPv6 (also known as IPng “IP next generation”) is the new version of the
well known IP protocol (also known as IPv4). Like the
other current *BSD systems, FreeBSD includes the KAME IPv6 reference implementation. So
your FreeBSD system comes with all you will need to experiment with IPv6. This section
focuses on getting IPv6 configured and running.
In the early 1990s, people became aware of the rapidly diminishing address space of
IPv4. Given the expansion rate of the Internet there were two major concerns:
-
Running out of addresses. Today this is not so much of a concern anymore since RFC1918
private address space (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16) and
Network Address Translation (NAT) are being
employed.
-
Router table entries were getting too large. This is still a concern today.
IPv6 deals with these and many other issues:
-
128 bit address space. In other words theoretically there are
340,282,366,920,938,463,463,374,607,431,768,211,456 addresses available. This means there
are approximately 6.67 * 10^27 IPv6 addresses per square meter on our planet.
-
Routers will only store network aggregation addresses in their routing tables thus
reducing the average space of a routing table to 8192 entries.
There are also lots of other useful features of IPv6 such as:
-
Address autoconfiguration (RFC2462)
-
Anycast addresses (“one-out-of many”)
-
Mandatory multicast addresses
-
IPsec (IP security)
-
Simplified header structure
-
Mobile IP
-
IPv6-to-IPv4 transition mechanisms
For more information see:
There are different types of IPv6 addresses: Unicast, Anycast and Multicast.
Unicast addresses are the well known addresses. A packet sent to a unicast address
arrives exactly at the interface belonging to the address.
Anycast addresses are syntactically indistinguishable from unicast addresses but they
address a group of interfaces. The packet destined for an anycast address will arrive at
the nearest (in router metric) interface. Anycast addresses may only be used by
routers.
Multicast addresses identify a group of interfaces. A packet destined for a multicast
address will arrive at all interfaces belonging to the multicast group.
Note: The IPv4 broadcast address (usually xxx.xxx.xxx.255) is expressed by multicast addresses in IPv6.
Table 29-2. Reserved IPv6 addresses
IPv6 address |
Prefixlength (Bits) |
Description |
Notes |
:: |
128 bits |
unspecified |
cf. 0.0.0.0 in IPv4 |
::1 |
128 bits |
loopback address |
cf. 127.0.0.1 in IPv4 |
::00:xx:xx:xx:xx |
96 bits |
embedded IPv4 |
The lower 32 bits are the IPv4 address. Also called “IPv4 compatible IPv6
address” |
::ff:xx:xx:xx:xx |
96 bits |
IPv4 mapped IPv6 address |
The lower 32 bits are the IPv4 address. For hosts which do not support IPv6. |
fe80:: - feb:: |
10 bits |
link-local |
cf. loopback address in IPv4 |
fec0:: - fef:: |
10 bits |
site-local |
|
ff:: |
8 bits |
multicast |
|
001 (base 2) |
3 bits |
global unicast |
All global unicast addresses are assigned from this pool. The first 3 bits are
“001”. |
The canonical form is represented as: x:x:x:x:x:x:x:x, each
“x” being a 16 Bit hex value. For example FEBC:A574:382B:23C1:AA49:4592:4EFE:9982
Often an address will have long substrings of all zeros therefore one such substring
per address can be abbreviated by “::”. Also up to three leading
“0”s per hexquad can be omitted. For example fe80::1
corresponds to the canonical form fe80:0000:0000:0000:0000:0000:0000:0001.
A third form is to write the last 32 Bit part in the well known (decimal) IPv4 style
with dots “.” as separators. For example 2002::10.0.0.1 corresponds to the (hexadecimal) canonical
representation 2002:0000:0000:0000:0000:0000:0a00:0001 which in
turn is equivalent to writing 2002::a00:1.
By now the reader should be able to understand the following:
# ifconfig
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
ether 00:00:21:03:08:e1
media: Ethernet autoselect (100baseTX )
status: active
fe80::200:21ff:fe03:8e1%rl0 is an auto configured link-local
address. It is generated from the MAC address as part of the auto configuration.
For further information on the structure of IPv6 addresses see RFC3513.
Currently there are four ways to connect to other IPv6 hosts and networks:
-
Contact your Internet Service Provider to see if they offer IPv6 yet.
-
SixXS offers tunnels with end-points
all around the globe.
-
Tunnel via 6-to-4 (RFC3068)
-
Use the net/freenet6 port if you are on a dial-up connection.
There used to be two types of DNS records for IPv6. The IETF has declared A6 records
obsolete. AAAA records are the standard now.
Using AAAA records is straightforward. Assign your hostname to the new IPv6 address
you just received by adding:
MYHOSTNAME AAAA MYIPv6ADDR
To your primary zone DNS file. In case you do not serve your own DNS zones ask your DNS
provider. Current versions of bind (version 8.3 and 9) and dns/djbdns (with the IPv6 patch) support AAAA records.
These settings will help you configure a machine that will be on your LAN and act as a
client, not a router. To have rtsol(8) autoconfigure
your interface on boot all you need to add is:
ipv6_enable="YES"
To statically assign an IP address such as 2001:471:1f11:251:290:27ff:fee0:2093, to your fxp0 interface, add:
ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093"
To assign a default router of 2001:471:1f11:251::1 add the
following to /etc/rc.conf:
ipv6_defaultrouter="2001:471:1f11:251::1"
This will help you take the directions that your tunnel provider has given you and
convert it into settings that will persist through reboots. To restore your tunnel on
startup use something like the following in /etc/rc.conf:
List the Generic Tunneling interfaces that will be configured, for example gif0:
gif_interfaces="gif0"
To configure the interface with a local endpoint of MY_IPv4_ADDR to a remote endpoint of REMOTE_IPv4_ADDR:
gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR"
To apply the IPv6 address you have been assigned for use as your IPv6 tunnel endpoint,
add:
ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"
Then all you have to do is set the default route for IPv6. This is the other side of
the IPv6 tunnel:
ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"
If the server is to route IPv6 between the rest of your network and the world, the
following /etc/rc.conf setting will also be needed:
ipv6_gateway_enable="YES"
This section will help you setup rtadvd(8) to advertise
the IPv6 default route.
To enable rtadvd(8) you will
need the following in your /etc/rc.conf:
rtadvd_enable="YES"
It is important that you specify the interface on which to do IPv6 router
solicitation. For example to tell rtadvd(8) to use fxp0:
rtadvd_interfaces="fxp0"
Now we must create the configuration file, /etc/rtadvd.conf.
Here is an example:
fxp0:\
:addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether:
Replace fxp0 with the interface you are going to be
using.
Next, replace 2001:471:1f11:246:: with the prefix of your
allocation.
If you are dedicated a /64 subnet you will not need to change
anything else. Otherwise, you will need to change the prefixlen#
to the correct value.