<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.solace.net/index.php?action=history&amp;feed=atom&amp;title=Adventures_with_IPv6</id>
	<title>Adventures with IPv6 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.solace.net/index.php?action=history&amp;feed=atom&amp;title=Adventures_with_IPv6"/>
	<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Adventures_with_IPv6&amp;action=history"/>
	<updated>2026-10-22T20:56:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.10</generator>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Adventures_with_IPv6&amp;diff=71&amp;oldid=prev</id>
		<title>Kc: Initial creation</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Adventures_with_IPv6&amp;diff=71&amp;oldid=prev"/>
		<updated>2025-03-01T01:31:43Z</updated>

		<summary type="html">&lt;p&gt;Initial creation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;IPv6, like Dippin&amp;#039; Dots and net-positive fusion power, seems to be &amp;quot;the future.&amp;quot;  So I decided I should probably have some.&lt;br /&gt;
&lt;br /&gt;
These are my notes for how I&amp;#039;m doing home-network IPv6.  YMMV.&lt;br /&gt;
&lt;br /&gt;
=== Obtaining IPv6 Addresses from Spectrum ===&lt;br /&gt;
My router, which is actually a multi-homed Debian 12 fanless mini-PC, was easily able to just obtain an IPv6 address from Spectrum for its external interface via the standard Router Advertisement (RA) exchange.  Woohoo!  That, however, doesn&amp;#039;t do much good for the multiple subnets of machines &amp;#039;&amp;#039;behind&amp;#039;&amp;#039; the router.  Especially since [https://youtu.be/bvWRMAU6V-c We Don&amp;#039;t Talk About NAT] in IPv6.&lt;br /&gt;
&lt;br /&gt;
==== Tangent- Subnet Masks and Network Sizes ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;The standard network subnet for IPv6 addresses is /64&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.  My first thought was &amp;quot;Wow, that&amp;#039;s 64 bits (18 bajillion!) host addresses.  I&amp;#039;ll just &amp;#039;&amp;#039;split that up!&amp;#039;&amp;#039;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
BZZT!  WRONG ANSWER!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I mean, sure, you can happily divide a /64 into 16 different /68 networks, and still have a bajillion addresses in each one, but &amp;#039;&amp;#039;amazingly this causes problems with lots of IPv6 stacks, as they assume the network is /64.&amp;#039;&amp;#039;  Why?  Because there&amp;#039;s crazy standards for calculating ephemeral &amp;quot;temporary&amp;quot; scoped IPv6 addresses on top of the MAC-address derived &amp;quot;permanent&amp;quot; global addresses, and those algos seems to assume (in most? all? cases) the availability of the entire 64 bits of host address space.  I&amp;#039;ve had trouble finding specific technical documentation around this for the plethora of Desktop and Mobile OS stacks, so suffice it to say &amp;quot;sticking with what the OS expects, which is a /64 network, just turned out to be easier.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Obtaining Network Addresses ====&lt;br /&gt;
I tried a few variants of the built-in methods in &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
Specifically:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iface IFNAME inet6 auto&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
would get me an external IPv6 address, but not internal ones for my subnets.  Ultimately I figured out that Spectrum uses a combination of DHCPv6 to assign network addresses &amp;amp; subnets, but RA to publish gateways and DNS servers.  The key seemed to be that I have to specifically ask Spectrum for:&lt;br /&gt;
&lt;br /&gt;
- A &amp;quot;normal&amp;quot; IPv6 address for the external inferface&lt;br /&gt;
&lt;br /&gt;
- IPv6 Prefix Delegation (a subnet)&lt;br /&gt;
&lt;br /&gt;
- With a &amp;quot;hint&amp;quot; for the length I want.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The command to do this with /etc/network/interfaces , given an external address of enp1s0 , looks like this:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
iface enp1s0 inet6 manual&lt;br /&gt;
  up /usr/sbin/dhclient -6 -v -pf /run/dhclient6.enp1s0.pid -lf /var/lib/dhcp/dhclient6.enp1s0.leases -I -P --prefix-len-hint 60 -N -df /var/lib/dhcp/dhclient.enp1s0.leases enp1s0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;-P --prefix-len-hint NN&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
specifies we want a PD address block with a subnet mask of NN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
specifies we also want a &amp;quot;normal&amp;quot; IPv6 address for the external interface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the interface is brought up, you can see the &amp;quot;normal&amp;quot; dynamic IPv6 address in the address assignments for enp1s0&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
2: enp1s0: &amp;lt;BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:e2:[...]&lt;br /&gt;
    [...]&lt;br /&gt;
    inet6 2600:6c4e:7008:[...]&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;And you can see the PD block in the /var/lib/dhcp/dhclient6.enp1s0.leases file under the &amp;lt;code&amp;gt;ia-pd xx:xx:xx:xx {&amp;lt;/code&amp;gt; block in the lease outputs.&lt;br /&gt;
&lt;br /&gt;
Great!  But wait.  What do we do with that ::/60 address block once we get it? &lt;br /&gt;
&lt;br /&gt;
=== Assigning the Prefix Delegation (PD) Subnets ===&lt;br /&gt;
{to be continued} [2025-02-28.  Update within 7 days - KCB]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
</feed>