|
| 1 | +<!-- |
| 2 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 3 | +SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 4 | +--> |
| 5 | + |
| 6 | +[](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/ipv6-site-enforcer) |
| 7 | +[](https://github.com/hyperpolymath/palimpsest-license) <embed |
| 8 | +src="https://api.thegreenwebfoundation.org/greencheckimage/github.com" |
| 9 | +data-link="https://www.thegreenwebfoundation.org/green-web-check/?url=github.com" /> |
| 10 | + |
| 11 | +# Purpose |
| 12 | + |
| 13 | +Tools and configurations to enforce IPv6-only ingress and service |
| 14 | +routing across the FlatRacoon Network Stack. |
| 15 | + |
| 16 | +Part of the [FlatRacoon Network |
| 17 | +Stack](https://github.com/hyperpolymath/flatracoon-netstack). |
| 18 | + |
| 19 | +# Architecture |
| 20 | + |
| 21 | + Internet (Dual-Stack) |
| 22 | + │ |
| 23 | + ┌──────────▼──────────┐ |
| 24 | + │ IPv6 Ingress │ |
| 25 | + │ (This Module) │ |
| 26 | + │ ──────────────── │ |
| 27 | + │ • NAT64/DNS64 │ |
| 28 | + │ • IPv4 rejection │ |
| 29 | + │ • Happy Eyeballs │ |
| 30 | + └──────────┬──────────┘ |
| 31 | + │ IPv6 only |
| 32 | + ┌─────────────────┼─────────────────┐ |
| 33 | + │ │ │ |
| 34 | + ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ |
| 35 | + │ Services │ │ ZeroTier │ │ IPFS │ |
| 36 | + │ (K8s) │ │ Overlay │ │ Nodes │ |
| 37 | + └─────────────┘ └─────────────┘ └─────────────┘ |
| 38 | + |
| 39 | +# Components |
| 40 | + |
| 41 | +- **NAT64/DNS64 gateway** - Jool-based translation for legacy clients |
| 42 | + |
| 43 | +- **IPv6 ingress controller** - Nginx/Envoy configured for v6-only |
| 44 | + |
| 45 | +- **Policy enforcement** - NetworkPolicy manifests rejecting IPv4 |
| 46 | + |
| 47 | +- **Monitoring hooks** - Prometheus metrics for v4 rejection counts |
| 48 | + |
| 49 | +- **Happy Eyeballs support** - RFC 8305 compliant client handling |
| 50 | + |
| 51 | +# Directory Structure |
| 52 | + |
| 53 | + ipv6-site-enforcer/ |
| 54 | + ├── manifests/ |
| 55 | + │ ├── nat64-deployment.yaml |
| 56 | + │ ├── dns64-configmap.yaml |
| 57 | + │ ├── ingress-controller.yaml |
| 58 | + │ └── networkpolicy-v6only.yaml |
| 59 | + ├── configs/ |
| 60 | + │ ├── jool.ncl # NAT64 configuration |
| 61 | + │ ├── dns64.ncl # DNS64 resolver config |
| 62 | + │ ├── ingress.ncl # Ingress controller settings |
| 63 | + │ └── policy.ncl # Network policy rules |
| 64 | + ├── scripts/ |
| 65 | + │ ├── enforce-v6.sh # Runtime enforcement |
| 66 | + │ ├── audit-v4.sh # Detect IPv4 leakage |
| 67 | + │ └── metrics.sh # Collect rejection metrics |
| 68 | + ├── Justfile |
| 69 | + ├── README.adoc |
| 70 | + ├── STATE.scm |
| 71 | + ├── META.scm |
| 72 | + └── ECOSYSTEM.scm |
| 73 | + |
| 74 | +# Inputs |
| 75 | + |
| 76 | +| Input | Description | Source | |
| 77 | +|----------------|-----------------------------------|-----------------------| |
| 78 | +| IPv6 prefix | Allocated /48 or /64 for services | Network administrator | |
| 79 | +| NAT64 prefix | 64:ff9b::/96 or custom | Configuration | |
| 80 | +| DNS64 upstream | Resolver for synthesis | Network configuration | |
| 81 | +| Ingress rules | Service exposure policies | configs/ingress.ncl | |
| 82 | + |
| 83 | +# Outputs |
| 84 | + |
| 85 | +| Output | Description | |
| 86 | +|-------------------|------------------------------------| |
| 87 | +| IPv6-only ingress | All inbound traffic forced to IPv6 | |
| 88 | +| NAT64 gateway | Legacy IPv4 client compatibility | |
| 89 | +| Rejection metrics | IPv4 attempt counts and sources | |
| 90 | +| Audit logs | Compliance reporting | |
| 91 | + |
| 92 | +# Integration Points |
| 93 | + |
| 94 | +## With FlatRacoon Stack |
| 95 | + |
| 96 | +- **zerotier-k8s-link** - Overlay uses IPv6 addressing |
| 97 | + |
| 98 | +- **ipfs-overlay** - IPFS nodes bind to IPv6 only |
| 99 | + |
| 100 | +- **network-dashboard** - v4 rejection metrics displayed |
| 101 | + |
| 102 | +- **bgp-backbone-lab** - IPv6 route announcements |
| 103 | + |
| 104 | +## Machine-Readable Manifest |
| 105 | + |
| 106 | +```json |
| 107 | +{ |
| 108 | + "module": "ipv6-site-enforcer", |
| 109 | + "version": "0.1.0", |
| 110 | + "layer": "network", |
| 111 | + "requires": ["kubernetes", "jool", "dns64"], |
| 112 | + "provides": ["ipv6-only-ingress", "nat64", "dns64"], |
| 113 | + "config_schema": "configs/schema.ncl", |
| 114 | + "health_endpoint": "/ipv6/health", |
| 115 | + "metrics_endpoint": "/ipv6/metrics" |
| 116 | +} |
| 117 | +``` |
| 118 | + |
| 119 | +# Quick Start |
| 120 | + |
| 121 | +```bash |
| 122 | +# 1. Deploy NAT64/DNS64 gateway |
| 123 | +just deploy-gateway |
| 124 | + |
| 125 | +# 2. Configure ingress controller |
| 126 | +just configure-ingress |
| 127 | + |
| 128 | +# 3. Apply network policies |
| 129 | +just enforce-policies |
| 130 | + |
| 131 | +# 4. Verify enforcement |
| 132 | +just audit |
| 133 | +``` |
| 134 | + |
| 135 | +# IPv6 Addressing Scheme |
| 136 | + |
| 137 | + 2001:db8:face::/48 # Example allocation |
| 138 | + ├── 2001:db8:face:0::/64 # Kubernetes services |
| 139 | + ├── 2001:db8:face:1::/64 # ZeroTier overlay |
| 140 | + ├── 2001:db8:face:2::/64 # IPFS cluster |
| 141 | + └── 2001:db8:face:ff::/64 # NAT64 pool |
| 142 | + |
| 143 | +# Status |
| 144 | + |
| 145 | +Phase |
| 146 | +Scaffolding |
| 147 | + |
| 148 | +Completion |
| 149 | +5% |
| 150 | + |
| 151 | +Next |
| 152 | +NAT64/DNS64 deployment manifests |
| 153 | + |
| 154 | +# License |
| 155 | + |
| 156 | +MPL-2.0 |
0 commit comments