<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Setting up working dual stack (IPv4 and IPv6) wireguard home server on EE in Broadband &amp; Landline</title>
    <link>https://community.ee.co.uk/t5/Broadband-Landline/Setting-up-working-dual-stack-IPv4-and-IPv6-wireguard-home/m-p/1578855#M129308</link>
    <description>&lt;P&gt;&lt;!--  StartFragment   --&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;To forward port 51820 on the EE Smart Hub Pro for WireGuard or similar services, you'll need to create a custom port forwarding rule and optionally configure firewall pinholes. Here's a step-by-step guide.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":hammer_and_wrench:"&gt;🛠&lt;/span&gt;️ How to Set Up Port Forwarding for Port 51820 on EE Smart Hub Pro&lt;/P&gt;&lt;P&gt;This setup enables external access to your Raspberry Pi or other device running WireGuard via UDP port 51820.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":locked_with_key:"&gt;🔐&lt;/span&gt; Prerequisites&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Your Raspberry Pi or target device must have a &lt;STRONG&gt;static IP address&lt;/STRONG&gt; on your LAN (e.g., 192.168.1.100)&lt;/LI&gt;&lt;LI&gt;You must know your EE Smart Hub Pro’s &lt;STRONG&gt;admin password&lt;/STRONG&gt; (found on the back of the router)&lt;/LI&gt;&lt;LI&gt;WireGuard must be configured to listen on &lt;STRONG&gt;UDP port 51820&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":gear:"&gt;⚙️&lt;/span&gt; Step-by-Step Instructions&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;STRONG&gt;Access the EE Smart Hub Manager&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;Open a browser and go to &lt;A href="http://192.168.1.254" target="_blank" rel="noopener"&gt;http://192.168.1.254&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;Log in with the admin password&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;Navigate to Port Forwarding Settings&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;Click &lt;STRONG&gt;Advanced Settings&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Select &lt;STRONG&gt;Firewall&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Choose &lt;STRONG&gt;Create a new port forwarding rule&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;Create the Port Forwarding Rule&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Rule name&lt;/STRONG&gt;: WireGuard 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Select device&lt;/STRONG&gt;: Choose your Raspberry Pi or manually enter its IP (e.g., 192.168.1.100)&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;External ports&lt;/STRONG&gt;: 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Internal ports&lt;/STRONG&gt;: 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Protocol&lt;/STRONG&gt;: UDP&lt;/LI&gt;&lt;LI&gt;Click &lt;STRONG&gt;Set&lt;/STRONG&gt;, then &lt;STRONG&gt;Save&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;(For IPv6 Support) Configure Pinholes&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;UL&gt;&lt;LI&gt;If your EE Smart Hub Pro supports pinhole configuration:&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Go to &lt;STRONG&gt;Firewall &amp;gt; Pinholes&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Add a new pinhole for the same device and port&lt;/LI&gt;&lt;LI&gt;Use the same port number: 51820&lt;/LI&gt;&lt;LI&gt;Protocol: UDP&lt;/LI&gt;&lt;LI&gt;Save the configuration&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Verification &amp;amp; Tips&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Use an external device or online tool like &lt;A href="https://portchecker.co/" target="_blank" rel="noopener"&gt;PortChecker&lt;/A&gt; to verify that port 51820 is open.&lt;/LI&gt;&lt;LI&gt;Ensure your WireGuard service is actively listening on port 51820 and bound to the correct interface (end0 in your case).&lt;/LI&gt;&lt;LI&gt;If using dynamic DNS (e.g., Dynu via ddclient), confirm that your domain resolves to your public IP.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;!--  EndFragment   --&gt;&lt;/P&gt;</description>
    <pubDate>Thu, 30 Oct 2025 16:45:20 GMT</pubDate>
    <dc:creator>TraderTravel</dc:creator>
    <dc:date>2025-10-30T16:45:20Z</dc:date>
    <item>
      <title>Setting up working dual stack (IPv4 and IPv6) wireguard home server on EE</title>
      <link>https://community.ee.co.uk/t5/Broadband-Landline/Setting-up-working-dual-stack-IPv4-and-IPv6-wireguard-home/m-p/1578854#M129307</link>
      <description>&lt;P&gt;&lt;!--  StartFragment   --&gt;&lt;/P&gt;&lt;P&gt;&lt;!--  StartFragment   --&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H1&gt;Raspberry Pi VPN gateway with dynamic DNS, WireGuard, and NAT66&lt;/H1&gt;&lt;P&gt;A reproducible, fully annotated runbook for deploying a dual‑stack VPN gateway on Raspberry Pi OS Trixie with EE broadband, Dynu dynamic DNS, WireGuard, and NAT66. This guide is anonymised so any network savvy EE user can follow it.&lt;/P&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;1. Overview and rationale&lt;/H2&gt;&lt;P&gt;This setup solves two common problems with consumer ISPs and routers: unstable public IPs and limited IPv6 routing support. By combining WireGuard with Dynamic DNS and NAT66, you get a reliable, full‑tunnel experience for both IPv4 and IPv6 across your devices.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Why Dynamic DNS:&lt;/STRONG&gt; ISPs like EE often change your public IPs. Dynamic DNS keeps a human‑friendly domain pointing to your gateway automatically. Dynu is a good default because it’s free and straightforward, but you can use any provider that supports standard update protocols.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Why NAT66:&lt;/STRONG&gt; EE’s Smart Hub Pro does not support prefix delegation or proxy NDP for your downstream gateway. That means you can’t route your global /64 directly to WireGuard clients. NAT66 translates ULA IPv6 from clients to the Pi’s global IPv6, making IPv6 work reliably despite these limitations. A full rationale is included later.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;2. Prerequisites&lt;/H2&gt;&lt;H3&gt;Network and hardware&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;EE Broadband Smart Hub Pro (Hub):&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Reset:&lt;/STRONG&gt; Perform a full factory reset.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Pair:&lt;/STRONG&gt; Re‑pair the Hub to your broadband line.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;EE Smart Wifi Pro Extenders:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Reset:&lt;/STRONG&gt; Factory reset each extender.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Pair:&lt;/STRONG&gt; Re‑pair them to the Hub.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;EE App:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Pair:&lt;/STRONG&gt; Link Hub and Extenders to your EE account for stable mesh management before adding services.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Raspberry Pi baseline&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;OS:&lt;/STRONG&gt; Raspberry Pi OS Trixie (Debian 13 base), clean install recommended.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Connectivity:&lt;/STRONG&gt; Ethernet to the EE Hub (we will enable predictable interface names).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;System updates:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade -y
sudo reboot&lt;/PRE&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Predictable network interface names&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Enable via raspi-config:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;Run sudo raspi-config&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Advanced Options → Network interface names → Enable “predictable” names&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Reboot: sudo reboot&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Verify external interface (typically end0):&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;ip link show&lt;/PRE&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Access model&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Sudo privileges:&lt;/STRONG&gt; All commands assume sudo; root login (su) is not required.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Domain and Dynamic DNS&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Domain:&lt;/STRONG&gt; &lt;A href="https://ExamplePersonalDomain.com" target="_blank" rel="noopener"&gt;ExamplePersonalDomain.com&lt;/A&gt; (replace with your own domain).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Dynu account:&lt;/STRONG&gt; Free dynamic DNS to keep your domain updated as EE changes your public IPs. Other providers (e.g., Cloudflare API, DuckDNS) can be used if preferred.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;WireGuard clients&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;WireGuard installed&lt;/STRONG&gt; on your devices (computer, phone, tablet).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Keys generated&lt;/STRONG&gt; for server and each client.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;3. Dynamic DNS with ddclient&lt;/H2&gt;&lt;H3&gt;Install ddclient&lt;/H3&gt;&lt;PRE&gt;sudo apt install ddclient&lt;/PRE&gt;&lt;H3&gt;Configure ddclient&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;File: /etc/&lt;A href="https://ddclient.conf" target="_blank" rel="noopener"&gt;ddclient.conf&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;# ----------------------------------------
# ddclient configuration for Dynu (free)
# ----------------------------------------
# Updates your Dynu domain with current IPv4 and IPv6.
# Ensures clients can always reach your Pi despite changing ISP IPs.
# If using another provider, adapt protocol/server/login/password accordingly.
# ----------------------------------------

protocol=dyndns2
use=web, web=checkip.dynu.com/, web-skip='Current IP Address:'
server=api.dynu.com
login=&amp;lt;dynu-username&amp;gt;
password='&amp;lt;dynu-password&amp;gt;'
ExamplePersonalDomain.com&lt;/PRE&gt;&lt;H3&gt;Enable and verify&lt;/H3&gt;&lt;PRE&gt;sudo systemctl enable ddclient
sudo systemctl restart ddclient
journalctl -u ddclient -f&lt;/PRE&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;4. WireGuard server&lt;/H2&gt;&lt;H3&gt;Install WireGuard&lt;/H3&gt;&lt;PRE&gt;sudo apt install wireguard&lt;/PRE&gt;&lt;H3&gt;Server config&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;File: /etc/wireguard/&lt;A href="https://wg0.conf" target="_blank" rel="noopener"&gt;wg0.conf&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;# ----------------------------------------
# WireGuard server configuration
# ----------------------------------------
# - Dual-stack inside the tunnel: IPv4 + ULA IPv6
# - Uses dedicated routing table for clean policy routing
# - PostUp/Down scripts manage forwarding and NAT
# ----------------------------------------

[Interface]
Address = 10.0.0.1/24, fd42:1234:5678::1/64
ListenPort = 51820
PrivateKey = &amp;lt;server-private-key&amp;gt;
Table = 51820
MTU = 1420
PostUp   = /etc/wireguard/wg0-postup.sh
PostDown = /etc/wireguard/wg0-postdown.sh

# ---- Peers ----

[Peer]
# Computer client
PublicKey = &amp;lt;computer-client-public-key&amp;gt;
AllowedIPs = 10.0.0.2/32, fd42:1234:5678::2/128
PersistentKeepalive = 25

[Peer]
# Phone client
PublicKey = &amp;lt;phone-client-public-key&amp;gt;
AllowedIPs = 10.0.0.3/32, fd42:1234:5678::3/128
PersistentKeepalive = 25&lt;/PRE&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;5. WireGuard PostUp/PostDown scripts&lt;/H2&gt;&lt;H3&gt;PostUp: /etc/wireguard/&lt;A href="https://wg0-postup.sh" target="_blank" rel="noopener"&gt;wg0-postup.sh&lt;/A&gt;&lt;/H3&gt;&lt;PRE&gt;#!/bin/bash
set -e

# ----------------------------------------
# WireGuard PostUp
# ----------------------------------------
# Enables forwarding and installs IPv4 NAT and IPv6 forwarding.
# Triggers NAT66 refresh to adapt to EE's dynamic global IPv6.
# ----------------------------------------

# Enable forwarding
sysctl -w net.ipv4.ip_forward=1 &amp;gt;/dev/null
sysctl -w net.ipv6.conf.all.forwarding=1 &amp;gt;/dev/null

# IPv4 forwarding + NAT44
iptables -A FORWARD -i wg0 -o end0 -j ACCEPT
iptables -A FORWARD -i end0 -o wg0 -j ACCEPT
iptables -t nat -A POSTROUTING -o end0 -j MASQUERADE

# IPv6 forwarding (NAT66 handled by service)
ip6tables -A FORWARD -i wg0 -o end0 -j ACCEPT
ip6tables -A FORWARD -i end0 -o wg0 -j ACCEPT

# Refresh NAT66 rule for ULA subnet
systemctl start nat66-refresh.service&lt;/PRE&gt;&lt;H3&gt;PostDown: /etc/wireguard/&lt;A href="https://wg0-postdown.sh" target="_blank" rel="noopener"&gt;wg0-postdown.sh&lt;/A&gt;&lt;/H3&gt;&lt;PRE&gt;#!/bin/bash
set -e

# ----------------------------------------
# WireGuard PostDown
# ----------------------------------------
# Cleans up forwarding and NAT rules for both IPv4 and IPv6.
# ----------------------------------------

# IPv4 cleanup
iptables -D FORWARD -i wg0 -o end0 -j ACCEPT || true
iptables -D FORWARD -i end0 -o wg0 -j ACCEPT || true
iptables -t nat -D POSTROUTING -o end0 -j MASQUERADE || true

# IPv6 cleanup
ip6tables -D FORWARD -i wg0 -o end0 -j ACCEPT || true
ip6tables -D FORWARD -i end0 -o wg0 -j ACCEPT || true
ip6tables -t nat -D POSTROUTING -s fd42:1234:5678::/64 -j MASQUERADE || true&lt;/PRE&gt;&lt;H3&gt;Ensure scripts are executable&lt;/H3&gt;&lt;PRE&gt;sudo chmod +x /etc/wireguard/wg0-postup.sh /etc/wireguard/wg0-postdown.sh
sudo chown root:root /etc/wireguard/wg0-postup.sh /etc/wireguard/wg0-postdown.sh&lt;/PRE&gt;&lt;H3&gt;Enable WireGuard&lt;/H3&gt;&lt;PRE&gt;sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0&lt;/PRE&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;6. NAT66 refresh service and timer&lt;/H2&gt;&lt;H3&gt;NAT66 refresh script&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;File: /usr/local/bin/&lt;A href="https://nat66-refresh.sh" target="_blank" rel="noopener"&gt;nat66-refresh.sh&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;#!/bin/bash
set -e

# ----------------------------------------
# Dynamic NAT66 refresh script
# ----------------------------------------
# Detects the Pi's current global IPv6 on end0 (EE assigns dynamically),
# prefers the /64 address (common on EE), and refreshes the MASQUERADE rule
# for the ULA subnet so clients get stable outbound IPv6.
# ----------------------------------------

# Prefer /64 address, fallback to any global (exclude link-local and temporary)
GLOBAL_IPV6=$(ip -6 addr show dev end0 \
  | awk '/inet6/ &amp;amp;&amp;amp; /scope global/ &amp;amp;&amp;amp; !/temporary/ {print $2}' \
  | grep -v '^fe80' \
  | grep '/64' \
  | cut -d/ -f1 \
  | head -n1)

if [[ -z "$GLOBAL_IPV6" ]]; then
  GLOBAL_IPV6=$(ip -6 addr show dev end0 \
    | awk '/inet6/ &amp;amp;&amp;amp; /scope global/ &amp;amp;&amp;amp; !/temporary/ {print $2}' \
    | grep -v '^fe80' \
    | cut -d/ -f1 \
    | head -n1)
fi

if [[ -z "$GLOBAL_IPV6" ]]; then
  echo "&lt;span class="lia-unicode-emoji" title=":cross_mark:"&gt;❌&lt;/span&gt; No usable global IPv6 found on end0"
  exit 1
fi

echo "&lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Detected global IPv6: $GLOBAL_IPV6"

# Refresh NAT66 rule (remove stale, add fresh)
ip6tables -t nat -D POSTROUTING -s fd42:1234:5678::/64 -j MASQUERADE 2&amp;gt;/dev/null || true
ip6tables -t nat -A POSTROUTING -s fd42:1234:5678::/64 -j MASQUERADE

echo "&lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; NAT66 MASQUERADE rule applied for fd42:1234:5678::/64 → $GLOBAL_IPV6"&lt;/PRE&gt;&lt;H3&gt;Make the script executable&lt;/H3&gt;&lt;PRE&gt;sudo chmod +x /usr/local/bin/nat66-refresh.sh
sudo chown root:root /usr/local/bin/nat66-refresh.sh&lt;/PRE&gt;&lt;H3&gt;NAT66 refresh service&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;File: /etc/systemd/system/&lt;A href="https://nat66-refresh.service" target="_blank" rel="noopener"&gt;nat66-refresh.service&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;[Unit]
Description=Refresh NAT66 ip6tables rule for WireGuard ULA subnet
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/nat66-refresh.sh
RemainAfterExit=true

[Install]
WantedBy=multi-user.target&lt;/PRE&gt;&lt;H3&gt;NAT66 periodic timer (every 15 minutes)&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;File: /etc/systemd/system/&lt;A href="https://nat66-refresh.timer" target="_blank" rel="noopener"&gt;nat66-refresh.timer&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;[Unit]
Description=Periodic NAT66 refresh (every 15 minutes)

[Timer]
OnBootSec=2min
OnUnitActiveSec=15min
Persistent=true

[Install]
WantedBy=timers.target&lt;/PRE&gt;&lt;H3&gt;Enable service and timer&lt;/H3&gt;&lt;PRE&gt;sudo systemctl daemon-reload
sudo systemctl enable nat66-refresh.service
sudo systemctl enable --now nat66-refresh.timer
sudo systemctl start nat66-refresh.service&lt;/PRE&gt;&lt;H3&gt;Verify timer&lt;/H3&gt;&lt;PRE&gt;systemctl list-timers | grep nat66&lt;/PRE&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;7. Client configurations (anonymised)&lt;/H2&gt;&lt;H3&gt;Computer client&lt;/H3&gt;&lt;PRE&gt;# ----------------------------------------
# Computer WireGuard client
# ----------------------------------------
# - ULA IPv6 inside the tunnel; NAT66 on the Pi translates outbound IPv6.
# - Full-tunnel routing for IPv4 and IPv6.
# ----------------------------------------

[Interface]
PrivateKey = &amp;lt;computer-client-private-key&amp;gt;
Address = 10.0.0.2/32, fd42:1234:5678::2/128
DNS = 1.1.1.1, 2606:4700:4700::1111

[Peer]
PublicKey = &amp;lt;server-public-key&amp;gt;
Endpoint = ExamplePersonalDomain.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25&lt;/PRE&gt;&lt;H3&gt;Phone client&lt;/H3&gt;&lt;PRE&gt;# ----------------------------------------
# Phone WireGuard client
# ----------------------------------------
# - ULA IPv6 inside the tunnel; NAT66 on the Pi translates outbound IPv6.
# - Full-tunnel routing for IPv4 and IPv6.
# ----------------------------------------

[Interface]
PrivateKey = &amp;lt;phone-client-private-key&amp;gt;
Address = 10.0.0.3/32, fd42:1234:5678::3/128
DNS = 1.1.1.1, 2606:4700:4700::1111

[Peer]
PublicKey = &amp;lt;server-public-key&amp;gt;
Endpoint = ExamplePersonalDomain.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25&lt;/PRE&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;8. Testing and audits&lt;/H2&gt;&lt;H3&gt;Functional tests&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;WireGuard status on the Pi:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo wg show&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;NAT66 rule present:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo ip6tables -t nat -S | grep MASQUERADE&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Public IPv6 from client (Computer/Phone):&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;curl -6 https://ifconfig.co&lt;/PRE&gt;&lt;P&gt;Should match the Pi’s current global IPv6.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Browser IPv6 readiness:&lt;/STRONG&gt; visit &lt;A href="https://test-ipv6.com" target="_blank" rel="noopener"&gt;https://test-ipv6.com&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Audit checklist&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Proxy NDP entries (should be empty):&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;ip -6 neigh show proxy dev end0&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;IPv6 forwarding enabled:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sysctl net.ipv6.conf.all.forwarding
# expect: net.ipv6.conf.all.forwarding = 1&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Timer active:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;systemctl list-timers | grep nat66&lt;/PRE&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;9. Why we’re using Dynu&lt;/H2&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Purpose:&lt;/STRONG&gt; Keep &lt;A href="https://ExamplePersonalDomain.com" target="_blank" rel="noopener"&gt;ExamplePersonalDomain.com&lt;/A&gt; pointing to your gateway even when EE changes your public IPs.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Why Dynu:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Free plan&lt;/STRONG&gt; with core features sufficient for home use.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Standard protocols&lt;/STRONG&gt; (dyndns2) work with ddclient out‑of‑the‑box.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;IPv4 and IPv6 updates&lt;/STRONG&gt; supported.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Alternatives:&lt;/STRONG&gt; DuckDNS, Cloudflare API scripts, No‑IP, etc. If you already use a different provider, adapt /etc/&lt;A href="https://ddclient.conf" target="_blank" rel="noopener"&gt;ddclient.conf&lt;/A&gt; or use their API tool instead.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;10. Why NAT66 is necessary on EE&lt;/H2&gt;&lt;H3&gt;Preferred IPv6 model (no NAT)&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Delegated prefix:&lt;/STRONG&gt; ISP provides a /64 or larger.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Direct addressing:&lt;/STRONG&gt; Assign global IPv6 to WireGuard clients.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Routing announcements:&lt;/STRONG&gt; Gateway uses &lt;STRONG&gt;proxy NDP&lt;/STRONG&gt; or &lt;STRONG&gt;prefix delegation&lt;/STRONG&gt; so the router forwards traffic to those client addresses.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Outcome:&lt;/STRONG&gt; True end‑to‑end IPv6 without translation.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;EE environment limitations&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Single /64 only:&lt;/STRONG&gt; No extra prefixes to route to downstream networks.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;No prefix delegation:&lt;/STRONG&gt; Smart Hub Pro does not delegate a routable prefix to your Pi.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Proxy NDP ignored:&lt;/STRONG&gt; The router does not honour your gateway’s claims for client addresses.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Result:&lt;/STRONG&gt; Packets sourced from client‑assigned global IPv6 addresses get dropped.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;NAT66 as the practical workaround&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;ULA inside tunnel:&lt;/STRONG&gt; Clients use fd42:1234:5678::/64 on WireGuard.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Translation at the gateway:&lt;/STRONG&gt; Pi uses ip6tables MASQUERADE to translate outbound IPv6 to its own global IPv6 on end0.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Router compatibility:&lt;/STRONG&gt; The EE router sees traffic as coming from the Pi’s known global IPv6 and forwards it reliably.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Outcome:&lt;/STRONG&gt; Stable full‑tunnel IPv6 for clients despite consumer router constraints.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Trade‑offs&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Pros:&lt;/STRONG&gt; Works with consumer gear, resilient to ISP address changes, minimal client config.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Cons:&lt;/STRONG&gt; Loses end‑to‑end global addressing; traffic appears from a single global IPv6 (the gateway’s).&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Future path (if supported)&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;If EE (or a different ISP/router) supports prefix delegation or honours proxy NDP, you can assign global IPv6 to clients directly and remove NAT66 for a purist routed configuration.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;H2&gt;11. Maintenance tips&lt;/H2&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Keep OS and packages updated:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade -y&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Monitor ddclient:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;journalctl -u ddclient -f&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Monitor NAT66 refresh (manual runs):&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo /usr/local/bin/nat66-refresh.sh&lt;/PRE&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Restart WireGuard after changes:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;sudo systemctl restart wg-quick@wg0
sudo wg show&lt;/PRE&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV&gt;&lt;HR /&gt;&lt;/DIV&gt;&lt;P&gt;&lt;!--  EndFragment   --&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Oct 2025 16:39:33 GMT</pubDate>
      <guid>https://community.ee.co.uk/t5/Broadband-Landline/Setting-up-working-dual-stack-IPv4-and-IPv6-wireguard-home/m-p/1578854#M129307</guid>
      <dc:creator>TraderTravel</dc:creator>
      <dc:date>2025-10-30T16:39:33Z</dc:date>
    </item>
    <item>
      <title>Re: Setting up working dual stack (IPv4 and IPv6) wireguard home server on EE</title>
      <link>https://community.ee.co.uk/t5/Broadband-Landline/Setting-up-working-dual-stack-IPv4-and-IPv6-wireguard-home/m-p/1578855#M129308</link>
      <description>&lt;P&gt;&lt;!--  StartFragment   --&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;To forward port 51820 on the EE Smart Hub Pro for WireGuard or similar services, you'll need to create a custom port forwarding rule and optionally configure firewall pinholes. Here's a step-by-step guide.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":hammer_and_wrench:"&gt;🛠&lt;/span&gt;️ How to Set Up Port Forwarding for Port 51820 on EE Smart Hub Pro&lt;/P&gt;&lt;P&gt;This setup enables external access to your Raspberry Pi or other device running WireGuard via UDP port 51820.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":locked_with_key:"&gt;🔐&lt;/span&gt; Prerequisites&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Your Raspberry Pi or target device must have a &lt;STRONG&gt;static IP address&lt;/STRONG&gt; on your LAN (e.g., 192.168.1.100)&lt;/LI&gt;&lt;LI&gt;You must know your EE Smart Hub Pro’s &lt;STRONG&gt;admin password&lt;/STRONG&gt; (found on the back of the router)&lt;/LI&gt;&lt;LI&gt;WireGuard must be configured to listen on &lt;STRONG&gt;UDP port 51820&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":gear:"&gt;⚙️&lt;/span&gt; Step-by-Step Instructions&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;STRONG&gt;Access the EE Smart Hub Manager&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;Open a browser and go to &lt;A href="http://192.168.1.254" target="_blank" rel="noopener"&gt;http://192.168.1.254&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;Log in with the admin password&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;Navigate to Port Forwarding Settings&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;Click &lt;STRONG&gt;Advanced Settings&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Select &lt;STRONG&gt;Firewall&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Choose &lt;STRONG&gt;Create a new port forwarding rule&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;Create the Port Forwarding Rule&lt;/STRONG&gt;&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Rule name&lt;/STRONG&gt;: WireGuard 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Select device&lt;/STRONG&gt;: Choose your Raspberry Pi or manually enter its IP (e.g., 192.168.1.100)&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;External ports&lt;/STRONG&gt;: 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Internal ports&lt;/STRONG&gt;: 51820&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Protocol&lt;/STRONG&gt;: UDP&lt;/LI&gt;&lt;LI&gt;Click &lt;STRONG&gt;Set&lt;/STRONG&gt;, then &lt;STRONG&gt;Save&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;LI&gt;&lt;STRONG&gt;(For IPv6 Support) Configure Pinholes&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;UL&gt;&lt;LI&gt;If your EE Smart Hub Pro supports pinhole configuration:&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Go to &lt;STRONG&gt;Firewall &amp;gt; Pinholes&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Add a new pinhole for the same device and port&lt;/LI&gt;&lt;LI&gt;Use the same port number: 51820&lt;/LI&gt;&lt;LI&gt;Protocol: UDP&lt;/LI&gt;&lt;LI&gt;Save the configuration&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Verification &amp;amp; Tips&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Use an external device or online tool like &lt;A href="https://portchecker.co/" target="_blank" rel="noopener"&gt;PortChecker&lt;/A&gt; to verify that port 51820 is open.&lt;/LI&gt;&lt;LI&gt;Ensure your WireGuard service is actively listening on port 51820 and bound to the correct interface (end0 in your case).&lt;/LI&gt;&lt;LI&gt;If using dynamic DNS (e.g., Dynu via ddclient), confirm that your domain resolves to your public IP.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;!--  EndFragment   --&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Oct 2025 16:45:20 GMT</pubDate>
      <guid>https://community.ee.co.uk/t5/Broadband-Landline/Setting-up-working-dual-stack-IPv4-and-IPv6-wireguard-home/m-p/1578855#M129308</guid>
      <dc:creator>TraderTravel</dc:creator>
      <dc:date>2025-10-30T16:45:20Z</dc:date>
    </item>
  </channel>
</rss>

