This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/hosts/pinix/localServices/ipv6-test.nix
pijukka 61b4d1f5c8 host(pinix): TLS ueber ACME HTTP-01, Mango-DNAT parametrisiert umgelegt
Schritte 4 und 5 aus docs/intent/pinix-ipv6-traefik-webserver.md.

scripts/configure-mango-ipv6-web.sh nimmt das Ziel jetzt als Parameter
(TARGET_IP, PUBLIC_IP, WAN_DEV, PORT_MAP, RULE_PREFIX, STALE_PREFIXES)
statt es fest einzutragen, raeumt Regeln frueherer Ziele vorher weg und
ermittelt die oeffentliche Adresse zur Laufzeit -- das Praefix rotiert, auf
dem WAN liegt regelmaessig noch ein "deprecated" aus dem vorigen.

Die SNAT-Rueckwegregeln entfallen ersatzlos. Sie waren noetig, weil tnix
seine Default-Route auf dem iPhone-Hotspot behielt; pinix' Default-Route
zeigt ohnehin auf den Mango. Sechs Regeln werden zu drei, und die echte
Client-Adresse steht wieder im Traefik-Log. Extern 8080 landet auf intern
80, weil dort nur Traefik mit 80/443 lauscht -- der alte Link bleibt
gueltig und laeuft ueber die HTTPS-Weiterleitung.

Gotcha, gemessen und wieder zurueckgebaut: eine statische
networking.interfaces.end0.ipv6.addresses als stabiles DNAT-Ziel kostet den
Host sein Internet. Das NixOS-dhcpcd-Modul schreibt fuer ein Interface mit
statischer IPv6-Adresse `noipv6rs` in die generierte dhcpcd.conf; ohne
Router-Solicitation keine RA-Default-Route, und pinix' Uplink ist
IPv6-only. Ziel ist deshalb die SLAAC-Adresse, die aus MAC und ULA-Praefix
ohnehin deterministisch entsteht -- dieselbe Adresse, nur ohne den
Nebeneffekt. Im Modul dokumentiert.

Verifiziert: "Validations succeeded" im Traefik-Log, also hat Let's
Encrypt pinix von aussen ueber IPv6 erreicht; openssl gegen den Listener
zeigt die vollstaendige Kette mit "Verify return code: 0 (ok)".

Offen: ein externer Abruf ueber einen Client mit aelterem CA-Bundle
scheitert an "unable to verify the first certificate" -- die Kette laeuft
ueber ISRG Root YR. Siehe Bericht, ggf. preferredChain.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019jNMZkpvA9QuNEPg9BA6oY
2026-09-12 15:20:27 +02:00

51 lines
1.7 KiB
Nix

{ config, pkgs, ... }:
let
host = "ipv6-test.${config.domain}";
port = 8001;
webRoot = pkgs.runCommand "pinix-ipv6-test-site" { } ''
mkdir -p "$out"
cp ${./ipv6-test.html} "$out/index.html"
'';
in
{
# Statische Testseite hinter Traefik. Muster geklaut von
# hosts/blunix/localServices/launcher.nix: static-web-server auf
# Loopback, Traefik davor, und jedes Dienstmodul bringt seine eigene
# Route mit, statt sie in eine zentrale Routenliste einzutragen.
#
# Die Seite nennt pinix ausdrücklich beim Namen -- wenn beim Test der
# alte tnix-Pfad antwortet, fällt das sofort auf, statt als
# "funktioniert ja" durchzugehen.
#
# Backend auf 127.0.0.1: es soll ausschließlich über den Proxy
# erreichbar sein, deshalb steht 8001 auch in keiner Firewall-Liste.
systemd.services.ipv6-test-site = {
description = "Static IPv6 reachability test page (pinix)";
wantedBy = [ "multi-user.target" ];
before = [ "traefik.service" ];
serviceConfig = {
ExecStart = "${pkgs.static-web-server}/bin/static-web-server"
+ " --host 127.0.0.1 --port ${toString port} --root ${webRoot}";
DynamicUser = true;
Restart = "always";
RestartSec = "5s";
};
};
services.traefik.dynamicConfigOptions.http = {
# TLS ueber ACME HTTP-01 (Resolver "le" in traefik.nix). Die
# Weiterleitung von web nach websecure steht dort am Entrypoint,
# gilt also fuer jede weitere Route mit.
routers.ipv6-test = {
rule = "Host(`${host}`)";
service = "ipv6-test";
entrypoints = [ "websecure" ];
tls.certResolver = "le";
};
services.ipv6-test.loadBalancer.servers = [
{ url = "http://127.0.0.1:${toString port}/"; }
];
};
}