v1.5 1st Sep 2003, Pekka Savola <pekkas@netcore.fi>

HOW TO SET UP IPV6 WITH 6TO4
----------------------------

6TO4 IN SHORT
-------------

6to4 is a method of creating automatic IPv6 tunnels.  You can connect to 
IPv6 Internet very easily without a need for a manually configured tunnel.

For every globally unique IPv4 address, there exists a mapping for a
subnettable /48 network (2^16 for subnetting, 2^64 bits for hosts).

Return route can sometimes be non-optimal, leading to higher round-trip times.

See below for references and more information.

ASSUMPTIONS
-----------

1. You're running Red Hat Linux 7.1 or later.
   
   This is required for correct IPv6 by default settings, and IPv6 being
   enabled as a kernel module by default.  

2. Your initscripts >= 6.02, for 6to4 support.

3. You have a static, globally unique IPv4 address.  This is not an absolute
   requirement, but the only scenario discussed here.

4. Protocol 41 (IPv6-in-IPv4) is not being filtered in any IPv4 firewall.

5. 'iproute' package is installed.  This is used by default for a lot 
   more powerful tunneling capabilities.

Note: even though 6to4 was supported with earlier releases of Red Hat Linux,
below it is assumed that the initscripts package version this
document comes with is used.

INFORMATION NEEDED
------------------

Nothing :-).

If you want to select a specific relay (rather than automatically
selecting the closest one), you can define it with IPV6TO4_RELAY
using the list below:

http://www.kfu.com/~nsayer/6to4/

SETTING UP THE 6TO4 CONFIGURATION
---------------------------------

Now, set up the configuration as follows:

1. Enable IPv6 and set 6to4 pseudo-interface as default gateway in 
   /etc/sysconfig/network:

   echo "IPV6_DEFAULTDEV=tun6to4">> /etc/sysconfig/network

2. Edit your outbound (Internet) interface configuration.  This can be 
   e.g. ippp0, ppp0, eth0, or the like. Here, eth1 is used.


/etc/sysconfig/network-scripts/ifcfg-eth0:
---
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=xx.yy.zz.ww           [Globally unique IPv4 address]
NETMASK=aa.bb.cc.dd          [IPv4 settings up to this point]

IPV6INIT=yes
IPV6TO4INIT=yes
---

   Note: [i]ppp - interfaces need to be called in /etc/ppp/ip-up|down.local;
   if you are not using local files by yourself, this can easily be done with:

    cd /etc/ppp
    ln -s ip-up.ipv6to4 ip-up.local
    ln -s ip-down.ipv6to4 ip-down.local


USING 6TO4
----------

6to4 automatic tunneling is brought up when the interface is brought up.

You will see your 6to4 address prefix in device tun6to4 when done:

	inet6 addr: 2002:c15e:a001::1/16 Scope:Global

Note that 'c15e:a001' is the hexadecimal representation of dotted-quad IPv4
address (IPADDR= above), here '193.94.160.1'.

NOTE: iproute tools give more reliable data, try e.g. '/sbin/ip addr ls'.

PROVIDING IPV6 TO YOUR LAN
--------------------------

If you want to provide IPv6 for your LAN (e.g. connected on eth1)
using your Linux system as a router, this can be done rather easily with 6to4.

You will need to enable IPv6 forwarding (IPV6FORWARDING=yes in
/etc/sysconfig/network) and install a router advertisement daemon.  One such,
'radvd' is available in the distribution.  

You must configure the prefix your IPv4 maps to (see tun6to4 above) in 
/etc/radvd.conf or use certain automatic hooks.  This is not covered here 
in detail; see radvd.conf(5) and /etc/sysconfig/network-scripts/ifup-ipv6 
for details.

Usually the following is enough:

1. Make sure that radvd package is installed.

2. Configure radvd as outlined in radvd.conf(5); the file could
   be something like:

   interface eth1
   {
	AdvSendAdvert on;
	MinRtrAdvInterval 3;
	MaxRtrAdvInterval 10;
	prefix 0:0:0:1::/64
	{
		Base6to4Interface eth0;
		AdvPreferredLifetime 120;
		AdvValidLifetime 300;
	};
   };

3. Make sure radvd starts at boot and start it now:

   /sbin/chkconfig radvd on
   /sbin/service radvd start 

4. Make the initscripts signal radvd to recalculate the prefix when it
   changes:

  /etc/sysconfig/network-scripts/ifcfg-eth0:

  IPV6_CONTROL_RADVD=yes

5. Configure the associated routes to other 6to4 subnets to point at 
   your LAN interfaces; this can be done automatically with 
   IPV6TO4_ROUTING variable; please refer sysconfig.txt for details.
   In the particular example, above, this would be like:

  /etc/sysconfig/network-scripts/ifcfg-eth0:

  IPV6TO4_ROUTING="eth1-:1::0/64"

   However, please note that no global address is configured on the
   interface, just a route!

MORE INFORMATION
----------------

http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO.html is a good
source of IPv6 related Linux-information.

ftp://ftp.isi.edu/in-notes/rfc3056.txt ("Connection of IPv6 Domains via IPv4
Clouds") is the RFC about 6to4.

ftp://ftp.isi.edu/in-notes/rfc3068.txt ("An Anycast Prefix for 6to4 Relay
Routers") is the RFC about finding a close 6to4 relay automatically.

http://www.ietf.org/internet-drafts/draft-savola-v6ops-6to4-security-02.txt
("Security Considerations and Enhancements for 6to4") explains some
security considerations in 6to4.
