<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ipsidixit.net</title>
	<atom:link href="http://www.ipsidixit.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ipsidixit.net</link>
	<description>A far off place</description>
	<lastBuildDate>Tue, 06 Jul 2010 08:28:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>In praise of VirtualBox</title>
		<link>http://www.ipsidixit.net/2010/07/06/in-praise-of-virtualbox/</link>
		<comments>http://www.ipsidixit.net/2010/07/06/in-praise-of-virtualbox/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 06:52:35 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[digiblue]]></category>
		<category><![CDATA[qx5]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[windows xp]]></category>
		<category><![CDATA[wine]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/?p=359</guid>
		<description><![CDATA[VirtualBox. What a splendid piece of software. Just a quick post to flag up this software, which deserves recognition. It&#8217;s a VMware lookalike, but entirely Free (as in beer and as in GNU GPL) Digiblue boo As owner of a Digital Blue QX5 microscope (one of the cheapest, greatest,  &#8221;serious educational toys&#8221; you can lay [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ipsidixit.net/wp-content/2010/07/vbox_logo2_gradient.png"><img class="alignleft size-full wp-image-361" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="vbox_logo2_gradient" src="http://www.ipsidixit.net/wp-content/2010/07/vbox_logo2_gradient.png" alt="" width="140" height="180" /></a><a href="http://www.virtualbox.org/">VirtualBox</a>. What a splendid piece of software.</p>
<p>Just a quick post to flag up this software, which deserves recognition. It&#8217;s a <a href="http://www.vmware.com/">VMware</a> lookalike, but entirely Free (as in beer and as in <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License">GNU GPL</a>)</p>
<h3>Digiblue boo</h3>
<p>As owner of a <a href="http://digiblue.com/customer-service/safety/digital_blue/qx5.html">Digital Blue QX5 microscope</a> (one of the cheapest, greatest,  &#8221;serious educational toys&#8221; you can lay your hands on &#8211; and it&#8217;s not even clear if they still make it) my daughter wanted to use it the other day. It&#8217;s been unused for a while and during that period my only Windows machine has moved to Windows 7 64-bit. And the QX5 driver software supplied is, of course, Windows XP 32-bit. Off to the Digiblue web-site and relieved to see that they assure me that they have Windows 7 64-bit drivers available. Turns out to be a big fat lie. They have them available for a slightly revised model of the QX5. Not the original (different USB ids, etc.)</p>
<h3>WINE?</h3>
<p>Thoughts turn to <a href="http://www.winehq.org/">Linux WINE</a>. Hmmmm. Nope. USB drivers and WINE are one area that still doesn&#8217;t really do what it needs to do.</p>
<h3>I need XP</h3>
<p>OK &#8211; I realise that to get the thing working I need a Windows XP machine. Simple. Yet I can&#8217;t be arsed to set up a dual-boot or anything like that. So remember how neat <a href="http://www.vmware.com/">VMware</a> was all those years ago when I used to use it. I even bought a license for some early version! But I don&#8217;t fancy buying a new license which would cost about €130.</p>
<p>I have the dimmiest recollection of some sort of freebie workstation VM called virtual-something. Google around a bit and quickly find <a href="http://www.virtualbox.org/">VirtualBox</a>. And it&#8217;s just like the VMware I remember, but without the credit card requirement.</p>
<p>Now I&#8217;ve only used it in the simplest of manners: running an XP 32-bit VM on a Windows 7 64-bit host. Not tried any other permutation of host/VM, of which there are all sorts claimed. (Linux hosts, MAC, different Windows &#8211; and even more VMs, extending to the BSD and so on) But for what I wanted it&#8217;s absolutely spot on. Really neat.</p>
<p>Oracle, not a company I&#8217;ve ever been a fanatical supporter of, earns a few brownie points from me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/07/06/in-praise-of-virtualbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenVPN over IPv6</title>
		<link>http://www.ipsidixit.net/2010/06/21/openvpn-over-ipv6/</link>
		<comments>http://www.ipsidixit.net/2010/06/21/openvpn-over-ipv6/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 12:38:09 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[ethernet]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/?p=313</guid>
		<description><![CDATA[Previous articles have detailed various aspects of getting IPv6 running on a home-gateway router. The aim is to migrate as much as possible towards an IPv6-only situation. Here I cover the steps required to implement a simple point-to-point OpenVPN (SSL) VPN tunnel using PSK over IPv6 infrastructure. One key element for me is to migrate [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png"><img class="size-full wp-image-227 alignleft" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" /></a>Previous articles have detailed various aspects of getting IPv6 running on a home-gateway router. The aim is to migrate as much as possible towards an IPv6-only situation.</p>
<p>Here I cover the steps required to implement a simple point-to-point OpenVPN (SSL) VPN tunnel using PSK over IPv6 infrastructure.</p>
<p>One key element for me is to migrate my VPN connection to a remote host I own off IPv4 and entirely onto IPv6. This was not entirely straightforward! In fact it took hours and hours of research and experimentation to get this working. The <em>eventual</em> config required is not so mind-boggling. But getting there was tricky. As I&#8217;ve found out so many times before with regard to IPv6, the building bricks are lying around, but there are very few sources of information to help you stack them up. Once the steps are laid out, as you&#8217;ll see below, it&#8217;s actually pretty easy.</p>
<h2>Migrating from <em>what</em> to OpenVPN IPv6?</h2>
<p>We&#8217;re going to migrate an IPv4 OpenVPN point-to-point PSK VPN tunnel on Linux to an equivalent on native IPv6 infrastructure. We&#8217;re not trying to have an IPv4 tunnel over IPv6, nor an IPv6 tunnel over IPv4 (both of which are possible and useful in different situations). Here I aim to have an IPv6 OpenVPN SSL tunnel over pure IPv6 infrastructure.</p>
<p>My current VPN set up is:</p>
<ul>
<li>Home gateway running Ubuntu 10.04 (Lucid)</li>
<li>Remote host running the same</li>
<li>Fixed public IPv4 and IPv6 (global) addresses on each.</li>
<li>OpenVPN point-to-point tunnel between them.</li>
<li>Simple PSK authentication.</li>
<li>Shorewall config as appropriate to OpenVPN.</li>
</ul>
<p>To put some detail on it, there is a standard build of OpenVPN installed, with a config file such as <em>/etc/openvpn/otherhost.conf</em>:</p>
<p><span id="more-313"></span></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<div id="_mcePaste" style="padding-left: 30px;">remote <em>&lt;IPv4 address of the other host&gt;</em></div>
<div id="_mcePaste" style="padding-left: 30px;">dev tun</div>
<div id="_mcePaste" style="padding-left: 30px;">ifconfig 192.168.2.22 192.168.2.1</div>
<div id="_mcePaste" style="padding-left: 30px;">secret topsecret.psk</div>
<div id="_mcePaste" style="padding-left: 30px;">comp-lzo</div>
<div id="_mcePaste" style="padding-left: 30px;">keepalive 60 180</div>
<div id="_mcePaste" style="padding-left: 30px;">ping-timer-rem</div>
<div id="_mcePaste" style="padding-left: 30px;">persist-tun</div>
<div id="_mcePaste" style="padding-left: 30px;">persist-key</div>
<div id="_mcePaste" style="padding-left: 30px;">user nobody</div>
<div id="_mcePaste" style="padding-left: 30px;">group nogroup</div>
<div id="_mcePaste" style="padding-left: 30px;">daemon</div>
<p></code></p>
<p>At the other host we&#8217;ve a similar config, without the &#8220;remote &lt;address&gt;&#8221; part, and with the VPN addresses specified by the ifconfig flipped around.</p>
<p>This all works a treat. It&#8217;s about as plain an OpenVPN config as you could really get &#8211; a simple point to point tunnel using private IPv4 addressing.</p>
<h2>OpenVPN and IPv6</h2>
<p>This is really where things go all over the place. My starting point was <a href="http://openvpn.net/index.php/open-source/faq.html" target="_blank">over at the OpenVPN site</a>, looking for details on IPv6. I found that:</p>
<p><span style="font-family: Arial, Helvetica, sans-serif; line-height: normal; font-size: 12px; color: #003366;"> </span></p>
<blockquote>
<h2 style="font-size: 16px;">Is IPv6 support planned/in the works?</h2>
<p>Currently, there&#8217;s limited support for IPv6.</p>
<p>Point-to-point IPv6 tunnels are supported on OSes which have IPv6 TUN driver support (this includes Linux and the BSDs). IPv6 over TAP is always supported as is any other protocol which can run over Ethernet.</p>
<p>When OpenVPN 2.0 is run in server mode, IPv6 is currently only supported in TAP mode, not TUN mode (Server mode IPv6 TUN support will likely be added post-2.0).</p>
<p>The VPN carrier connection must currently use IPv4 endpoints, however there&#8217;s a patch which can be found in the openvpn-devel archives which adds IPv6 support. This patch will probably be merged into the mainline post-2.0.</p></blockquote>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; color: #000000; font-size: small;"><span style="line-height: 19px;">So just what do we conclude from that? It says that point-to-point works with the TUN driver. But I couldn&#8217;t find any useful information about <em>how</em> to set it up.</span></span></p>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; color: #000000; font-size: small;"><span style="line-height: 19px;">Researching further, I find that the version of OpenVPN we&#8217;re using with Ubuntu (which is the latest) has very limited IPv6 support indeed. Indeed somewhat less than the OpenVPN web-site led me to believe! Now it may well be that the problem is my inability to understand the nuances of what the OpenVPN folks are saying. But I sure couldn&#8217;t get it working with the installed, standard version.</span></span></p>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; color: #000000; font-size: small;"><span style="line-height: 19px;">So I then find a lot <a href="http://www.greenie.net/ipv6/openvpn.html" target="_blank">more information here</a>, which strongly suggests that I need to use a special IPv6 payload patch to achieve what I want to achieve. Specifically it says:</span></span></p>
<blockquote><p><span style="color: #000000; font-family: 'Times New Roman'; font-size: small;">in point-to-point TUN mode, OpenVPN can transport IPv6 packets with the &#8211;tun-ipv6 option. No support for configuring the IPv6 endpoints and routes from within OpenVPN either, you need to run external &#8220;up&#8221; scripts.</span></p></blockquote>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; color: #000000; font-size: small;"><span style="line-height: 19px;">That implies that I could use the unpatched OpenVPN and then manual scripts. As we&#8217;ll see below, in fact I had to use the patched version <em>and</em> external scripts! Again, likely due to a lack of knowledge on my part. But as a network engineer, I figure if I can&#8217;t work it all out then others will be in the same predicament.</span></span></p>
<h2>VPN addressing</h2>
<p>With IPv6, as discussed previously, the whole notion of private and public is done away with. Or at least, the meaning is seriously changed. Since we no longer have NAT in IPv6 (due to the address space being so very large) we do not have private address ranges for use inside a NATted network. So when choosing IPv6 addresses to use on our VPN it would seem that we can use any values. Well, yes and no. Back in IPv4 we could also have used any values too, while running the risk of accidentally using addresses which do really exist in the public Internet. So it is with IPv6, where we might collide with real addresses. It&#8217;s unlikely in these early days of IPv6, but we want to avoid it.</p>
<p>Another point to note, as with IPv4, is security. If VPN traffic inadvertently &#8221;leaks&#8221; out of a public interface (and this is easier to achieve than you might think, particularly when you are setting things up!) then it would be good to use addresses which any compliant adjacent router will simply drop as unroutable, rather than propagate them in to the wider world. Indeed this desire to avoid &#8220;leaks&#8221; is also a reason to not simply use a chunk of IPv6 addresses out of your allocated pool. It&#8217;s not as if they are scarce &#8211; but mixing VPN addresses and public addresses so intimately is just asking for trouble. In a perfect world, then fine. But I do not live in that world. So an arbitrary addressing barrier betwen my VPN and the Internet is no bad thing.</p>
<p>So for this IPv6 VPN, we shall use so-called Unique Local Addresses, (<a href="http://www.ipsidixit.net/2010/02/24/228/">Over here I touched upon</a> Link Local addresses which are, as the name suggests, valid only within a single network.) as per RFC 4193. The history of all this is damn messy, but the bottom line is you should choose addresses in the range fd00::/8. So I will, merrily ignoring all the rest of RFC 4193, with its try-and-make-it-random stuff, use the following:</p>
<ul>
<li>fd22::22 &#8211; the gateway device</li>
<li>fd22::1 &#8211; the remote host</li>
</ul>
<h2>What does good look like</h2>
<p>What&#8217;s our definition of a working IPv6 VPN? How will I know when &#8220;it&#8217;s working&#8221;? My criteria include:</p>
<ul>
<li>if I do an ifconfig I see a discrete VPN interface.</li>
<li>I can ping6 from one host to another.</li>
<li>during a ping6 I can tcpdump the tunnel interface and see clear traffic.</li>
<li>during a ping6 I can tcpdump the real WAN interface and see encrypted traffic.</li>
</ul>
<h2>Install a patched OpenVPN</h2>
<p>As mentioned in the introduction, I ended up using a patched OpenVPN. I still believe that, based upon what the OpenVPN website says that this should not be required! But I ended up doing it. If you trust the use of a pre-built binary (I did) then it&#8217;s actually pretty easy to install. Bearing in mind that the system being used are running Ubuntu Lucid, follow these steps and you should be good to go:</p>
<ul>
<li>Go to <a href="http://www.greenie.net/ipv6/openvpn.html">this page</a> and have a bit of a read.</li>
<li>Towards the bottom, you should find a link that takes you to <a href="https://launchpad.net/~berni/+archive/ipv6">this page</a>.</li>
<li>At the time of writing, this page only has builds for Intrepid and Karmic. And we&#8217;re Lucid. But fear not, and assume Karmic is correct&#8230;</li>
<li>As per the instructions, add the repository and signing key as per karmic.</li>
<li>Then perform the usual apt-get update followed either by a apt-get install openvpn or just a apt-get upgrade if openvpn was already installed.</li>
</ul>
<p>And you should be all set with the required version.</p>
<h2>Ancillary config</h2>
<p>I&#8217;m just going to cover the IPv6-specific OpenVPN config file. I&#8217;m not going to go in to every last detail required &#8220;around the edges&#8221;. Just a few reminders:</p>
<ul>
<li>You will point to your new IPv6 OpenVPN config from /etc/default/openvpn</li>
<li>You need to add the required config, just as for IPv4, to your shorewall6 config.</li>
</ul>
<h2>Core config</h2>
<p>Here we get to the details. The configs used will actually be very similar to the IPv4 versions, with obvious changes for IPv6.</p>
<p>I&#8217;ll say again: I simply do not understand why the config has to be this way. Based upon the documents and info above, I should be able to put this all neatly within the OpenVPN config. But I could not, and hence the configs below reference simple &#8216;helper&#8217; script to bring the tunnel up correctly.<br />
Here is the config for the home gateway device:</p>
<p style="padding-left: 30px;"><code> local local6address_as_per_hosts_file<br />
remote remote6address_as_per_hosts_file</code></p>
<p style="padding-left: 30px;"><code># Local and remote unique-local addresses<br />
ifconfig-ipv6   fd22::22 fd22::1<br />
# Allow external script to be run<br />
script-security 2<br />
# Script to do the rest of the work...<br />
up /etc/openvpn/helper.up</code></p>
<p style="padding-left: 30px;"><code>proto udp6<br />
dev tun<br />
tun-ipv6<br />
secret topsecret.psk<br />
comp-lzo<br />
keepalive 60 180<br />
ping-timer-rem<br />
persist-tun<br />
persist-key<br />
user root<br />
group root<br />
daemon<br />
</code></p>
<p>And here is the referenced helper script helper.up:</p>
<p style="padding-left: 30px;"><code> #!/bin/bash<br />
ip -6 link set tun0 up<br />
ip -6 addr add fd22::22 dev tun0<br />
ip -6 route add fd22::1 dev tun0<br />
</code></p>
<div>(And remember to make the script executable)</div>
<p>And here&#8217;s one for the remote server:</p>
<p style="padding-left: 30px;"><code> # Local and remote addresses<br />
ifconfig-ipv6 fd22::1 fd22::22</code></p>
<p style="padding-left: 30px;"><code># Allow external script to be run<br />
script-security 2<br />
# Script to do the rest of the work...<br />
up /etc/openvpn/helper.up<br />
proto udp6<br />
dev tun<br />
tun-ipv6<br />
secret supersecret.psk<br />
comp-lzo<br />
keepalive 60 180<br />
ping-timer-rem<br />
persist-tun<br />
persist-key<br />
user nobody<br />
group nogroup<br />
daemon</code></p>
<div>And the helper.up for that one is:</div>
<p style="padding-left: 30px;"><code> #!/bin/bash<br />
ip -6 link set tun0 up<br />
ip -6 addr add fd22::1 dev tun0<br />
ip -6 route add fd22::22 dev tun0<br />
</code></p>
<div>Again, make sure it&#8217;s executable.</div>
<p>Note that each makes use of names, where posible, rather than IPv6 addresses, which have been added to /etc/hosts to make everything easier to read and less prone to typos!</p>
<h2>Static addressing</h2>
<p>Yes, the addressing scheme is kinda static, I know. I wanted to keep this as simple as possible (which already isn&#8217;t so very simple&#8230;) and have everything point-to-point, with all routing being host-specific routing, rather than ranges. The obvious way to slightly adapt this is to allocate two IPv6 subnets within the unique-local adresses being used, and then of course adapt the helper scripts to add the route for the subnets rather than the specific hosts. I&#8217;m sure anyone who has got this far can make that change.</p>
<h2>Success!</h2>
<p>That&#8217;s about all that&#8217;s required. With the above config in place and the firewall set up correctly an ifconfig on the home router returns:</p>
<div style="padding-left: 30px;"><code>tun0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00</code></div>
<div style="padding-left: 90px;"><code>inet6 addr: fd22::22/128 Scope:Global<br />
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1<br />
RX packets:44 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:44 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:100<br />
RX bytes:4576 (4.5 KB)  TX bytes:4576 (4.5 KB)</code></div>
<div></div>
<div>and the routing table shows two new entries:</div>
<p><code></p>
<div style="padding-left: 30px;">fd22::1 dev tun0  metric 1024  mtu 1500 advmss 1440 hoplimit 0</div>
<div style="padding-left: 30px;">fd22::22 dev tun0  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 0</div>
<p></code></p>
<div>And if I ping6 the other VPN address I get a response! Checking with tcpdump directly on the virtual tun0 interface I see meaningful ping-like traffic. While a similar scoping of the bearer interface, eth0, shows me the expected random-looking traffic (i.e. my highly sophisticated test for &#8220;Yes, it&#8217;s encrypted&#8221;!)</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/06/21/openvpn-over-ipv6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netgear EVA9150</title>
		<link>http://www.ipsidixit.net/2010/06/10/netgear-eva9150/</link>
		<comments>http://www.ipsidixit.net/2010/06/10/netgear-eva9150/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 12:15:36 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[ethernet]]></category>
		<category><![CDATA[eva9150]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[mkv]]></category>
		<category><![CDATA[netgear]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[television]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/?p=294</guid>
		<description><![CDATA[My much-loved Pinnacle Showcenter (written about previously here, for example)  finally packed up. Not sure what killed it &#8211; did the obligatory open-it-up-and-buzz-it-a-bit routine. PSU  seemed OK, but when the main board was connected up, something was dragging the PSU down big-time. No obviously failed components, so you are left with the likelihood that some [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://www.ipsidixit.net/wp-content/2010/06/eva9150.jpg"><img class="size-medium wp-image-293 alignleft" title="eva9150" src="https://www.ipsidixit.net/wp-content/2010/06/eva9150-300x128.jpg" alt="" width="300" height="128" /></a>My much-loved Pinnacle Showcenter (written about previously <a href="http://www.ipsidixit.net/2007/10/19/pinnacle-showcenter-1000/">here</a>, for example)  finally packed up. Not sure what killed it &#8211; did the obligatory open-it-up-and-buzz-it-a-bit routine. PSU  seemed OK, but when the main board was connected up, something was dragging the PSU down big-time. No obviously failed components, so you are left with the likelihood that some chip somewhere has gone bad in a big way. So after shedding a tear, one quickly cheers up and realises that it&#8217;s a perfect excuse to replace it with something new!</p>
<h2>Not self-build?</h2>
<p>I wanted a device with similar functionality, to play my large collection of videos stored on a server and also allow occasional photo browsing. I didn&#8217;t have many hard and fast requirements, but as far as they went they were:</p>
<ul>
<li>support a wide range of media formats, particularly DivX variants and MKV hi-def.</li>
<li>support a wide range of output (today we still have a large but rather old normal-def TV &#8211; I am sure in the lifetime of a new device our TV will get replaced with something HDMI-ish)</li>
<li>smart networking: my house is a mixture of Ethernet-over-power and wi-fi, with little cabled Ethernet)</li>
<li>Open. Very important. No proprietary crap, either in terms of what it can play or what I am allowed to do with it.</li>
</ul>
<p>Given this and my propensity for building my own kit, a self-build seemed like an obvious idea. I toyed with the obvious mini-ITX options, with appropriately funky video cards and one of the Linux TV-based distros. But when I did a rough calculation of both the cost and the work required I couldn&#8217;t help but check if there was anything ready-built which would also do the job. I didn&#8217;t expect to find anything, to be honest. It was almost a &#8220;Due Diligence&#8221; exercise which I had to perform so that when I then spent day after day getting my self-build working OK I could mentally justify the effort. However the formality of proving there was nothing which met my needs turned out to have a surprise ending.<span id="more-294"></span></p>
<h2>Netgear EVA9150</h2>
<p>To cut a long story short, I came across the <a href="http://www.netgear.com/Products/Entertainment/DigitalMediaPlayers/EVA9150.aspx">Netgear EVA 9150</a>. Lovely device. Absolutely spot on. And no, I have no affiliation with Netgear! I paid € 270 of my hard-earned cash for it. I&#8217;ll not run through the spec (you can get that <a href="http://www.netgear.com/Products/Entertainment/DigitalMediaPlayers/EVA9150.aspx?detail=Specifications">here</a>) but will mention some key features it has which make it rather special and ideal for my requirements.</p>
<h3>Server support</h3>
<p>Go back to the recent past and devices such as the Pinnacle Showcenter used a web-based client-server architecture. The mediaplayer was, for many purposes, a web-client. It obtained metadata, menus, etc. from the server which had to run either proprietary software or, thanks to some open-source projects, a web server. Either way, you had to run &#8220;special&#8221; software on the media server. Then, to actually play something, the mediaplayer would initiate a web-streaming transfer of the data. Given the limited buffering capability available this meant that the server <em>and</em> network had to, more or less, deliver the required bit-rate in real-time. Any variations (due to a server hit or a network glitch) would result in degraded or completely stopped video playback.</p>
<p>The EVA9150, as I gather with many of the newer generation of mediaplayers, has a quite different architecture. They are actually simpler. The player itself is now much smarter and so demands correspondingly less smarts of the server. All the server has to be is what it already is: a network file server. The mediaplayer runs a local operating system (Linux in the case of the EVA9150) and just scans the server and, when required, copies stuff across. See below where I talk about caching for what this means in practice&#8230;</p>
<p>The version of firmware that came installed on my EVA9150 only supported Samba (i.e. Windows) shared file systems from the server. However the EVA9150 software seems to be under pretty active development, and a newer version (easy install: USB key in the front panel) now provides NFS support too. Since I run a Linux-based file server, this is great.</p>
<h3>Networking</h3>
<p>It has the almost obligatory 10/100 wired Ethernet port. I&#8217;m currently using that into a Ethernet-over-power adapter. The box also has built-in (and it really is built-in: the antennae are completely hidden inside the casing) 802.11a/b/g/n. That last one is interesting: nominal 300Mbps, 5GHz band, wi-fi. I&#8217;ve not tested it yet, but it could be useful in the future.</p>
<h3>Caching</h3>
<p>Ahhhh. This is, for me anyway, the killer feature. My home network works OK most of the time. Like most home networks, it will occasionally hiccup. And during a 2 hour movie even the occasional hiccup or two can become madly apparent when one is streaming in near-real time. Here the EVA9150 does something so simple. It&#8217;s not <em>at all</em> unique, it&#8217;s just done so well and transparently. It caches to the local 500GB disk. So you start a 2 hour movie and, probably within a few minutes of the start, it&#8217;s cached the whole thing successfully to the local disk. Network glitches be dammed. Simple. Perfect. Me like.</p>
<h3>Media formats supported</h3>
<p>The independent reviews of the EVA9150 make this point pretty strongly: try and find something, anything, it can&#8217;t play. OK, I best they exist. But it does everything I&#8217;ve chucked at it. I&#8217;ve got the output connected to a low-def standard TV. I start playing a hi-def Matroska file. Apart from the fact that is support MKV in the first place, I don&#8217;t get any crap about &#8220;this is hi-def, the output is not&#8221; etc. It just PLAYS IT, and down-specs (or, apparently, up-specs under other conditions) as required.</p>
<h3>Physical support</h3>
<p>There&#8217;s a plug on the back for anything I&#8217;ve ever heard about. From SCART up to HDMI, with loads in between.</p>
<h3>Value for money?</h3>
<p>All in all, it&#8217;s a very good mediaplayer. Not cheap, but if I&#8217;d built a box with the same spec myself, quite apart from my time, I don&#8217;t think the parts would have come to less than the €270 I paid anyway.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/06/10/netgear-eva9150/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evil secularists</title>
		<link>http://www.ipsidixit.net/2010/05/03/277/</link>
		<comments>http://www.ipsidixit.net/2010/05/03/277/#comments</comments>
		<pubDate>Mon, 03 May 2010 07:56:31 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[discrimination]]></category>
		<category><![CDATA[humanism]]></category>
		<category><![CDATA[religion]]></category>
		<category><![CDATA[secularism]]></category>
		<category><![CDATA[uk]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/2010/05/03/277/</guid>
		<description><![CDATA[Interesting appeal court decision in the UK yesterday. A certain Gary McFarlane, a &#8220; Christian relationship counsellor&#8221; lost his appeal over a refusal to offer sex therapy to a gay couple. The story seems fairly well covered here, here and here (lefties, right-wing and The BBC!) with similar reporting. First off one cannot but wonder [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;"><img class="size-full wp-image-278 alignleft" style="margin-top: 10px; margin-bottom: 10px; margin-left: 40px; margin-right: 40px;" title="30px-Happyman.svg" src="https://www.ipsidixit.net/wp-content/2010/05/30px-Happyman.svg_.png" alt="" width="30" height="116" />Interesting appeal court decision in the UK yesterday. A certain Gary McFarlane, a &#8220;</span><span style="font-size: small;"> Christian relationship counsellor&#8221; lost his appeal over a refusal to offer sex therapy to a gay couple.</span></p>
<p>The story seems fairly well covered <a id="eaw5" title="here" href="http://www.guardian.co.uk/world/2010/apr/29/religion-gay-rights">here</a>, <a id="iqqg" title="here" href="http://www.telegraph.co.uk/news/newstopics/religion/7652358/Gary-McFarlane-judges-assault-on-irrational-religious-freedom-claims-in-sex-therapist-case.html">here</a> and <a id="gq6j" title="here" href="http://news.bbc.co.uk/2/hi/uk_news/england/bristol/somerset/8651417.stm">here</a> (lefties, right-wing and The BBC!) with similar reporting.</p>
<p>First off one cannot but wonder what a &#8220;Christian relationship counsellor&#8221; actually is. Is it like a &#8220;Christian car mechanic&#8221;, who we wonder is a car mechanic who goes to church, or a car mechanic who only works on Christian cars? And given, as we soon discover, that Mr McFarlane objects, in at least some form or another, to homosexuality, you have to wonder just who would choose to become a sex therapist when you have a hang up about a common sexual orientation.</p>
<p>But that is not the main issue here &#8211; the real issue is whether Mr McFarlane can claim supernatural beliefs permit him to discriminate against people in his working life. And the English courts have emphatically said &#8220;No&#8221;. In essence the court says that your beliefs are your own business, not anyone else&#8217;s. And if you choose to apply them to others you may find that they contradict the laws of the country. And at that point you have a problem.</p>
<p><span id="more-277"></span>So so far, so fairly dull. Today it is homosexuality. 30 years ago it might have been the perceived right to be a racist. 80 years ago the right to be openly sexist. And so on. The litmus test for bigots changes as time goes on. What&#8217;s much more interesting here is that Mr McFarlane claims that he is right simply due to his arbitrary religious beliefs.</p>
<p>And, as the reports make clear, the courts very firmly rejected that and have caused considerable annoyance amongst those who do wish to have their superstitious beliefs imposed upon others.</p>
<p>The quote that really caught my eye was <span style="font-size: small;">Lord Carey (a former Archbishop of Canterbury &#8211; the deputy head of the Church of England) saying of the ruling: &#8220;</span><span style="color: #333333;"> </span><span style="font-size: small;">It heralded a &#8216;secular&#8217; state rather than a &#8216;neutral&#8217; one. &#8220;</span></p>
<p>That is extraordinary. In one short sentence he implies firstly that today the UK is not a place where religion affects those who do not believe in it, and also that &#8220;secularism&#8221; is in some way anti-religion and generally negative.</p>
<p>Taking his suggestion that the UK is a &#8220;neutral&#8221; place already: one could write a book refuting that. But a few that spring to mind are:</p>
<li style="padding-left: 30px;">The Head of State is, by constitutional definition, also the Head of the Church of England.</li>
<li style="padding-left: 30px;">There are laws which would make a Catholic, Jewish or other non-Christian democratically elected Prime Minister difficult or impossible.</li>
<li style="padding-left: 30px;">One of the country&#8217;s leading youth organisations (The Scouting Association) will not allow atheists to join it.</li>
<li style="padding-left: 30px;">The UK&#8217;s House of Lords has 26 voting members (plus a few more there by merit of their religion) who are there <em>solely</em> due to being a senior cleric in the Church of England.</li>
<li style="padding-left: 30px;">Courts can make <a id="jbpr" title="arbitrary sentencing decisions" href="http://www.ipsidixit.net/2010/02/04/bless-me-father-for-i-have-punched/">arbitrary sentencing decisions</a> based upon supernatural beliefs.</li>
<li style="padding-left: 30px;">Publicly funded schools can discriminate on who they accept based upon religious beliefs.</li>
<li style="padding-left: 30px;">Millions of pounds of taxes are used to fund religious practice within the state Health Service.</li>
<li style="padding-left: 30px;">Animal cruelty is made legal if supported by a supernatural belief.</li>
<p>And the list goes on. The point being that for Carey to claim that, religiously, the UK is today &#8220;neutral&#8221; is ridiculous. And his interesting suggesion that, even if it was neutral, we&#8217;ve now tipped over into secularism! It&#8217;s dishonest of him. He is not a stupid man, and is well aware of the dishonesty of that statement. Secularism is the very essence of neutraility, as it applies to government.</p>
<p>Take supernatural beliefs out of government. Stop bleating about religious discrimination. You are the one who wishes to practice religious discrimination Carey, not the secularists. And stop subtly  insinuating that lack of religion equates in some way with lack of morality. That&#8217;s dishonest. And dishonesty is bad. I would have thought you might have known that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/05/03/277/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPv6 and DNS</title>
		<link>http://www.ipsidixit.net/2010/04/02/243/</link>
		<comments>http://www.ipsidixit.net/2010/04/02/243/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 08:33:37 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[icmp6]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ndisc6]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[nslookup]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[rdisc6]]></category>
		<category><![CDATA[rdnss]]></category>
		<category><![CDATA[rdnssd]]></category>
		<category><![CDATA[tcpdump]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/2010/04/02/243/</guid>
		<description><![CDATA[IPv6 DNS &#8211; It works for me&#8230;.. but it shouldn&#8217;t. When in my IPv6 environment I perform a test ping to, say, Google, it seems to work great: ping6 ipv6.google.com PING ipv6.google.com(2a00:1450:8006::6a) 56 data bytes 64 bytes from 2a00:1450:8006::6a: icmp_seq=1 ttl=55 time=49.3 ms 64 bytes from 2a00:1450:8006::6a: icmp_seq=2 ttl=55 time=44.6 ms . . . Which [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-227" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" />IPv6 DNS &#8211; It works for me&#8230;.. but it shouldn&#8217;t.</p>
<p>When in my IPv6 environment I perform a test ping to, say, Google, it seems to work great:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ping6 ipv6.google.com</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">PING ipv6.google.com(2a00:1450:8006::6a) 56 data bytes</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">64 bytes from 2a00:1450:8006::6a: icmp_seq=1 ttl=55 time=49.3 ms</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">64 bytes from 2a00:1450:8006::6a: icmp_seq=2 ttl=55 time=44.6 ms</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<p>Which is lovely. But I then ask myself how the ping6 command actually gets to know that name ipv6.google.com lives at IPv6 global address 2a00:1450:8006::6a. How is the domain name being resolved? And I find that I actually don&#8217;t know. I&#8217;m perfectly familiar with IPv4 DNS. So what&#8217;s going on here?</p>
<h2>I&#8217;m cheating</h2>
<p>I discover, upon investigation, that in fact I&#8217;m &#8220;cheating&#8221;. By that I mean that my attempt to set up a &#8220;pure&#8221; IPv6 environment (albeit in parallel with IPv4) that does not rely upon or touch IPv4 in any way has not been achieved &#8211; It turns out that my DNS is currently entirely dependent upon the existing IPv4 infrastructure! And before going ahead and trying to rectify that, it&#8217;s actually rather educational to understand how it is actually working at all.</p>
<p><span id="more-243"></span>So I run tcpdump on the IPv6 interface and take a look at what&#8217;s going on when I kick off the <em>ping6</em>:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">13:28:36.671682 IP (tos 0&#215;0, ttl 64, id 45341, offset 0, flags [DF], proto UDP (17), length 61)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 11.11.11.11.48231 &gt; 212.27.40.241.53: [udp sum ok] 8831+ AAAA? ipv6.google.com. (33)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">13:28:36.765503 IP (tos 0&#215;0, ttl 60, id 0, offset 0, flags [DF], proto UDP (17), length 250)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 212.27.40.241.53 &gt; 11.11.11.11.48231: 8831 q: AAAA? ipv6.google.com. 7/0/0 ipv6.google.com. [1h49m54s] CNAME[|domain]</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">13:28:36.767123 IP (tos 0&#215;0, ttl 64, id 45365, offset 0, flags [DF], proto UDP (17), length 118)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 11.11.11.11.56346 &gt; 212.27.40.241.53: 37833+[|domain]</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">13:28:37.042646 IP (tos 0&#215;0, ttl 60, id 0, offset 0, flags [DF], proto UDP (17), length 178)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 212.27.40.241.53 &gt; 11.11.11.11.56346: 37833 NXDomain q:[|domain]</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div>So what&#8217;s all that about then?</div>
<div>We appear to have a perfectly standard IPv4 exchange taking place, but with a few odd bits mixed in! Taking it a step at a time&#8230;..</div>
<ul>
<li>A DNS query (UDP &#8211; port 53 &#8211; IPv4 &#8211; standard stuff) goes out for <em>ipv6.google.com</em>. The odd looking bit is the DNS query type: &#8220;AAAA&#8221;. What&#8217;s that? That actually signifies that this is an IPv6 query. Special.</li>
<li>And sure enough we get a response from the IPv4 DNS. It does not decode it here, but in the CNAME response data is the full IPv6 address required.</li>
<li>In fact it returns, as DNS queries often do, more than one address. It returns a selection of 6 of them, of which one gets selected for use.</li>
<li>And we then get a rather odd repeating pattern of subsequent PTR resolution attempts, which is a bit confusing. We&#8217;ll ignore that bit for now.</li>
</ul>
<p>So: in fact our IPv6 DNS is running (with great success!) but&#8230;&#8230;&#8230;&#8230;. over an entirely IPv4 infrastructure.</p>
<p>It&#8217;s fabulous that it all works so easily and seamlessly. <img src='http://www.ipsidixit.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  However, for the purposes of my voyage in to IPv6, I&#8217;d actually rather not use the IPv4 side of things at all. What if IPv4 wasn&#8217;t available to me? So what to do?</p>
<h2>Pure IPv6 Name Resolution &#8211; IPv6 DNS</h2>
<p>So we want to shift the DNS function off IPv4 and to make use of the IPv6 infrastructure. Where to being? Well, since setting up all the IPv6 I had noticed some new bit &#8216;n bobs appearing in my logs, as you do with new things. And I&#8217;d mostly ignored them for now. Again, as you do. But this one was appearing rather regularly, and now seemed rather interesting&#8230;</p>
<pre style="padding-left: 30px;">Mar 30 09:45:30 xxxxx radvd[2351]: RDNSS address 2a01:e00::1 received on eth0 from fe80::207:cbff:fea5:1a68 is not advertised by us</pre>
<p style="padding-left: 30px;">
<p>What&#8217;s that all about? Looking at the elements:</p>
<li style="padding-left: 30px;"><em>eth0</em> is my external (Internet-facing) interface</li>
<li style="padding-left: 30px;">the <em>fe80:</em> address is the IPv6 <em>link</em> address of my adjacent router (i.e. the ISP&#8217;s IPv6 router)</li>
<li style="padding-left: 30px;"><em>2a01:e00::1</em> is a normalish looking IPv6 global address. And sometimes I see the same log with <em>2a01:e00::2</em> in it instead.</li>
<li style="padding-left: 30px;">The RDNSS rather gives it away! &#8220;DNS.&#8221; Is this to do with DNS perhaps&#8230;?</li>
<li style="padding-left: 30px;">&#8220;&#8230;is not advertised by us&#8221; &#8211; What&#8217;s that all about?</li>
<p>Grabbing the incoming packet that seems to generate these logs I see more when fully decoded. The packet concerned is an expected <em>Router Advertisement</em> (RA) but it has some options on it:</p>
<li style="padding-left: 30px;">Prefix Information: this we expect. It tells me the 64-bit prefix that is &#8220;mine&#8221; to use for global IPv6 addresses.</li>
<li style="padding-left: 30px;">Recursive DNS Server: woah! That acronymises as RDNSS. And it hands me two &#8220;Recursive DNS Servers&#8221;: <em>2a01:e00::1</em> and <em>::2</em>. So that&#8217;s where they come from.</li>
<li style="padding-left: 30px;">MTU: an MTU of 1480 is specified in there too. I see that in fact my interface MTU is 1500. Should I worry? perhaps yes. But I&#8217;ll leave that for now and come back to it.</li>
<li style="padding-left: 30px;">Source link-layer address: we can ignore that. <img src='http://www.ipsidixit.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<h2>Manual test of IPv6 DNS</h2>
<p>Before jumping in to new software subsystems, let&#8217;s try a manual test and see what happens. Just as one can use nslookup on the command line to check name resolution for IPv4, so one can use it for IPv6 too. Specify the name to be resolved and the server to us (or else we will default as per /etc/resolv.conf) and see what happens, checking with tcpdump:</p>
<pre style="padding-left: 30px;"><span style="font-family: 'Courier New';"> </span><span style="font-size: medium;">nslookup ipv6.google.com 2a01:e00::1</span></pre>
<p>And I see the following packet sequence result:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">10:23:43.522926 IP6 (hlim 64, next-header UDP (17) payload length: 41) 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c.52838 &gt; dns2.proxad.net.domain: [udp sum ok] 9362+ A? ipv6.google.com. (33)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><br />
</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">10:23:43.577684 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::207:cbff:fea5:1a68 &gt; ff02::1:fff5:f93c: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> source link-address option (1), length 8 (1): 00:07:cb:a5:1a:68</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 0&#215;0000:  0007 cba5 1a68</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><br />
</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">10:23:43.577937 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c &gt; fe80::207:cbff:fea5:1a68: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c, Flags [router, solicited, override]</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> destination link-address option (2), length 8 (1): 00:40:63:f5:f9:3c</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> 0&#215;0000:  0040 63f5 f93c</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><br />
</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">10:23:43.578294 IP6 (hlim 60, next-header UDP (17) payload length: 112) dns2.proxad.net.domain &gt; 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c.52838: [udp sum ok] 9362 q: A? ipv6.google.com. 1/1/0 ipv6.google.com. [2h44m2s] CNAME ipv6.l.google.com. ns: l.google.com. [10m] SOA ns4.google.com. dns-admin.google.com. 1411041 900 900 1800 60 (104)</span></div>
<p>Key here are the first and fourth packets: DNS request out, and DNS response back. All in IPv6. No IPv4 there at all. That&#8217;s good. We can see our IPv6 DNS server and, in principle, they work.</p>
<h2>A secret &#8211; ndisc6</h2>
<p>Time to let you in on a little secret to make life much easier&#8230; While tcpdumps and so on are instructive up to a point, and force one to think a little about what is being seen, they are also pretty tedious. A lot of what we need to achieve here can be done using much more accessible tools! Do yourself a big favour and install the ndisc6 package on your linux system. The <a id="p49f" title="creator's web page" href="http://www.remlab.net/ndisc6/"><span style="color: #000000;">creator&#8217;s web page</span></a> gives you a little more information, but just as an example, look at this command + output:</p>
<div><span style="font-family: 'Courier New';"> </span><span style="font-size: medium;"><strong>rdisc6  eth0</strong></span></div>
<div><span style="font-family: 'Courier New';">Soliciting ff02::2 (ff02::2) on eth0&#8230;</span></div>
<div><span style="font-family: 'Courier New';">Hop limit                 :           64 (      0&#215;40)</span></div>
<div><span style="font-family: 'Courier New';">Stateful address conf.    :           No</span></div>
<div><span style="font-family: 'Courier New';">Stateful other conf.      :           No</span></div>
<div><span style="font-family: 'Courier New';">Router preference         :       medium</span></div>
<div><span style="font-family: 'Courier New';">Router lifetime           :         1800 (0&#215;00000708) seconds</span></div>
<div><span style="font-family: 'Courier New';">Reachable time            :  unspecified (0&#215;00000000)</span></div>
<div><span style="font-family: 'Courier New';">Retransmit time           :  unspecified (0&#215;00000000)</span></div>
<div><span style="font-family: 'Courier New';"> Source link-layer address: 00:40:63:F5:F9:3C</span></div>
<div><span style="font-family: 'Courier New';"> from fe80::240:63ff:fef5:f93c</span></div>
<div><span style="font-family: 'Courier New';">Hop limit                 :           64 (      0&#215;40)</span></div>
<div><span style="font-family: 'Courier New';">Stateful address conf.    :           No</span></div>
<div><span style="font-family: 'Courier New';">Stateful other conf.      :           No</span></div>
<div><span style="font-family: 'Courier New';">Router preference         :       medium</span></div>
<div><span style="font-family: 'Courier New';">Router lifetime           :         1800 (0&#215;00000708) seconds</span></div>
<div><span style="font-family: 'Courier New';">Reachable time            :  unspecified (0&#215;00000000)</span></div>
<div><span style="font-family: 'Courier New';">Retransmit time           :  unspecified (0&#215;00000000)</span></div>
<div><span style="font-family: 'Courier New';"> Prefix                   : 2a01:e35:8b25:7ea0::/64</span></div>
<div><span style="font-family: 'Courier New';"> Valid time              :        86400 (0&#215;00015180) seconds</span></div>
<div><span style="font-family: 'Courier New';"> Pref. time              :        86400 (0&#215;00015180) seconds</span></div>
<div><span style="font-family: 'Courier New';"> Recursive DNS server     : 2a01:e00::2</span></div>
<div><span style="font-family: 'Courier New';"> Recursive DNS server     : 2a01:e00::1</span></div>
<div><span style="font-family: 'Courier New';"> DNS servers lifetime    :          600 (0&#215;00000258) seconds</span></div>
<div><span style="font-family: 'Courier New';"> MTU                      :         1480 bytes (valid)</span></div>
<div><span style="font-family: 'Courier New';"> Source link-layer address: 00:07:CB:A5:1A:68</span></div>
<div><span style="font-family: 'Courier New';"> from fe80::207:cbff:fea5:1a68</span></div>
<p>Wow. Look at all that! Useful.</p>
<p>Now to move on to integrating this into the system so all IPv6 names get resolved this was.</p>
<h2>rdnssd &#8211; Recursive DNS Server daemon</h2>
<p>I think I should start out with a warning here: this next step is the entirely logical and sensible thing to do. But in fact read through to the end: it&#8217;s not going to work &#8211; the Linux IPv6 userspace tools are simply not quite here they should be yet&#8230; But it&#8217;s instructive to look at this, if only for the learning it provides.</p>
<p>Let&#8217;s set up the required sub-system to handle IPv6 DNS requests from this system and the users who will later traverse it. The first step is simply to install the required package:</p>
<p style="padding-left: 30px;"><span style="font-family: 'Courier New';">apt-get install rdnssd</span></p>
<p>This package may have other dependencies, which should get automatically fulfilled, e.g. <em>resolvconf</em>)</p>
<div>Just what is rdnssd? The best summary of it I can see is the first paragraph of the associated <em>man</em> page:</div>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">rdnssd is a daemon program providing client-side support for DNS configuration using the Recursive</span></div>
<div><span style="font-family: 'Courier New';">DNS Server (RDNSS) option, as described in RFC 5006. Its purpose is to supply IPv6 DNS resolvers</span></div>
<div><span style="font-family: 'Courier New';">through stateless autoconfiguration, carried by Router Advertisements.</span></div>
<div><span style="font-family: 'Courier New';"><br />
</span></div>
</blockquote>
<p>That pretty much sums it up. It&#8217;s just what we need here!</p>
<div>The second paragraph is also quite illuminating:</div>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">rdnssd parses RDNSS options and keeps track of resolvers to write nameservers entries to a</span></div>
<div><span style="font-family: 'Courier New';">resolv.conf(5) configuration file. By default, it writes its own separate file, and may call an</span></div>
<div><span style="font-family: 'Courier New';">external hook to merge it with the main /etc/resolv.conf. This is aimed at easing coexistence with</span></div>
<div><span style="font-family: 'Courier New';">concurrent daemons, especially IPv4 ones, updating /etc/resolv.conf too.</span></div>
</blockquote>
<p>So, we&#8217;ve installed it. What&#8217;s it doing? Straight after installing the package a ps -ef shows me that the process is running. I rerun my ping6 and nslookup (without specifying th IPv6 DNS this time) and tcpdump shows me no change: the DNS is still taking place over IPv4.</p>
<p>As mentioned at the start of thus sub-section, we have a problem here. A big, fat problem. We want this daemon to pick up our DNS server from the RA and use them. Which is fine. But check out the last para of the rdnssd man page:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">When rdnssd uses a raw socket instead of the netlink kernel interface, it does not validate received</span></div>
<div><span style="font-family: 'Courier New';">Neighbor Discovery traffic in any way. For example, it will always consider Router Advertisement</span></div>
<div><span style="font-family: 'Courier New';">packets, whereas it should not if the host is configured as a router. When the netlink interface is</span></div>
<div><span style="font-family: 'Courier New';">used, such validation is done by the kernel.</span></div>
</blockquote>
<p>What that boils down to is that if we&#8217;re running as a <em>router</em> (and we are, since in <em>/etc/sysctl.conf</em> we have <em>net.ipv6.conf.all.forwarding=1</em>) the kernel will simply not pass the RA up to user-space at all. So rdnssd never gets the chance to see it, and thus never acts upon it. Which is a bummer.</p>
<p>Just to experiment, you can dynamically drop down to <em>/proc/sys/net/ipv6/conf/all/forwarding</em> and set it to &#8217;0&#8242;. (radvd will bitch and moan, but ignore that.) Force a RA refresh if required, using rdisc eth0, and you will see rdnssd do its stuff and change the <em>/etc/resolv.conf</em> to point at the IPv6 servers. But we can&#8217;t leave it that way, alas. We&#8217;ve hit a bit of a blocker here &#8211; picking up the IPv6 DNS servers automatically from the ISP seems to not be achievable at the moment using rdnssd &#8211; the kernel&#8217;s policies for what is allowed and when prevent it.</p>
<h2>So what do we do?</h2>
<p>We now understand what we&#8217;re trying to do. We also understand how it should be doable. But currently there&#8217;s a blocker. What to do?</p>
<p>As always in such matters, there&#8217;s an easy, pragmatic way forward and a tricky, hacky way forward! The sensible path to take is very simple indeed. We know the IPv6 addresses of our DNS servers (and if we forget we can just do a rdisc eth0 to find them out again) The obvious thing to do it to statically configure them in to the existing <em>/etc/resolv.conf</em> and then, when we later use IPv6 from a device on the internal network, configure them there too.</p>
<p>That&#8217;s what I would recommend. That&#8217;s what you should do. You can specify a mixture of IPv6 and IPv4 name-server in the <em>/etc/resolv.conf file</em>. If you specify the IPv6 servers first, then all DNS on the system will (if available) use the IPv6 name servers. I suppose this does slightly violate still our desire to keep IPv4 and IPv6 separate (since IPv4 name resolution will now also use IPv6) but since it tilts the bias in favour if IPv6, with a seamless fallback to IPv4, I think I can live with that.</p>
<h2>OK &#8211; but what about more wacky solutions?</h2>
<div><strong><em>[Remember, stop here unless you're wanting to have some fun</em></strong><em><strong> and</strong></em><strong><em> you are comfortable with building your own software.]</em></strong></div>
<p>One approach that would give us a partial solution would be to admit we were wrong originally, and instead of using radvd to propagate simple prefix information into our internal networks we should instead use a fully-fledged IPv6 DHCP server that can propagate addressing and DNS information. This would solve the problem of devices inside the network needing to have the IPv6 DNSs statically configured on them. However even this would not solve the root issue here: our inability to automatically pick up the IPv6 DNS information from received RAs when we&#8217;re configured to operate as a router.</p>
<p>The problem there is not, directly, rdnssd itself. The problem is the kernel. An architectural decision has been taken to stop the kernel sending RA DNS data up to userspace if the system is functioning as a router. Good or bad decision? Bad in my view. I can understand why it is sensible default behaviour, yes. But I do not understand why it&#8217;s been made unchangeable. But that&#8217;s how it is, for now anyway.</p>
<p>The solution I&#8217;m going to go for is to actually bypass the policing mechanism itself. The kernel only manages to stop the DNS being sent to userspace when userspace uses the Netlink mechanism to talk down. So why not just bypass that and get the raw data we want? This should bre easy enough to do, as rdnssd itself used to work this way, before the kernel started using Netlink to talk to userspace. So we might be able to build rdnssd to behave as it used to and get the data, right?</p>
<h3>Hack and build rdnssd</h3>
<p>The existing rndssd code makes provision for kernels <em>with </em> the netlink capability which causes us problems and for older kernels <em>without</em> that capability. So all the code we need is already in place. All we really need to do is change the default behaviour of <em>rdnssd</em> to the old way and we&#8217;ll be all set. One could of course do this properly and completely using command line options. Here&#8217;s what you might do in terms of changes to the <em>rdnssd</em> code-base:</p>
<h3>Edit rdnssd.c</h3>
<p>In <em>usage()</em>, ad a line such as:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">&#8221;  -n  &#8211;no-netlink  use old method to pick up kernel notificationsn&#8221;</span></div>
</blockquote>
<p>In <em>main() </em>drop in appropriate parameter parsing:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">static const struct option opts[] =</span></div>
<div><span style="font-family: 'Courier New';"> {</span></div>
<div><span style="font-family: 'Courier New';"> { &#8220;foreground&#8221;,         no_argument,            NULL, &#8216;f&#8217; },</span></div>
<div><span style="font-family: 'Courier New';"> { &#8220;no-netlink&#8221;,         no_argument,            NULL, &#8216;n&#8217;},</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
</blockquote>
<p>and an appropriate global:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'courier new';">bool nonetlink = false;</span></div>
</blockquote>
<p>and then in the main parsing switch add:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">case &#8216;n&#8217;:</span></div>
<div><span style="font-family: 'Courier New';"> nonetlink = true;</span></div>
<div><span style="font-family: 'Courier New';"> break;</span></div>
</blockquote>
<p>Then finally up in worker() we act upon it.</p>
<p>Before we had:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">static int worker (int pipe, const char *resolvpath, const char *username)</span></div>
<div><span style="font-family: 'Courier New';">{</span></div>
<div><span style="font-family: 'Courier New';"> sigset_t emptyset;</span></div>
<div><span style="font-family: 'Courier New';"> int rval = 0, sock = -1;</span></div>
<div><span style="font-family: 'Courier New';"> const rdnss_src_t *src;</span></div>
<div><span style="font-family: 'Courier New';">#ifdef __linux__</span></div>
<div><span style="font-family: 'Courier New';"> src = &amp;rdnss_netlink;</span></div>
<div><span style="font-family: 'Courier New';"> sock = src-&gt;setup ();</span></div>
<div><span style="font-family: 'Courier New';">#endif</span></div>
<div><span style="font-family: 'Courier New';"> if (sock == -1)</span></div>
<div><span style="font-family: 'Courier New';"> {</span></div>
<div><span style="font-family: 'Courier New';"> src = &amp;rdnss_icmp;</span></div>
<div><span style="font-family: 'Courier New';"> sock = src-&gt;setup ();</span></div>
<div><span style="font-family: 'Courier New';"> }</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
</blockquote>
<p>Change it to something like:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">static int worker (int pipe, const char *resolvpath, const char *username)</span></div>
<div><span style="font-family: 'Courier New';">{</span></div>
<div><span style="font-family: 'Courier New';"> sigset_t emptyset;</span></div>
<div><span style="font-family: 'Courier New';"> int rval = 0, sock = -1;</span></div>
<div><span style="font-family: 'Courier New';"> const rdnss_src_t *src;</span></div>
<div><span style="font-family: 'Courier New';">#ifdef __linux__</span></div>
<div><span style="font-family: 'Courier New';"> if (!nonetlink) {</span></div>
<div><span style="font-family: 'Courier New';"> src = &amp;rdnss_netlink;</span></div>
<div><span style="font-family: 'Courier New';"> sock = src-&gt;setup ();</span></div>
<div><span style="font-family: 'Courier New';"> }</span></div>
<div><span style="font-family: 'Courier New';">#endif</span></div>
<div><span style="font-family: 'Courier New';"> if (sock == -1)</span></div>
<div><span style="font-family: 'Courier New';"> {</span></div>
<div><span style="font-family: 'Courier New';"> src = &amp;rdnss_icmp;</span></div>
<div><span style="font-family: 'Courier New';"> sock = src-&gt;setup ();</span></div>
<div><span style="font-family: 'Courier New';"> }</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
</blockquote>
<p>and we&#8217;re good. Build, install and use as before, but using the new cli parameter &#8220;-n&#8221; as required to force the old behaviour.</p>
<p><a title="rdnssd.c - proof of concept" href="http://www.ipsidixit.net/wp-content/2010/04/rdnssd.c" target="_blank">Attached is a version of rdnssd.c </a>based off version 0.9.9 for reference.</p>
<p>For finishing touches, set up an rdnssd hook-file which puts the IPv6 nameservers first in /etc/resolv.conf, and then have the original IPv4 servers appended after them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/04/02/243/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPv6 &#8211; Proxy the neighbors (or come back ARP &#8211; we loved you really)</title>
		<link>http://www.ipsidixit.net/2010/03/24/239/</link>
		<comments>http://www.ipsidixit.net/2010/03/24/239/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 09:11:32 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[icmp6]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[shorewall]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/2010/03/24/239/</guid>
		<description><![CDATA[After three articles, where am I with my venture in to IPv6? What have we really achieved so far? Well, in functional terms, not so very much yet!! To recap: Here I covered a lot of ground, getting basic IPv6 running on a Linux gateway box connected to an ISP providing native IPv6, while remembering [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: medium;"><strong><a href="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png"><img class="alignleft size-full wp-image-227" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" /></a></strong></span><br />
After three articles, where am I with my venture in to IPv6? What have we really achieved so far? Well, in functional terms, not so very much yet!!</p>
<p>To recap:</p>
<ul>
<li><a id="f3ex" title="Here I covered a lot of ground" href="http://www.ipsidixit.net/2010/02/24/228/">Here I covered a lot of ground</a>, getting basic IPv6 running on a Linux gateway box connected to an ISP providing native IPv6, while remembering stuff like the need to set up a firewall.</li>
<li><a id="qd0y" title="Here I looked at" href="http://www.ipsidixit.net/2010/02/25/231/">Here I looked at</a> the issue of IPv6 firewall logging</li>
<li><a id="f8.l" title="And here I looked at" href="http://www.ipsidixit.net/2010/03/05/ipv6-and-default-routes/">And here I looked at</a> the need to set up a default route out of the gateway device pointing back towards the internet.</li>
</ul>
<p>And what can I now actually <em>do</em>? Well&#8230;&#8230;. from the gateway box I can ping out successfully to any IPv6 device on the Internet. In other words, logged in to the device in green on this diagram, I can ping out of eth0 over the Internet. And <em>from</em> an IPv6 device on the Internet I can successfully ping <em>towards</em> my green box, using the address of eth0. So I can ping from the Internet to (these are of course made-up addresses!) 123::456.</p>
<p><img class="aligncenter size-full wp-image-241" title="ipv6_diag1b" src="http://www.ipsidixit.net/wp-content/2010/03/ipv6_diag1-e1269432148539.png" alt="" width="744" height="350" /><br />
<span id="more-239"></span></p>
<p>However if from my remote Internet location I ping instead the IPv6 address of eth1 (here <span style="font-family: 'Courier New';">123::789</span>) does it work? I might expect it to: after all, eth1 has a global IPv6 address on it, not a private address. So surely I can ping it?</p>
<p>Needless to say, as it stands I cannot. Here we look at why not &#8211; in the process covering an important element of turning our gateway device in to an IPv6 router (which, grand though it sounds, is exactly what we are doing here!) which receives very little coverage elsewhere on the Internet. In fact when researching this I came to a conclusion that the vast majority of folks who have dabbled with IPv6 in the domestic environment have terminated their ISP IPv6 connection on their workstation, and very few have gone the step further and used a device as a gateway to a home network!!</p>
<h2>How to get through the gateway &#8211;  or Come back ARP, all is forgiven</h2>
<p><span style="font-size: small;">So when I </span><span style="font-family: 'Courier New';">ping 123::789</span> what stops it working? The first thought is: firewall. We&#8217;re blocking it, right? A quick trip to the shorewall6 log (<a href="http://www.ipsidixit.net/2010/02/25/231/">glad we set that up, eh?</a>) shows us: nothing. Nowt. Zilch. Nada. Surprisingly, we&#8217;re not dropping the ping. (In fact the firewall config we set up in the first of these articles contains enough already to allow, from a firewall perspective, for this ping to succeed.)</p>
<p><span style="font-size: small;">So we now run <em>tcpdump</em> on eth0 to see just what is going on. Here&#8217;s an example:</span></p>
<h3>From the remote host</h3>
<p>From my remote IPv6 host I do and see:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">ping6 2a01:e35:8b25:7ea0::22</span></div>
<div><span style="font-family: 'Courier New';">PING 2a01:e35:8b25:7ea0::22(2a01:e35:8b25:7ea0::22) 56 data bytes</span></div>
<div><span style="font-family: 'Courier New';">From 2a01:e35:8b25:7ea0::1 icmp_seq=1 Destination unreachable: Address unreachable</span></div>
<div><span style="font-family: 'Courier New';">From 2a01:e35:8b25:7ea0::1 icmp_seq=2 Destination unreachable: Address unreachable</span></div>
<div><span style="font-family: 'Courier New';">From 2a01:e35:8b25:7ea0::1 icmp_seq=3 Destination unreachable: Address unreachable</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
</blockquote>
<p>Which doesn&#8217;t tell me a lot.</p>
<h3>On the gateway</h3>
<p>On my gateway, from tcpdump, I see:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">tcpdump -i eth0 -v ip6</span></div>
<div><span style="font-family: 'Courier New';">tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes</span></div>
<div><span style="font-family: 'Courier New';">08:51:35.315038 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::207:cbff:fea5:1a68 &gt; ff02::1:ff00:22: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a01:e35:8b25:7ea0::22</span></div>
<div><span style="font-family: 'Courier New';"> source link-address option (1), length 8 (1): 00:07:cb:a5:1a:68</span></div>
<div><span style="font-family: 'Courier New';">08:51:36.315002 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::207:cbff:fea5:1a68 &gt; ff02::1:ff00:22: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a01:e35:8b25:7ea0::22</span></div>
<div><span style="font-family: 'Courier New';"> source link-address option (1), length 8 (1): 00:07:cb:a5:1a:68</span></div>
<div><span style="font-family: 'Courier New';">08:51:37.315001 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::207:cbff:fea5:1a68 &gt; ff02::1:ff00:22: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a01:e35:8b25:7ea0::22</span></div>
<div><span style="font-family: 'Courier New';"> source link-address option (1), length 8 (1): 00:07:cb:a5:1a:68</span></div>
</blockquote>
<h3>What does this tell me?</h3>
<p>So the ping is reaching the gateway device alright. Sort of. Well, not really. But there&#8217;s something going on there! What we see in that tcpdump trace is the ISP&#8217;s router to which I&#8217;m connected is sending me a Neighbor Solicitation for the ::22 address (i.e. the global IPv6 address of my eth1 interface on the &#8220;far side&#8221; of my gateway which I&#8217;m trying to ping) While I&#8217;m not keen to draw too many parallels and comparisons with IPv4, it is useful to do so here: A Neighbor Solicitation is, at least as we see it here, pretty much analogous to a good ol&#8217; ARP Request. The ISP is saying to us &#8220;I think this address is somewhere over with you &#8211; Please confirm and let me know how to reach it&#8221;. Which is great, except for the glaring fact that we appear to ignore this NS (Neighbor Solicitation) and hence the ping fails.</p>
<p>So you can guess we need to set something up on the gateway that tells it to reply to such a NS. (Kinda vaguely analogous to a <em>Proxy ARP</em>, if you&#8217;re familiar with that)</p>
<h3>IPv6 Proxy</h3>
<p>A couple of steps here. Firstly the system needs to be told globally to perform the required IPv6 proxying, and we then need to enable it for specific addresses.</p>
<h4>proxy_ndp</h4>
<p>In the<span style="font-family: 'Courier New';"> /etc/sysctl.conf</span> file add a line:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">net.ipv6.conf.all.proxy_ndp = 1</span></div>
</blockquote>
<p>To set this dynamically (without a reboot) you can also do:</p>
<blockquote style="border: none; margin: 0 0 0 40px;"><p><span style="font-family: 'Courier New';">sysctl -w net.ipv6.conf.all.proxy_ndp=1</span></p></blockquote>
<h4>Neighbor proxy</h4>
<p>Then perform:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">ip -6 neigh add proxy 2a01:e35:8b25:7ea0::22 dev eth0</span></div>
</blockquote>
<p>Note that here the IPv6 address is the address of the interface on the private side of the gateway (eth1 for me). The end part &#8220;&#8230;dev eth0&#8243; is to say &#8220;Proxy that address from this interface&#8221;.</p>
<p>You also, of course, will need to make such configuration permanent. Numerous approaches to that: I settled upon adding this from the interface-up scripts in <span style="font-family: 'Courier New';">/etc/network/if-up.d/</span> but there are so many other methods too. Pick yours.</p>
<p>(Interestingly, I have yet to discover any way at all to <em>display</em> the list of proxied neighbors added in this manner! I&#8217;ve looked pretty hard, but there appears to be no way I can find to have them listed. There must be a way, but I can&#8217;t find it.)</p>
<h3>Success!</h3>
<p>And the ping now works, with a tcpdump like this now showing to us:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">09:18:18.644817 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::207:cbff:fea5:1a68 &gt; ff02::1:ff00:22: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a01:e35:8b25:7ea0::22</span></div>
<div><span style="font-family: 'Courier New';"> source link-address option (1), length 8 (1): 00:07:cb:a5:1a:68</span></div>
<div><span style="font-family: 'Courier New';">09:18:18.868550 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::240:63ff:fef5:f93c &gt; fe80::207:cbff:fea5:1a68: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is 2a01:e35:8b25:7ea0::22, Flags [solicited]</span></div>
<div><span style="font-family: 'Courier New';"> destination link-address option (2), length 8 (1): 00:40:63:f5:f9:3c</span></div>
<div><span style="font-family: 'Courier New';">09:18:18.868958 IP6 (hlim 56, next-header ICMPv6 (58) payload length: 64) ipsi6 &gt; 2a01:e35:8b25:7ea0::22: ICMP6, echo request, length 64, seq 5</span></div>
<div><span style="font-family: 'Courier New';">09:18:18.869107 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 64) 2a01:e35:8b25:7ea0::22 &gt; ipsi6: ICMP6, echo reply, length 64, seq 5</span></div>
</blockquote>
<p>Which has 4 elements:</p>
<ol>
<li>The same sort of Neighbor Solicitation we had previously.</li>
<li>This time we send back a Neighbor Advertisement for the ::22 address</li>
<li>With that done, the ping itself can come to us (the ICMP6 echo request)</li>
<li>And we of course respond to the ping with ICMP6 echo reply.</li>
</ol>
<h2>Conclusions and summary</h2>
<p>In the world of IPv6, with no ARP or NAT, life is different. Devices which in IPv4 are thought of as private (both in terms of addressing and functionality) are now, at least from the perspective of addressing, public. We need to make sure that if we want &#8220;The World&#8221; to be able to reach them, we must in turn tell the world about them. Hence the need for IPv6 neighbor proxying. And, thinking ahead a little, the need to take our firewalling ever more seriously. If I make the addresses of a &#8220;private&#8221; workstation globally reachable I&#8217;d better make sure that it&#8217;s protected&#8230;</p>
<p>The last point to make is about scalability: do we really need to add an &#8220;ip -6 neigh add proxy&#8221; for each private device we wish to be able to reach from the Internet? If there are only a few devices (as in the typical home network) then it may well be easiest to do this. However in situations where the private side of the network has many IPv6 addresses which need to be globally reachable, other solutions may be more appropriate and manageable, but will not be covered here. Here we&#8217;re trying to get a small home network IPv6 enabled, not migrate a corporation to IPv6. If you really want to get in to the area of automating these functions you need to read up on implementations of Neighbor Discovery Protocol,  look at &#8220;zeroconfig&#8221; networking, Apple&#8217;s Bonjour service, and so on..</p>
<p>There will come a time when such automation <em>will</em> be required at the domestic level, with the eventual proliferation of networked devices. But for now we keep it simple and statically configure the required addresses.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/03/24/239/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>IPv6 and default routes</title>
		<link>http://www.ipsidixit.net/2010/03/05/ipv6-and-default-routes/</link>
		<comments>http://www.ipsidixit.net/2010/03/05/ipv6-and-default-routes/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 15:02:13 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[icmp6]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/?p=233</guid>
		<description><![CDATA[Following on from my first tutorial, we have a box set up which has basic IPv6 connectivity. There&#8217;s a firewall in place with a simple but sufficient configuration. And we can ping6 from this box to remote IPv6 destinations. All of this has, so far, made use only of one network interface (in my case eth0) to [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-227" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" />Following on from <a href="http://www.ipsidixit.net/2010/02/24/228/">my first tutorial</a>, we have a box set up which has basic IPv6 connectivity. There&#8217;s a firewall in place with a simple but sufficient configuration. And we can ping6 from this box to remote IPv6 destinations.</p>
<p>All of this has, so far, made use only of one network interface (in my case <em>eth0</em>) to set things up. However looking ahead to the next step I am aware that I will want devices <em>inside</em> my network (i.e. my workstations, etc.) to have IPv6 connectivity <em>through</em> this device I am setting up. In other words, this device must, as it does today for IPv4, act as a <em>router</em>.</p>
<p>With IPv4 this is, at a basic level (so forgetting about firewalling and so on) very easy: enable IPv4 forwarding and away you go.</p>
<p>For IPv6? A little more complicated&#8230;</p>
<p><span id="more-233"></span></p>
<h2>sysctl.conf</h2>
<p>My first step was to jump in to /etc/sysctl.conf and, just as I have IPv4 forwarding enabled here, do the same for IPv6. There&#8217;s even a (likely commented out) entry already there to help you. So I change it to show:</p>
<pre style="padding-left: 30px;">net.ipv6.conf.all.forwarding = 1</pre>
<p>Reboot (or if you prefer manually involve the same change via sysctl or simply dropping the value in via /proc/sys/) and it takes effect.</p>
<h2>Why has it all stopped working?</h2>
<p>After doing this, the first thing I noticed was that suddenly I could no longer ping6 to my test destination. I find that the default route has disappeared from the route table (ip -6 route show)</p>
<p>It turns out that once the device is defined to be a router (i.e. that IPv6 forwarding is enabled) it stops acting on received Router Advertisements from the ISP, arriving on my WAN link eth0.</p>
<p>I was pretty miffed at first, but of course on reflection this is entirely sensible behaviour &#8211; I do not actually know who is sending me a given router advertisement. I have no knowledge of how the ISP has built its IPv6 infrastructure, and while I would hope that only the ISP can send an IPv6 Router Advertisement towards me, maybe not? What if someone else manages to do it too?</p>
<p>That&#8217;s why an IPv6 router, even in this context, as a home gateway, needs to treat a Router Advertisement with care!</p>
<h2>What to do?</h2>
<p>With IPv6 forwarding enabled it is possible to allow the RA to be accepted. In sysctl.conf set:</p>
<pre style="padding-left: 30px;">net.ipv6.conf.all.accept_ra = 1</pre>
<p>However this then permits the interface(s) to autoconfig so far as addressing is concerned, but still does not pick up a default route. There is also a sysctl of net.ipv6.conf.all.accept_ra_defrtr which could be useful (if you trust your RA in the first place, that is) but anyway I could not make it work as I&#8217;d expect.</p>
<p>So really it comes down to making sure that, once IPv6 forwarding is enabled, that a default route is manually defined. Something along the lines of:</p>
<pre style="padding-left: 30px;">ip -6 route add default via fe80::207:cbff:aaaa:bbbb dev eth0</pre>
<p>seems to do the trick<br />
Of course the difficulty here is how you obtain the address of the required gateway. My ISP had not told me what it was. I obtained it by looking at what the default route had been prior to enabling IPv6 forwarding. Of course I could also have simply run <em>tcpdump -i eth0 ip6</em> and waited for a to show up.To make this permanent, a suitable line can be added to /etc/network.interfaces, so mine now looks similar to:</p>
<pre style="padding-left: 30px;">iface eth0 inet6 static
address 2a01:e35:8b25:aaaa::1
netmask 64
gateway fe80::207:cbff:aaaa:bbbb</pre>
<p>So with IPv6 forwarding enabled <em>and </em> a default route successfully restored, we can now proceed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/03/05/ipv6-and-default-routes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IPv6 &#8211; logging and shorewall6</title>
		<link>http://www.ipsidixit.net/2010/02/25/231/</link>
		<comments>http://www.ipsidixit.net/2010/02/25/231/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 11:42:32 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[icmp6]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[shorewall]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/2010/02/25/231/</guid>
		<description><![CDATA[Following on from my early success at get IPv6 running, I soon hit a significant issue: firewall logging. Now this need not be a &#8220;blocker&#8221; for everyone, but I take my firewall logging duties quite seriously&#8230;! shorewall IPv4 logging Currently I have IPv4 shorewall configured to log not using the standard syslog mechanism, but instead [...]]]></description>
			<content:encoded><![CDATA[<h1><span style="font-weight: normal; font-size: 13px;"><img class="alignleft size-full wp-image-227" style="margin-top: 10px; margin-bottom: 10px; margin-left: 15px; margin-right: 15px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" />Following on from <a href="http://www.ipsidixit.net/2010/02/24/228/" target="_blank"><span style="color: #000000;">my early success at get IPv6 running</span></a>, I soon hit a significant issue: firewall logging.</p>
<p></span></h1>
<p>Now this need not be a &#8220;blocker&#8221; for everyone, but I take my firewall logging duties quite seriously&#8230;!</p>
<h2>shorewall IPv4 logging</h2>
<p>Currently I have IPv4 <a id="mn7m" title="shorewall IPv4 logging configuration and options" href="http://www.shorewall.net/shorewall_logging.html"><span style="color: #000000;">shorewall configured to log</span></a> not using the standard syslog mechanism, but instead to use <a id="w_zy" title="ulogd" href="http://www.netfilter.org/projects/ulogd/index.html"><span style="color: #000000;">ulogd</span></a> instead. This allows me to easily log firewall activity to an entirely separate set of log files very easily. It is entirely not mandatory, but it&#8217;s neat and tidy. I then have <a id="pe_m" title="fwlogwatch" href="http://fwlogwatch.inside-security.de/"><span style="color: #000000;">fwlogwatch</span></a> to nightly analyse the logs and automatically email the interesting bits to me for occasional checking.</p>
<p>To enable this I have appropriate pointers to use of ULOG in shorewall&#8217;s <span style="font-family: 'Courier New';">policy</span> and <span style="font-family: 'Courier New';">rules </span>files as follows:</p>
<div><span id="more-231"></span></div>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';"><span style="text-decoration: underline;">policy</span></span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">ext all DROP ULOG<br />
</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
</blockquote>
<p>and, for example:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';"><span style="text-decoration: underline;">rules</span></span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<div><span style="font-family: 'Courier New';">.</span></div>
<p><span style="font-family: 'Courier New';">ACCEPT:ULOG all fwall 47<br />
.<br />
.<br />
.</span></p></blockquote>
<p>One then has an appropriate config in <span style="font-family: 'Courier New';">/etc/ulogd.conf</span> to file things where you want them.</p>
<h2>shorewall6 IPv6 logging</h2>
<div>Having installed <em>shorewall6</em> in a simple form and got it working, I naively assumed I could log in a similar manner as with the IPv4 version of shorewall. Oh no &#8211; I find <em>ulogd</em> is no longer supported in <em>shorewall6</em> and the choices are:</div>
<ul>
<li>syslog</li>
<li>nflog</li>
</ul>
<p>The <em>syslog</em> option I specifically did not want, so I decided I&#8217;d better find out about <em>nflog</em> (Net Filter Log). It turns out that nflog is actually more commonly referred to as <em>ulogd2</em>, and is a dramatically enhanced version of the original <em>ulog</em>. In fact it&#8217;s so different that it is, for all practical purposes, and entirely different thing. Trying to relate <em>ulog</em> to <em>ulog2</em> is a pretty futile exercise. Work on the basis that they are pretty much unrelated and it&#8217;ll prove less frustrating.</p>
<div>
<p>Anyway, the learning curve with <em>ulogd2</em> was a bit steep, but it turns out to be a very neat product. Here I will present some key points that should help you to get it up, running and integrated on a Ubuntu system. Oh, and it&#8217;s not available as a pre-built package&#8230; Sorry &#8211; didn&#8217;t I mention that?</p>
</div>
<h2>Implementing NFLOG (aka ulogd2) on a Ubuntu firewall</h2>
<p>The first step to follow is to get hold of the <em>ulogd2</em> source tree and build it. I worried that this would take me some time, but found a <a id="cgq:" title="Pollux's blog" href="https://www.wzdftpd.net/blog/index.php?2008/04/05/19-ulogd2-the-new-userspace-logging-daemon-for-netfilter-iptables-part-2">tremendously helpful article</a> someone had already written which aided me a lot. (Thank you Pollux!)</p>
<div>If you&#8217;re familiar with building from source, that page will give you most of what you need. Here are a few points to add:</div>
<ul>
<li>I&#8217;d suggest leaving the build <span style="font-family: 'Courier New';">PREFIX</span> unspecified (i.e. default) so it will ultimately install in the <span style="font-family: 'Courier New';">/usr/local/</span> hierarchy. This means you can get it all working in parallel with an existing <em>ulogd</em> installation &#8211; much cleaner and safer!</li>
<li>Since we want to emulate <em>ulogd</em> just in so far as we are able to log to a disk file, disable any of the <em>Postgres</em> or <em>MySQL</em> build options to make things more compact and simple (unless of course you want to make use of these neat new features within <em>ulogd2</em>!)</li>
<li>Much of the article referenced assume that you <em>will</em> be logging to a database &#8211; keep it simple for now and ignore that.</li>
</ul>
<h2>ulogd2 config highlights</h2>
<div>Once <em>ulogd2</em> is installed, you need to copy the supplied <span style="font-family: 'Courier New';">ulogd.conf </span>from the source tree you used to build into <span style="font-family: 'Courier New';">/usr/local/etc</span>.</div>
<div>The contents of this file took a little working out, but here I present the key elements required in order to have <em>ulogd2</em> set up to allow:</div>
<ul>
<li>IPv6 to be logged to one file</li>
<li>IPv4 to be logged to another file (this used to be done using the original <em>ulogd</em>)</li>
</ul>
<div>Once completed and the two shorewall configs tweaked to make use of it, this new ulogd2 <em>replaces</em> the previously used ulogd. Note that this is optional: you can have both versions of ulogd coexist. However it&#8217;s a lot cleaner and easier to maintain if just one subsystem is used. But that&#8217;s entirely a personal choice.</div>
<h3>plugins section</h3>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_inppkt_NFLOG.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_inppkt_ULOG.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_inpflow_NFCT.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_IFINDEX.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_IP2STR.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_IP2BIN.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_PRINTPKT.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_HWHDR.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_PRINTFLOW.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_filter_MARK.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_LOGEMU.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_SYSLOG.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_OPRINT.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_NACCT.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_PCAP.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_PGSQL.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_MYSQL.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">#plugin=&#8221;/usr/local/lib/ulogd/ulogd_output_DBI.so&#8221;</span></div>
<div><span style="font-family: 'Courier New';">plugin=&#8221;/usr/local/lib/ulogd/ulogd_raw2packet_BASE.so&#8221;</span></div>
</blockquote>
<h3>stacks section</h3>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';"># this is a stack for logging packets to syslog after a collect via NFLOG</span></div>
<div><span style="font-family: 'Courier New';">stack=log4:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu4:LOGEMU</span></div>
<div><span style="font-family: 'Courier New';">stack=log6:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu6:LOGEMU</span></div>
</blockquote>
<h3>log section</h3>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';"># Using log4 for IPv4</span></div>
<div><span style="font-family: 'Courier New';">[log4]</span></div>
<div><span style="font-family: 'Courier New';">group=4</span></div>
<div><span style="font-family: 'Courier New';">numeric_lable=4</span></div>
<div><span style="font-family: 'Courier New';"># Using log6 for IPv6</span></div>
<div><span style="font-family: 'Courier New';">[log6]</span></div>
<div><span style="font-family: 'Courier New';">group=6</span></div>
<div><span style="font-family: 'Courier New';">numeric_label=6</span></div>
</blockquote>
<h3>log-specific sections</h3>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';"># IPv4</span></div>
<div><span style="font-family: 'Courier New';">[emu4]</span></div>
<div><span style="font-family: 'Courier New';">file=&#8221;/var/log/firewall/nflog4.log&#8221;</span></div>
<div><span style="font-family: 'Courier New';">sync=1</span></div>
<div><span style="font-family: 'Courier New';"># IPv6</span></div>
<div><span style="font-family: 'Courier New';">[emu6]</span></div>
<div><span style="font-family: 'Courier New';">file=&#8221;/var/log/firewall/nflog6.log&#8221;</span></div>
<div><span style="font-family: 'Courier New';">sync=1</span></div>
</blockquote>
<h2>Changes to shorewall configs</h2>
<div>And finally we need to tweak <em>shorewall</em> and <em>shorewallt6</em> to use the new log facility. For shorewall6 that means simply adding the appropriate <span style="font-family: 'Courier New';">NFLOG</span> references within the policies and/or rules. For shorewall IPv4 one simply has to replace existing <span style="font-family: 'Courier New';">ULOG</span> references with an appropriate <span style="font-family: 'Courier New';">NFLOG</span> reference.</div>
<h3>shorewall6 additions</h3>
<p>So my (very very over-logged &#8211; but then my IPv6 is still at the experimental stage&#8230;!) <span style="font-family: 'Courier New';">policy</span> file is now:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">#Source         Dest            Policy          Log             Burst/Limit</span></div>
<div><span style="font-family: 'Courier New';">fwall           all             DROP            NFLOG(6)</span></div>
<div><span style="font-family: 'Courier New';">int             all             DROP            NFLOG(6)</span></div>
<div><span style="font-family: 'Courier New';">ext             all             DROP            NFLOG(6)</span></div>
<div><span style="font-family: 'Courier New';">all             all             DROP            NFLOG(6)</span></div>
</blockquote>
<div>And to test logging from individual rules I&#8217;ve specified <span style="font-family: 'Courier New';">rules</span> as:</div>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">ACCEPT:NFLOG(6) ext     fwall   ipv6-icmp</span></div>
<div><span style="font-family: 'Courier New';">ACCEPT:NFLOG(6) fwall   ext     ipv6-icmp</span></div>
</blockquote>
<h3>shorewall (IPv4) changes</h3>
<p>And over in my IPv4 shorewall I just changed any reference to <span style="font-family: 'Courier New';">ULOG</span> to read <span style="font-family: 'Courier New';">NFLOG(4)</span>, for example, where <span style="font-family: 'Courier New';">policy</span> previously read:</p>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">office all DROP ULOG</span></div>
</blockquote>
<div>it now reads</div>
<blockquote style="border: none; margin: 0 0 0 40px;">
<div><span style="font-family: 'Courier New';">office all DROP NFLOG(4)</span></div>
<div><span style="font-family: 'Courier New';"><br />
</span></div>
</blockquote>
<h2>In Summary</h2>
<div>If you are implementing IPv6 with <em>shorewall6</em>, <em>ulog</em> cannot be used for logging. You must either go back to the crude-but-efective use of <em>syslog</em> or go forward to <em>NFLOG</em> / <em>ulogd2</em>. Implementing <em>ulogd2</em> is not entirely trivial, since it is not yet a pre-built package for Ubuntu. However building and implementing it is far from impossible if you&#8217;ve a little experience in such matters. And as a bonus, once implemented you can drop the original ulog and integrate both IPv4 and IPv6 logging within NFLOG.</div>
<div>Worth noting is that while we&#8217;ve achieved an elegant split between IPv4 and IPv6 firewall logs using <em>ulog2d</em>, while I can continue to process my IPv4 logs every night using <em>fwlogwatch</em>, as before, the processing and analysis of the IPv6 logs is another issue altogether! <em>fwlogwatch</em> is an old tool and does not process IPv6 log files. I&#8217;ll sort that out in a later article.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/02/25/231/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPv6 at home &#8211; a guide to getting started</title>
		<link>http://www.ipsidixit.net/2010/02/24/228/</link>
		<comments>http://www.ipsidixit.net/2010/02/24/228/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 08:36:50 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[ethernet]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[icmp6]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ping6]]></category>
		<category><![CDATA[radvd]]></category>
		<category><![CDATA[shorewall]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/2010/02/24/228/</guid>
		<description><![CDATA[With IPv6 slowly becoming more visible, it was time to get to grips with it. While absolutely not essential (yet!) it seemed like a fun idea: my ADSL provider offers native IPv6 in parallel with IPv4, and my hosting provider is running an IPv6 beta. So I can do native IPv6 end to end between [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-large;"><span style="text-decoration: underline;"><strong><img class="alignleft size-full wp-image-227" style="margin-left: 15px; margin-right: 15px; margin-top: 10px; margin-bottom: 10px;" title="IPv6 Logo" src="http://www.ipsidixit.net/wp-content/2010/02/IPv6-logo.png" alt="" width="100" height="60" /></strong></span></span></p>
<p>With IPv6 slowly becoming more visible, it was time to get to grips with it. While absolutely not essential (yet!) it seemed like a fun idea: my ADSL provider offers native IPv6 in parallel with IPv4, and my hosting provider is running an IPv6 beta. So I can do native IPv6 end to end between my home and a remote host. &#8220;Home&#8221; in this case consists of a Linux firewall running iptables, fronted by shorewall. Two ethernet ports: one to the ADSL modem (my &#8220;external&#8221; interface) and one to the house infrastructure (&#8220;internal&#8221;)</p>
<p>The Ubuntu server distribution in use is, like most Linux distros, fully IPv6 ready. For example, do an ifconfig and we see</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">Link encap:Ethernet  HWaddr 00:40:63:f5:f9:3c </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet addr:88.XXX.XX.XXX  Bcast:88.178.87.255  Mask:255.255.255.0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 addr: fe80::240:63ff:fef5:f93c/64 Scope:Link</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX packets:14086899 errors:0 dropped:0 overruns:0 frame:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> TX packets:15607323 errors:0 dropped:0 overruns:0 carrier:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> collisions:0 txqueuelen:1000 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX bytes:1837525573 (1.8 GB)  TX bytes:666354591 (666.3 MB)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> Interrupt:16 Base address:0&#215;8000 </span></div>
<p>Now I may not know much about IPv6 on Linux yet, but I can see that I&#8217;ve got a line beginning &#8220;inet addr&#8221; which looks kinda IPv6-ish. Good start. Let&#8217;s go&#8230;</p>
<p><span id="more-228"></span></p>
<h1>IPv4 &#8211; today</h1>
<p>As it stands, my home firewall performs the following functions:</p>
<ul>
<li>It acts as a DHCP <em>client</em> on its <em>external</em> interface, in order to pick up from the ISP the IPv4 address, plus the DNS server(s) being offered. In fact my IPv4 address is fixed, so strictly speaking I don&#8217;t need to act as a DHCP client on this interface, but it&#8217;s no real effort to do so and it means I get the DNS servers automatically.</li>
<li>It acts as a DHCP <em>server</em> on its <em>internal</em> interface, in order to supply IP addresses to the many and various client devices within the house, along with DNS information. (I actually use <a id="cuqm" title="dnsmasq" href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a> for this purpose &#8211; tremendous piece of software)</li>
<li>It performs NAT between the internal devices and the Internet, courtesy of <a id="e66t" title="iptables" href="http://www.netfilter.org/">iptables</a>.</li>
<li>It acts as a firewall between the internal devices and the Internet, again courtesy of iptables.</li>
</ul>
<p>Since no one in their right mind writes &#8220;raw&#8221; iptables configs of any complexity, I use <a id="rljr" title="shorewall" href="http://www.shorewall.net/"><span style="color: #000000;">shorewall</span></a> to administer the NAT and firewall functions &#8211; mostly using the shorewall cli, sometimes using the shorewall GUI within <a id="hk_w" title="Webmin" href="http://www.webmin.com/"><span style="color: #000000;">Webmin</span></a>.</p>
<p>To top things off, I also have a VPN tunnel running between the firewall and a host machine, using <a id="wr0b" title="OpenVPN" href="http://openvpn.net/"><span style="color: #000000;">OpenVPN</span></a>.</p>
<h1>So what do I need to know even <em>before</em> I think of starting with IPv6?</h1>
<p>So as far as I know all the raw elements are available to me: ISP support, host support and all the bit &#8216;n bobs that Linux offers. So how do I string them together? In fact, hang on a sec before that: Just what is my goal?? The engineer in me frankly just wants to have a damn good play with IPv6, but it&#8217;s still good to have an initial goal to provide some sort of framework and direction.</p>
<p>Hence I set myself the somewhat arbitrary goals as follows:</p>
<ul>
<li>Between my firewall and my remote host enable simple IPv6 connectivity. ping, ssh, etc.</li>
<li>Between my firewall and my remote host enable VPN connectivity (i.e. shift the existing IPv4 tunnel to IPv6)</li>
<li>While leaving the rest of the household blissfully ignorant (and hence unaffected) by IPv6, enable two specific workstations (one Windows, one Linux) to have dual IPv4/IPv6 stacks such that they default to using IPv4 except for traffic destined to the remote host or some other IPv6 end-point, which will go IPv6 end-to-end (i.e. workstation &lt;&#8211;&gt; firewall &lt;&#8211;&gt; host)</li>
</ul>
<p>Note that there are a lot of things that I am not yet trying to do. Specifically I am not setting up any gateways to allow IPv4 &lt;&#8211;&gt; IPv6 inter-working. For now I will have all my existing IPv4 functionality, with an entirely optional layer of IPv6 for those clients who (a) can talk native IPv6 and (b) have an IPv6 end-point to which they wish to connect. The inter-working side of things is a level of complication that in the first instance I want to avoid. Start simple and build up.</p>
<h1>IPv6 Basics</h1>
<p>Before anything else there are some IPv6 &#8220;basics&#8221; that need a little explanation and clarification. As with any technology, the problem is not with finding information. The problem is with finding out which information is useful and which is entirely irrelevant.</p>
<h2>IPv6 Addresses</h2>
<p>The one thing everyone knows about IPv6 is that it&#8217;s got funny looking, and rather large, addresses. Where once we had stuff like good old 192.168.0.1, now I might have fe80::240:63ff:fef5:f93c/64. And that&#8217;s one of the shorter ones&#8230;!</p>
<p>So what do I really need to know about IPv6 addresses, leaving aside the stuff that&#8217;s not required? Here goes.</p>
<p>IPv6 addresses consist of 128 bits. Why? Simple: to provide enough addresses that we&#8217;re not likely to run out, as we are perilously close to doing with IPv4. Just how big is &#8220;128 bits&#8221;? In decimal terms, such numbers have up to 39 digits. Here&#8217;s one:</p>
<pre style="padding-left: 30px;">340282366920938463463374607431768211455</pre>
<p>In order to make things more manageable, IPv6 addresses are not written as long, decimal numbers. Instead they are written in hexadecimal, broken up in to 16-bit fields by colons. Here&#8217;s an IPv6 address lifted from the official IPv6 HowTo:</p>
<pre style="padding-left: 30px;">2001:0db8:0100:f101:0210:a4ff:fee3:9566</pre>
<p>To further simplify things, leading zeros can be omitted. Also, contiguous blocks of zeros can also be omitted. For example:</p>
<pre style="padding-left: 30px;">2001:0db8:0100:f101:0000:0000:0000:0001</pre>
<p>can be reduced down to</p>
<pre style="padding-left: 30px;">2001:db8:100:f101::1</pre>
<p>The most extreme example of this is when the localhost address is considered (analogous to IPv4&#8242;s 127.0.0.1) and can be condensed down from</p>
<pre style="padding-left: 30px;">0000:0000:0000:0000:0000:0000:0000:0001</pre>
<p>to</p>
<pre style="padding-left: 30px;">::1</pre>
<p>Note, however, that the use of &#8216;::&#8217; and leading-zero suppression is purely a shorthand. <em>All</em> IPv6 addresses are 128-bits in length &#8211; these are just cosmetic tricks to make the writing and typing of them a little more friendly.</p>
<p>Just as IPv4 addresses have netmasks, so with IPv6 addresses. More of that when we look specifically at routing later on.</p>
<p>Also, normally we find that the upper 64 bits are considered to be &#8220;network&#8221; bits and the lower 64 bits are &#8220;host&#8221; bits.</p>
<h3>Network bits</h3>
<p>The leading 16 bits of the network portion of an IPv6 address are &#8220;special&#8221; in so far as some values are reserved as having special meaning. I am not here going to define all the possible values in use. I am confining myself to what matters within the context of the exercise at hand. And for those purposes the two values might be seen.</p>
<h4>Local link addresses prefix</h4>
<p><span style="font-family: 'Courier New';">fec</span><em><span style="font-family: 'Courier New';">x</span></em> (where <em>x</em> is any hex digit, but is normally 0) &#8211; Such addresses are local link addresses. Under Linux, when an IPv6-capable interface is enabled, such an address &#8220;automatically&#8221; appears. It is used solely to talk with other devices on the same link: hi, anything there? anyone looking for a router? Note that such addresses are <em>not</em> used for &#8220;normal&#8221; data &#8211; they are purely for local link management. And now we know where that IPv6-looking address came from in my original <em>ifconfig</em> command:</p>
<pre style="padding-left: 30px;">inet6 addr: fe80::240:63ff:fef5:f93c/64 Scope:Link</pre>
<p>(and notice that friendly Linux even puts the &#8220;Link&#8221; there to remind you that it&#8217;s a link address)</p>
<div>
<h4>Global unicast address prefix</h4>
<p><span style="font-family: 'Courier New';">2</span><em><span style="font-family: 'Courier New';">xxx</span></em> and <span style="font-family: 'Courier New';">3</span><em><span style="font-family: 'Courier New';">xxx</span></em> &#8211; These are so-called &#8220;global unicast&#8221; addresses, analogous to IPv4 &#8220;normal&#8221; addresses (i.e. not private, not multicast, etc.)</p>
</div>
<h3>Host bits</h3>
<p>The bottom 64 bits of an IPv6 address are, essentially, whatever you want them to be. They can be manually defined or, more often, are computed by using the interfaces MAC address (if it has one).</p>
<p>So here&#8217;s a simple enough address:</p>
<pre style="padding-left: 30px;">2001:0db8:100:f101::1</pre>
<p>Given the <span style="font-family: 'Courier New';">2001:</span>prefix, so we know it&#8217;s a global unicast address from an ISP. And the bottom 64 bits consists of just &#8217;1&#8242; (all the zeros are magic&#8217;ed away by the &#8216;::&#8217;)</p>
<p>But what of this &#8220;computed from the MAC address&#8221;? Recalling the ifconfig I showed back at the start:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">Link encap:Ethernet  HWaddr 00:40:63:f5:f9:3c </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet addr:88.XXX.XX.XXX  Bcast:88.178.87.255  Mask:255.255.255.0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 addr: fe80::240:63ff:fef5:f93c/64 Scope:Link</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX packets:14086899 errors:0 dropped:0 overruns:0 frame:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> TX packets:15607323 errors:0 dropped:0 overruns:0 carrier:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> collisions:0 txqueuelen:1000 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX bytes:1837525573 (1.8 GB)  TX bytes:666354591 (666.3 MB)</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> Interrupt:16 Base address:0&#215;8000 </span></div>
<p>Note the hardware MAC address: 00:40:63:f5:f9:3c (and remember that those digits and colons are nothing at all to do with IPv6 notation &#8211; they are bog-standard, traditional L2 MAC address format)</p>
<div>
<p>Now look at the last part of the IPv6 link address: you will see that there is more than a passing resemblance between them &#8211; although also note that they are not identical either. The details of how one is morphed in to the other is not of direct concern to us &#8211; all we need to know here is that one follows from the other.</p>
<h3>A complete example</h3>
<p>Here&#8217;s one I prepared earlier&#8230;.. <img src='http://www.ipsidixit.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  This is the output from <em>ifconfig</em> on my host system, after the main interface has been fully configured and all addresses allocated:</p>
</div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">Link encap:Ethernet  HWaddr 00:16:3e:2e:50:36 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet addr:217.70.191.54  Bcast:217.70.191.255  Mask:255.255.252.0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 addr: fe80::216:3eff:fe2e:5036/64 Scope:Link</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 addr: 2001:4b98:41::d946:bf36:54/64 Scope:Global</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX packets:122352 errors:0 dropped:0 overruns:0 frame:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> TX packets:68714 errors:0 dropped:0 overruns:0 carrier:0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> collisions:0 txqueuelen:1000 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> RX bytes:34644771 (34.6 MB)  TX bytes:62489400 (62.4 MB)</span></div>
<p>What have we got? The interesting parts break down as follows:</p>
<ol>
<li>The interface has a L2 MAC address of <span style="font-family: 'courier new';">00:16:3e:2e:50:36</span></li>
<li>The IPv4 addressing is as it always has been &#8211; No change there.</li>
<li>We have a Link address of <span style="font-family: 'courier new';">fe80::216:3eff:fe2e:5036</span> which should now look familiar: the <em>fe80:</em> prefix and the appearance of the L2 MAC address.</li>
<li>And we now have a Global address of <span style="font-family: 'courier new';">2001:4b98:41::d946:bf36:54</span> which is familiar at least in so much as it has a prefix of <em>2001:</em> The rest of the address&#8217;s derivation is not of direct concern here. (In fact, after the ISP-specific part, other elements of it are derived from VLAN addresses and other such stuff. No matter.)</li>
</ol>
<h2>Goodbye <em>ifconfig</em>, hello <em>ip</em></h2>
<p>Since time immemorial Linux users have been familiar with the command <em>ifconfig</em>. Thus far in this document I&#8217;ve used it too, for the sake of familiarity. But dear <em>ifconfig</em> has actually been deprecated now for many years. It lives on, and we all still use it, but with the advent of IPv6 it does now seem an appropriate moment to bid it goodbye. It&#8217;s time to use the <em>ip</em> command, in its many forms. While it&#8217;s true that <em>ifconfig</em> can still achieve <em>most</em> of what is required, it sometimes falls short. Also, using <em>ip</em> let&#8217;s us more clearly and easily distinguish between IPv4 and IPv6, which is maybe not a bad thing!</p>
<p>Compare the <em>ifconfig</em> output from above with a couple of examples of the <em>ip</em> command:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip addr show dev eth0</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> link/ether 00:16:3e:2e:50:36 brd ff:ff:ff:ff:ff:ff</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet 217.70.191.54/22 brd 217.70.191.255 scope global eth0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 2001:4b98:41::d946:bf36:54/64 scope global </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 fe80::216:3eff:fe2e:5036/64 scope link </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<p>This is analogous to the simple <em>ifconfig</em>: we&#8217;ve got L2 MAC, IPv4, and a couple of IPv6 addresses showing.</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip -4 addr show dev eth0</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet 217.70.191.54/22 brd 217.70.191.255 scope global eth0</span></div>
<p>Look how much neater that is, even just for IPv4: no L2 MAC, no IPv6, just the IPv4-related information.</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip -6 addr show</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 ::1/128 scope host </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qlen 1000</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 2001:4b98:41::d946:bf36:54/64 scope global </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 fe80::216:3eff:fe2e:5036/64 scope link </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<p>And similarly here: we just get IPv6-related information, and nothing else.</p>
<div>It may take a little effort to get used to it, but it&#8217;s worth the effort. And feel free to make use of <em>alias</em> to make life even easier. If you tire of typing <em>-6</em> after each invocation of IP, then do something like:</div>
<p style="padding-left: 30px;"><span style="font-family: 'Courier New';">alias ip6=&#8217;ip -6&#8242;</span></p>
<p>and then you can just enter:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ip6 addr show</span></div>
<p>which is quite neat.</p>
<h2>Key subsystems</h2>
<p>The last part of this <em>IPv6 Basics</em> section is to introduce the functional building blocks within Linux which seem to get mentioned in connection with IPv6.</p>
<p>We now know about IPv6 addresses types that matter to us, we have met the command(s) we will use to inspect and manipulate things such as interfaces, routes and so on. We have also assumed that there is something similar to IPv4 <em>iptables </em>(and we&#8217;ll come back to that in some detail later as to how we actually use <em>iptables</em> under IPv6). However what subsystems such as DHCP exist and are of interest to us? When reading up on IPv6 Linux implementation one comes across the following mentioned frequently, and you may quickly form the impression that they are three important elements in an IPv6 firewall/router. They are:</p>
<ul>
<li>dhcp6c</li>
<li>dhcp6s</li>
<li>radvd</li>
</ul>
<h3>dhcp6c</h3>
<p>dhcp6c is a Linux DHCP IPv6 client. It is directly comparable to the IPv4 dhclient or dhclient3. It will, for a nominated interface, call out and ask for an IPv6 address which it can allocate to that interface. It may also, optionally, pick up other information, typically DNS-related.</p>
<h3>dhcp6s</h3>
<p>dhcp6s is a Linux DHCP IPv6 server. It is comparable to the IPv4 dhcpd or, in my network, dnsmasq. Just as in the IPv4 environment, it hands out addresses to other devices and, optionally, other information such as DNS data.</p>
<h3>radvd</h3>
<p>radvd is a Router Advertisement Daemon. This is less easy to directly compare to the IPv4 environment. It can hand out, to requesting devices, an IPv6 prefix (not a full address&#8230;) and a default route to be used. From this the receiving device can then automatically decide upon a host portion to add to the prefix to give it a full IPv6 address. So at first sight, it seems to be a rather inadequate imitation of a DHCP server!</p>
<p>One might very easily conclude that all three are required. After all, we may well use a DHCP client on the Internet side, and a DHCP server for the private network sounds pretty much essential. And a router advertisement daemon? Not entirely sure what it is, but gets a lot of mentions so I probably need that too! In actual fact the only one of these you are likely to need is readvd. You might need any combination of them, depending upon your precise circumstances. But probably not.</p>
<p><span style="font-size: medium;"><br />
</span></p>
<h2>DHCP client I get, but what&#8217;s with DHCP server <em>versus</em> radvd?</h2>
<p>This is an area of considerable confusion! When bouncing around Google trying to find information on setting up IPv6 one minute we appear to be required to use DHCP server, the next minute we appear to need radvd. Which is which and when do I use them? Do I need both?</p>
<p>Well, the answer to the last question, &#8220;Do I need both of them?&#8221;, it &#8220;Probably not, but you might&#8230;&#8221;</p>
<p>Coming from familiarity with the world of IPv4 one instinctively tends to feel comfortable with the concept of dhcp6s &#8211; and while it can be used, radvd may well be simpler and easier in practice. Or, maybe, both&#8230; The attraction of rad is that the server does not need to concern itself with any state: no records of addresses allocated &#8211; since it dos not allocate any. It just says &#8220;Hey, this is the prefix, work the rest out for yourelf.&#8221; which is attractively simple! The DHCP server alternative has to remember which address is where and when. The case where you might want both would be where you want to have rad handle the job of initiating address allocation, and then have DHCP pick up to add some icing on the cake: DNS information being the common case.</p>
<p>And us here? We&#8217;re going to go with the simpler case, and have radvd handle the job of responding to IPv6-capable devices within our internal network and tell them just enough to allocate addresses themselves and use a default route.</p>
<p>So it actually seems to come down to a pair of subsystems being required:</p>
<ul>
<li><em>dhcp6c</em> talks out to the ISP to handle &#8220;outside&#8221; IPv6 addressing.</li>
<li><em>radvd</em> talks internally to all devices to handle &#8220;inside&#8221; IPv6 addressing.</li>
</ul>
<p>Well, maybe&#8230; But in these early days of IPv6 there is far from a standard view of how these things are to work. And, as I discovered, your ISP may not actually themselves offer an IPv6 DHCP server at all! In my case that was the situation, although I have little doubt that as time progresses and IPv6 implementations mature such services will become more standard.</p>
<p>But for now, my implementation will be reduced down to simply running radvd on the firewall, with the IPv6 configuration on Internet side being handled semi-statically.</p>
<p>Just one subsystem to be used: radvd. No DHCP client. No DHCP server. Who said IPv6 was complicated?!?</p>
<h1>Setting up the firewall box</h1>
<p>So at last we get to the actual practicalities of getting IPv6 up and running on the home firewall. The system in question is a Ubuntu-based device. The differences for another Linux system should be fairly negligible (package names maybe, some config file locations, etc.)</p>
<h2>Packages to install</h2>
<p>All we need to install is radvd if its not already present. Under Ubuntu something like:</p>
<pre style="padding-left: 30px;">sudo apt-get install radvd</pre>
<p>should do the job.</p>
<h2>Careful now&#8230;.</h2>
<p>And already we come to potentially our first issue!!! Once radvd is up and running on the firewall it will, potentially, start chatting to devices on the home network which are, by default, on the look out for IPv6 routers. Whether it does this by default depends upon the installed configuration file used, and which interface points where, but it&#8217;s a real possibility. And that may not be entirely a good thing. Be on the look out for workstations suddenly getting really really slow when, for example, browsing the web. I would suggest disabling IPv6 on any devices which may be susceptible to it. There are numerous ways to do that. On Windows in all its flavours? I have not the faintest idea. Under Linux? <a id="b2v8" title="Here are some suggestions" href="http://www.ubuntugeek.com/how-to-disable-ipv6-in-ubuntu.html"><span style="color: #000000;">Here are some suggestions</span></a>. Depending upon what is on your home network this may not be required, but if you do run in to the &#8220;slow web&#8221; issue, be alert to it.</p>
<p>Technical note: for the curious, if you do hit the IPv6 crawl of death issue, it&#8217;s actually due to certain services on clients stations being IPv6 aware and thus trying to resolve DNS requests via IPv6. They try, take an age to fail, and eventually fall back to IPv4. But it&#8217;s ugly. I wish I could say that I foresaw the issue and planned accordingly. More truthful would be to say that during my diddling around with radvd I got loud complaints from another user on the home network&#8230; <img src='http://www.ipsidixit.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h2>Setting up the connection towards the Internet&#8230; no hang on, actually not yet&#8230;</h2>
<p>The first task is to get the public (in my case eth0) interface up and running IPv6. Before actually doing that we need to pause for a moment and consider the implications of what might happen if we indeed succeed in bringing up the IPv6 ISP-connected interface! We are then wide-open to the world, and just asking to be attacked. The only sensible thing to do is to first set up an IPv6 firewall to provide some level of protection before we throw ourselves open.</p>
<p>Sorry. But that&#8217;s life. Of course if your public-side connection is already protected via some firewall, then you can skip this. But it probably isn&#8217;t, so pay attention. With IPv4 most home networks make use of, by necessity, NAT. While not done for reasons of security it does nonetheless provide as a side-effect a modest level of security in so far as it tends to block unsolicited incoming connections. So even with a poorly configured firewall under IPv4, the use of NAT hides a multitude of nasties from us. But in the brave new world of IPv6 one hugely important difference from IPv4, but one that everyone seems to gloss over, is that NAT is not required. And indeed since not required, it does not exist. All IPv6 devices on the &#8220;inside&#8221; network will have, in effect, public addresses. No port-forwarding, no NAT, none of that. And while that&#8217;s actually a very refreshing thing in general (NAT and large firewalls are a real pain) it does means we can no longer rely on the default level of safety that NAT provides. A tightly configured firewall is absolutely essential.</p>
<p>To drive IPv6 <em>iptables</em> I use <em>shorewall6</em>. I highly recommend it. Here I am going to run through, without too much explanation, the steps to set up a very basic &#8220;block almost everything except a bit of stuff for testing&#8221; IPv6 firewall on the system. Here goes.</p>
<p>Install the package:</p>
<pre style="padding-left: 30px;">apt-get install shorewall6</pre>
<p>The basic level of configuration then has to take place. Navigate to the configuration files:</p>
<pre style="padding-left: 30px;">cd /etc/shorewall6/</pre>
<p>Set up the following files in a similar manner as shown here:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong><span style="text-decoration: underline;">interfaces</span></strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ext     eth0     -</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">int     eth1     -</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong><span style="text-decoration: underline;">zones</span></strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">int     ipv6</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ext     ipv6</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">fwall   firewall </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><span style="text-decoration: underline;"><strong>policy</strong></span></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">#Source  Dest    Policy     Log     Burst/Limit</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">fwall     all     DROP</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">int       all     DROP</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ext       all     DROP</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">all       all     DROP</span></div>
<p style="padding-left: 30px;"><span style="font-family: 'Courier New';"> <span style="text-decoration: underline;"><strong>rules</strong></span><br />
# Allow only ping &#8211; for testing<br />
</span></p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ACCEPT     ext     fwall     ipv6-icmp</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ACCEPT     fwall     ext     ipv6-icmp</span></div>
<p style="padding-left: 30px;"><span style="font-family: 'Courier New';"><br />
Within <span style="text-decoration: underline;"><strong>shorewall6.conf</strong></span> ensure these lines as as follows:<br />
.<br />
.<br />
.<br />
STARTUP_ENABLED=Yes<br />
.<br />
.<br />
.<br />
IP_FORWARDING=Keep<br />
</span></p>
<p>What we have there is a minimal firewall configuration, which blocks absolutely everything except pings to and from the firewall box itself.</p>
<p>Start up the firewall with e.g.:</p>
<pre style="padding-left: 30px;">/etc/init.d/shorewall6 start</pre>
<p>And then</p>
<pre style="padding-left: 30px;">shorewall6 show config</pre>
<p>should give you a pretty lengthy IPv6 <em>iptables</em> config.</p>
<p>So, with precautions now in place, we may proceed.</p>
<p>[EDIT: shorewall6 and logging may or may not be an issue... See my article here: <a href="http://www.ipsidixit.net/2010/02/25/231/">http://www.ipsidixit.net/2010/02/25/231/</a>]</p>
<h2>OK, <em>finally</em> setting up the connection towards the Internet&#8230;</h2>
<p>Here is the starting point, with an automatically assigned, MAC-derived, link address:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip6 add show dev eth0</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qlen 1000</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 fe80::240:63ff:fef5:f93c/64 scope link </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forev</span>er</div>
<h2>Configuring the addressing</h2>
<p>My ISP is free.fr (a French ISP) From them I have a fixed IPv4 address and a fixed IPv6 address. My IPv6 address prefix is 2a01:e35:8b25:7ea0::/64 which looks pretty random but of course is not.</p>
<p>The part <em>2a01:e3</em> is, from previous knowledge, a global unicast prefix (the <em>2xxx:</em> indicates that) and the full form <em>2a01:e3</em> is the RIPE-allocated prefix used by Free. The next part, <em>58 b2 57 ea</em>? Well, I write is deliberately in that format to show that it breaks down to (decimal): 88 178 87 234. This, by no coincidence at all, is my current IPv4 address! Of course Free mapping subscribers&#8217; IPv4 addresses into their IPv6 prefix is entirely arbitrary on their part. It indeed seems like a good idea, but is absolutely not required. In the future, for example, IPv4 addresses will not be used in the first place, so no such mapping would be possible.</p>
<p>Of course their network prefix is, as per standard IPv6, 64 bits in length. So the second 64 bits (the host portion) is entirely mine to use as I see fit. That is a seriously large amount of address space, all <em>globally</em> routable, and all entirely mine to use as I wish.</p>
<p>Since my ISP themselves run radvd (or some equivalent) on their routers, when everything is IPv6 enabled on my firewall system, the Internet-facing interface, eth0, should automatically pick up the required prefix and use it. However in addition to the ISP-prefix + MAC-derived host portion I also want a simplified address on the interface. It&#8217;s absolutely not required, but I want it to make my life slightly easier.</p>
<p>So prior to the reboot I edit</p>
<pre style="padding-left: 30px;">/etc/network/interfaces</pre>
<p>and add a section as follows:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">iface eth0 inet6 static</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> address 2a01:e35:8b25:7ea0::1</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> netmask 64</span></div>
<p>With this I am specifying that <em>in addition</em> to any automatic address the interface picks up, I also want to statically assign a PREFIX+::1 address to the interface.</p>
<p>After the boot I inspect the results and see:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip6 addr show dev eth0</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qlen 1000</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c/64 scope global dynamic </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft 86369sec preferred_lft 86369sec</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 2a01:e35:8b25:7ea0::1/64 scope global tentative </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> inet6 fe80::240:63ff:fef5:f93c/64 scope link </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> valid_lft forever preferred_lft forever</span></div>
<p>Excellent! We see the <em>link</em> address that was there previously. And now we have two <em>global</em> addresses. The one marked <em>dynamic</em> which is clearly the MAC-derived address (notice how the prefix is as expected &#8211; this was picked up not from any of our config but from a remotely received router advertisement from the ISP) and the one marked <em>tentative</em> which is as manually configured by me.</p>
<h2>Testing</h2>
<p>When we set up the shorewall6 firewall, everything was marked as blocked except for ipv6-icmp. Ostensibly this was to permit what we are about to do now, a ping test, which makes use of ICMP. However it was also in the knowledge that the Router Advertisements which we picked up from the ISP, and which gave us the prefix to be used for the dynamic address, are also, coincidentally, ICMP6. Two birds with one stone: we allow pings to go in and out, and also allow IPv6 Router Advertisements to pass unhindered.</p>
<p>So, to test our interface, let&#8217;s try something:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ping6 ipv6.google.com</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">PING ipv6.google.com(2a00:1450:8006::69) 56 data bytes</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">64 bytes from 2a00:1450:8006::69: icmp_seq=1 ttl=54 time=39.4 ms</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">64 bytes from 2a00:1450:8006::69: icmp_seq=2 ttl=54 time=38.4 ms</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">64 bytes from 2a00:1450:8006::69: icmp_seq=3 ttl=54 time=35.6 ms</span></div>
<p>It works!!</p>
<p>Which is great, but where&#8217;s the routing and so forth that is being used here? Let&#8217;s look at that too:</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip6 neigh show</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">fe80::207:cbff:fea5:1a68 dev eth0 lladdr 00:07:cb:a5:1a:68 router REACHABLE</span></div>
<p>That&#8217;s kind of like our IPv4 ARP table: where is, in Layer 2 terms, the next hop? And we see it at the given link address, with a corresponding MAC address, and a marker of REACHABLE. That REACHABLE can change as entries get set up and then age out, and values such as DELAY or STALE might also be seen.</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip6 route show</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';">2a01:e35:8b25:7ea0::/64 dev eth0  proto kernel  metric 256  expires 85889sec mtu 1480 advmss 1420 hoplimit 0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';">fe80::/64 dev eth1  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';">fe80::/64 dev eth0  proto kernel  metric 256  mtu 1480 advmss 1420 hoplimit 0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';">default via fe80::207:cbff:fea5:1a68 dev eth0  proto kernel  metric 1024  expires 1283sec mtu 1480 advmss 1420 hoplimit 64</span></div>
<p>Note that the default route is, automatically, via the adjacent router we learned about from the router advertisement.</p>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>ip6 monitor</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">192.168.0.3 dev eth1 lladdr 00:18:8b:86:f3:52 STALE</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">ff02::1:fff5:f93c via ff02::1:fff5:f93c dev eth0  metric 0 </span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"> cache  mtu 1480 advmss 1420 hoplimit 0</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">fe80::207:cbff:fea5:1a68 dev eth0 lladdr 00:07:cb:a5:1a:68 router REACHABLE</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">192.168.0.3 dev eth1 lladdr 00:18:8b:86:f3:52 STALE</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">fe80::207:cbff:fea5:1a68 dev eth0 lladdr 00:07:cb:a5:1a:68 router STALE</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">.</span></div>
<div>The <em>monitor</em> command is quite interesting. It shows the significant state changes as they occur. Here we can see IPv4 ARP entries aging out, and IPv6 neighbors becoming active and then stale.</div>
<div>And of course to really shine a light on what&#8217;s happening, we could do something like:</div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';"><strong>tcpdump ip6 -i eth0</strong></span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">&#8230;</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:58.856832 IP6 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c &gt; 2a00:1450:8006::6a: ICMP6, echo request, seq 1, length 64</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:58.897135 IP6 fe80::207:cbff:fea5:1a68 &gt; ff02::1:fff5:f93c: ICMP6, neighbor solicitation, who has 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c, length 32</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:58.897305 IP6 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c &gt; fe80::207:cbff:fea5:1a68: ICMP6, neighbor advertisement, tgt is 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c, length 32</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:58.897664 IP6 2a00:1450:8006::6a &gt; 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c: ICMP6, echo reply, seq 1, length 64</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:59.856858 IP6 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c &gt; 2a00:1450:8006::6a: ICMP6, echo request, seq 2, length 64</span></div>
<div style="padding-left: 30px;"><span style="font-family: 'Courier New';">16:00:59.892915 IP6 2a00:1450:8006::6a &gt; 2a01:e35:8b25:7ea0:240:63ff:fef5:f93c: ICMP6, echo reply, seq 2, length 64</span></div>
<p style="padding-left: 30px;">.<br />
.<br />
.</p>
<p style="padding-left: 30px;">So at this point we now know that we have basic IPv6 connectivity in and out of the firewall.</p>
<h2>Summary</h2>
<p>What we&#8217;ve done here, after a quick recap of IPv6 addressing techniques, is to:</p>
<li style="padding-left: 30px;">Enable a default &#8220;block almost everything&#8221; IPv6 firewall.</li>
<li style="padding-left: 30px;">Understand the three major subsystems which might b used on an IPv6 router/firewall (<em>dhcp6c, dhcp6s, radvd</em>)</li>
<li style="padding-left: 30px;">Understand that we possibly only need <em>radvd</em> and to install it on the firewall.</li>
<li style="padding-left: 30px;">Assign an automatic address to our Internet-facing interface, based upon a received router advertsiement.</li>
<li style="padding-left: 30px;">Assign a static address to the same interface, in addition to the automatic address.</li>
<li style="padding-left: 30px;">See how we can examine IPv6 information relating to interfaces, route tables and neighbours.</li>
<li style="padding-left: 30px;">Monitor IPv6 activity for troubleshooting purposes.</li>
<li style="padding-left: 30px;">Do a simple ping test to confirm that we have basic IPv6 connectivity from the firewall out to the IPv6-Internet.</li>
<p>In the next part I will look at extending IPv6 inside the private network, and examining options for moving the VPN to a native IPv6 implementation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/02/24/228/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bless me father for I have punched</title>
		<link>http://www.ipsidixit.net/2010/02/04/bless-me-father-for-i-have-punched/</link>
		<comments>http://www.ipsidixit.net/2010/02/04/bless-me-father-for-i-have-punched/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:43:57 +0000</pubDate>
		<dc:creator>sgroarke</dc:creator>
				<category><![CDATA[FPage]]></category>
		<category><![CDATA[religion]]></category>

		<guid isPermaLink="false">http://www.ipsidixit.net/?p=224</guid>
		<description><![CDATA[Several newspapers report today (e.g. here and here) that a British judge this week chose not to jail a violent criminal because he was religious. The judge said &#8220;You are a religious man and you know this is not acceptable behaviour.&#8221; The fact that the judge in question is Cherie Blair, wife of former-prime minister [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-225" style="margin-left: 15px; margin-right: 15px; margin-top: 10px; margin-bottom: 10px;" title="cherie-blair-415x350" src="http://www.ipsidixit.net/wp-content/2010/02/cherie-blair-415x350-150x150.jpg" alt="" />Several newspapers report today (e.g. <a href="http://goo.gl/t7j3" target="_blank">here</a> and <a href="http://goo.gl/fjuR" target="_blank">here</a>) that a British judge this week chose not to jail a violent criminal because he was religious.</p>
<p>The judge said &#8220;You are a religious man and you know this is not acceptable behaviour.&#8221;</p>
<p>The fact that the judge in question is Cherie Blair, wife of former-prime minister Tony Blair, just confirms that this couple appear able to justify almost anything in their own minds based upon their beliefs and superstitions.</p>
<p>Apparently the UK&#8217;s National Secular Society has complained about it, but in true British don&#8217;t-kick-up-a-fuss tradition not much more will happen.</p>
<p>So remember: before violently assaulting someone in Britain, say a prayer. No, not to ask for any sort of forgiveness for what you will do, just pray that you get this lunatic women as your judge afterwards.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipsidixit.net/2010/02/04/bless-me-father-for-i-have-punched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
