v6proxy Host - IPv6 Gateway#
IPv6 gateway proxy hosted on Hetzner VPS, forwarding all IPv6 traffic to the main IPv4 proxy.
Overview#
- Hostname: v6proxy
- IPv4 Address: 178.104.18.93/32
- IPv6 Address: 2a01:4f8:1c19:96f8::1/64
- Type: Hetzner VPS (Full VM)
- Services: HAProxy (IPv6 to IPv4 forwarding)
- Role: IPv6 gateway for StuRa HTW Dresden infrastructure
Architecture#
The v6proxy serves as an IPv6 gateway because the main infrastructure at 141.56.51.0/24 is IPv4-only:
- All IPv6 DNS records (AAAA) point to this host (2a01:4f8:1c19:96f8::1)
- HAProxy forwards all IPv6 HTTP/HTTPS traffic to the main proxy at 141.56.51.1
- The main proxy then handles routing to backend services
- Simple pass-through configuration - no SNI inspection or routing logic
Why This Host Exists#
The HTW Dresden network (141.56.51.0/24) does not have native IPv6 connectivity. This Hetzner VPS provides:
- IPv6 connectivity: Public IPv6 address for all services
- Transparent forwarding: All traffic is forwarded to the IPv4 proxy
- No maintenance overhead: Simple configuration, no routing logic
This allows all StuRa services to be accessible via IPv6 without requiring IPv6 support in the HTW network.
Services#
HAProxy#
HAProxy runs in simple TCP forwarding mode:
HTTP (Port 80)
- Binds to IPv6
:::80 - Forwards all traffic to
141.56.51.1:80 - No HTTP inspection or routing
HTTPS (Port 443)
- Binds to IPv6
:::443 - Forwards all traffic to
141.56.51.1:443 - No SNI inspection or TLS termination
Key features:
- Logging: All connections logged to systemd journal
- Stats page: Available at http://127.0.0.1:8404/stats (localhost only)
- Max connections: 50,000
- Buffer size: 32,762 bytes
- Timeouts: 5s connect, 30s client/server
Configuration Philosophy#
Unlike the main proxy at 141.56.51.1, this proxy is intentionally simple:
- No SNI inspection
- No HTTP host header routing
- No ACME challenge handling
- Just pure TCP forwarding
All routing logic happens at the main IPv4 proxy. This keeps the v6proxy configuration minimal and reduces maintenance burden.
Deployment Type#
The v6proxy is a Hetzner VPS (full VM):
- Hosted outside HTW network
- Uses Hetzner-specific disk layout (hetzner-disk.nix)
- Network interface:
eth0 - Both IPv4 and IPv6 connectivity
Network Configuration#
IPv4#
- Address: 178.104.18.93/32
- Gateway: 172.31.1.1
- Interface: eth0
IPv6#
- Address: 2a01:4f8:1c19:96f8::1/64
- Gateway: fe80::1 (link-local)
- Route: Default route via fe80::1
- Interface: eth0
DNS#
- Nameservers: 9.9.9.9, 1.1.1.1 (Quad9 and Cloudflare)
- Uses public DNS servers (not HTW internal DNS)
Firewall#
- Firewall: nftables enabled
- Open ports: 22, 80, 443
DNS Configuration#
For IPv6 support, configure AAAA records pointing to this host:
proxy.htw.stura-dresden.de AAAA 2a01:4f8:1c19:96f8::1
*.htw.stura-dresden.de CNAME proxy.htw.stura-dresden.deThis provides IPv6 access to all services while IPv4 traffic continues to use the main proxy (141.56.51.1).
Deployment#
See the main README for deployment methods.
Initial Installation#
Using nixos-anywhere (recommended):
nix run github:nix-community/nixos-anywhere -- --flake .#v6proxy --target-host root@178.104.18.93This handles disk partitioning via disko automatically.
Updates#
# From local machine
nixos-rebuild switch --flake .#v6proxy --target-host root@178.104.18.93
# Or use auto-generated script
nix run .#v6proxy-updateDisko Configuration#
The v6proxy uses the Hetzner-specific disk layout (hetzner-disk.nix):
- Filesystem: Btrfs or Ext4 (Hetzner default)
- Declarative disk management via disko
- Automatic partitioning on installation
Traffic Flow#
IPv6 request flow:
- Client connects to
2a01:4f8:1c19:96f8::1(v6proxy) - v6proxy forwards to
141.56.51.1:443(main IPv4 proxy) - Main proxy performs SNI inspection and routes to backend
- Backend responds through the chain
For the client, the IPv6 connectivity is transparent - they don’t know the backend infrastructure is IPv4-only.
HAProxy Configuration#
The HAProxy configuration is minimal:
frontend http-in
bind :::80
use_backend http_80
frontend sni_router
bind :::443
mode tcp
use_backend http_443
backend http_80
mode http
server proxy 141.56.51.1:80
backend http_443
mode tcp
server proxy 141.56.51.1:443This is intentionally simple - all routing intelligence is at 141.56.51.1.
HAProxy Stats#
Access HAProxy statistics page (localhost only):
# SSH into v6proxy
ssh root@178.104.18.93
# Access stats via curl
curl http://127.0.0.1:8404/stats
# Or forward port to your local machine
ssh -L 8404:127.0.0.1:8404 root@178.104.18.93
# Then browse to http://localhost:8404/statsThe stats page shows:
- Current connections to main proxy backend
- Traffic statistics
- Connection status
Monitoring#
Check HAProxy Status#
# HAProxy service status
systemctl status haproxy
# View HAProxy logs
journalctl -u haproxy -f
# Check configuration
haproxy -c -f /etc/haproxy/haproxy.cfgTest Connectivity#
# Test IPv6 HTTP forwarding
curl -6 -v http://[2a01:4f8:1c19:96f8::1]/
# Test IPv6 HTTPS forwarding
curl -6 -vk https://[2a01:4f8:1c19:96f8::1]/
# Test backend connectivity (IPv4 to main proxy)
curl -v http://141.56.51.1/
curl -vk https://141.56.51.1/
# Check IPv6 routing
ip -6 route show
ping6 2a01:4f8:1c19:96f8::1Troubleshooting#
HAProxy not starting#
# Check HAProxy status
systemctl status haproxy
# Check configuration syntax
haproxy -c -f /etc/haproxy/haproxy.cfg
# View HAProxy logs
journalctl -u haproxy -fIPv6 connectivity issues#
# Verify IPv6 address is configured
ip -6 addr show eth0
# Check IPv6 routing
ip -6 route show
# Test IPv6 connectivity
ping6 2606:4700:4700::1111 # Cloudflare DNS
# Check IPv6 firewall rules
nft list ruleset | grep ip6Backend (main proxy) unreachable#
# Test IPv4 connectivity to main proxy
ping 141.56.51.1
curl -v http://141.56.51.1/
curl -vk https://141.56.51.1/
# Check HAProxy backend status
curl http://127.0.0.1:8404/stats | grep proxy
# View connection errors
journalctl -u haproxy | grep -i errorDNS not resolving#
# Check nameserver configuration
cat /etc/resolv.conf
# Test DNS resolution
dig git.adm.htw.stura-dresden.de A
dig git.adm.htw.stura-dresden.de AAAA
# Test with specific nameserver
dig @9.9.9.9 git.adm.htw.stura-dresden.deSecurity Considerations#
- No TLS termination: Traffic is passed through encrypted to main proxy
- No deep packet inspection: Simple TCP forwarding only
- Minimal attack surface: No routing logic or service-specific configuration
- Public IPv6 address: Exposed to the internet, firewall must be properly configured
Performance Considerations#
- Additional hop: IPv6 traffic goes through an extra proxy hop
- Latency: Hetzner → HTW network adds some latency
- Bandwidth: Hetzner provides high bandwidth, unlikely to be a bottleneck
- Connection limits: HAProxy configured for 50,000 concurrent connections
For most use cases, the additional latency is negligible (typically <10ms within Germany).
Cost and Hosting#
- Provider: Hetzner Cloud
- Type: VPS (Virtual Private Server)
- Location: Germany, Nürnberg, Falkenstein war voll.
- Cost: Minimal - basic VPS tier sufficient for forwarding traffic
Future Improvements#
Possible improvements (not currently needed):
- Native IPv6 at HTW: If HTW network gains IPv6, this proxy can be decommissioned
- GeoDNS: Use GeoDNS to route IPv4 and IPv6 separately
- Monitoring: Add automated monitoring and alerting
- Failover: Add a second IPv6 proxy for redundancy
Files and Directories#
- HAProxy config:
/etc/haproxy/haproxy.cfg(generated by Nix) - Disk config:
./hetzner-disk.nix(disko configuration) - Hardware config:
./hardware-configuration.nix(Hetzner VPS hardware) - NixOS config:
./default.nix(v6proxy configuration)
Relationship to Main Proxy#
| Feature | v6proxy (IPv6 Gateway) | proxy (Main Proxy) |
|---|---|---|
| IP Version | IPv4 + IPv6 | IPv4 only |
| Location | Hetzner Cloud | HTW network (141.56.51.0/24) |
| Function | Simple forwarding | SNI routing, service routing |
| Complexity | Minimal | Complex routing logic |
| HAProxy Mode | TCP forwarding | TCP + HTTP with SNI inspection |
| TLS Handling | Pass-through | Pass-through (SNI inspection) |
| ACME Handling | None | Forwards challenges to backends |
The v6proxy is intentionally minimal - all intelligence lives at the main proxy.
See Also#
- Main README - Deployment methods and architecture
- Proxy README - Main IPv4 proxy configuration
- HAProxy Documentation
- Hetzner Cloud Docs