The Myth: “IPv6 is Coming Eventually”
You’ve been hearing this for 15 years. “Eventually IPv6 will replace IPv4.” Meanwhile you’re running on IPv4 and things work fine, so why bother?
Because IPv6 is already here and you’re already using it. Your ISP probably offers it. Your network probably has it broken. When you actually need it (and you will), you’ll wish you’d figured it out when you had time to think.
Real talk: IPv6 on your home network is way more useful than you think, and way less complicated than people claim.
The Real Reason You Should Care
- IoT devices expect IPv6: Smart home gear increasingly relies on IPv6-capable networks
- Your ISP likely offers it: And you’re not using it, leaving performance on the table
- Future-proofing: Dual-stack (IPv4 + IPv6) is the reality now
- Better subnet isolation: IPv6 subnets are massive. You can dedicate /64s to different purposes
- Easier than you think: Modern routers and Linux do most of the work for you
Check If Your Network Already Has IPv6
# Does your interface have an IPv6 address?ip addr show
# Output includes:# inet 192.168.1.100/24 <- IPv4# inet6 fd12:3456:789a::100/64 <- IPv6 (if enabled)
# Can you reach IPv6-only services?ping6 ipv6.google.com
# Check your router's public IPv6:curl -6 https://icanhazip.comIf you get curl: (7) Failed to connect to ipv6.google.com port 443 or no IPv6 address shows up, your network isn’t configured for IPv6 yet.
How IPv6 Actually Works on Home Networks
Unlike IPv4, you don’t manually assign IPv6 addresses. Your router gets a block of addresses from your ISP (usually a /56 or /60, which is millions of addresses). It then:
- Creates subnets for different parts of your network
- Advertises those subnets to devices
- Devices auto-configure their own addresses
No DHCP for IPv6 addresses (usually). The devices just pick one. This is called Stateless Address Autoconfiguration (SLAAC).
Enable IPv6 on Your Linux Server
# Check if IPv6 is enabled:sudo sysctl net.ipv6.conf.all.disable_ipv6
# Output of 0 = enabled, 1 = disabled
# If disabled, enable it:sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0
# Make it permanent:sudo tee /etc/sysctl.d/10-ipv6.conf << EOFnet.ipv6.conf.all.disable_ipv6=0net.ipv6.conf.default.disable_ipv6=0EOF
sudo sysctl -p /etc/sysctl.d/10-ipv6.confGet an IPv6 Address via DHCP
Most home networks use DHCPv6 for address assignment. Check if your interface gets one:
# Run DHCP client for IPv6:sudo dhclient -6 eth0
# Check for new IPv6 address:ip addr show eth0
# You should see:# inet6 2001:db8::1234:5678/64 scope global mngtmpaddrOr if your router supports SLAAC (most do), just wait a few seconds and devices auto-configure.
Check Your IPv6 Connectivity
# Ping IPv6-only server:ping6 2001:4860:4860::8888 # Google's public DNS
# Try to curl a dual-stack site:curl -6 https://www.example.com
# See which protocol was used:curl -6 -w "IPv6: %{http_code}\n" https://www.example.comcurl -4 -w "IPv4: %{http_code}\n" https://www.example.comSet a Static IPv6 Address (If You Need One)
For servers that need to stay put:
# Edit netplan config (Ubuntu/Debian):sudo nano /etc/netplan/01-netcfg.yamlnetwork: version: 2 ethernets: eth0: dhcp4: true dhcp6: false addresses: - 192.168.1.100/24 - fd12:3456:789a::100/64 # IPv6 from your /64 subnet gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]Apply it:
sudo netplan apply
# Verify:ip addr showOpen IPv6 Ports in Your Firewall
If you have UFW:
# Allow SSH over IPv6:sudo ufw allow 22/tcpsudo ufw allow 22/udp
# UFW applies to both IPv4 and IPv6 automatically
# Check:sudo ufw statusIf using ip6tables directly:
# Allow incoming SSH on IPv6:sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPTsudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# Save rules:sudo ip6tables-save | sudo tee /etc/ip6tables.rulesAccess Services Over IPv6
Once you have IPv6 working:
# SSH to server via IPv6:ssh user@[fd12:3456:789a::100]
# Note the brackets—required for IPv6 addresses with colons
# Curl a local service:curl -6 http://[fd12:3456:789a::50]:3000/api
# In your hosts file:echo "fd12:3456:789a::50 myserver.local" | sudo tee -a /etc/hostsping6 myserver.localReal-World Example: Service Discovery
# Find all IPv6 hosts on your /64:ping6 ff02::1%eth0
# This pings the "link-local all-nodes" multicast address# All devices on the network respond
# Output:# From fd12:3456:789a::100: bytes=32# From fd12:3456:789a::200: bytes=32# From fd12:3456:789a::300: bytes=32Now you know what’s on your network without scanning port ranges.
The One IPv6 Advantage Over IPv4
With IPv4, you get maybe 253 usable addresses in your home network. With IPv6, a single /64 subnet is 18 quintillion addresses. You can assign a full /64 to:
- Guests (one subnet)
- IoT devices (another subnet)
- Servers (another subnet)
- VPN clients (another subnet)
This is proper network segmentation without any of the “running out of addresses” problem.
Fallback: Tunneling If Your ISP Doesn’t Offer IPv6
If your ISP doesn’t have native IPv6:
# Use a tunnel broker (Hurricane Electric is free):# Register at https://tunnelbroker.net/
# Then configure your tunnel:sudo ip tunnel add he-ipv6 mode sit remote your.isp.ipv4 local your.local.ipv4 ttl 255sudo ip link set he-ipv6 upsudo ip addr add 2001:db8::1/64 dev he-ipv6sudo ip route add ::/0 dev he-ipv6It’s slower than native IPv6 but works fine for testing and low-traffic services.
Bottom Line
IPv6 isn’t complicated. It’s just different. Once you spend an hour getting it working, you’ll realize it’s actually easier than IPv4 because you get so many addresses that you never run out or have to do careful subnet planning.
Set it up on your homelab now. When the rest of the internet finally cares about IPv6, you’ll already know how it works.