fail2web richtig konfigurieren/starten

CyborgBeta

Captain
Registriert
Jan. 2021
Beiträge
3.913
Hi, ich bin gerade überfragt.

Habe eine REST-API, die horcht auf 127.0.0.1:5000

und einen Webserver, der horcht auf http://0.0.0.0:8000/

so weit, so gut.

Der Webserver/Client muss jetzt aber auf die REST-API zugreifen und ruft deshalb localhost/api an.

Ich möchte also alle Requests an localhost/api auf 127.0.0.1:5000 "mappen".

Mit dem nginx ginge das so:

Code:
    location /api/ {
        proxy_pass         http://127.0.0.1:5000/;
        proxy_redirect     off;
    }

Ich muss das aber in einem Docker-Container über die CMD machen. Folgendes funktioniert nicht:

Code:
CMD [ "bash", "-c", "cat my_config.json \
&& (nohup fail2rest --config=my_config.json &) \
&& (nohup mitmdump -p 80 --mode reverse:http://127.0.0.1:5000/ --map-local \"|.*/api|~/\" &) \
&& python3 -m http.server -d fail2web/web 8000" ]

Ja, die API startet und horcht auf 5000, mitmdump startet und horcht auf 80, und fail2web startet und horcht auf 8000.

Wenn ich jetzt aber http://localhost:8000 im Browser aufrufen möchte, sehe ich:

"GET /api/global/status HTTP/1.1" 404 - in den Logs, und 404 Page Not Found - Couldn't contact fail2rest im Webinterface.

Hat jemand eine Idee? Ich kann fail2rest leider nicht sagen, es solle nur auf localhost:80/api laufen ... Wenns nicht geht, brauche ich fail2web auch nicht unbedingt.
 
Auf welchem host läuft es auf 127.0.0.1? Auf deinem PC/Server, oder im Docker container? Wenn du keine Ports via Docker selbst mappst, ist ein localhost im container NICHT das localhost auf deinem System.
 
Hm, vielleicht liegt es doch an 127.0.0.1 ... Ich ändere das später mal zu 0.0.0.0, weil der Webbrowser-Client läuft ja auf dem Host, nicht im Docker-Container ... muss von dort aber den Docker-Container "kontaktieren".
 
Also eigentlich ist das auch etwas pfusch wie du es machst, nginx und deine python app sollten zwei container sein.

Dann hängst du die mit docker-compose in ein netzwerk. Port 5000 des nginx bindest du an 127.0.0.1:5000 deines hosts und im nginx machst du eine Weiterleitung an den zweiten container, das geht dann einfach per servicenamen des docker composes und nicht per IP.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CyborgBeta
Geht doch nicht. :( Hab herausgefunden, dass das Webinterface /api auf dem gleichen Port (8000) versucht aufzurufen. Ich kann natürlich nicht zwei Server auf dem gleichen Port starten.

Hier mal alle beteiligten Dateien:

Dockerfile

Code:
FROM golang:bookworm

ENV TZ=Europe/Berlin

RUN apt update
#RUN apt upgrade -y
RUN apt install git wget python3 mitmproxy -y
RUN git clone https://github.com/Sean-Der/fail2web
#RUN wget -O my_config.json https://raw.githubusercontent.com/sean-der/fail2rest/master/config.json
RUN echo '{' >> my_config.json
RUN echo '  "Addr": "0.0.0.0:5000",' >> my_config.json
RUN echo '  "Fail2banSocket": "/var/run/fail2ban/fail2ban.sock"' >> my_config.json
RUN echo '}' >> my_config.json
RUN go install -v github.com/sean-der/fail2rest@latest

CMD [ "bash", "-c", "cat my_config.json \
&& (nohup fail2rest --config=my_config.json &) \
#&& (nohup mitmdump -p 80 --mode reverse:http://0.0.0.0:5000/ &) \
&& python3 -m http.server -d fail2web/web 8000" ]

docker compose

Code:
  go-fail2web:
    build: ./go-fail2web
    init: true
    stop_signal: SIGHUP
    stop_grace_period: 30s
    stdin_open: true # docker run -i
    tty: true        # docker run -t
    volumes:
      - /var/run/fail2ban/fail2ban.sock:/var/run/fail2ban/fail2ban.sock:ro
    labels:
      - "traefik.enable=false"

Logs

Code:
docker logs -f proxy-go-fail2web-1
{
  "Addr": "0.0.0.0:5000",
  "Fail2banSocket": "/var/run/fail2ban/fail2ban.sock"
}
nohup: appending output to 'nohup.out'
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.18.0.22 - - [20/May/2025 14:42:51] "GET / HTTP/1.1" 200 -
172.18.0.22 - - [20/May/2025 14:42:51] "GET /bundle.js HTTP/1.1" 200 -
172.18.0.22 - - [20/May/2025 14:42:51] "GET /config.json HTTP/1.1" 200 -
172.18.0.22 - - [20/May/2025 14:42:52] code 404, message File not found
172.18.0.22 - - [20/May/2025 14:42:52] "GET /api/global/status HTTP/1.1" 404 -
172.18.0.22 - - [20/May/2025 14:42:52] "GET /fonts/glyphicons-halflings-regular.woff HTTP/1.1" 200 -
172.18.0.22 - - [20/May/2025 14:43:01] "GET / HTTP/1.1" 304 -
172.18.0.22 - - [20/May/2025 14:43:01] "GET /bundle.js HTTP/1.1" 304 -
172.18.0.22 - - [20/May/2025 14:43:01] "GET /config.json HTTP/1.1" 304 -
172.18.0.22 - - [20/May/2025 14:43:01] code 404, message File not found
172.18.0.22 - - [20/May/2025 14:43:01] "GET /api/global/status HTTP/1.1" 404 -

Screen

1747745534422.png


Hast du noch eine Idee?

Der letzte Commit im Repo https://github.com/Sean-Der/fail2web ist leider schon 8 Jahre her und die Installationsanweisungen gibt es nicht mehr. Muss mir das also alles selber zusammenreimen.
 
Du machst zwei container draus, einer für die anwendung, einer für nginx. Dann kann jeder container die Ports verwenden, die er möchte.

Abgesehen davon, dass ich ein so lange unmaintaintes projekt nicht verwenden würde. :D
 
Danke ... es hat geklappt:

docker compose

Code:
  fail2web-go:
    build: ./fail2web-go
    init: true
    stop_signal: SIGHUP
    stop_grace_period: 30s
    volumes:
      - /var/run/fail2ban/fail2ban.sock:/var/run/fail2ban/fail2ban.sock:ro
    labels:
      - "traefik.enable=false"
    networks:
      - mynet1

  fail2web-nginx:
    build: ./fail2web-nginx
    depends_on:
      - fail2web-go
    stop_grace_period: 30s
    volumes:
      - ./fail2web-nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    labels:
      - "traefik.enable=false"
    networks:
      - mynet1

fail2web-go Dockerfile

Code:
FROM golang:bookworm

ENV TZ=Europe/Berlin

#RUN apt update
#RUN apt upgrade -y
#RUN apt install git wget -y
#RUN wget -O my_config.json https://raw.githubusercontent.com/sean-der/fail2rest/master/config.json
RUN echo '{' >> my_config.json
RUN echo '  "Addr": "0.0.0.0:5000",' >> my_config.json
RUN echo '  "Fail2banSocket": "/var/run/fail2ban/fail2ban.sock"' >> my_config.json
RUN echo '}' >> my_config.json
RUN go install -v github.com/sean-der/fail2rest@latest

CMD [ "bash", "-c", "fail2rest --config=my_config.json" ]

fail2web-nginx Dockerfile

Code:
FROM nginx:bookworm

ENV TZ=Europe/Berlin

RUN apt update
#RUN apt upgrade -y
RUN apt install git -y
RUN git clone https://github.com/Sean-Der/fail2web

nginx conf

Code:
events {
    worker_connections  1024;
}
http {
    server {
        listen       80;
        server_name  fail2web-nginx;

        location / {
            root /fail2web/web;
        }
        location /api/ {
            proxy_pass         http://fail2web-go:5000/;
            proxy_redirect     off;
        }
    }
}

Ergebnis Screen

-

Was ich jetzt noch nicht verstehe, ist:

Your fail2rest instance is reporting that you don't have a persisted DB

This might mean you are running on old version of fail2ban (pre 0.9), don't have the persisted DB enabled or don't have the permissions to read it.

Na gut, man sollte nicht vergessen, dass der ganze Spaß ca. 10 Jahre alt ist ... aber woran liegt diese Fehlermeldung? Ich kann die aktuellen Bans ja sehen ...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kuddlmuddl
Ach so, man muss /var/lib/fail2ban/ (dort ist das db-file) auch noch mounten, dann ist die warning weg ... und alle log files ro, insofern erforderlich.

Edit:

Code:
    volumes:
      - /var/run/fail2ban/:/var/run/fail2ban/
      - /var/lib/fail2ban/:/var/lib/fail2ban/
      - /var/log/fail2ban.log:/var/log/fail2ban.log:ro
 
Zuletzt bearbeitet:
Man merkt, dass da längere Zeit nix an den Repos gemacht wurde ... Nach einiger Zeit tritt im fail2rest go backend folgender Fehler auf:

Code:
runtime error: index out of range [0] with length 0

das Frontend funktioniert dann natürlich auch nicht mehr ...

Leider sind meine go Kenntnisse zu schlecht, um da selber etwas machen zu können. Vielleicht tritt das auch auf, wenn ein Jail gerade leer geworden ist, wegen des Indexfehlers, aber das ist nur eine Vermutung.

Also ja, es läuft; aber nein, es läuft nicht stabil.
 
Zuletzt bearbeitet:
Hab den Fehler gefunden:

-

Das ist die gute Nachricht ... die schlechte ist, ich kann den selber leider nicht fixen.

Bin genau diesen https://stackoverflow.com/a/72312461 Schritte gefolgt, damit oben kein Indexfehler mehr entsteht, aber Go ist schlau und merkt, dass es sich bei meinem Fork nicht ums Original-Repo handelt.
 
Zuletzt bearbeitet:
Zurück
Oben