27.10. IPv6
Poprzedni | Rozdział 27. Advanced Networking | Następny

## 27.10. IPv6

Originally Written by Aaron Kaplan.
Restructured and Added by Tom Rhodes.
Extended by Brad Davis.

IPv6 (also know as IPng „IP next generation”) is the new version of the well known IP protocol (also know 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:

- IPv6 overview at playground.sun.com

- KAME.net

- 6bone.net

### 27.10.1. Background on IPv6 Addresses

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.

### Uwaga:

The IPv4 broadcast address (usually `xxx.xxx.xxx.255`) is expressed by multicast addresses in IPv6.

Tabela 27.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”.

### 27.10.2. Reading IPv6 Addresses

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.

### 27.10.3. Getting Connected

Currently there are four ways to connect to other IPv6 hosts and networks:

- Join the experimental 6bone

- Getting an IPv6 network from your upstream provider. Talk to your Internet provider for instructions.

- Tunnel via 6-to-4 (RFC3068)

- Use the `net/freenet6` port if you are on a dial-up connection.

Here we will talk on how to connect to the 6bone since it currently seems to be the most popular way.

First take a look at the 6bone site and find a 6bone connection nearest to you. Write to the responsible person and with a little bit of luck you will be given instructions on how to set up your connection. Usually this involves setting up a GRE (gif) tunnel.

Here is a typical example on setting up a gif(4) tunnel:

`#` `ifconfig gif0 create` `#` `ifconfig gif0` gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 `#` `ifconfig gif0 tunnel `MY_IPv4_ADDR MY_IPv4_REMOTE_TUNNEL_ENDPOINT_ADDR`` `#` `ifconfig gif0 inet6 alias `MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR``

Replace the capitalized words by the information you received from the upstream 6bone node.

This establishes the tunnel. Check if the tunnel is working by ping6(8) 'ing `ff02::1%gif0`. You should receive two ping replies.

### Uwaga:

In case you are intrigued by the address `ff02:1%gif0`, this is a multicast address. `%gif0` states that the multicast address at network interface `gif0` is to be used. Since we `ping` a multicast address the other endpoint of the tunnel should reply as well.

By now setting up a route to your 6bone uplink should be rather straightforward:

`#` `route add -inet6 default -interface gif0` `#` `ping6 -n `MY_UPLINK``
`#` `traceroute6 www.jp.FreeBSD.org` (3ffe:505:2008:1:2a0:24ff:fe57:e561) from 3ffe:8060:100::40:2, 30 hops max, 12 byte packets 1 atnet-meta6 14.147 ms 15.499 ms 24.319 ms 2 6bone-gw2-ATNET-NT.ipv6.tilab.com 103.408 ms 95.072 ms * 3 3ffe:1831:0:ffff::4 138.645 ms 134.437 ms 144.257 ms 4 3ffe:1810:0:6:290:27ff:fe79:7677 282.975 ms 278.666 ms 292.811 ms 5 3ffe:1800:0:ff00::4 400.131 ms 396.324 ms 394.769 ms 6 3ffe:1800:0:3:290:27ff:fe14:cdee 394.712 ms 397.19 ms 394.102 ms

This output will differ from machine to machine. By now you should be able to reach the IPv6 site www.kame.net and see the dancing tortoise — that is if you have a IPv6 enabled browser such as `www/mozilla`, Konqueror, which is part of `x11/kdebase3`, or `www/epiphany`.

### 27.10.4. DNS in the IPv6 World

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.

### 27.10.5. Applying the needed changes to `/etc/rc.conf`

#### 27.10.5.1. IPv6 Client Settings

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"

#### 27.10.5.2. IPv6 Router/Gateway Settings

This will help you take the directions that your tunnel provider, such as the 6bone, 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`"

#### 27.10.5.3. IPv6 Tunnel Settings

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"

### 27.10.6. Router Advertisement and Host Auto Configuration

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.

Poprzedni | Początek rozdziału | Następny
27.9. Parallel Line IP (PLIP) | Spis treści | 27.11. Asynchronous Transfer Mode (ATM)

All FreeBSD documents are available for download at http://ftp.FreeBSD.org/pub/FreeBSD/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.