Eine Firewall, die nur eingehend filtert, sieht nichts von dem, was ein übernommener Server tatsächlich tut. Alle drei typischen Aktivitäten laufen nach draußen: Schadcode nachladen, Spam versenden, Kontakt zum Steuerungsserver halten.
Egress-Regeln verhindern die Übernahme nicht, sie begrenzen den Schaden danach und machen ihn sichtbar. Für eine Maschine, die man nicht ständig beobachtet, ist das oft der einzige Weg, überhaupt von einem Einbruch zu erfahren, bevor der Anbieter sich meldet.
Warum das die aufschlussreichere Richtung ist#
Eingehend blockierst du Versuche. Ausgehend blockierst du Erfolge. Der Unterschied zeigt sich an dem Tag, an dem eine Lücke in einer Anwendung ausgenutzt wurde: Eingehend war alles korrekt, der Angriff kam über Port 443 zum Webserver. Was danach passiert, entscheidet die ausgehende Seite.
Eine Positivliste, die im Alltag trägt#
Der Reflex „alles ausgehend erlauben“ hat einen echten Grund: Zu enge Regeln brechen Updates, DNS und Zertifikatsprüfungen. Die Liste unten ist deshalb bewusst kurz und deckt den Normalfall ab.
table inet filter {
set egress_ports {
type inet_service
elements = { 53, 80, 123, 443 }
}
chain output {
type filter hook output priority filter; policy drop;
ct state established,related accept
oif "lo" accept
# DNS, HTTP(S), NTP — mehr braucht ein Webserver im Regelfall nicht.
tcp dport @egress_ports accept
udp dport @egress_ports accept
# Mailversand: explizit sperren und protokollieren.
tcp dport { 25, 465, 587 } log prefix "SMTP-EGRESS " drop
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
counter comment "verworfen ausgehend"
}
}
| Port | Wofür | Ohne die Regel |
|---|---|---|
| 53 | DNS | nichts löst mehr auf |
| 80 | HTTP, ACME-Prüfung | Zertifikatserneuerung schlägt fehl |
| 123 | NTP | Uhr läuft weg, TLS-Fehler folgen |
| 443 | HTTPS, Paketquellen, APIs | keine Updates mehr |
Bevor policy drop auf der Output-Chain scharf gestellt wird: eine Woche lang nur zählen und protokollieren, ohne zu verwerfen. Dann steht in den Protokollen, was die Maschine tatsächlich braucht, statt dass es am Sonntagabend auffällt, wenn ein Backup-Ziel auf einem ungewöhnlichen Port hängt.
# Lernmodus: nichts verwerfen, alles mitschreiben
chain output {
type filter hook output priority filter; policy accept;
ct state new tcp dport != { 53, 80, 123, 443 } log prefix "EGRESS-NEU " counter
}
Port 25: der eine Fall, der immer gilt#
Wenn dein Server keine Mail direkt zustellt und die meisten tun das nicht, sondern nutzen ein Relay auf Port 587, dann ist jede ausgehende Verbindung auf Port 25 verdächtig. Genau diesen Port braucht ein Spam-Skript.
Die Sperre kostet nichts und ist die zuverlässigste Einzelmaßnahme dagegen, dass die eigene IP-Adresse auf einer Blockliste landet. Steht sie erst einmal dort, dauert das Herauskommen Wochen, Zeit, in der auch legitime Mail nicht ankommt.
Wer wirklich direkt zustellt, macht die Ausnahme für genau einen Dienst:
meta skuid "postfix" tcp dport 25 accept
Auswerten, sonst bringt es nichts#
# Was wollte raus und durfte nicht?
sudo journalctl -k --since "7 days ago" | grep "SMTP-EGRESS" | tail -20
# Welche Prozesse haben offene ausgehende Verbindungen?
sudo ss -tnp state established '( dport != :22 )' | head -30
Die zweite Zeile ist der Befehl, den man kennen sollte. Ein Prozess, den man nicht zuordnen kann und der eine dauerhafte Verbindung nach außen hält, ist der Anfang einer Untersuchung, siehe Einen Einbruch erkennen.
Wo es unbequem wird#
Ehrlich benannt, damit es keine Überraschung gibt:
- Container bauen ihre eigenen Netze und Regeln. Egress-Filterung für Container braucht eigene Ketten, sonst greift sie nicht. Siehe Docker umgeht deine Firewall.
- Paketquellen über Spiegelserver nutzen manchmal ungewöhnliche Ports. Einmal prüfen, dann eintragen.
- Monitoring-Agenten telefonieren nach Hause, oft auf eigenen Ports. Das ist legitim, gehört aber bewusst in die Liste.
Der Aufwand ist real. Er lohnt sich für Maschinen, die Kundendaten halten oder deren Ausfall teuer wäre und die Port-25-Sperre lohnt sich immer.
Geschrieben aus dem laufenden Betrieb: MRMedia betreibt eigene Hosts, Kundendienste und deren Härtung in der EU. Eine veraltete Anleitung ist hier ein Sicherheitsproblem, kein Schönheitsfehler. Korrekturen bitte über Discord.