IPv6 environments are becoming increasingly popular as the Internet runs out of IPv4 addresses. However, not all ISPs support dual-stack. Developers and cybersecurity researchers need IPv6 for better network visibility, testing, and to build practical skills.

NorthSec’s annual hacking competition uses an exclusively IPv6 environment, with no IPv4 support. This forward-thinking design highlights the shift toward the next-generation internet protocol and its unique challenges. It may seem trivial, but many tools surprisingly do not work in IPv6-only networks. See section IPv6 of the post Getting Reverse Shells [Link].

To bridge the gap between IPv4-only ISPs and the growing need for IPv6 connectivity, tunnel brokers like Hurricane Electric and Route64 offer FREE IPv6-over-IPv4 tunnels.


BASICS

Note: the IPs starting with 2a11:6c7:f03:ca:: are used only for the tunnel itself, while 2a11:6c7:2000:c500::/56 is the subnet advertised via BGP.

On the LAN, SLAAC (Stateless Address Auto-configuration) is used to advertise IPv6 configuration parameters (/64 only). Unlike DHCP, it periodically advertises itself, allowing clients to assign their own IP.

The example below shows how a client uses parts of its MAC address to build the Interface ID of its global and link-local addresses.

A packet capture with tcpdump -n -i eth0 ip6 may reveal SLAAC communication:

Some special IPv6 address ranges:

  • fe80::/10 – link-local
  • ff00::/8 – multicast
  • 2000::/3 – global unicast

Popular FREE IPv6-over-IPv4 providers:

  • Hurricane Electric [Link]
    • Offers a /48 prefix over a SIT tunnel (Simple Internet Transition) using IPv4 protocol 41 from 40+ locations.
  • Route64 [Link]
    • Offers a /56 prefix over multiple protocols (including WireGuard) from 8 locations.
  • SixXS / Gogo6 / Freenet6 / gogoCLIENT – Mostly Defunct

IPv6 ONLY ENVIRONMENT

The router is responsible for establishing the tunnel and forwarding traffic in and out of the IPv6-only network.

In this example, Route64 is the IPv6 block provider. Register for a new account at [Link].

Create a Tunnelbroker for IPv6.

Click Show Config.

Under List IP Subnets, the block starting with 2a11:6c7:2000:c500:: is the subnet for the IPv6-only network.

Note: the IPs starting with 2a11:6c7:f03:ca:: are used only for the tunnel itself, while 2a11:6c7:2000:c500::/56 is the subnet advertised via BGP.


LINUX ROUTER

On Ubuntu, install and configure WireGuard.

apt update && apt install wireguard -y
nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = 6OX/STUbJruheYjciTKDJQu1paBRkR55ApP8U09oZHw=
Address = 2a11:6c7:f03:ca::2/64
PostUp = ip6tables -A FORWARD -i eth0 -o wg0 -j ACCEPT
PostUp = ip6tables -A FORWARD -i wg0 -o eth0 -j ACCEPT
PostDown = ip6tables -D FORWARD -i eth0 -o wg0 -j ACCEPT
PostDown = ip6tables -D FORWARD -i wg0 -o eth0 -j ACCEPT

[Peer]
PublicKey = QNE8BE08RJKHS/KcFpIZ4RrxhKCLYxX7fUt1LywZuhQ=
AllowedIPs = ::/1, 8000::/1
Endpoint = 23.150.41.118:48135
PersistentKeepAlive = 30

Enable it to start automatically on boot.

systemctl enable --now wg-quick@wg0

Test the IPv6 tunnel connection.

wg
ip -6 a
ip -6 r
ping 2606:4700:4700::1001 
curl ip.me --interface wg0
curl ip.me --interface 2a11:6c7:2000:c500::1
curl https://42.be/

Enable IPv6 forwarding between interfaces.

echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf

Apply and verify.

sysctl -p
sysctl -a | grep forward | grep ipv6

Configure both network adapters with Netplan.

nano /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  ethernets:
    eth1:                    # WAN
      dhcp4: true
      dhcp6: false
      accept-ra: false
    eth0:                    # LAN
      dhcp6: false
      addresses:
        - 2a11:6c7:2000:c500::1/64
      accept-ra: false
      dhcp4: false

Note: the IP 2a11:6c7:2000:c500::1 belongs to the acquired subnet. Do not confuse it with the tunnel range.

netplan try
netplan apply

Advertise the IPv6 network to the isolated network using SLAAC.

apt install radvd -y
nano /etc/radvd.conf
interface eth0 {
  AdvSendAdvert on;
  MaxRtrAdvInterval 600;
  MinRtrAdvInterval 200;
  AdvDefaultLifetime 600;
  prefix 2a11:6c7:2000:c500::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };
  RDNSS 2606:4700:4700::1001 {
    AdvRDNSSLifetime 1200;
  };
};

Note: the prefix must be a /64 for radvd to work.

systemctl restart radvd
systemctl status radvd

Test the connection from any client on the internal network.

curl ip.me

Note: the client must be able to resolve and reach the given address. It will return its own IP, not the router’s WAN IP as it would with IPv4 NAT.


SIT ALTERNATIVE

SIT (Simple Internet Transition) encapsulates IPv6 packets inside IPv4 packets with no encryption. It is not a translation, unlike SIIT.

In this example, Hurricane Electric is the IPv6 block provider. Register for a new account at [Link].

Note: the difference between the tunnel IP (c1) and the public subnet (1d) is highlighted in bold.

Select the option matching your system or router, and copy the configuration.

The Netplan configuration includes an additional block for tunnels.

nano /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  ethernets:
    eth1:                    # WAN
      dhcp4: true
      dhcp6: false
      accept-ra: false
    eth0:                    # LAN
      dhcp6: false
      addresses:
        - 2a11:6c7:2000:c500::1/64
      accept-ra: false
      dhcp4: false
  tunnels:
    he-ipv6:
      mode: sit
      remote: 216.66.38.58
      local: 184.147.161.183
      addresses:
        - "2001:470:1c:c9::2/64"
      routes:
        - to: default
          via: "2001:470:1c:c9::1"
netplan try
netplan apply

The rest is the same as before. Take some time to work through the challenges for an IPv6 Certification. It is definitely fun!


BONUS

IPv6 Syntax

IPv6 addresses often need to be enclosed in square brackets to avoid ambiguity with port numbers.

curl http://[2001:470:1c:c9::2]:8080

For link-local addresses, the interface must be specified after the % symbol, or %25 in URL encoding.

ping fe80::1%eth0
browser http://[fe80::1%25eth0]

SEE ALSO

Dual-Stack and NATed IPv6 Networking on Linux [Link].