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
51 lines
1.7 KiB
Nix
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}/"; }
|
|
];
|
|
};
|
|
}
|