<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://doku.autopoll.de/api.php?hidebots=1&amp;urlversion=1&amp;days=7&amp;limit=50&amp;action=feedrecentchanges&amp;feedformat=atom</id>
	<title>Autopoll-Dokumentation  - Letzte Änderungen [de]</title>
	<link rel="self" type="application/atom+xml" href="https://doku.autopoll.de/api.php?hidebots=1&amp;urlversion=1&amp;days=7&amp;limit=50&amp;action=feedrecentchanges&amp;feedformat=atom"/>
	<link rel="alternate" type="text/html" href="https://doku.autopoll.de/index.php?title=Spezial:Letzte_%C3%84nderungen"/>
	<updated>2026-11-05T22:03:20Z</updated>
	<subtitle>Verfolge mit diesem Feed die letzten Änderungen in Autopoll-Dokumentation.</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://doku.autopoll.de/index.php?title=FailToBan&amp;diff=15769&amp;oldid=15767</id>
		<title>FailToBan</title>
		<link rel="alternate" type="text/html" href="https://doku.autopoll.de/index.php?title=FailToBan&amp;diff=15769&amp;oldid=15767"/>
		<updated>2026-11-04T22:47:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 4. November 2026, 22:47 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-multi&quot; lang=&quot;de&quot;&gt;(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Zeile 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= FailToBan – Punktesystem und Abuse-Dienst =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= FailToBan – Punktesystem und Abuse-Dienst =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;FailToBan&amp;#039;&amp;#039;&amp;#039; ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete &amp;#039;&amp;#039;&amp;#039;Punkte&amp;#039;&amp;#039;&amp;#039;, und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über &amp;lt;code&amp;gt;fail2ban-client&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;FailToBan&amp;#039;&amp;#039;&amp;#039; ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete &amp;#039;&amp;#039;&amp;#039;Punkte&amp;#039;&amp;#039;&amp;#039;, und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über &amp;lt;code&amp;gt;fail2ban-client&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key db?hwiki:diff:1.41:old-15767:rev-15769:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Caesar</name></author>
	</entry>
	<entry>
		<id>https://doku.autopoll.de/index.php?title=FailToBan&amp;diff=15767&amp;oldid=0</id>
		<title>FailToBan</title>
		<link rel="alternate" type="text/html" href="https://doku.autopoll.de/index.php?title=FailToBan&amp;diff=15767&amp;oldid=0"/>
		<updated>2026-11-04T22:45:46Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= FailToBan – Punktesystem und Abuse-Dienst = &amp;#039;&amp;#039;&amp;#039;FailToBan&amp;#039;&amp;#039;&amp;#039; ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete &amp;#039;&amp;#039;&amp;#039;Punkte&amp;#039;&amp;#039;&amp;#039;, und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über &amp;lt;code&amp;gt;fail2ban-client&amp;lt;/code&amp;gt;. Diese Seite beschreibt &amp;#039;&amp;#039;&amp;#039;Aufbau&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Konfiguration&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;Verwendung&amp;#039;&amp;#039;&amp;#039;. {| class=&amp;quot;wikita…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= FailToBan – Punktesystem und Abuse-Dienst =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;FailToBan&amp;#039;&amp;#039;&amp;#039; ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete &amp;#039;&amp;#039;&amp;#039;Punkte&amp;#039;&amp;#039;&amp;#039;, und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über &amp;lt;code&amp;gt;fail2ban-client&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese Seite beschreibt &amp;#039;&amp;#039;&amp;#039;Aufbau&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Konfiguration&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;Verwendung&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kurzinfo !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Projektverzeichnis || &amp;lt;code&amp;gt;~/work/FailToBan&amp;lt;/code&amp;gt; (bzw. Deploy-Pfad)&lt;br /&gt;
|-&lt;br /&gt;
| Sprache || Python 3 (Standardbibliothek, kein externes Paket nötig)&lt;br /&gt;
|-&lt;br /&gt;
| Default-Modus || &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; (Dry-Run)&lt;br /&gt;
|-&lt;br /&gt;
| Ban-Schwellwert || ≥ &amp;#039;&amp;#039;&amp;#039;40 Punkte&amp;#039;&amp;#039;&amp;#039; / &amp;#039;&amp;#039;&amp;#039;15 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Get-DoS || ≥ &amp;#039;&amp;#039;&amp;#039;75&amp;#039;&amp;#039;&amp;#039; Requests ohne Referer / &amp;#039;&amp;#039;&amp;#039;5 Minuten&amp;#039;&amp;#039;&amp;#039; (außerhalb App)&lt;br /&gt;
|-&lt;br /&gt;
| Live-Jail || &amp;lt;code&amp;gt;autopoll-httpd-score&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Idee und Abgrenzung ==&lt;br /&gt;
=== Warum Punkte statt nur maxretry? ===&lt;br /&gt;
Klassische Fail2Ban-Jails zählen Treffer einer Filter-Regex. FailToBan bewertet &amp;#039;&amp;#039;&amp;#039;Schwere&amp;#039;&amp;#039;&amp;#039; unterschiedlich:&lt;br /&gt;
* Path-Traversal / LFI kostet mehr als ein einzelner 404.&lt;br /&gt;
* Partner-Clients (Indy Library) und App-Pfade (&amp;lt;code&amp;gt;/apon/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/apserver/&amp;lt;/code&amp;gt;, …) werden geschont.&lt;br /&gt;
* Länderpolitik kann bei Abuse aus Nicht-EU-Ländern den Score auf Ban-Niveau anheben.&lt;br /&gt;
=== Zwei Ebenen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Komponente !! Rolle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Python-Dienst&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;scripts/daemon.py&amp;lt;/code&amp;gt;) || Tailt Logs, scored, entscheidet Ban, ruft Backend&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Fail2Ban&amp;#039;&amp;#039;&amp;#039; (optional / Live) || Führt den eigentlichen Firewall-Ban aus (&amp;lt;code&amp;gt;banip&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Klassische Filter/Jails&amp;#039;&amp;#039;&amp;#039; unter &amp;lt;code&amp;gt;fail2ban/&amp;lt;/code&amp;gt; || Optional parallel (maxretry-Modell), nicht zwingend für den Score-Dienst&lt;br /&gt;
|}&lt;br /&gt;
Im Live-Betrieb ist Fail2Ban die &amp;#039;&amp;#039;&amp;#039;Ausführungsschicht&amp;#039;&amp;#039;&amp;#039;; die Entscheidung trifft der Score-Daemon.&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FailToBan/&lt;br /&gt;
├── config/&lt;br /&gt;
│   ├── service.json      # Modus, Logs, Scoring, Action, Daemon&lt;br /&gt;
│   ├── ips.json          # Whitelist / Partner / Test-Angreifer-Pool&lt;br /&gt;
│   └── countries.json    # Allow-/Denylist Länder&lt;br /&gt;
├── scripts/&lt;br /&gt;
│   ├── daemon.py         # Hauptdienst (tail + score + ban)&lt;br /&gt;
│   ├── score_engine.py   # Regeln, Parsing, Sliding-Window&lt;br /&gt;
│   ├── ban_backend.py    # dry_run | fail2ban&lt;br /&gt;
│   ├── config_loader.py  # Lädt service.json + ips.json&lt;br /&gt;
│   ├── countries.py      # Länderpolitik&lt;br /&gt;
│   ├── geo.py            # Geo-Cache / Lookup (Simulation)&lt;br /&gt;
│   ├── simulate.py       # Offline-Auswertung historischer Logs&lt;br /&gt;
│   ├── test_traffic.py   # Synthetischer Traffic → access.log&lt;br /&gt;
│   ├── testenv_generate.py / testenv_run.py&lt;br /&gt;
│   └── scharfschaltung.sh&lt;br /&gt;
├── fail2ban/&lt;br /&gt;
│   ├── filter.d/         # Regex-Filter (optional)&lt;br /&gt;
│   └── jail.d/           # Jail-Beispiele&lt;br /&gt;
├── systemd/&lt;br /&gt;
│   └── autopoll-f2b.service&lt;br /&gt;
├── testenv/&lt;br /&gt;
│   ├── scenarios.json&lt;br /&gt;
│   └── generated/        # erzeugte Logs / expected_bans (nicht versioniert)&lt;br /&gt;
├── logs/                 # Test-Access-Logs (Inhalt gitignored)&lt;br /&gt;
├── data/                 # Runtime: bans, state, status, geo_cache, activity&lt;br /&gt;
├── docs/&lt;br /&gt;
│   └── FailToBan.mediawiki&lt;br /&gt;
├── requirements.txt&lt;br /&gt;
├── .gitignore&lt;br /&gt;
└── README.md&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nicht versioniert&amp;#039;&amp;#039;&amp;#039; (siehe &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt;): &amp;lt;code&amp;gt;.venv/&amp;lt;/code&amp;gt;, Inhalt von &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt; und Runtime-Dateien unter &amp;lt;code&amp;gt;data/&amp;lt;/code&amp;gt; (JSON/Logs), &amp;lt;code&amp;gt;testenv/generated/&amp;lt;/code&amp;gt;.&lt;br /&gt;
== Architektur (Datenfluss) ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Apache access.log (Combined / optional VHost-Prefix)&lt;br /&gt;
              │&lt;br /&gt;
              ▼&lt;br /&gt;
     LogTailer (Rotation/Inode)&lt;br /&gt;
              │&lt;br /&gt;
              ▼&lt;br /&gt;
     parse_line → score_request / get_dos&lt;br /&gt;
              │&lt;br /&gt;
              ├─ ignoreip / partner_ips / private → verwerfen&lt;br /&gt;
              ├─ Länderpolitik + Geo-Cache → ggf. Punkte anheben&lt;br /&gt;
              ▼&lt;br /&gt;
     Sliding Window (Punkte / 15 min)&lt;br /&gt;
     + DoS-Fenster (Count / 5 min)&lt;br /&gt;
              │&lt;br /&gt;
              ▼  Score ≥ Threshold&lt;br /&gt;
     BanBackend&lt;br /&gt;
       ├─ test: DryRun → data/bans.log + service_state.json&lt;br /&gt;
       └─ live: fail2ban-client set &amp;amp;lt;jail&amp;amp;gt; banip &amp;amp;lt;ip&amp;amp;gt;&lt;br /&gt;
                (+ Mirror nach bans.log)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Installation und Umgebung ==&lt;br /&gt;
=== Python-venv ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/work/FailToBan&lt;br /&gt;
python3 -m venv .venv&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
pip install -r requirements.txt   # derzeit keine externen Pakete&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ohne Activate:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
.venv/bin/python scripts/daemon.py --mode test&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Systemvoraussetzungen Live ===&lt;br /&gt;
* Python 3.10+ (entwickelt/getestet mit 3.13)&lt;br /&gt;
* Leserechte auf Apache-Access-Logs&lt;br /&gt;
* Fail2Ban installiert und Jail &amp;lt;code&amp;gt;autopoll-httpd-score&amp;lt;/code&amp;gt; (oder konfigurierter Name) aktiv bzw. erreichbar für &amp;lt;code&amp;gt;banip&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dienst-User mit Rechten für &amp;lt;code&amp;gt;fail2ban-client&amp;lt;/code&amp;gt; (häufig über sudoers oder Gruppe)&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Übersicht der Config-Dateien ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;</summary>
		<author><name>Caesar</name></author>
	</entry>
</feed>