Externer Zugriff trotz Block - Vaultwarden auf Docker, Fail2ban und Iptables

Hallo liebe Community

ich bin neu hier im Forum. Seit gut einem Jahr beschäftige ich mich mit dem Linux-System, u.a. mit Proxmox und VM. Ich habe einige Erfahrungen sammeln können, möchte aber nicht behaupten, dass ich viel von der Linux-Welt verstehe. Ich komme auch nicht aus der IT-Welt, also verzeiht mir, wenn mir die Grundlagen fehlen. Mit Web-Tutorials kann man viel erreichen, stößt aber bei Problemen schnell an seine Grenzen. So, genug von mir.

Ich betreibe einen kleinen Proxmox-Server. Darauf läuft unter anderem eine VM mit Vaultwarden. Vaultwarden läuft auf Docker, bzw. mit der Erweiterung Docker-Compose. Der Traffic für Vaultwarden wird über eine separate DynDNS von der PF-Sense mit Portweiterleitung an den NGINX Proxy Manager zur VM weitergeleitet. Dies funktioniert einwandfrei. Da der Server von außen erreichbar ist, habe ich ihn mit Fail2Ban abgesichert. Fail2Ban habe ich über APT installiert. Fail2ban kann die Logs von Vaultwarden erfolgreich lesen und sperrt auch erfolgreich die IP. So steht im Status unter Action die richtige IP. Ich teste das immer von meinem Arbeitsplatzrechner aus. Der Arbeitsrechner läuft immer über das Firmennetzwerk via VPN. Die IP wird bei erfolgreicher Sperrung von Fail2Ban an Iptables weitergeleitet. In der Chain FORWARD kommt der Eintrag f2b-bitwarden an erster Stelle.

Der Befehl iptables -L gibt folgendes aus:

Chain f2b-bitwarden (3 references)
target prot opt source destination
DROP all – ip.von.der.arbeit anywhere

Nach Ablauf der angegebenen Zeit oder nach einem unban Befehl via fail2ban wird der Eintrag in iptables ebenfalls gelöscht.

Soweit die Konfiguration und das Setup. Mein Problem ist nun, dass ich trotz Sperre und Eintrag in Iptables von außen auf Vaultwarden zugreifen kann. Ich verstehe nicht warum, also das Problem und bin mit meinem wenigen Latein am Ende. Ich vermute hier das Problem bei der VM oder bei Proxmox. Wahrscheinlich handelt es sich sogar um ein triviales Problem mit einer einfachen Lösung. :sweat_smile: Über sachdienliche Hinweisewäre ich super dankbar.

Vielen lieben Dank.

Mike

Hier ist die Codes und Ausgaben:

Code Docker Compose Vaultwarden
version: '3'

volumes:
  mariadb:
    driver: local

networks:
  vaultwarden-mariaDB: 


services:
  mariadb:
    image: mariadb:latest
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: supergeheimespassword
        MYSQL_USER:  mike 
        MYSQL_PASSWORD: supergeheimespassword
        TZ: "Europe/Berlin"
    ports:
        - "3306:3306"
    volumes:
        - /volume1/docker/mariadb:/var/lib/mysql
    networks:
        - vaultwarden-mariaDB

  vaultwarden:
    image: vaultwarden/server:latest
    restart: always
    environment:
        ADMIN_RATELIMIT_SECONDS: 3600
        ADMIN_TOKEN: supergeheimespassword
        DATABASE_URL: mysql://vaultwarden:supergeheimespassword@mariadb/vaultwarden
        LOG_FILE: /data/log/vaultwarde.log
        #LOG_LEVEL: info
        LOGIN_RATELIMIT_MAX_BURST: 10
        LOGIN_RATELIMIT_SECONDS: 86400
        PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        ROCKET_ADDRESS: 0.0.0.0
        ROCKET_PORT: 80
        ROCKET_PROFILE: release
        USE_SYSLOG: true 
        TZ: Europe/Berlin
    ports:
        - "3012:3012"
        - "8010:80"
    volumes:
        - /volume1/docker/vaultwarden:/data
    networks:
        - vaultwarden-mariaDB
              
  phpmyadmin:
    image: phpmyadmin:latest
    restart: always
    expose:
        - "8000"
    ports:
        - "8000:80"
    environment:
        - PMA_HOST=mariadb
        - PMA_PORT=3306 
        - TZ=Europe/Berlin
    networks:
        - vaultwarden-mariaDB
jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.0.0.0/8
chain = FORWARD

[bitwarden]
enabled = true
port    = http,https
logpath = /volume1/docker/vaultwarden/log/vaultwarde.log
filter   = bitwarden
action = iptables-allports[name=bitwarden, chain=FORWARD, port="80,443"]
maxretry = 3
bantime = 3600
Fail2ban Status Jail Bitwarden
Status for the jail: bitwarden
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/volume1/docker/vaultwarden/log/vaultwarde.log
`- Actions
   |- Currently banned:	1
   |- Total banned:	2
   `- Banned IP list:	ip.von.der.arbeit

ich vermute jetzt einfach mal das es an Docker liegt, Docker überschreibt die iptables, damit das richtig funktioniert müssen Anpassungen vorgenommen werden, am besten mal im netz suchen nach Docker und iptables

alternativ wäre es besser das deine pfsense die sachen sperrt und nicht die VM wo dein Docker drauf läuft

mit crowdsec kann man das super umsetzen, die vm erkennt die aktivität und die OPNsense/PFsense sperrt es dan, wie du das mit fail2ban weiter leitest kann ich dir nicht sagen.
wen du dennoch auf der VM sperren willst ,musst du dafür wie gesagt den override von docker in den iptable umgehen.

Hey, danke für den Hinweis mit Crowdsec. Ich habe mich da mal eingearbeitet und das sieht ja cool aus. Mit Hilfe von ChatGPT konnte ich dies nach ein paar Stolpersteine installieren und mit der PFsense verbinden. Der Effekt mit PFsense und LAPI ist ja der Overkill. So habe ich nun alle meine Dienste nach ausse abgesichert. Also ich habe eh nur die notwendigsten Dienste nach aussen offen. :sweat_smile:

Hey,

schön, dass du es zum Laufen bekommen hast.
Hast du hierzu eventuell eine kleine Anleitung? Will mich damit auch etwas beschäftigen.
Die Anleitung muss nicht ausführlich sein, sondern mir eventuell nur ein paar Anhaltspunkte geben.

den Teil mit Crowdsec kannst du hier nachlesen

Ich machte es ganz grob so. Du musst natürlich prüfen, dass CS auf die Logs zugreifen kann:

Loggen dich auf der pfSense per SSH ein und erstelle eine Maschine für den Proxmox-Server:

cscli machines add --password --force

Listen die registrierten Maschinen auf, um sicherzustellen, dass der Server hinzugefügt wurde:

cscli machines list

Du solltest nun den Server in der Liste sehen, mit dem Status WAITING_AUTH.

Genehmigen Sie den Proxmox-Server:

cscli machines validate Server

Der Status sollte nun ALLOWED sein.

Bearbeiten Sie die Konfigurationsdatei von CrowdSec auf dem Server, um die Verbindung zur pfSense herzustellen:

sudo nano /etc/crowdsec/local_api_credentials.yaml

Stelle sicher, dass die api.client-Sektion wie folgt konfiguriert ist:

url: http://<pfSense-IP>:8080/
login: "server"
password: "<starkes-passwort>"

Speichern und Datei schließen.

Startenden CrowdSec-Dienst neu, damit die Änderungen wirksam werden:

sudo systemctl restart crowdsec

ChatGPT war bei mir sehr hilfreich und half auch mit den Logs via Docker. Das brauchte aber mehrere Runden bis alles funktionierte.