Linux IPv6 HOWTO

Peter Bieringer

Revision History
Revision Release 0.232002-03-27Revised by: PB
See revision history for more
Revision Release 0.222002-03-04Revised by: PB
See revision history for more
Revision Release 0.212002-02-26Revised by: PB
See revision history for more

Table of Contents
1. General
1.1. Copyright, license and others
1.2. Category
1.3. Version, History and To-Do
1.4. Translations
1.5. Technical
1.6. Preface
1.7. Used terms
1.8. Requirements for using this HOWTO
2. Basics
2.1. What is IPv6?
2.2. History of IPv6 in Linux
2.3. How do IPv6 addresses look like?
2.4. FAQ (Basics)
3. Address types
3.1. Addresses without a special prefix
3.2. Network part, also known as prefix
3.3. Address types (host part)
3.4. Prefix lengths for routing
4. IPv6-ready system check
4.1. IPv6-ready kernel
4.2. IPv6-ready network configuration tools
4.3. IPv6-ready test/debug programs
4.4. IPv6-ready programs
4.5. IPv6-ready client programs (selection)
4.6. IPv6-ready server programs
4.7. FAQ (IPv6-ready system check)
5. Configuring interfaces
5.1. Different network devices
5.2. Bringing interfaces up/down
6. Configuring IPv6 addresses
6.1. Displaying existing IPv6 addresses
6.2. Add an IPv6 address
6.3. Removing an IPv6 address
7. Configuring normal IPv6 routes
7.1. Displaying existing IPv6 routes
7.2. Add an IPv6 route through a gateway
7.3. Removing an IPv6 route through a gateway
7.4. Add an IPv6 route through an interface
7.5. Removing an IPv6 route through an interface
7.6. FAQ for IPv6 routes
8. Configuring IPv6-in-IPv4 tunnels
8.1. Types of tunnels
8.2. Displaying existing tunnels
8.3. Setup of point-to-point tunnel
8.4. Setup of 6to4 tunnels
9. Configuring IPv4-in-IPv6 tunnels
10. Kernel settings
10.1. /proc filesystem
10.2. Netlink
11. Network debugging
11.1. Server socket binding
11.2. Examples for tcpdump packet dumps
12. Support for persistent IPv6 configuration in Linux distributions
12.1. Red Hat Linux and "clones"
12.2. SuSE Linux
12.3. Debian Linux
13. Auto-configuration and mobility
13.1. Stateless auto-configuration
13.2. Stateful auto-configuration using Router Advertisement Daemon (radvd)
13.3. Dynamic Host Configuration Protocol v6 (DHCPv6)
13.4. Mobility
14. Firewalling and security issues
14.1. Firewalling
14.2. Security
15. Encryption and Authentication
15.1. Support in kernel
15.2. Usage
16. Quality of Service (QoS)
17. Hints for IPv6-enabled daemons
17.1. Berkeley Internet Name Daemon BIND (named)
17.2. Internet super daemon (xinetd)
17.3. Webserver Apache2 (httpd2)
17.4. Router Advertisement Daemon (radvd)
17.5. tcp_wrapper
18. Programming (using API)
19. Interoperability
20. Further information and URLs
20.1. Paper printed books, articles, online reviews (mixed)
20.2. Online information
20.3. Online test tools
20.4. Maillists
21. Revision history / Credits / The End
21.1. Revision history
21.2. Credits
21.3. The End

Chapter 1. General


1.1. Copyright, license and others


1.1.3. About the author

1.1.3.1. Internet/IPv6 history of the author


1.1.3.2. Contact

The author can be contacted via e-mail at <pb at bieringer dot de> and also via his homepage.

He's currently living in Munich [northern part of Schwabing] / Bavaria / Germany (south) / Europe (middle) / Earth (surface/mainland).


1.5. Technical


1.6. Preface

Some things first:


1.6.1. How many versions of a Linux & IPv6 related HOWTO are floating around?

Including this, there are three (3) HOWTO documents available. Apologies, if that is too many ;-)


1.6.1.1. Linux IPv6 FAQ/HOWTO (outdated)

The first IPv6 related document was written by Eric Osborne and called Linux IPv6 FAQ/HOWTO (please use it only for historical issues). Latest version was 3.2.1 released 14. July 1997.

Please help: if someone knows the date of birth of this HOWTO, please send me an e-mail (information will be needed in "history").


1.6.1.2. IPv6 & Linux - HowTo (maintained)

There exists a second version called IPv6 & Linux - HowTo written by me (Peter Bieringer) in pure HTML. It was born April 1997 and the first English version was published in June 1997. I will continue to maintain it, but it will slowly fade in favour of the Linux IPv6 HOWTO you are currently reading.


1.6.1.3. Linux IPv6 HOWTO (this document)

Because the IPv6 & Linux - HowTo is written in pure HTML it's not really compatible with the Linux Documentation Project (LDP). I (Peter Bieringer) got a request in late November 2001 to rewrite the IPv6 & Linux - HowTo in SGML. However, because of the discontinuation of that HOWTO (Future of IPv6 & Linux - HowTo), and as IPv6 is becoming more and more standard, I decided to write a new document covering basic and advanced issues which will remain important over the next few years. Dynamic content will be still found further on in the second HOWTO (IPv6 & Linux - HowTo).


Chapter 2. Basics

2.1. What is IPv6?

IPv6 is a new layer 3 transport protocol (see linuxports/howto/intro_to_networking/ISO - OSI Model) which will supersede IPv4 (also known as IP). IPv4 was designed long time ago (RFC 760 from January 1980) and since its inception, there have been many requests for more addresses and enhanced capabilities. Major changes in IPv6 are the redesign of the header, including the increase of address size from 32 bits to 128 bits. Because layer 3 is responsible for end-to-end packet transport using packet routing based on addresses, it must include the new IPv6 addresses (source and destination), like IPv4.

For more information about the IPv6 history take a look at older IPv6 related RFCs listed e.g. at SWITCH IPv6 Pilot / References.


2.2. History of IPv6 in Linux

To-do: better time-line, more content...


2.2.1. Beginning

The first IPv6 related network code was added to the Linux kernel 2.1.8 in November 1996 by Pedro Roque. It was based on the BSD API:

diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h
¬ linux/include/linux/in6.h 
--- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 
+++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 
@@ -0,0 +1,99 @@ 
+/* 
+ * Types and definitions for AF_INET6 
+ * Linux INET6 implementation 
+ * + * Authors: 
+ * Pedro Roque <******> 
+ * 
+ * Source: 
+ * IPv6 Program Interfaces for BSD Systems 
+ * <draft-ietf-ipngwg-bsd-api-05.txt>
   

The shown lines were copied from patch-2.1.8 (e-mail address was blanked on copy&paste).


2.2.2. In between

Because of lack of manpower, the IPv6 implementation in the kernel was unable to follow the discussed drafts or newly released RFCs. In October 2000, a project was started in Japan, called USAGI, whose aim was to implement all missing, or outdated IPv6 support in Linux. It tracks the current IPv6 implementation in FreeBSD made by the KAME project. From time to time they create snapshots against current vanilla Linux kernel sources.


2.2.3. Current

Unfortunately, the USAGI patch is so big, that current Linux networking maintainers are unable to include it in the production source of the Linux kernel 2.4.x series. Therefore the 2.4.x series is missing some (many) extensions and also does not confirm to all current drafts and RFCs. This can cause some interoperability problems with other operating systems.


2.2.4. Future

USAGI is now making use of the new Linux kernel development series 2.5.x to insert all of their current extensions into this development release. Hopefully the 2.6.x kernel series will contain a true and up-to-date IPv6 implementation.


2.3. How do IPv6 addresses look like?

As previously mentioned, IPv6 addresses are 128 bits long. This number of bits generates very high decimal numbers with up to 39 digits:

2^{128}-1: 340282366920938463463374607431768211455
  

Such numbers are not really addresses that can be memorized. Also the IPv6 address schema is bitwise orientated (just like IPv4, but that's not often recognized). Therefore a better notation of such big numbers is hexadecimal. In hexadecimal, 4 bits (also known as "nibble") are represented by a digit or character from 0-9 and a-f (10-15). This format reduces the length of the IPv6 address to 32 characters.

2^{128}-1: 0xffffffffffffffffffffffffffffffff
  

This representation is still not very convenient (possible mix-up or loss of single hexadecimal digits), so the designers of IPv6 chose a hexadecimal format with a colon as separator after each block of 16 bits. In addition, the leading "0x" (a signifier for hexadecimal values used in programming languages) is removed:

2^{128}-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
  

A usable address (see address types later) is e.g.:

3ffe:ffff:0100:f101:0210:a4ff:fee3:9566
  

For simplifications, leading zeros of each 16 bit block can be omitted:

3ffe:ffff:0100:f101:0210:a4ff:fee3:9566  -> 
¬ 3ffe:ffff:100:f101:210:a4ff:fee3:9566
  

One sequence of 16 bit blocks containing only zeroes can be replaced with "::". But not more than one at a time, otherwise it is no longer a unique representation.

3ffe:ffff:100:f101:0:0:0:1  ->  3ffe:ffff:100:f101::1
  

The biggest reduction is seen by the IPv6 localhost address:

0000:0000:0000:0000:0000:0000:0000:0001  ->  ::1
  

There is also a so-called compact (base85 coded) representation defined RFC 1924 / A Compact Representation of IPv6 Addresses (written 1996), never seen in the wild, but here is an example:

# ipv6calc --addr_to_base85 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 
Itu&-ZQ82s>J%s99FJXT
  

Info: ipv6calc is an IPv6 address format calculator and converter program and can be found here: ipv6calc


2.4. FAQ (Basics)


Chapter 3. Address types

Like IPv4, IPv6 addresses can be split into network and host parts using subnet masks.

IPv4 has shown that sometimes it would be nice, if more than one IP address can be assigned to an interface, each for a different purpose (aliases, multi-cast). To remain extensible in the future, IPv6 is going further and allows more than one IPv6 address to be assigned to an interface. There is currently no limit defined by an RFC, only in the implementation of the IPv6 stack (to prevent DoS attacks).

Using this large number of bits for addresses, IPv6 defines address types based on some leading bits, which are hopefully never going to be broken in the future (unlike IPv4 today and the history of class A, B, and C).

Also the number of bits are separated into a network part (upper 64 bits) and a host part (lower 64 bits), to facilitate auto-configuration .


3.2. Network part, also known as prefix

Designers defined some address types and left a lot of scope for future definitions as currently unknown requirements arise. RFC 2373 [July 1998] / IP Version 6 Addressing Architecture defines the current addressing scheme but there is already a new draft available: draft-ietf-ipngwg-addr-arch-*.txt.

Now lets take a look at the different types of prefixes (and therefore address types):


3.2.2. Site local address type

These are addresses similar to the RFC 1918 / Address Allocation for Private Internets in IPv4 today, with the added advantage that everyone who use this address type has the capability to use the given 16 bits for a maximum number of 65536 subnets. Comparable with the 10.0.0.0/8 in IPv4 today.

Another advantage: because it's possible to assign more than one address to an interface with IPv6, you can also assign such a site local address in addition to a global one.

It begins with:

fec<emphasis>x:  <- most commonly used.</emphasis>
fed<emphasis>x:</emphasis>
fee<emphasis>x:</emphasis>
fef<emphasis>x:</emphasis>
   

(where "x" is any hex character, normally "0")


3.2.3. Global address type "Aggregatable global unicast"

Today, there is one global address type defined (the first design, called "provider based," was thrown away some years ago RFC 1884 / IP Version 6 Addressing Architecture [obsolete], you will find some remains in older Linux kernel sources).

It begins with (x are hex characters)

2<emphasis>xxx</emphasis>: 
3<emphasis>xxx</emphasis>:
   

There are some further subtypes defined, see below:


3.2.3.2. 6to4 addresses

These addresses, designed for a special tunneling mechanism [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds and RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers], encode a given IPv4 address and a possible subnet and begin with

2002:
    

For example, representing 192.168.1.1/5:

2002:c0a8:0101:5::1
    

A small shell command line can help you generating such address out of a given IPv4 one:

ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 | tr "." " "` $sla
    

See also tunneling using 6to4 and information about 6to4 relay routers.


3.2.4. Multicast addresses

Multicast addresses are used for related services.

They alway start with (xx is the scope value)

ff<emphasis>x</emphasis>y:
   

They are split into scopes and types:


3.2.4.2. Multicast types

There are many types already defined/reserved (see RFC 2373 / IP Version 6 Addressing Architecture for details). Some examples are:

  • All Nodes Address: ID = 1h, addresses all hosts on the local node (ff01:0:0:0:0:0:0:1) or the connected link (ff02:0:0:0:0:0:0:1).

  • All Routers Address: ID = 2h, addresses all routers on the local node (ff01:0:0:0:0:0:0:2), on the connected link (ff02:0:0:0:0:0:0:2), or on the local site (ff05:0:0:0:0:0:0:2)


3.3. Address types (host part)

For auto-configuration and mobility issues, it was decided to use the lower 64 bits as host part of the address in most of the current address types. Therefore each single subnet can hold a large amount of addresses.

This host part can be inspected differently:


3.4. Prefix lengths for routing

In the early design phase it was planned to use a fully hierarchical routing approach to reduce the size of the routing tables maximally. The reasoning behind this approach were the number of current IPv4 routing entries in core routers (> 104 thousand in May 2001), reducing the need of memory in hardware routers (ASIC driven) to hold the routing table and increase speed (fewer entries hopefully result in faster lookups).

Todays view is that routing will be mostly hierarchically designed for networks with only one service provider. With more than one ISP connections, this is not possible, and subject to an issue named multi-homing.


3.4.1. Prefix lengths (also known as "netmasks")

Similar to IPv4, the routable network path for routing to take place. Because standard netmask notation for 128 bits doesn't look nice, designers employed the IPv4 Classless Inter Domain Routing (CIDR, RFC 1519 / Classless Inter-Domain Routing) scheme, which specifies the number of bits of the IP address to be used for routing. It is also called the "slash" notation.

An example:

3ffe:ffff:100:1:2:3:4:5/48
   

This notation will be expanded:

  • Network:

3ffe:ffff:0100:0000:0000:0000:0000:0000
   

  • Net-mask:

ffff:ffff:ffff:0000:0000:0000:0000:0000
   

Chapter 4. IPv6-ready system check

Before you can start using IPv6 on a Linux host, you have to test, whether your system is IPv6-ready. You may have to do some work to enable it first.


4.1. IPv6-ready kernel

Modern Linux distributions already contain IPv6-ready kernels, the IPv6 capability is generally compiled as a module, but it's possible that this module is not loaded automatically on startup.

See IPv6+Linux-Status-Distribution page for most up-to-date information.


4.1.3. Compile kernel with IPv6 capabilities

If both above shown results were negative and your kernel has no IP6 support, than you have the following options:

If you decide to compile a kernel, you should have previous experience in kernel compiling and read the Linux Kernel HOWTO.

A mostly up-to-time comparison between vanilla and USAGI extended kernels is available on IPv6+Linux-Status-Kernel.


4.1.3.1. Compiling a vanilla kernel

More detailed hints about compiling an IPv6-enabled kernel can be found e.g. on IPv6-HOWTO-2#kernel.

Note: you should use whenever possible kernel series 2.4.x or above, because the IPv6 support in series 2.2.x is not so in current state and needs some patches for ICMPv6 and 6to4 support (can be found on kernel series 2.2.x IPv6 patches).


4.1.4. IPv6-ready network devices

Not all existing network devices have already (or ever) the capability to transport IPv6 packets. A current status can be found at IPv6+Linux-status-kernel.html#transport.

A major issue is that because of the network layer structure of kernel implementation an IPv6 packet isn't really recognized by it's IP header number (6 instead of 4). It's recognized by the protocol number of the Layer 2 transport protocol. Therefore any transport protocol which doesn't use such protocol number cannot dispatch IPv6 packets. Note: the packet is still transported over the link, but on receivers side, the dispatching won't work (you can see this e.g. using tcpdump).


4.1.4.1. Currently known never "IPv6 capable links"

  • Serial Line IP (SLIP, RFC 1055), should be better called now to SLIPv4, device named: slX

  • Parallel Line IP (PLIP), same like SLIP, device names: plipX

  • ISDN with encapsulation rawip, device names: isdnX


4.3. IPv6-ready test/debug programs

After you have prepared your system for IPv6, you now want to use IPv6 for network communications. First you should learn how to examine IPv6 packets with a sniffer program. This is strongly recommended because for debugging/troubleshooting issues this can aide in providing a diagnosis very quickly.


4.3.1. IPv6 ping

This program is normally included in package iputils. It is designed for simple transport tests sending ICMPv6 echo-request packets and wait for ICMPv6 echo-reply packets.

Usage

# ping6 <hostwithipv6address>
# ping6 <ipv6address>
# ping6 [-I <device>] <link-local-ipv6address>
   

Example

# ping6 -c 1 ::1 
PING ::1(::1) from ::1 : 56 data bytes 
64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec
--- ::1 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms
   

Hint: ping6 needs raw access to socket and therefore root permissions. So if non-root users cannot use ping6 then there are two possible problems:

  1. ping6 is not in users path (probably, because ping6 is generally stored in /usr/sbin -> add path (not really recommended)

  2. ping6 doesn't execute properly, generally because of missing root permissions -> chmod u+s /usr/sbin/ping6


4.3.1.1. Specifying interface for IPv6 ping

Using link-local addresses for an IPv6 ping, the kernel does not know through which (physically or virtual) device it must send the packet - each device has a link-local address. A try will result in following error message:

# ping6 fe80::212:34ff:fe12:3456 
connect: Invalid argument
    

In this case you have to specify the interface additionally like shown here:

# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 
PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from
¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes 
64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec
--- fe80::2e0:18ff:fe90:9205 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss round-trip
¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms
    

4.3.2. IPv6 traceroute6

This program is normally included in package iputils. It's a program similar to IPv4 traceroute. But unlike modern IPv4 versions, the IPv6 one still doesn't understand to traceroute using ICMP echo-request packets (which is more accepted by firewalls around than UDP packets to high ports). Below you will see an example:

# traceroute6 www.6bone.net 
traceroute to 6bone.net (3ffe:b00:c18:1::10) from 3ffe:ffff:0000:f101::2, 30
¬ hops max, 16 byte packets 
 1 localipv6gateway (3ffe:ffff:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms 
 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms 
 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms 
 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 ms 
 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms 
 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms
   

4.3.3. IPv6 tracepath6

This program is normally included in package iputils. It's a program like traceroute6 and traces the path to a given destination discovering the MTU along this path. Below you will see an example:

# tracepath6 www.6bone.net 
 1?: [LOCALHOST] pmtu 1480 
 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms 
 2: 3ffe:b00:c18::5 267.864ms 
 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 
 3: 3ffe:3900:5::2 asymm 4 346.632ms 
 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms 
 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms 
 6: 3ffe:3800::1:1 asymm 4 578.126ms !N 
Resume: pmtu 1280
   

4.3.4. IPv6 tcpdump

On Linux, tcpdump is the major tool for packet capturing. Below you find some examples. IPv6 support is normally built-in in current releases of version 3.6.

tcpdump uses expressions for filtering packets to minimize the noise:

Also some command line options are very useful to catch and print more information in a packet, mostly interesting for digging into ICMPv6 packets:


4.3.4.1. IPv6 ping to 3ffe:ffff:100:f101::1 native over a local link

# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on eth0 
3ffe:ffff:100:f101:2e0:18ff:fe90:9205 > 3ffe:ffff:100:f101::1: icmp6: echo
¬ request (len 64, hlim 64) 
3ffe:ffff:100:f101::1 > 3ffe:ffff:100:f101:2e0:18ff:fe90:9205: icmp6: echo
¬ reply (len 64, hlim 64)
    

4.3.4.2. IPv6 ping to 3ffe:ffff:100::1 routed through an IPv6-in-IPv4-tunnel

1.2.3.4 and 5.6.7.8 are tunnel endpoints (all addresses are examples)

# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on ppp0 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
¬ 64, hlim 61) (ttl 23, id 29887, len 124) 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
¬ 64, hlim 61) (ttl 23, id 29919, len 124)
    

4.4. IPv6-ready programs

Current distributions already contain the most needed IPv6 enabled client and servers. See first on IPv6+Linux-Status-Distribution. If still not included, you can check IPv6 & Linux - Current Status - Applications whether the program is already ported to IPv6 and usable with Linux. For common used programs there are some hints available at IPv6 & Linux - HowTo - Part 3 and IPv6 & Linux - HowTo - Part 4.


4.5. IPv6-ready client programs (selection)

To run the following shown tests, it's required that your system is IPv6 enabled, and some examples show addresses which only can be reached if a connection to the 6bone is available.


4.5.2. IPv6-ready telnet clients

IPv6-ready telnet clients are available. A simple test can be done with

$ telnet 3ffe:400:100::1 80
Trying 3ffe:400:100::1... 
Connected to 3ffe:400:100::1. 
Escape character is '^]'. 
HEAD / HTTP/1.0
HTTP/1.1 200 OK 
Date: Sun, 16 Dec 2001 16:07:21 
GMT Server: Apache/2.0.28 (Unix) 
Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT 
ETag: "3f02-a4d-b1b3e080" 
Accept-Ranges: bytes 
Content-Length: 2637 
Connection: close 
Content-Type: text/html; charset=ISO-8859-1
Connection closed by foreign host.
   

If the telnet client don't understand the IPv6 address and says something like "cannot resolve hostname", then it's not IPv6-enabled.


4.5.4. IPv6-ready web browsers

A current status of IPv6 enabled web browsers is available at IPv6+Linux-status-apps.html#HTTP.

Most of them have unresolved problems at the moment

  1. If using an IPv4 only proxy in the settings, IPv6 requests will be sent to the proxy, but the proxy will fail to understand the request and the request fails. Solution: update proxy software (see later).

  2. Automatic proxy settings (*.pac) cannot be extended to handle IPv6 requests differently (e.g. don't use proxy) because of their nature (written in Java-script and well hard coded in source like to be seen in Maxilla source code).

Also older versions don't understand an URL with IPv6 encoded addresses like http://[3ffe:400:100::1]/ (this given URL only works with an IPv6-enabled browser!).

A short test is to try shown URL with a given browser and using no proxy.


4.5.4.1. URLs for testing

A good starting point for browsing using IPv6 is http://www.kame.net/. If the turtle on this page is animated, the connection is via IPv6, otherwise the turtle is static.


Chapter 5. Configuring interfaces

5.1. Different network devices

On a node, there exist different network devices. They can be collected in classes


5.2. Bringing interfaces up/down

Two methods can be used to bring interfaces up or down.


5.2.1. Using "ip"

Usage:

# ip link set dev <interface> up
# ip link set dev <interface> down
   

Example:

# ip link set dev eth0 up
# ip link set dev eth0 down
   

5.2.2. Using "ifconfig"

Usage:

# /sbin/ifconfig <interface> up
# /sbin/ifconfig <interface> down
   

Example:

# /sbin/ifconfig eth0 up
# /sbin/ifconfig eth0 down
   

Chapter 6. Configuring IPv6 addresses

There are different ways to configure an IPv6 address on an interface. You can use use "ifconfig" or "ip".


6.1. Displaying existing IPv6 addresses

First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during stateless auto-configuration).


6.1.1. Using "ip"

Usage:

# /sbin/ip -6 addr show dev <interface>
   

Example for a static configured host:

# /sbin/ip -6 addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_ fast qlen 100
inet6 fe80::210:a4ff:fee3:9566/10 scope link
inet6 3ffe:ffff:0:f101::1/64 scope global
inet6 fec0:0:0:f101::1/64 scope site 
   

Example for a host which is auto-configured

Here you see some auto-magically configured IPv6 addresses and their lifetime.

# /sbin/ip -6 addr show dev eth0 
3: eth0: <BROADCAST,MULTICAST,PROMISC,UP&gt; mtu 1500 qdisc pfifo_fast qlen
¬ 100 
inet6 2002:d950:f5f8:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
valid_lft 16sec preferred_lft 6sec 
inet6 3ffe:400:100:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
valid_lft 2591997sec preferred_lft 604797sec inet6 fe80::2e0:18ff:fe90:9205/10
¬ scope link
   

6.1.2. Using "ifconfig"

Usage:

# /sbin/ifconfig <interface>
   

Example (output filtered with grep to display only IPv6 addresses). Here you see different IPv6 addresses with different scopes.

# /sbin/ifconfig eth0 |grep "inet6 addr:"
inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link
inet6 addr: 3ffe:ffff:0:f101::1/64 Scope:Global
inet6 addr: fec0:0:0:f101::1/64 Scope:Site
   

6.2. Add an IPv6 address

Adding an IPv6 address is similar to the mechanism of "IP ALIAS" addresses in Linux IPv4 addressed interfaces.


6.2.1. Using "ip"

Usage:

# /sbin/ip -6 addr add <ipv6address>/<prefixlength> dev <interface> 
   

Example:

# /sbin/ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0 
   

6.2.2. Using "ifconfig"

Usage:

# /sbin/ifconfig <interface> inet6 add <ipv6address>/<prefixlength>
   

Example:

# /sbin/ifconfig eth0 inet6 add 3ffe:ffff:0:f101::1/64 
   

6.3. Removing an IPv6 address

Not so often needed, be carefully with removing non existent IPv6 address, sometimes using older kernels it results in a crash.


6.3.1. Using "ip"

Usage:

# /sbin/ip -6 addr del <ipv6address>/<prefixlength> dev <interface> 
   

Example:

# /sbin/ip -6 addr del 3ffe:ffff:0:f101::1/64 dev eth0 
   

6.3.2. Using "ifconfig"

Usage:

# /sbin/ifconfig <interface> inet6 del <ipv6address>/<prefixlength>
   

Example:

# /sbin/ifconfig eth0 inet6 del 3ffe:ffff:0:f101::1/64
   

Chapter 7. Configuring normal IPv6 routes

If you want to leave your link and want to send packets in the world wide IPv6-Internet, you need routing. If there is already an IPv6 enabled router on your link, it's possible enough to add IPv6 routes.

Also here there are different ways to configure an IPv6 address on an interface. You can use use "ifconfig" or "ip"


7.1. Displaying existing IPv6 routes

First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during auto-configuration).


7.1.1. Using "ip"

Usage:

# /sbin/ip -6 route show [dev <device>]
   

Example:

# /sbin/ip -6 route show dev eth0
3ffe:ffff:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440
fe80::/10             proto kernel metric 256 mtu 1500 advmss 1440
ff00::/8              proto kernel metric 256 mtu 1500 advmss 1440
default               proto kernel metric 256 mtu 1500 advmss 1440
   

7.1.2. Using "route"

Usage:

# /sbin/route -A inet6 
   

Example (output is filtered for interface eth0). Here you see different IPv6 routes for different addresses on a single interface.

# /sbin/route -A inet6 |grep -w "eth0"
3ffe:ffff:0:f101 ::/64 :: UA  256 0 0 eth0 <- Interface route for global
¬ address
fe80::/10        ::       UA  256 0 0 eth0 <- Interface route for link-local
¬ address
ff00::/8         ::       UA  256 0 0 eth0 <- Interface route for all multicast
¬ addresses
::/0             ::       UDA 256 0 0 eth0 <- Automatic default route
   

7.2. Add an IPv6 route through a gateway

Mostly needed to reach the outside with IPv6 using an IPv6-enabled router on your link.


7.2.1. Using "ip"

Usage:

# /sbin/ip -6 route add <ipv6network>/<prefixlength> via <ipv6address>
¬ [dev <device>]
   

Example:

# /sbin/ip -6 route add 2000::/3 via 3ffe:ffff:0:f101::1
   

7.3. Removing an IPv6 route through a gateway

Not so often needed manually, mostly done by network configure scripts on shutdown (full or per interface)


7.3.1. Using "ip"

Usage:

# /sbin/ip -6 route del <ipv6network>/<prefixlength> via <ipv6address>
¬ [dev <device>]
   

Example:

# /sbin/ip -6 route del 2000::/3 via 3ffe:ffff:0:f101::1
   

7.3.2. Using "route"

Usage:

# /sbin/route -A inet6 del <network>/<prefixlength> [dev <device>]
   

Example for removing upper added route again:

# /sbin/route -A inet6 del 2000::/3 gw 3ffe:ffff:0:f101::1
   

7.4. Add an IPv6 route through an interface

Not often needed, sometimes in cases of dedicated point-to-point links.


7.4.1. Using "ip"

Usage:

# /sbin/ip -6 route add <ipv6network>/<prefixlength> dev <device>
¬ metric 1
   

Example:

# /sbin/ip -6 route add 2000::/3 dev eth0 metric 1
   

Metric "1" is used here to be compatible with the metric used by route, because the default metric on using "ip" is "1024".


7.4.2. Using "route"

Usage:

# /sbin/route -A inet6 add <network>/<prefixlength> dev <device>
   

Example:

# /sbin/route -A inet6 add 2000::/3 dev eth0 
   

7.5. Removing an IPv6 route through an interface

Not so often needed to use by hand, configuration scripts will use such on shutdown.


7.5.1. Using "ip"

Usage:

# /sbin/ip -6 route del <ipv6network>/<prefixlength> dev <device>
   

Example:

# /sbin/ip -6 route del 2000::/3 dev eth0 
   

7.5.2. Using "route"

Usage:

# /sbin/route -A inet6 del <network>/<prefixlength> dev <device>
   

Example:

# /sbin/route -A inet6 del 2000::/3 dev eth0
   

Chapter 8. Configuring IPv6-in-IPv4 tunnels

If you want to leave your link you have no IPv6 capable network around you, you need IPv6-in-IPv4 tunneling to reach the World Wide IPv6-Internet.

There are some kind of tunnel mechanism and also some possibilities to setup tunnels.


8.1. Types of tunnels

There are more than one possibility to tunnel IPv6 packets over IPv4-only links.


8.1.1. Static point-to-point tunneling: 6bone

A point-to-point tunnel is a dedicated tunnel to an endpoint, which knows about your IPv6 network (for backward routing) and the IPv4 address of your tunnel endpoint and defined in RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Requirements:

  • IPv4 address of your local tunnel endpoint must be static, global unique and reachable from the foreign tunnel endpoint

  • A global IPv6 prefix assigned to you (see 6bone registry)

  • A foreign tunnel endpoint which is capable to route your IPv6 prefix to your local tunnel endpoint (mostly remote manual configuration required)


8.1.3. 6to4-Tunneling

6to4 tunneling (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) uses a simple mechanism to create automatic tunnels. Each node with a global unique IPv4 address is able to be a 6to4 tunnel endpoint (if no IPv4 firewall prohibits traffic). 6to4 tunneling is mostly not a one-to-one tunnel. This case of tunneling can be divided into upstream and downstream tunneling. Also, a special IPv6 address indicates that this node will use 6to4 tunneling for connecting the world-wide IPv6 network


8.1.3.1. Generation of 6to4 prefix

The 6to4 address is defined like following (schema is taken from RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds):

|   3+13   |    32     |    16  |            64 bits             | 
+---+------+-----------+--------+--------------------------------+ 
|  FP+TLA  |  V4ADDR   | SLA ID |           Interface ID         | 
|  0x2002  |           |        |                                | 
+---+------+-----------+--------+--------------------------------+
    

Where FP is the known prefix for global addresses, TLA is the top level aggregator. V4ADDR is the node's global unique IPv4 address (in hexadecimal notation). SLA is the subnet identifier (65536 local subnets possible).

Such prefix is generated and normally using SLA "0000" and suffix "::1" assigned to the 6to4 tunnel interface.


8.2. Displaying existing tunnels

8.2.1. Using "ip"

Usage:

# /sbin/ip -6 tunnel show [<device>]
   

Example:

# /sbin/ip -6 tunnel show 
sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 
sit1: ipv6/ip remote 195.226.187.50 local any ttl 64
   

8.2.2. Using "route"

Usage:

# /sbin/route -A inet6 
   

Example (output is filtered to display only tunnels through virtual interface sit0):

# /sbin/route -A inet6 | grep "\Wsit0\W*$" 
::/96      ::               U   256  2  0  sit0 
2002::/16  ::               UA  256  0  0  sit0 
2000::/3   ::193.113.58.75  UG    1  0  0  sit0 
fe80::/10  ::               UA  256  0  0  sit0 
ff00::/8   ::               UA  256  0  0  sit0
   

8.3. Setup of point-to-point tunnel

There are 3 possibilities to add or remove point-to-point tunnels.


8.3.1. Add point-to-point tunnels

8.3.1.1. Using "ip" and "route"

Common method at the moment for a small amount of tunnels

Usage for creating a tunnel device (but it's not up afterward, also a TTL must be specified because the default value is 0).

# /sbin/ip tunnel add <device> mode sit ttl <ttldefault> remote
¬ <ipv4addressofforeigntunnel> local <ipv4addresslocal>
    

Usage (generic example for three tunnels):

# /sbin/ip tunnel add sit1 mode sit ttl <ttldefault> remote
¬ <ipv4addressofforeigntunnel1> local <ipv4addresslocal>
# /sbin/ifconfig sit1 up
# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
# /sbin/ip tunnel add sit2 mode sit ttl <ttldefault>
¬ <ipv4addressofforeigntunnel2> local <ipv4addresslocal>
# /sbin/ifconfig sit2 up
# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
# /sbin/ip tunnel add sit3 mode sit ttl <ttldefault>
¬ <ipv4addressofforeigntunnel3> local <ipv4addresslocal>
# /sbin/ifconfig sit3 up
# /sbin/route -A inet6 add <prefixtoroute3> dev sit3
    

8.3.1.2. Using "ifconfig" and "route" (deprecated)

This not very recommended way to add a tunnel because it's a little bit strange. No problem if adding only one, but if you setup more than one, you cannot easy shutdown the first ones and leave the others running.

Usage (generic example for three tunnels):

# /sbin/ifconfig sit0 up
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel1>
# /sbin/ifconfig sit1 up
# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel2>
# /sbin/ifconfig sit2 up
# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel3>
# /sbin/ifconfig sit3 up
# /sbin/route -A inet6 add <prefixtoroute3> dev sit3
    

Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated.


8.3.1.3. Using "route" only

It's also possible to setup tunnels in Non Broadcast Multiple Access (NBMA) style, it's a easy way to add many tunnels at once. But none of the tunnel can be numbered (which is a not required feature).

Usage (generic example for three tunnels):

# /sbin/ifconfig sit0 up
# /sbin/route -A inet6 add <prefixtoroute1> gw
¬ ::<ipv4addressofforeigntunnel1> dev sit0
# /sbin/route -A inet6 add <prefixtoroute2> gw
¬ ::<ipv4addressofforeigntunnel2> dev sit0
# /sbin/route -A inet6 add <prefixtoroute3> gw
¬ ::<ipv4addressofforeigntunnel3> dev sit0
    

Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated.


8.3.2. Removing point-to-point tunnels

Manually not so often needed, but used by scripts for clean shutdown or restart of IPv6 configuration.


8.3.2.1. Using "ip" and "route"

Usage for removing a tunnel device:

# /sbin/ip tunnel del <device>
    

Usage (generic example for three tunnels):

# /sbin/route -A inet6 del <prefixtoroute1> dev sit1
# /sbin/ifconfig sit1 down
# /sbin/ip tunnel del sit1
# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
# /sbin/ifconfig sit2 down
# /sbin/ip tunnel del sit2
# /sbin/route -A inet6 del <prefixtoroute3> dev sit3
# /sbin/ifconfig sit3 down
# /sbin/ip tunnel del sit3
    

8.3.2.2. Using "ifconfig" and "route" (deprecated because not very funny)

Not only the creation is strange, the shutdown also...you have to remove the tunnels in backorder, means the latest created must be removed first.

Usage (generic example for three tunnels):

# /sbin/route -A inet6 del <prefixtoroute3> dev sit3
# /sbin/ifconfig sit3 down
# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
# /sbin/ifconfig sit2 down
# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
# /sbin/ifconfig sit1 down
# /sbin/ifconfig sit0 down
    

8.3.2.3. Using "route"

This is like removing normal IPv6 routes

Usage (generic example for three tunnels):

# /sbin/route -A inet6 del <prefixtoroute1> gw
¬ ::<ipv4addressofforeigntunnel1> dev sit0
# /sbin/route -A inet6 del <prefixtoroute2> gw
¬ ::<ipv4addressofforeigntunnel2> dev sit0
# /sbin/route -A inet6 del <prefixtoroute3> gw
¬ ::<ipv4addressofforeigntunnel3> dev sit0
# /sbin/ifconfig sit0 down
    

8.4. Setup of 6to4 tunnels

Pay attention that the support of 6to4 tunnels currently lacks on vanilla kernel series 2.2.x (see systemcheck/kernel for more information). Also note that that the prefix length for a 6to4 address is 16 because of from network point of view, all other 6to4 enabled hosts are on the same layer 2.


8.4.1. Add a 6to4 tunnel

First, you have to calculate your 6to4 prefix using your local assigned global routable IPv4 address (if your host has no global routable IPv4 address, in special cases NAT on border gateways is possible):

Assuming your IPv4 address is

1.2.3.4
   

the generated 6to4 prefix will be

2002:0102:0304::
   

Local 6to4 gateways should always assigned the manual suffix "::1", therefore your local 6to4 address will be

2002:0102:0304::1
   

Use e.g. following for automatic generation:

ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`
   

There are two ways possible to setup 6to4 tunneling now.


8.4.1.1. Using "ip" and a dedicated tunnel device

This is now the recommended way.

Create a new tunnel device

# /sbin/ip tunnel add tun6to4 mode sit remote any local <localipv4address> 
    

Bring interface up

# /sbin/ip link set dev tun6to4 up 
    

Add local 6to4 address to interface

# /sbin/ip -6 addr add <local6to4address>/16 dev tun6to4 
    

Add (default) route to the global IPv6 network using the all-6to4-routers IPv4 anycast address

# /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1
    

Chapter 9. Configuring IPv4-in-IPv6 tunnels

This will be filled in the future. At the moment, such tunnels are more used in test environments.

More information in the meantime: RFC 2473 / Generic Packet Tunneling in IPv6 Specification


Chapter 10. Kernel settings

To be filled...


Chapter 11. Network debugging

11.1. Server socket binding

11.1.1. Using "netstat" for server socket binding check

It's always interesting which server sockets are currently active on a node. Using "netstat" is a short way to get such information:

Used options: -nlptu

Example:

# netstat -nlptu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
¬ PID/Program name
tcp        0      0 0.0.0.0:32768           0.0.0.0:*               LISTEN     
¬ 1258/rpc.statd
tcp        0      0 0.0.0.0:32769           0.0.0.0:*               LISTEN     
¬ 1502/rpc.mountd
tcp        0      0 0.0.0.0:515             0.0.0.0:*               LISTEN     
¬ 22433/lpd Waiting
tcp        0      0 1.2.3.1:139             0.0.0.0:*               LISTEN     
¬ 1746/smbd
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
¬ 1230/portmap
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN     
¬ 3551/X
tcp        0      0 1.2.3.1:8081            0.0.0.0:*               LISTEN     
¬ 18735/junkbuster
tcp        0      0 1.2.3.1:3128            0.0.0.0:*               LISTEN     
¬ 18822/(squid)
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
¬ 30734/named
tcp        0      0 ::ffff:1.2.3.1:993      :::*                    LISTEN     
¬ 6742/xinetd-ipv6
tcp        0      0 :::13                   :::*                    LISTEN     
¬ 6742/xinetd-ipv6
tcp        0      0 ::ffff:1.2.3.1:143      :::*                    LISTEN     
¬ 6742/xinetd-ipv6
tcp        0      0 :::53                   :::*                    LISTEN     
¬ 30734/named
tcp        0      0 :::22                   :::*                    LISTEN     
¬ 1410/sshd
tcp        0      0 :::6010                 :::*                    LISTEN     
¬ 13237/sshd
udp        0      0 0.0.0.0:32768           0.0.0.0:*                          
¬ 1258/rpc.statd
udp        0      0 0.0.0.0:2049            0.0.0.0:*                          
¬ -
udp        0      0 0.0.0.0:32770           0.0.0.0:*                          
¬ 1502/rpc.mountd
udp        0      0 0.0.0.0:32771           0.0.0.0:*                          
¬ -
udp        0      0 1.2.3.1:137             0.0.0.0:*                          
¬ 1751/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                          
¬ 1751/nmbd
udp        0      0 1.2.3.1:138             0.0.0.0:*                          
¬ 1751/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                          
¬ 1751/nmbd
udp        0      0 0.0.0.0:33044           0.0.0.0:*                          
¬ 30734/named
udp        0      0 1.2.3.1:53              0.0.0.0:*                          
¬ 30734/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                          
¬ 30734/named
udp        0      0 0.0.0.0:67              0.0.0.0:*                          
¬ 1530/dhcpd
udp        0      0 0.0.0.0:67              0.0.0.0:*                          
¬ 1530/dhcpd
udp        0      0 0.0.0.0:32858           0.0.0.0:*                          
¬ 18822/(squid)
udp        0      0 0.0.0.0:4827            0.0.0.0:*                          
¬ 18822/(squid)
udp        0      0 0.0.0.0:111             0.0.0.0:*                          
¬ 1230/portmap
udp        0      0 :::53                   :::*                               
¬ 30734/named
   

11.2. Examples for tcpdump packet dumps

Here some examples of captured packets are shown, perhaps useful for your own debugging...

...more coming next...


11.2.1. Router discovery

11.2.1.1. Router advertisement

15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router
¬ advertisement(chlim=64, router_ltime=30, reachable_time=0,
¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20,
¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000,
¬ preffered_ltime=604800, prefix=3ffe:ffff:0:1::/64)(src lladdr:
¬ 0:12:34:12:34:50) (len 88, hlim 255)
    

Router with link-local address "fe80::212:34ff:fe12:3450" send an advertisement to the all-node-on-link multicast address "ff02::1" containing two prefixes "2002:0102:0304:1::/64" (lifetime 30 s) and "3ffe:ffff:0:1::/64" (lifetime 2592000 s) including its own layer 2 MAC address "0:12:34:12:34:50"


11.2.2. Neighbor discovery


11.2.2.2. Neighbor discovery solicitation for looking for host or gateway

13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6:
¬ neighbor sol: who has 3ffe:ffff:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32,
¬ hlim 255)
    

13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor
¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255)
    

Chapter 12. Support for persistent IPv6 configuration in Linux distributions

Some Linux distribution contain already support of a persistent IPv6 configuration using existing or new configuration and script files and some hook in the IPv4 script files.


12.1. Red Hat Linux and "clones"

Since starting writing the IPv6 & Linux - HowTo it was my intention to enable a persistent IPv6 configuration which catch most of the wished cases like host-only, router-only, dual-homed-host, router with second stub network, normal tunnels, 6to4 tunnels, and so on. Nowadays there exists a set of configuration and script files which do the job very well (never heard about real problems, but I don't know how many use the set. Because this configuration and scrips files are extended from time to time, they got their own HOWTO page: IPv6-HOWTO/scripts/current. Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 development systems are mostly Red Hat Linux based now, it's kind a logic that the scripts are developed for this kind of distribution (so called historic issue). Also it was very easy to extend some configuration files, create new ones and create some simple hook for calling IPv6 setup during IPv4 setup.

Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is included, this was and is still further on assisted by Pekka Savola.

Mandrake since version 8.0 also includes an IPv6-enabled initscript package, but a minor bug still prevents usage ("ifconfig" misses "inet6" before "add").


12.1.1. Test for IPv6 support of network configuration scripts

You can test, whether your Linux distribution contain support for persistent IPv6 configuration using my set. Following script library should exist:

/etc/sysconfig/network-scripts/network-functions-ipv6
   

Auto-magically test:

# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo "Main
¬ IPv6 script libary exists"
   

The version of the library is important if you miss some features. You can get it executing following (or easier look at the top of the file):

# source /etc/sysconfig/network-scripts/network-functions-ipv6 &&
¬ getversion_ipv6_functions 
20011124
   

In shown example, the used version is 20011124. Check this against latest information on IPv6-HOWTO/scripts/current to see what has been changed. There is also a change-log available in the distributed tar-ball.


Chapter 13. Auto-configuration and mobility


Chapter 14. Firewalling and security issues

IPv6 firewalling is important, especially if using IPv6 on internal networks with global IPv6 addresses. Because unlike at IPv4 networks where in common internal hosts are protected automatically using private IPv4 addresses like RFC 1918 / Address Allocation for Private Internets or APIPA / Automatic Private IP Addressing, in IPv6 normally global addresses are used and someone with IPv6 connectivity can reach all internal IPv6 enabled nodes.


14.1. Firewalling


14.1.2. Preparation

14.1.2.1. Get sources

Get the latest kernel source: http://www.kernel.org/

Get the latest iptables package:


14.1.2.2. Extract sources

Change to source directory:

# cd /path/to/src 
    

Unpack and rename kernel sources

# tar z|jxf kernel-version.tar.gz|bz2 
# mv linux linux-version-iptables-version+IPv6 
    

Unpack iptables sources

# tar z|jxf iptables-version.tar.gz|bz2 
    

14.1.2.4. Configure, build and install new kernel

Change to kernel sources

# cd /path/to/src/linux-version-iptables-version/ 
    

Edit Makefile

- EXTRAVERSION = 
+ EXTRAVERSION = -iptables-version+IPv6-try 
    

Run configure, enable IPv6 related

            Code maturity level options 
                  Prompt for development and/or incomplete code/drivers : yes 
            Networking options 
                  Network packet filtering: yes 
                  The IPv6 protocol: module 
                       IPv6: Netfilter Configuration 
                             IP6 tables support: module 
                             All new options like following: 
                                   limit match support: module 
                                   MAC address match support: module 
                                   Multiple port match support: module 
                                   Owner match support: module 
                                   netfilter MARK match support: module 
                                   Aggregated address check: module 
                                   Packet filtering: module 
                                        REJECT target support: module 
                                        LOG target support: module 
                                   Packet mangling: module 
                                   MARK target support: module 
    

Configure other related to your system, too

Compilation and installing: see the kernel section here and other HOWTOs


14.1.3. Usage

14.1.3.1. Check for support

Load module, if so compiled

# modprobe ip6_tables 
    

Check for capability

# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support
¬ 'ip6tables' firewalling (IPv6)!" 
    

14.1.3.2. Learn how to use ip6tables

List all IPv6 netfilter entries

# ip6tables -L 
    

# ip6tables -n -v --line-numbers -L 
    

List specified filter

# ip6tables -n -v --line-numbers -L INPUT 
    

Insert a log rule at the input filter with options

# ip6tables --table filter --append INPUT  -j LOG --log-prefix "INPUT:"
¬ --log-level 7 
    

Insert a drop rule at the input filter

# ip6tables --table filter --append INPUT  -j DROP 
    

Delete a rule by number

# ip6tables --table filter --delete INPUT 1 
    

Allow ICMPv6, at the moment, with unpatched kernel 2.4.5 and iptables-1.2.2 no type can be specified

# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT 
    

# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT 
    

Allow incoming SSH, here an example is shown for a ruleset which allows incoming SSH connection from a specified IPv6 address

# ip6tables -A INPUT -i sit+ -p tcp -s 3ffe:400:100::1/128 --sport 512:65535
¬ --dport 22 -j ACCEPT 
    

# ip6tables -A OUTPUT -o sit+ -p tcp -d 3ffe:400:100::1/128 --dport 512:65535
¬ --sport 22 ! --syn j ACCEPT 
    

Enable tunneled IPv6-in-IPv4, to accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your IPv4 firewall setup relating to such packets, for example

# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT 
    

# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT 
    

If you have only a static tunnel, you can specify the IPv4 addresses, too, like

# iptables -A INPUT -i ppp0 -p ipv6 -s 1.2.3.4 -j ACCEPT 
    

# iptables -A OUTPUT -o ppp0 -p ipv6 -d 1.2.3.4 -j ACCEPT 
    

Protect against incoming TCP connection requests (VERY RECOMMENDED!), for security issues you should really insert a rule which blocks incoming TCP connection requests. Adapt "-i" option, if other interface names are in use!

# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP 
    

# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP 
    

Perhaps the rules have to be placed below others, but that is work you have to think about it. Best way is to create a script and execute rules in a specified way.

Protect against incoming UDP connection requests (ALSO RECOMMENDED!), like mentioned on my firewall information it's possible to control the ports on outgoing UDP/TCP sessions. So if all of your local IPv6 systems are use local ports e.g. from 32768 to 60999 you are able to filter UDP connections also (until connection tracking works) like:

# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP 
    

ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP 
    

14.1.3.3. Demonstration example

Following lines show a more sophisticated setup as an example. Happy netfilter6 ruleset creation....

# ip6tables -n -v -L 
Chain INPUT (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination
    0     0 extIN      all      sit+   *       ::/0                 ::/0 
    4   384 intIN      all      eth0   *       ::/0                 ::/0 
    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    0     0 ACCEPT     all      lo     *       ::/0                 ::/0 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `INPUT-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 int2ext    all      eth0   sit+    ::/0                 ::/0 
    0     0 ext2int    all      sit+   eth0    ::/0                 ::/0 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `FORWARD-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain OUTPUT (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 extOUT     all      *      sit+    ::/0                 ::/0 
    4   384 intOUT     all      *      eth0    ::/0                 ::/0 
    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    0     0 ACCEPT     all      *      lo      ::/0                 ::/0 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `OUTPUT-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain ext2int (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `ext2int-default:' 
    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    0     0 DROP       udp      *      *       ::/0                 ::/0 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain extIN (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     tcp      *      *       3ffe:400:100::1/128  ::/0       
¬        tcp spts:512:65535 dpt:22 
    0     0 ACCEPT     tcp      *      *       3ffe:400:100::2/128  ::/0       
¬        tcp spts:512:65535 dpt:22 
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
¬        udp spts:1:65535 dpts:1024:65535 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain extOUT (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     tcp      *      *       ::/0                
¬ 3ffe:400:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    0     0 ACCEPT     tcp      *      *       ::/0                
¬ 3ffe:400:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
¬        tcp spts:1024:65535 dpts:1:65535 
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
¬        udp spts:1024:65535 dpts:1:65535 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `extOUT-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain int2ext (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
¬        tcp spts:1024:65535 dpts:1:65535 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `int2ext:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `int2ext-default:' 
    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    0     0 DROP       udp      *      *       ::/0                 ::/0 
    0     0 DROP       all      *      *       ::/0                 ::/0 
 
Chain intIN (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     all      *      *       ::/0                
¬ fe80::/ffc0:: 
    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
 
Chain intOUT (1 references) 
 pkts bytes target     prot opt in     out     source               destination
¬ 
    0     0 ACCEPT     all      *      *       ::/0                
¬ fe80::/ffc0:: 
    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    0     0 LOG        all      *      *       ::/0                 ::/0       
¬        LOG flags 0 level 7 prefix `intOUT-default:' 
    0     0 DROP       all      *      *       ::/0                 ::/0 
    

Chapter 15. Encryption and Authentication

Unlike in IPv4 encryption and authentication is a mandatory feature of IPv6. This features are normally implemented using IPsec (which can be also used by IPv4).

But because of the independence of encryption and authentication from the key exchange protocol there exists currently some interoperability problems regarding this issue.


Chapter 16. Quality of Service (QoS)

IPv6 supports QoS with use of Flow Labels and Traffic Classes. This can be controlled using "tc" (contained in package "iproute").

more to be filled...


Chapter 17. Hints for IPv6-enabled daemons

Here some hints are shown for IPv6-enabled daemons.


17.1. Berkeley Internet Name Daemon BIND (named)

IPv6 is supported since version 9. Always use newest available version. At least version 9.1.3 must be used, older versions can contain remote exploitable security holes.


17.1.1. Listening on IPv6 addresses

Note: unlike in IPv4 current versions doesn't allow to bind a server socket to dedicated IPv6 addresses, so only any or none are valid. Because this can be a security issue, check the Access Control List (ACL) section below, too!


17.1.1.1. Enable BIND named for listening on IPv6 address

To enable IPv6 for listening, following options are requested to change

options {
        # sure other options here, too
        listen-on-v6 { any; };
};
    

This should result after restart in e.g.

# netstat -lnptu |grep "named\W*$" 
tcp 0 0 :::53         :::*      LISTEN 1234/named # incoming TCP requests
udp 0 0 1.2.3.4:53    0.0.0.0:*        1234/named # incoming UDP requests to IPv4 1.2.3.4
udp 0 0 127.0.0.1:53  0.0.0.0:*        1234/named # incoming UDP requests to IPv4 localhost
udp 0 0 0.0.0.0:32868 0.0.0.0:*        1234/named # dynamic chosen port for outgoing queries
udp 0 0 :::53         :::*             1234/named # incoming UDP request to any IPv6
    

And a simple test looks like

# dig localhost @::1
    

and should show you a result.


17.1.2. IPv6 enabled Access Control Lists (ACL)

IPv6 enabled ACLs are possible and should be used whenever it's possible. An example looks like following:

acl internal-net { 
        127.0.0.1; 
        1.2.3.0/24;  
        3ffe:ffff:100::/56; 
        ::1/128; 
        ::ffff:1.2.3.4/128; 
};
acl ns-internal-net { 
        1.2.3.4;  
        1.2.3.5;  
        3ffe:ffff:100::4/128; 
        3ffe:ffff:100::5/128; 
};
   

This ACLs can be used e.g. for queries of clients and transfer zones to secondary name-servers. This prevents also your caching name-server to be used from outside using IPv6.

options {
        # sure other options here, too
        listen-on-v6 { none; };
        allow-query { internal-net; }; 
        allow-transfer { ns-internal-net; }; 
};
   

It's also possible to set the allow-query and allow-transfer option for most of single zone definitions, too.


17.1.5. Serving IPv6 related DNS data

For IPv6 new types and root zones for reverse lookups are defined:

Perhaps filled later more content, for the meantime take a look at given RFCs and

Because IP6.INT is deprecated (but still in use), a DNS server which will support IPv6 information has to serve both reverse zones.


17.1.6. Checking IPv6-enabled connect

To check, whether BIND is listening on an IPv6 socket and serving data see following examples.


17.1.6.1. IPv6 connect, but denied by ACL

Specifying a dedicated server for the query, an IPv6 connect can be forced:

$ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 
Using domain server: 
Name: 3ffe:ffff:200:f101::1 
Address: 3ffe:ffff:200:f101::1#53 
Aliases:
Host www.6bone.net. not found: 5(REFUSED)
    

Related log entry looks like following:

Jan 3 12:43:32 gate named[12347]: client
¬ 3ffe:ffff:200:f101:212:34ff:fe12:3456#32770: 
 query denied
    

If you see such entries in the log, check whether requests from this client should be allowed and perhaps review your ACL configuration.


17.1.6.2. Successful IPv6 connect

A successful IPv6 connect looks like following:

$ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 
Using domain server: 
Name: 3ffe:ffff:200:f101::1 
Address: 3ffe:ffff:200:f101::1#53 
Aliases:
www.6bone.net. is an alias for 6bone.net. 
6bone.net. has AAAA address 3ffe:b00:c18:1::10
    

17.3. Webserver Apache2 (httpd2)

Apache web server supports IPv6 native by maintainers since 2.0.14. Available patches for the older 1.3.x series are not current and shouldn't be used in public environment, but available at KAME / Misc.


17.3.1. Listening on IPv6 addresses

Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 (a patch is available for 2.0.28).


17.3.1.1. Virtual host listen on an IPv6 address only

Listen [3ffe:ffff:100::1]:80
<VirtualHost [3ffe:ffff:100::1]:80>
        ServerName ipv6only.yourdomain.yourtopleveldomain
        # ...sure more config lines
</VirtualHost>
    

17.3.1.2. Virtual host listen on an IPv6 and on an IPv4 address

Listen [3ffe:ffff:100::2]:80 
Listen 1.2.3.4:80
<VirtualHost [3ffe:ffff:100::2]:80 1.2.3.4:80>
        ServerName ipv6andipv4.yourdomain.yourtopleveldomain
        # ...sure more config lines
</VirtualHost>
    

This should result after restart in e.g.

# netstat -lnptu |grep "httpd2\W*$" 
tcp 0 0 1.2.3.4:80          0.0.0.0:* LISTEN 12345/httpd2 
tcp 0 0 3ffe:ffff:100::1:80 :::*      LISTEN 12345/httpd2 
tcp 0 0 3ffe:ffff:100::2:80 :::*      LISTEN 12345/httpd2
    

For simple tests use the telnet example already shown.


17.4. Router Advertisement Daemon (radvd)

The router advertisement daemon is very useful on a LAN, if clients should be auto-configured. The daemon itself should run a Linux router (not necessary the default IPv4 gateway).

You can specify some information and flags which should be contained in the advertisement. Common used are

After a proper configuration, the daemon sends advertisements through specified interfaces and clients are hopefully receive them and auto-magically configure addresses with received prefix and the default route.


17.4.1. Configuring radvd

17.4.1.1. Simple configuration

Radvd's config file is normally /etc/radvd.conf. An simple example looks like following:

interface eth0 { 
        AdvSendAdvert on;
        MinRtrAdvInterval 3; 
        MaxRtrAdvInterval 10;
        prefix 3ffe:ffff:0100:f101::/64 { 
                AdvOnLink on; 
                AdvAutonomous on; 
                AdvRouterAddr on; 
        };
};
    

This results on client side in

# ip -6 addr show eth0 
3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    inet6 3ffe:ffff:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
       valid_lft 2591992sec preferred_lft 604792sec 
    inet6 fe80::2e0:12ff:fe34:1234/10 scope link
    

Because no lifetime was defined, a very high value was used.


17.4.1.2. Special 6to4 configuration

Version since 0.6.2pl3 support the automatic (re)-generation of the prefix depending on an IPv4 address of a specified interface. This can be used to distribute advertisements in a LAN after the 6to4 tunneling has changed. Mostly used behind a dynamic dial-on-demand Linux router. Because of the sure shorter lifetime of such prefix (after each dial-up, another prefix is valid), the lifetime configured to minimal values:

interface eth0 { 
        AdvSendAdvert on;
        MinRtrAdvInterval 3; 
        MaxRtrAdvInterval 10;
        prefix 0:0:0:f101::/64 { 
                AdvOnLink off; 
                AdvAutonomous on; 
                AdvRouterAddr on; 
                Base6to4Interface ppp0;
                AdvPreferredLifetime 20; 
                AdvValidLifetime 30;
        };
};
    

This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local IPv4 address):

# ip -6 addr show eth0 
3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
   inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
      valid_lft 22sec preferred_lft 12sec
   inet6 fe80::2e0:12ff:fe34:1234/10 scope link
    

Because a small lifetime was defined, such prefix will be thrown away quickly, if no related advertisement was received.


17.4.2. Debugging

A program called "radvdump" can help you looking into sent or received advertisements. Simple to use:

# radvdump 
Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) 
        AdvCurHopLimit: 64 
        AdvManagedFlag: off 
        AdvOtherConfigFlag: off 
        AdvHomeAgentFlag: off 
        AdvReachableTime: 0 
        AdvRetransTimer: 0 
        Prefix 2002:0102:0304:f101::/64 
                AdvValidLifetime: 30 
                AdvPreferredLifetime: 20 
                AdvOnLink: off 
                AdvAutonomous: on 
                AdvRouterAddr: on 
        Prefix 3ffe:ffff:100:f101::/64 
                AdvValidLifetime: 2592000 
                AdvPreferredLifetime: 604800 
                AdvOnLink: on 
                AdvAutonomous: on 
                AdvRouterAddr: on 
        AdvSourceLLAddress: 00 80 12 34 56 78
   

Output shows you each advertisement package in readable format. You should see your configured values here again, if not, perhaps it's not your radvd which sends the advertisement...look for another router on the link (and take the LLAddress, which is the MAC address for tracing).


17.5. tcp_wrapper

tcp_wrapper is a library which can help you to protect service against misuse.


17.5.4. Logging

Depending on the entry in the syslog daemon configuration file /etc/syslog.conf the tcp_wrapper logs normally into /var/log/secure.


17.5.4.1. Refused connection

A refused connection via IPv4 to an xinetd covered daytime service produces a line like following example

Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap
¬ from=::ffff:1.2.3.4
Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap 
 from=3ffe:ffff:100:200::212:34ff:fe12:3456
    

A refused connection via IPv4 to an dual-listen sshd produces a line like following example

Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4
¬ (::ffff:1.2.3.4)
Jan 2 20:39:33 gate sshd[12345]: refused connect 
 from 3ffe:ffff:100:200::212:34ff:fe12:3456
¬ (3ffe:ffff:100:200::212:34ff:fe12:3456)
    

17.5.4.2. Permitted connection

A permitted connection via IPv4 to an xinetd covered daytime service produces a line like following example

Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0
¬ from=::ffff:1.2.3.4 
Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 
 from=3ffe:ffff:100:200::212:34ff:fe12:3456
    

A permitted connection via IPv4 to an dual-listen sshd produces a line like following example

Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4
¬ port 33381 ssh2
Jan 2 20:42:19 gate sshd[12345]: Accepted password for user 
 from 3ffe:ffff:100:200::212:34ff:fe12:3456 port 33380 ssh2
    

Chapter 18. Programming (using API)

I have no experience in IPv6 programming, perhaps this chapter will be filled by others or moved away to another HOWTO.


Chapter 19. Interoperability

There are some projects around the world which checks the interoperability of different operating systems regarding the implementation of IPv6 features. Here some URLs:

More coming next...


Chapter 20. Further information and URLs

20.1. Paper printed books, articles, online reviews (mixed)

20.1.1. German language

  • Technik der IP-Netze (TCP/IP incl. IPv6) bei Amazon.de Anatol Badach, Erwin Hoffmann Carl Hanser Verlag München, Wien, 2001 ISBN: 3-446-21501-8 Kap. 6: Protokoll IPv6 S.205-242 Kap. 7: Plug&Play-Unterstützung bei IPv6 S.243-276 Kap. 8: Migration zum IPv6-Einsatz S.277-294 Kap. 9.3.4: RIP für das Protokoll IPv6 (RIPng) S.349-351 Kap. 9.4.6: OSPF für IPv6 S.384-385 Kommentar: tw. nicht ganz up-to-date bzw. nicht ganz fehlerfreie Abbildungen Homepage des Buches und Tabelle mit Fixes

  • Internet-Sicherheit (Browser, Firewalls und Verschlüsselung) bei Amazon.de Kai Fuhrberg 2. akt. Auflage 2000 Carl Hanser Verlag München, Wien, ISBN: 3-446-21333-3 Kap.2.3.1.4. IPv6 S.18-22 Kurz angerissen werden: RFC1825 - Security Association Konzept RFC1826 - IP authentication Header RFC1827 - IP Encapsulation Security Payload


20.1.2. Articles, Books, Online Reviews (mixed)


20.2. Online information

20.2.1. Join the IPv6 backbone

More to be filled later...suggestions are welcome!


20.2.1.2. Major regional registries

Also a list of major (prefix length 35) allocations per local registry is available here: Ripe NCC / IPv6 allocations.


20.2.1.3. Tunnel brokers

  • Freenet6, Canada

  • Hurricane Electric, US backbone

  • Centro Studi e Laboratory Telecomunicazioni, Italy

  • Wanadoo, Belgium

  • CERTNET-Nokia, China

  • Tunnelbroker Leipzig, Germany - DialupUsers with dynamic IP's can get a fix IPv6 IP...

  • Internet Initiative Japan, Japan - with IPv6 native line service and IPv6 tunneling Service

  • XS26 - "Access to Six", Netherland - with POPs in Slovak Republic, Czech Republic, Netherlands, Germany and Hungary.

  • IPng Netherland, Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected at the AMS-IX. It is possible (there are requirements...) to get an static tunnel.

  • UNINETT, Norway - Pilot IPv6 Service (for Customers): tunnelbroker & address allocation

  • NTT Europe, NTT Euroope, United Kingdom - IPv6 Trial. IPv4 Tunnel and native IPv6 leased Line connections. POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East Coast) Cupertino, USA (West Coast) Tokyo, Japan

  • ESnet, USA - Energy Sciences Network: Tunnel Registry & Address Delegation for directly connected ESnet sites and ESnet collaborators.

  • 6REN, USA - The 6ren initiative is being coordinated by the Energy Sciences Network (ESnet), the network for the Energy Research program of the US Dept. of Energy, located at the University of California's Lawrence Berkeley National Laboratory

See also here for more information and URLs: ipv6-net.org.


20.2.2. Latest news

More to be filled later...suggestions are welcome!


20.2.4. More information

More to be filled later...suggestions are welcome!


20.2.4.2. Linux related per distribution

For more see the distribution status page


20.2.4.3. General

Something missing? Suggestions are welcome!


20.2.5. By countries


20.2.5.2. Belgium

  • BELNET - the Belgian Research Network

  • Euronet - one of the biggest ISP's of Belgium...


20.2.5.4. France


20.2.5.5. Italy


20.2.5.6. Japan


20.2.5.7. Korea


20.2.5.8. Mexico

  • IPv6 Mexico (spain & english version) - IPv6 Project Hompeage of The National Autonomous University of Mexico (UNAM)


20.2.5.9. Netherland

  • SURFnet - SURFnet IPv6 Backbone

  • STACK, STACK (IPv6) - Students' computer association of the Eindhoven University of Technology, Netherland.

  • IPng.nl, collaboration between WiseGuys and Intouch.


20.2.5.10. United Kingdom


20.2.7. Application lists


20.2.7.1. Analyzer tools

  • Etherreal - Ethereal is a free network protocol analyzer for Unix and Windows

  • Radcom RC100-WL - Download Radcom RC100-WL protocol analyzer version 3.20


20.3. Online test tools

More to be filled later...suggestions are welcome!


Chapter 21. Revision history / Credits / The End

21.1. Revision history

Versions x.y are published on the Internet.

Versions x.y.z are work-in-progress and only published as LyX file on CVS.


21.1.1. Releases 0.x

0.23

2002-03-27/PB: Add entries in URL list and at maillists, add a label and minor information about IPv6 on RHL

0.22

2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an entry in URL list and at maillists

0.21

2002-02-26/PB: Migrate next grammar checks submitted by John Ronan

0.20.4

2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some additional hints at DNS section

0.20.3

2002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan

0.20.2

2002-02-05/PB: Add mipl to maillist table

0.20.1

2002-01-31/PB: Add a hint how to generate 6to4 addresses

0.20

2002-01-30/PB: Add a hint about default route problem, some minor updates

0.19.2

2002-01-29/PB: Add many new URLs

0.19.1

2002-01-27/PB: Add some forgotten URLs

0.19

2002-01-25/PB: Add two German books, fix quote entinities in exported SGML code

0.18.2

2002-01-23/PB: Add a FAQ on the program chapter

0.18.1

2002-01-23/PB: Move "the end" to the end, add USAGI to maillists

0.18

2002-01-22/PB: Fix bugs in explanation of multicast address types

0.17.2

2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all credits to the end of the document

0.17.1

2002-01-20/PB: Add a reference, fix URL text in online-test-tools

0.17

2002-01-19/PB: Add some forgotten information and URLs about global IPv6 addresses

0.16

2002-01-19/PB: Minor fixes, remove "bold" and "emphasize" formats on code lines, fix "too long unwrapped code lines" using selfmade utility, extend list of URLs.

0.15

2002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to end of document

0.14

2002-01-14/PB: Minor review at all, new chapter "debugging", review "addresses", spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor enhancements

0.13

2002-01-05/PB: Add example BIND9/host, move revision history to end of document, minor extensions

0.12

2002-01-03/PB: Merge review of David Ranch

0.11

2002-01-02/PB: Spell checking and merge review of Pekka Savola

0.10

2002-01-02/PB: First public release of chapter 1


21.2. Credits

The quickest way to be added to this nice list is to send bug fixes, corrections, and/or updates to me ;-).

If you want to do a major review, you can use the native LyX file (see original source) and send diffs against it, because diffs against SGML don't help too much.