The Joy of IPv6

One of the things I have tinkered with from time to time is the next generation of network addressing. Instead of the usual IP address people are used to, such as 192.168.1.1, the design was to quadruple the range. This allows for an address for every grain of sand on all the beaches of the world. Unfortunately, they also decided to change the way addressing works, preventing previous techniques in favor of autoconfiguration.
In some ways, this is good. The addresses, written in hex in 8 sets of 4 digits, can be hard to read and harder to relate to others. They did allow for conventions to shorten zeros where it made sense. For instance, a block 000a could be written as just ‘a’ with the zeros omitted. Trailing zeros must be written, but preceeding ones need not. Additionally, a block or multiple blocks that were all zero could be truncated using two colons together, like ::. On the other hand, the whole specification makes it difficult to set up the most simple of things, such as route assignments. That difficulty made it hard for me to get in the door with IPv6, and the conventions they applied to addressing made it worse.
For the longest time, I have had an account with an IPv6 tunnel provider because IPv6 rollout across Internet Service Providers is highly anemic. I have attempted to set it up before, and the configurations on my account have attested to that. I have a tunnel, a disabled subnet with a prefix of /64, and an enabled subnet of prefix /48. The tunnel was relatively easy to set up. With a client program and support in multiple operating systems, it wasn’t hard to at least connect and get it running. The subnetting, however, was harder to understand. And what’s worse, I needed to assign an address for it to matter.
See, there are a few ways to get an address. There is something called stateful assignment. This is the traditional method of DHCP assignment, where a server will allocate a lease, address, and record it for posterity. There is also a new ability similar to the DLNA auto-assignment called stateless. A client can do this on its own, or it can do it on the advice of a router. In order to do all this, the clients had to have a way to communicate back and forth. This called for two concepts within the specification; link-local and global addresses.
My biggest chore was trying to decide how to go about this in my network. Because of the autoassignment capabilities, it would make it difficult to pin systems to a particular address, and then why have an address that was huge? For client workstations, it makes sense to have a nearly random address within the prefix, but not for servers such as DNS servers or web servers. So after understanding that the subnet block I picked out so long ago, that /48, was usable to me if I segmented it into /64 length prefixes, I arranged things to partner off my IPv6 addressing.
I decided to use the following scheme for my IPv4 address space. The /48 prefix I was given was 2001:4978:1ac::/48, meaning that if the sets of four were numbered 1:2:3:4:5:6:7:8, that block #4, ranging from 0000 to ffff, could be used to choose prefixes. That prefix block corresponds to the third octet of my ipv4 address (e.g. 240 = 00f0, or f0 for short).
DMZ Subnet (Internet Facing) | 172.20.240.0/24 | 2001:4978:1ac:f0::/64 |
Resource Subnet (Internal Servers) | 172.20.239.0/24 | 2001:4978:1ac:ef::/64 |
Physical Subnet (Desktops, Printers, etc) | 172.20.101.0/24 | 2001:4978:1ac:65::/64 |
This was a nice way to let the subnet make some logical sense between the two address spaces. In cases where there was a static assignment required, such as a DNS server or router, I made use of the last IPv4 octet (.10 for router, for instance) and made that into a hex address, :a. This gave me a nice convention to follow in order to choose addresses for my systems.