When working with isolated IPv6 networks, we often need to balance technical correctness with human usability. While IPv6's 128-bit addresses offer virtually unlimited combinations, this same feature makes manual address assignment challenging for small-scale deployments.
The best practice is to use the fd00::/8 range (Unique Local Addresses - ULA) which is specifically designed for local communications:
# Example ULA prefix generation (Linux)
uuidgen | sed 's/-//g' | head -c 16
# Output might look like: fd42:8a93:71c0:b9e4
Create meaningful patterns in the interface identifier portion (last 64 bits):
Host 1: fd42:8a93:71c0:b9e4::1
Host 2: fd42:8a93:71c0:b9e4::2
Host 3: fd42:8a93:71c0:b9e4::3
Alternatively, embed decimal representations:
# For host 10 in subnet 1:
fd42:8a93:71c0:b9e4:0001::000a
Take advantage of IPv6's zero compression rules to create cleaner addresses:
# Instead of:
fd42:8a93:0000:0000:0000:0000:0000:0001
# Use compressed form:
fd42:8a93::1
For automatic interface ID generation while maintaining predictability:
# Example MAC address: 00:50:56:ab:cd:ef
# Convert to EUI-64:
fd42:8a93:71c0:b9e4:0250:56ff:feab:cdef
Even in isolated networks, consider setting up mDNS or local DNS:
# Example avahi (mDNS) configuration
<service-group>
<name>My IPv6 Host</name>
<service>
<type>_ssh._tcp</type>
<port>22</port>
<txt-record>address=fd42::1</txt-record>
</service>
</service-group>
Always validate your addresses:
# Python validation example
import ipaddress
def is_valid_ula(addr):
try:
return ipaddress.IPv6Address(addr).is_private
except:
return False
When working with isolated IPv6 LANs, we want addresses that are both technically valid and human-friendly. The best practice is to use the fc00::/7 range (Unique Local Addresses or ULAs), specifically fd00::/8 for locally assigned addresses. These are the IPv6 equivalent of IPv4's private ranges (like 10.0.0.0/8).
# Example ULA prefix generation (Linux)
uuidgen | sha1sum | cut -c 1-16
# Output might be: fd12:3456:789a:bc00::/56
For a small network (3-32 hosts), I recommend this pattern:
- Start with
fd(ULA indicator) - Add a simple 16-bit identifier (like
00:0001) - Use sequential numbering for hosts
Example assignments:
Host 1: fd00:0001::1/64
Host 2: fd00:0001::2/64
Host 3: fd00:0001::3/64
Here's how to set these addresses on different systems:
Linux (NetworkManager)
nmcli con modify "eth0" ipv6.addresses "fd00:0001::1/64"
nmcli con up "eth0"
Windows (PowerShell)
New-NetIPAddress -InterfaceAlias "Ethernet"
-IPAddress "fd00:0001::2"
-PrefixLength 64
Router Advertisement Configuration
# radvd.conf example
interface eth0 {
AdvSendAdvert on;
prefix fd00:0001::/64 {
AdvOnLink on;
AdvAutonomous on;
};
};
After configuration, verify connectivity:
ping6 fd00:0001::2
traceroute6 fd00:0001::3
For DNS resolution, consider adding entries to /etc/hosts:
fd00:0001::1 server1
fd00:0001::2 workstation2
For slightly larger networks, you might use:
fd00:feed::1 # "feed" as identifier
fd00:cafe::1 # "cafe" pattern
fd00:1bad:babe::1 # Memorable hex words
Remember that while these patterns aren't standard, they're perfectly valid for isolated networks and make administration easier.