Zwei RouterOS-Skripte fuer die DNS-Bypass-Sperre der TP5-forward-Kette, gespiegelt am TP5-Etappen-Stil (idempotent, place-before, Auto-Revert): - phaseA: Substrat (dns-resolvers/dns-bypass-exempt/jit-dns-bypass) + Exempt/JIT-Accepts + log-only TP5-WOULD-DROP-DNS. - phaseB: reject icmp-port-unreachable + Auto-Revert-Scheduler. Freigegeben 2026-09-11, bewusst NICHT deployt (Christoph remote, hartes Vor-Ort-Gate). Zwei Live-Verifikationen vor dem Deploy im Dateikopf markiert: Egress-Accept-Anker der forward-Kette + Exempt-IPs des dev-MacBooks (MikroMCP war beim Schreiben zu allen Geraeten tot -> nicht geraten). log-only wird beim Deploy als gc-Transaktion gefuehrt. Runbook-Zeiger auf beide Dateien ergaenzt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
41 lines
3.5 KiB
Plaintext
41 lines
3.5 KiB
Plaintext
# TP23 Stufe 6 — PHASE B: der scharfe Schnitt (reject) + Auto-Revert.
|
|
#
|
|
# 🔴🔴 NUR VOR ORT, mit offener Konsole. Erst NACHDEM das WOULD-DROP-DNS-Log
|
|
# (Phase A) mehrere Tage ruhig/verstanden ist und jeder externe Resolver
|
|
# entschieden wurde (Reservierung auf AGH / Exempt / bewusst brechen lassen).
|
|
# AB HIER ist .36/.37 ein DNS-SPOF ohne Fern-Rollback (Runbook, Gate).
|
|
#
|
|
# STATUS: ENTWURF, freigegeben 2026-09-11, NOCH NICHT DEPLOYT.
|
|
#
|
|
# WARUM reject STATT drop: reject icmp-port-unreachable laesst Clients schneller
|
|
# auf den naechsten (erlaubten) Resolver fallen, statt in einen Timeout zu laufen.
|
|
#
|
|
# WARUM die Log-Regel STEHEN BLEIBT: action=log terminiert NICHT — das Paket wird
|
|
# geloggt und faellt dann in die reject-Regel darunter. Gleiche Doktrin wie
|
|
# tp5-etappe3-drop (Log VOR Drop), der Kollektor zeigt weiter, was reject frisst.
|
|
#
|
|
# Weg (wie Phase A, ueber Nautobot GC):
|
|
# Deploy: python3 nautobot/gc-manual-plan.py --device crs326-core \
|
|
# --commands-file routeros/tp23-stufe6-phaseB-reject.rsc \
|
|
# --change-id TP23-S6-PhaseB --deploy
|
|
# Danach (reject ist jetzt Dauerzustand -> Soll, log-only-Transaktion schliessen):
|
|
# python3 nautobot/ingest-core-firewall.py --apply
|
|
# python3 nautobot/gc-configplan.py --refresh-compliance # Ziel gruen
|
|
#
|
|
# Rollback sofort (Vor-Ort-Konsole): /ip firewall filter set [find comment~"TP23-S6: reject"] disabled=yes
|
|
# -> Clients koennen sofort wieder externe Resolver nutzen. Bzw. Auto-Revert unten.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# 0) Auto-Revert ZUERST — deaktiviert die reject-Regeln nach 10m, falls nicht
|
|
# bestaetigt (analog tp5-etappe3/4). Nach der Abnahme abbestellen:
|
|
# /system scheduler remove [find name="tp23s6autorevert"]
|
|
:do { :if ([:len [/system scheduler find name="tp23s6autorevert"]] = 0) do={ /system scheduler add name="tp23s6autorevert" interval=10m on-event="/ip firewall filter set [find comment~\"TP23-S6: reject\"] disabled=yes; /system scheduler remove [find name=\"tp23s6autorevert\"]; :log warning \"tp23s6: AUTO-REVERT hat die DNS-reject-Regeln abgeschaltet\"" } } on-error={ :log info "tp23s6B: 00 scheduler warf" }
|
|
|
|
# 1) reject. Gleiche Match-Tupel wie die WOULD-DROP-DNS-Log-Regeln, direkt
|
|
# dahinter (place-before denselben Egress-Anker -> landet nach den Log-Regeln).
|
|
# <<EGRESS-ACCEPT>>: derselbe live-verifizierte Anker wie in Phase A.
|
|
:do { :if ([:len [/ip firewall filter find comment="TP23-S6: reject dns udp"]] = 0) do={ /ip firewall filter add chain=forward action=reject reject-with=icmp-port-unreachable protocol=udp dst-port=53,853 dst-address-list=!dns-resolvers comment="TP23-S6: reject dns udp" place-before=[/ip firewall filter find comment="<<EGRESS-ACCEPT — LIVE VERIFY>>"] } } on-error={ :log info "tp23s6B: 01a warf" }
|
|
:do { :if ([:len [/ip firewall filter find comment="TP23-S6: reject dns tcp"]] = 0) do={ /ip firewall filter add chain=forward action=reject reject-with=icmp-port-unreachable protocol=tcp dst-port=53,853 dst-address-list=!dns-resolvers comment="TP23-S6: reject dns tcp" place-before=[/ip firewall filter find comment="<<EGRESS-ACCEPT — LIVE VERIFY>>"] } } on-error={ :log info "tp23s6B: 01b warf" }
|
|
|
|
:log info ("tp23s6B: ENDE reject-udp=" . [:tostr [:len [/ip firewall filter find comment="TP23-S6: reject dns udp"]]] . " reject-tcp=" . [:tostr [:len [/ip firewall filter find comment="TP23-S6: reject dns tcp"]]] . " autorevert=" . [:tostr [:len [/system scheduler find name="tp23s6autorevert"]]])
|