The time for seasonal network cleaning has arrived. October's projects are to introduce IPv6 into my LAN (partly to test EthTV's compatibility) and to replace its troublesome upstream modem with an open source solution.
IPv6 was a feature of my network many years ago with a tunnel from Hurricane Electric. The immaturity of the technology and high latency1 of the service led me to nuke it a few months after setting it up, but the learning process was useful. I now have a new tunnel from SixXS with excellent latency thanks to their large pool of global peers:
[root@gateway ~]# ping6 ipv6.google.com
PING6(56=40+8+8 bytes) 2a01:348:6:13a::2 --> 2001:4860:0:1001::68
16 bytes from 2001:4860:0:1001::68, icmp_seq=0 hlim=58 time=42.370 ms
16 bytes from 2001:4860:0:1001::68, icmp_seq=1 hlim=58 time=41.324 ms
16 bytes from 2001:4860:0:1001::68, icmp_seq=2 hlim=58 time=41.903 ms
SixXS is an interesting service to experience. Tunnel requests, subnet allocations, PTR delegations, etc. are approved by the company's staff if you can provide sufficient justification. Trust is built up over time through a monetary system that can be used to "purchase" additional services. Simply keeping your tunnel endpoint pingable is enough to earn these services over time, albeit at a slower rate than interacting directly with the project.
I now have a static tunnel configured on my ALIX utility box:
gif0: flags=8051 metric 0 mtu 1280
tunnel inet 82.70.152.20 --> 77.75.104.126
inet6 2a01:348:6:13a::2 --> 2a01:348:6:13a::1 prefixlen 128
Getting PF to play nicely took a little head scratching. ICMPv6 must be allowed for SixXS to monitor my endpoint. I found this was sufficient (in addition to default block rules on all interfaces and protocols):
pass in quick on vr1 inet proto ipv6 from 77.75.104.126 to 82.70.152.20 keep state
pass in quick on gif0 inet6 proto ipv6-icmp from any to 2a01:348:6:13a::2 keep state
Configuring the LAN on a unique local subnet (pending enough trust with SixXS to obtain a globally routable prefix) highlighted the weaknesses in Ubuntu's GUI network configuration support. Bypassing NetworkManager for the wired connection to introduce a static IPv6 assignment did work. Interestingly, DHCPv6 is practically unsupported and one is instead meant to rely on stateless address autoconfiguration, a feature made possible by the N:1 mapping of MAC addresses to the host identifier of an IPv6 subnet. I haven't figured out how this variable mapping might interact with DNS entries yet, so I have statically assigned predictable addresses for now.
My IPv6 experimentation led to frustration with the Netgear DG834v3 modem/switch. SixXS requires an ICMP and ICMPv6 pingable endpoint; the latter proved to be no problem. The former appears to be defeated by the modem's firewall (which cannot be disabled). A firewall exception with the Any(ALL) type (other choices being limited to TCP or UDP) can be added to pass ICMP through, with the unfortunate side effect of making the target a DMZ - even for the modem's web interface. Joy!
Placing the modem into debug mode enables telnet access to its Busybox internals. The web interface firewall is based upon iptables and is easily circumvented with a broad accepting rule in the FORWARD chain. This is the configuration I prefer since ALIX, one hop downstream, provides a more sophisticated firewall for the LAN anyway. My exemption rule is, however, periodically deleted and of course lost when the modem is reset. I am now trying to source an ADSL modem compatible with OpenWRT so that I can eliminate the last proprietary component of my network.
1 Update: Martin Levy of Hurricane Electric wrote to let me know that their IPv6 tunnel broker service now has PoPs scattered across the globe, including one in London. This places the service on a par with SixXS and is definitely worth a look if you're interested in setting up a tunnel.