Recently my ISP Internode started a IPv6 trial, for their PPPoE ADSL customers.
I managed to get my setup going, albeit with a few hacks to get around some.. odd stuff.

First of all, you need to change the username your DSL connects with to “<yourusername>@ipv6.internode.on.net”… you’ll need to update this in the following files:

  • /etc/ppp/peers/dsl-provider
  • /etc/ppp/chap-secrets

Once you’ve done this you’ll need to enable ipv6 on your PPP connection, so open /etc/ppp/options and somewhere in that file place +ipv6, which should enable IPv6 in PPPD. There’s some more configuration to be done in PPPD, but we’ll come back to that.

You now need to configure your dhcpv6 client to pick up your /64 from internode. Install it by issuing the following command:

apt-get install wide-dhcpv6-client

Once this is installed you’ll need to configure the configuration file /etc/wide-dhcpv6/dhcp6c.conf with the following information:

interface ppp0 {
  send ia-pd 0;
  script "/etc/wide-dhcpv6/dhcp6c-script";
};

id-assoc pd {
  prefix-interface eth0 {
    sla-id 0;
    sla-len 4;
  };
};

Once this is enabled, it will allow you to get your IPv6 subnet information from Internode, but you need to advertise this subnet to your LAN clients! This is where radvd comes in.

Install it by issuing apt-get install radvd, and put the following in the config file:

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

Now, you should bring up your DSL connection by going ‘pon dsl-provider’.. if you have a look inside your /var/log/syslog, you should see something like the following:

Nov 16 15:01:40 aang pppd[12649]: local  LL address fe80::6487:8571:1291:995d
Nov 16 15:01:40 aang pppd[12649]: remote LL address fe80::020c:86ff:feda:dc1b

This indicates that your IPv6 portion of the PPPoE has come up. Unfortunately there’s one small gotcha with Linux’s IPv6 support, you need to manually configure a default route, by doing the following “ip -6 route add default dev ppp0”.

Now start up your wide dhcpv6 client by issuing “/etc/init.d/wide-dhcpv6-client start” then start up your radvd, by issuing /etc/init.d/radvd start.

If you issue “ip -6 address” you should see something similar to:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:44b8:75ec:fa0:20e:cff:fe38:d42a/64 scope global

This shows you have a local IPv6 address!
You should be able to do a traceroute6 or mtr to ipv6.google.com!
If you’re planning on doing IPv6 for your network also, you’ll need to enable IPv6 forwarding, by editing /etc/sysctl.conf and find the changing the following line:

net.ipv6.conf.all.forwarding=0

to:

net.ipv6.conf.all.forwarding=1

This should get the ball rolling.

To automate this somewhat, I’ve created the following scripts to bring the default route up automatically and to kick the dhcpv6 client once the PPP session comes up. Download them here and here, copy them to /etc/ppp/ipv6-up.d/, make sure they’re executable (chmod +x) and add the following line to your /etc/ppp/peers/dsl-provider file:

ipparam ipv6default

Once you’re done you should have IPv6 for your entire lan and what network change is complete without a traceroute or two, eh?

traceroute6 to ipv6.internode.on.net (2001:44b8:8020:f501:250:56ff:feb3:6633) from 2001:44b8:75ec:fa0:223:6cff:fe7e:eb8b, 64 hops max, 12 byte packets
 1  2001:44b8:75ec:fa0:20e:cff:fe38:d42a  3.144 ms  0.670 ms  0.608 ms
 2  loop0.lns6.adl6.internode.on.net  59.173 ms  64.452 ms  59.790 ms
 3  gi9-40.cor1.adl6.internode.on.net  56.972 ms  57.928 ms  64.692 ms
 4  te2-1.rtr2.adl6.internode.on.net  65.898 ms  57.747 ms  58.438 ms
 5  2001:44b8:8020:f501:250:56ff:feb3:6633  58.108 ms  57.006 ms  58.253 ms