[Docker] [alle OS] Het grote Docker ervaringen en tips topic

Pagina: 1 ... 14 15 Laatste
Acties:

Acties:
  • +2 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Dennis schreef op zondag 10 augustus 2025 @ 12:20:
Dank iedereen voor jullie overpeinzingen!

@Mars Warrior goeie vraag en dat vraag ik me nu ook af. Al zou Caddy niet mijn eerste keuze zijn, maar eerder nginx omdat ik dat relatief goed ken. En ik heb het gevoel (maar het is niet meer dan dat) dat Caddy iets te gesimplificeerd is. Ik wil ook bijvoorbeeld client certificate authentication uitvoeren en het lijkt wel of dat kan maar het ziet er geforceerd uit.
Nginx is beetje vorige eeuw als je Caddy gewend bent. Net als bij Apache moet je de meest simpele dingen elke keer instellen, waar Caddy standaard HTTPS doet en standaard 2 certificaat diensten ondersteund. Die hoef je ook niet in te stellen.

Caddy ondersteund gewoon mTLS. Dus als je je certificaten correct configureert dan moet dat goed gaan met een client_auth.
Ik weet ook nog niet of ik Authentik wil houden of toch liever Authelia wil gebruiken, bijvoorbeeld in combinatie met lldap. Dat zou ook een mooie stack zijn.
Beiden kunnen. En als je ze juist configureert dan werkt het goed.
Ik ga eens kijken hoever ChatGPT kan komen met helpen, dat was een goede tip ook!
Yep. Er komt vaak rommel uit ChatGPT, maar dit soort dingen gaan in het algemeen altijd goed bij mij.

Zelfs de abracadabra 😊😮

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +2 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Ga alsjeblieft voor authenticatie en autorisatie niet zomaar uit van antwoorden van een taalmodel. Authentik - en anderen - zijn echt geen projectjes die zonder voorkennis binnen een middagje (veilig) in elkaar klust. Daarmee wil ik niet zeggen dat het niet kan, maar het is niet voor niets een apart kennisgebied. Ik heb (professionele) ervaring met legio authenticatie oplossingen en Authentik staat om eerlijk te zijn ook niet bijster hoog op mijn lijstje. Ik vind ook de oplossing met outposts niet zo denderend en enorm complex voor een homelab.

Als je met SSO / OAuth2 / OpenID Connect wilt starten kan ik Pocket ID aanraden. Dat is zo ongeveer de meeste simpele oplossing. Combineer die dan met zoiets als TinyAuth, oauth2-proxy of Caddy Security mits je Caddy gebruikt. Want simpeler dan dat wordt het eigenlijk niet. Een snippet uit mijn Caddyfile om mee te starten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
{
    order authenticate before respond
    order authorize before basicauth
    order authorize before reverse_proxy

    security {
        oauth identity provider pocket-id {
            realm pocket-id
            driver generic

            client_id <pocket-id-client-id>
            client_secret <pocket-id-client-secret>
            scopes openid email profile groups

            base_auth_url https://id.my.domain
            metadata_url https://id.my.domain/.well-known/openid-configuration

            delay_start 3
        }

        authentication portal default-auth-portal {
            enable identity provider pocket-id

            crypto default token lifetime 86400
            crypto key sign-verify 383aca9a-1c39-4d7a-b4d8-67ba4718dd3f

            cookie domain my.domain
            cookie insecure off

            cookie lifetime 172800

            ui {
                meta title "My Authentication Portal"
                meta author "alex3305"
                meta description "Authentication portal my homelab"

                links {
                    "View Me" "/whoami" icon "las la-user"
                }
            }

            transform user {
                match role user
                action add role authp/user
            }

            transform user {
                match role admin
                action add role authp/admin
            }
        }

        authorization policy user_access {
            set auth url https://auth.my.domain/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 383aca9a-1c39-4d7a-b4d8-67ba4718dd3f

            allow roles user
            inject headers with claims
            validate bearer header
        }

        authorization policy admin_access {
            set auth url https://auth.my.domain/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 383aca9a-1c39-4d7a-b4d8-67ba4718dd3f

            allow roles admin
            inject headers with claims
            validate bearer header
        }
    }
}

*.my.domain {
        @auth {
                host auth.my.domain
        }
        @pocket-id {
                host id.my.domain
        }

        handle @auth {
                authenticate with default-auth-portal
        }
        handle @pocket-id {
                @admin {
                        not remote_ip 192.168.0.0/16
                        path /settings/audit-log* /settings/admin*
                }
                handle @admin {
                        redir https://my.domain
                }

                reverse_proxy 10.0.1.33:1411
        }

        handle @adguard-home {
                authorize with admin_access
                reverse_proxy 10.0.1.29:3000
        }
}


In Pocket ID heb ik dan de groepen admin en user en die heb ik dus toegewezen aan een authorization policy. En heb ik dus Caddy als client toegevoegd:
Afbeeldingslocatie: https://tweakers.net/i/89c2Nlh0MfSsC3SKwQXfBOoMsuo=/800x/filters:strip_exif()/f/image/igrfaptpxB2t5D594w0hKQF4.png?f=fotoalbum_large

Applicaties die zelf SSO ondersteunen hebben geen authorization policy nodig en zijn dus apart ingeregeld:
Afbeeldingslocatie: https://tweakers.net/i/nLD2kkwkDVZQGm1olBmv2kF7PVI=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/kZa5X2bw0DCvVLd19KvC0pSN.png?f=user_large

Mapping doe ik net zoals @Mars Warrior met Caddy en Caddy Docker Proxy en dat werkt prima.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Tularis schreef op zondag 10 augustus 2025 @ 10:15:
Tja, portainer is een tool om het gemakkelijker te maken om je stacks te beheren via een web interface. Dat het niet alles netjes ondersteunt dat docker compose aanbiedt is op zich wel logisch. Niet alles is even makkelijk via het web te ontsluiten zonder verregaande toegang tot je systeem en het daarmee verhoogde risico dat je loopt.
Ik vind het zelf voornamelijk irritant dat Portainer - historisch - eigen jargon is gaan gebruiken die dus compleet afwijkt van Docker jargon. Daarmee is het soms voor, met name nieuwelingen, erg verwarrend. Dat is ook de reden dat ik hiervoor Dockge gebruik. Wordt helaas niet bijster veel bijgehouden, maar heb ik in mijn setup ook niet echt nodig.
Persoonlijk gebruik ik portainer meer als een tool om via het web gemakkelijk bij mijn docker instances te komen, niet om mijn stacks mee te beheren. Daar heb ik ssh en een text editor voor (of vs code over ssh, werkt ook best fijn).
Geen versiebeheer :X ?

Ik ben echt blij dat ik dat in Forgejo heb staan en met Ansible uitrol. Ik maak sinds een tijdje van mijn infra repo ook wekelijkse releases met tags:
Afbeeldingslocatie: https://tweakers.net/i/iW_8LsgnRbOy30_qttgf51PBpS4=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/LtPaDlK8Nuq9LXjCVl1lAQWK.png?f=user_large

Daarnaast genereert de workflow dan ook release notes zodat ik direct inzichtelijk heb wat waar en wanneer is gebeurt:
Afbeeldingslocatie: https://tweakers.net/i/QpZzHL-WXIiEoKRzAKBwN_8hGUg=/800x/filters:strip_exif()/f/image/PdmlhKbVpasclGSj25IYJXp2.png?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
@alex3305 - ik ben voornemens om Authelia (2FA en evet. SSO) en Authentik (IdP) in te zetten.
Maar begrijp het goed dat je deze functies liever met resp. Pocket-ID en Caddy Security invult?

makes it run like clockwork


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Afgelopen weken heb ik met mijn Docker omgeving weer wat stappen gemaakt. Sowieso heb ik op allebei mijn nodes nu correct IPvlan op een eigen VLAN ingericht. Normaliter ontsluit ik alles via Caddy en Swarm, maar sommige containers wil ik toch direct ontsluiten. Bijvoorbeeld DNS met AdGuard Home.

Ook heb ik geprobeerd om Caddy HA uit te voeren, maar dat is wisselend :|. Ik heb Caddy Docker Proxy met één Controller draaien en dan twee Server's. Als Compose projecten en dus niet als Swarm services. So far, so good. Maar ik krijg het maar niet voor elkaar om op een stabiele manier de (certificaat) data te delen. NFS leek mij de makkelijkste aanpak, maar dat heeft toch meer voeten in de aarde dan ik had verwacht.

Ik heb nog nagedacht over GlusterFS in een container. Alhoewel dat project niet dood zou moeten zijn, heeft het ook niet bijster veel leven meer. Een replicerende Redis / Valkey of S3 met Garage zou ook nog een optie kunnen zijn, maar vond ik ook niet heel voor de hand liggend. Met name omdat ik het liefste alles in Docker containers wil draaien. Dus ook de storage O-).

Het zou allemaal wel moeten kunnen, maar voelt voornamelijk als net-niet. Hoe doen jullie dit of heb ik nog dingen gemist?

Voor de goede orde, k3s/k8s is geen antwoord :*)

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op zondag 10 augustus 2025 @ 14:48:
Ga alsjeblieft voor authenticatie en autorisatie niet zomaar uit van antwoorden van een taalmodel. Authentik - en anderen - zijn echt geen projectjes die zonder voorkennis binnen een middagje (veilig) in elkaar klust. Daarmee wil ik niet zeggen dat het niet kan, maar het is niet voor niets een apart kennisgebied. Ik heb (professionele) ervaring met legio authenticatie oplossingen en Authentik staat om eerlijk te zijn ook niet bijster hoog op mijn lijstje.
Het gaat er natuurlijk ook nogal om waarvoor je het in zet. Volgens mij zijn zowel Authentik als Authelia gemaakt door "hobbyisten" die SSO wilden hebben voor hun self hosted services. Vanuit dat oogpunt maakt "absolute veiligheid" misschien niet zo veel uit. Zolang de services niet vanaf het internet bereikbaar zijn etc etc. Als je bv Home Assistant, Zigbee2mqtt, ZWave JS UI, Radarr, Sonarr, qBittorrent, Syncthing, ... lokaal hebt draaien, je bent de enige die het gebruikt / toegang moet hebben, en je wilt alles met 1 login kunnen openen hoeft het niet perse heel veilig te zijn. Zolang je het maar niet aan het internet hangt (dus een, goed beveiligde, VPN voor buiten de deur, en geen poorten open zetten).

Maar voor een profi opzet, of uberhaupt services die wel direct aan het internet hangen, zou ik deze "hobby" tools idd niet snel inzetten. Maar voor thuisgebruik met een VPN voor buiten de deur zijn de risico's, lijkt mij, ook niet enorm groot. (Note: ik gebruik geen SSO. Met één Ctrl + Shift + L (Bitwarden auto fill) ben ik toch wel ingelogd als er al een login op zit).

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Airw0lf schreef op zondag 10 augustus 2025 @ 14:59:
@alex3305 - ik ben voornemens om Authelia (2FA en evet. SSO) en Authentik (IdP) in te zetten.
Maar begrijp het goed dat je deze functies liever met resp. Pocket-ID en Caddy Security invult?
Caddy Security is inderdaad mijn SP en Pocket ID mijn IdP. Overigens back ik Pocket ID ook nog met lldap voor user management. Die gebruik ik dan ook weer in Forgejo en als PAM op mijn server(s).

Caddy met forward auth en Authelia heb ik ook nog overwogen, maar ik weet niet meer precies waarom ik dat niet heb ingezet.

Authentik vond ik echt enorm complex. Vooral omdat je direct geconfronteerd wordt (of werd) met 101 knopjes. Verder was het niet heel erg energiezuinig en nam het voor wat het moest doen relatief veel resources in. Keycloak heb ik professioneel ervaring mee en stond daarmee dus ook op de shortlist. Mooi product, maar voor thuis met Let's Encrypt vond ik het - zowat verplichte - certificaatmanagement enorm irritant. JetBrains Hub heb ik eveneens professioneel ervaring mee en werkt enorm simpel. Maar was overkill voor mijn situatie en OAuth2 voelt daarin als een tweederangs burger.

Er zijn nog wel andere opties, maar ik vind deze oplossing vooral stralen door eenvoud. En inloggen met passkeys - vanuit Vaultwarden - is gewoon heel erg makkelijk.

Wel heb ik nog een tijdje Dex gebruikt als federated IdP voor Google IAM. Dat werkte prima, behalve dan dat ik afhankelijk was van Google voor auth.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
RobertMe schreef op zondag 10 augustus 2025 @ 15:00:
Het gaat er natuurlijk ook nogal om waarvoor je het in zet. Volgens mij zijn zowel Authentik als Authelia gemaakt door "hobbyisten" die SSO wilden hebben voor hun self hosted services. Vanuit dat oogpunt maakt "absolute veiligheid" misschien niet zo veel uit.
Sure, maar ik merk dan ook enorme scope-creep. Met name bij Authentik. Terwijl Caddy Security door iemand ontwikkeld wordt die het eveneens professioneel verkoopt - en dus ook dergelijke support levert. Dat boezemt me dan toch wat meer vertrouwen in.
Zolang de services niet vanaf het internet bereikbaar zijn etc etc. Als je bv Home Assistant, Zigbee2mqtt, ZWave JS UI, Radarr, Sonarr, qBittorrent, Syncthing, ... lokaal hebt draaien [...] Maar voor een profi opzet, of uberhaupt services die wel direct aan het internet hangen, zou ik deze "hobby" tools idd niet snel inzetten.
Nou ja, (bijna) al die diensten hangen bij mij dus direct aan het internet ;).

Maar zoals ik al zei, ik heb hier ook redelijk wat professionele ervaring mee. Dat scheelt misschien :9.

Acties:
  • 0 Henk 'm!

  • Yarisken
  • Registratie: Augustus 2010
  • Laatst online: 10:29
Bedankt voor de tip rond pocketid Alex !
Ik gebruik Caddy enkel om een lokale statische website te hosten en dus nog niet als reverse proxy. Blij dat ook authenticatie mee kan opgevangen worden.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Yarisken schreef op zondag 10 augustus 2025 @ 17:41:
Ik gebruik Caddy enkel om een lokale statische website te hosten en dus nog niet als reverse proxy. Blij dat ook authenticatie mee kan opgevangen worden.
Ik doe met Caddy ontzettend veel, vandaar dat ik het dus graag HA zou willen uitvoeren. Al was het maar voor de :*) -factor.

Momenteel gebruik ik Caddy als Docker Proxy en authenticatie, zoals benoemd, maar ook voor Layer4 diensten. Dat geeft echt enorm veel opties. Bijvoorbeeld AdGuard Home:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
  adguard-home:
    container_name: adguard-home
    image: adguard/adguardhome:v0.107.64
    ...
    labels:
      ...
      caddy_3.layer4.udp/:53.route.proxy: "udp/{{upstreams 53}}"
      caddy_4.layer4.tcp/:53.@dns-over-tls.tls: "sni dns.example.com"
      caddy_4.layer4.tcp/:53.route: "@dns-over-tls"
      caddy_4.layer4.tcp/:53.route.1_tls: ""
      caddy_4.layer4.tcp/:53.route.2_proxy: "{{upstreams 53}}"
      caddy_5.layer4.:853.@dns-over-tls.tls: "sni dns.example.com"
      caddy_5.layer4.:853.route: "@dns-over-tls"
      caddy_5.layer4.:853.route.1_tls: ""
      caddy_5.layer4.:853.route.2_proxy: "{{upstreams 53}}"


Of Forgejo:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
  forgejo:
    container_name: forgejo
    image: codeberg.org/forgejo/forgejo:12.0.1
    ...
    labels:
      caddy: "git.example.com"
      caddy.@forgejo.host: "git.example.com"
      caddy.handle: "@forgejo"
      caddy.handle.reverse_proxy: "{{upstreams 3000}}"
      caddy.layer4.:22.@forgejo-ssh.ssh: ""
      caddy.layer4.:22.@forgejo-ssh.remote_ip: "192.168.0.0/16"
      caddy.layer4.:22.route: "@forgejo-ssh"
      caddy.layer4.:22.route.proxy: "{{upstreams 22}}"


Bij lldap doe ik dan ook de TLS termination (met dus SNI) met Caddy, waardoor ik dus in Pocket ID en Forgejo een versleutelde ldap kan gebruiken mét geldige certificaten.

Recent heb hiermee ik zelfs sssd geconfigureerd voor PAM authenticatie. Dat werkt goed op een van mijn servers, maar op mijn Pi kreeg ik dat gek genoeg niet werkend. Daar moet ik nog even achterheen. Maar door de dynamische configuratie kan ik dan ook redelijk snel bijvoorbeeld testen met een unencrypted ldap. Zo kan ik dus ook het e.e.a. snel uitsluiten. Dat vind ik heel prettig.

Acties:
  • 0 Henk 'm!

  • Ghoulli
  • Registratie: Juli 2021
  • Laatst online: 28-10 22:18
@alex3305 Hier heb je een mooie setup aan, ik had geen idee dat Caddy zo uitgebreid was (heb er ook niet zo in verdiept moet ik bekennen). Ik heb momenteel Caddy in gebruik om SSL certificaten uit te delen voor websites die ik via de browser ook buitenshuis wil bereiken (reverse proxy). De LLDAP integratie vind ik wel een interessante, vooral omdat ik het toch al heb draaien.

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op maandag 11 augustus 2025 @ 11:27:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
  adguard-home:
    container_name: adguard-home
    image: adguard/adguardhome:v0.107.64
    ...
    labels:
      ...
      caddy_3.layer4.udp/:53.route.proxy: "udp/{{upstreams 53}}"
      caddy_4.layer4.tcp/:53.@dns-over-tls.tls: "sni dns.example.com"
      caddy_4.layer4.tcp/:53.route: "@dns-over-tls"
      caddy_4.layer4.tcp/:53.route.1_tls: ""
      caddy_4.layer4.tcp/:53.route.2_proxy: "{{upstreams 53}}"
      caddy_5.layer4.:853.@dns-over-tls.tls: "sni dns.example.com"
      caddy_5.layer4.:853.route: "@dns-over-tls"
      caddy_5.layer4.:853.route.1_tls: ""
      caddy_5.layer4.:853.route.2_proxy: "{{upstreams 53}}"


Of Forgejo:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
  forgejo:
    container_name: forgejo
    image: codeberg.org/forgejo/forgejo:12.0.1
    ...
    labels:
      caddy: "git.example.com"
      caddy.@forgejo.host: "git.example.com"
      caddy.handle: "@forgejo"
      caddy.handle.reverse_proxy: "{{upstreams 3000}}"
      caddy.layer4.:22.@forgejo-ssh.ssh: ""
      caddy.layer4.:22.@forgejo-ssh.remote_ip: "192.168.0.0/16"
      caddy.layer4.:22.route: "@forgejo-ssh"
      caddy.layer4.:22.route.proxy: "{{upstreams 22}}"
Ziet er wel uit als veel abracadabra, en niet als 2 regels.
Sorry @Mars Warrior, had to do it :>

Overigens kan Traefik bij mijn weten ook overweg met puur UDP & TLS (naast HTTP over TCP of UDP dan). Incl SNI achtige toestanden. Alleen bij protocollen met STARTTLS (SMTP en zo) kan die dat niet (altijd? Postgres meen ik ergens gezien te hebben van wel). Omdat in ieder geval SMTP & IMAP (& vermoed ook POP) ook moeten aangeven dat ze het ondersteunen. Waarbij in ieder geval SMTP IIRC weer eerst een HELO / EHLO heen en weer vereist voordat de server uberhaupt aangeeft welke features die ondersteund (waaronder dus STARTTLS). Daardoor zou Traefik dus een (zeer beperkte) subset van SMTP moeten ondersteunen puur om dit stukje flow te doorlopen.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@RobertMe Ik ga niet tussen jou en @Mars Warrior inzitten hè :+. Mij zal het een spreekwoordelijke Unox worst wezen welke reverse proxy je gebruikt.

Caddy Docker Proxy is echt niet heilig. Voornamelijk niet wanneer je ook maar iets buiten de gebaande paden wil gaan. Layer4 wordt 'ondersteund', maar een mapping op IP-adres of hostname werkt niet mooi issue nummer trouwens :9. Ook vind ik de mapping, met name in lijsten, niet altijd voor de hand liggend. Er zijn namelijk prefix-nummers en suffix-nummers. En daarnaast moet je de nummering zelf doen en bijhouden. Dat vind ik behoorlijk brak.

Ook gebruik ik wildcard certificaten voor het ontsluiten van diensten. Dat werkt prima, totdat er een label ergens de mist in vliegt. Dan krijg ik in de terminal een minified JSON die ik dan maar moet ontleden om te debuggen. Dat is waardeloos.

Aan de andere kant is Traefik (let op: mening) enorm gericht op de grotere setups en enterprise en daardoor passen soms ook de blokjes niet echt lekker in mijn homelab. Ik heb meer dan een jaar Traefik naar volle tevredenheid gebruikt overigens. Ik ben toen gewisseld omdat ik X-Forwarded-For met Cloudflare IP's niet lekker werkend kreeg. Ik weet niet hoe het nu zit, maar ik moest dat destijds handmatig instellen. Dat vond ik nogal ruk. Voor Caddy is daar een plugin voor. Onder water natuurlijk hetzelfde, maar het gevoel is anders. Naderhand bleek dit overigens een Home Assistant probleem te zijn. En had dit met de volgorde van headers te maken. Uiteindelijk heb ik dus nog steeds handmatige configuratie :o.

De Caddy Layer4 integratie vind ik voornamelijk een erg interessante quick-win, zoals de door mij geïllustreerde Adguard Home. Tegelijkertijd vind ik de documentatie daarvan ook extreem summier en is het daardoor ook niet iets om mee te starten.

Mijn voorkeur zou uitgaan naar zoiets als Consul vanuit Docker labels voor service management. Ik heb daar wel over nagedacht en ook overwogen om zelf iets in elkaar te zetten, maar Consul vereist een 3 node cluster en dat heb ik al niet. Het is bij - zowel Caddy als Traefik - voornamelijk ellendig dat je van een formaat naar een ander formaat gaat, waarbij het allebei niet helemaal lekker past.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@Ghoulli Wat ik eigenlijk had onderschat en uiteindelijk wel een super mooie quick win vond, was dat ik mijn SSH sleutel en groepenbeheer ook in de LDAP kan doen. Dit wordt dan - na sync - automatisch gebruikt in Forgejo en voor PAM-authenticatie. Het fijne is dat ik daar dan ook nauwelijks omkijken naar heb en was verrassend eenvoudig.

Acties:
  • 0 Henk 'm!

  • Ghoulli
  • Registratie: Juli 2021
  • Laatst online: 28-10 22:18
alex3305 schreef op maandag 11 augustus 2025 @ 13:28:
@Ghoulli Wat ik eigenlijk had onderschat en uiteindelijk wel een super mooie quick win vond, was dat ik mijn SSH sleutel en groepenbeheer ook in de LDAP kan doen. Dit wordt dan - na sync - automatisch gebruikt in Forgejo en voor PAM-authenticatie. Het fijne is dat ik daar dan ook nauwelijks omkijken naar heb en was verrassend eenvoudig.
SSH Sleutel lekker in LDAP knallen is wel lekker, scheelt ook weer extra bijhoud werk. Denk dat ik me er vanavond eens in ga verdiepen, want ik zie alleen maar voordelen zo. Hopelijk niet te veel werk, maar krijg er wel jeukende handen van 8)7

Acties:
  • 0 Henk 'm!

  • sjorsjuhmaniac
  • Registratie: Februari 2009
  • Laatst online: 01:57
@alex3305 wat is je probleem met caddy als proxy voor ha? Ha gewoon als http configureren en caddy als proxy ervoor zou gewoon moeten werken. Zo draai ik het hier al jaren, met nginx dan weliswaar

Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@sjorsjuhmaniac Ik heb geen enkel probleem met Caddy of enig andere service te proxy'en. Maar ik denk dat je mijn post nogmaals eens begrijpend moet lezen ;) :
alex3305 schreef op zondag 10 augustus 2025 @ 14:59:
Ook heb ik geprobeerd om Caddy HA uit te voeren [...]
Ik bedoel met HA hier natuurlijk niet Home Assistant, maar High Availability.

Ik wil namelijk mijn reverse proxy HA uitvoeren om o.a. config reloads te ondervangen. Het balancen of failover zou ik in kunnen regelen met een shared ip door middel van een ipvlan mapping met keepalived in een container. Dan heb ik ook maar één DNS entry nodig, omdat round robin DNS blijkbaar niet werkt vanuit Unifi. Echter moeten beide Caddy instanaties de certificaat data kunnen delen om geen dubbele aanvragen te doen. Dat kreeg ik over NFS niet correct werkend, vandaar dat ik op zoek ben naar een gedeelde (duplicerende) opslag voor Docker.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Nu online
Ghoulli schreef op maandag 11 augustus 2025 @ 11:36:
@alex3305 Hier heb je een mooie setup aan, ik had geen idee dat Caddy zo uitgebreid was (heb er ook niet zo in verdiept moet ik bekennen). Ik heb momenteel Caddy in gebruik om SSL certificaten uit te delen voor websites die ik via de browser ook buitenshuis wil bereiken (reverse proxy). De LLDAP integratie vind ik wel een interessante, vooral omdat ik het toch al heb draaien.
Wat doe je dan precies? Wie maakt die certificaten/hoe doe je dat? Ik gebruik zelf ejbca maar dat is geheel handmatig. Ik heb ook WPA2 enterprise wifi (moet nog overstappen naar WPA3) met certificaten voor mijn beveiligde netwerk.

Acties:
  • +1 Henk 'm!

  • Ghoulli
  • Registratie: Juli 2021
  • Laatst online: 28-10 22:18
Dennis schreef op maandag 11 augustus 2025 @ 19:41:
[...]

Wat doe je dan precies? Wie maakt die certificaten/hoe doe je dat? Ik gebruik zelf ejbca maar dat is geheel handmatig. Ik heb ook WPA2 enterprise wifi (moet nog overstappen naar WPA3) met certificaten voor mijn beveiligde netwerk.
Ik heb in Caddy aangegeven via mijn Caddyfile welk (sub)domain name er aan welke port gekoppeld is. Ik heb een eigen domain name gekocht bij Cloudflare. Zie deze video voor een uitleg zoals ik het ook heb gedaan.

[ Voor 3% gewijzigd door Ghoulli op 12-08-2025 08:54 ]


Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Nu online
Ghoulli schreef op dinsdag 12 augustus 2025 @ 08:42:
Ik heb in Caddy aangegeven via mijn Caddyfile welk (sub)domain name er aan welke port gekoppeld is. Ik heb een eigen domain name gekocht bij Cloudflare. Zie deze video voor een uitleg zoals ik het ook heb gedaan.
Het ging me meer om hoe je de certificaten aanmaakt. Of je dat via ACME/Let's Encrypt doet of anderszins :).

Acties:
  • +1 Henk 'm!

  • sjorsjuhmaniac
  • Registratie: Februari 2009
  • Laatst online: 01:57
Dennis schreef op dinsdag 12 augustus 2025 @ 09:47:
[...]

Het ging me meer om hoe je de certificaten aanmaakt. Of je dat via ACME/Let's Encrypt doet of anderszins :).
https://caddyserver.com/docs/automatic-https

Gewoon het standaard verhaal van ACME en LE. Andere providers zijn mogelijk.

Acties:
  • 0 Henk 'm!

  • Ghoulli
  • Registratie: Juli 2021
  • Laatst online: 28-10 22:18
@Dennis zoals @sjorsjuhmaniac dit inderdaad al aangeeft, het standaard verhaal. Bij mij regelt LE het. Ik hoef echt verder niks te doen behalve de Caddyfile correct instellen, de rest word voor me geregeld (Lekker luxe hé :P )

[ Voor 37% gewijzigd door Ghoulli op 12-08-2025 10:17 ]


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Je definieert in Caddy simpelweg een domein of subdomein en Caddy doet de rest via LE of ZeroSSL.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Ik ben van mijn eerdere mening teruggekomen en ben inmiddels van Caddy naar Traefik gewisseld. Ik bleef maar kleine frustraties houden die groter en groter werden.

Ik gebruikte Caddy met de hier bekende Docker labels plugin met wildcard certificaten. Als er echter ergens een configuratiefout voorkwam, zorgde dat ervoor dat alle diensten onder die gebruik maakte van dat certificaat onbereikbaar waren. Dit komt door de opzet van Caddy:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
*.example.com {
    @adguard-home {
        host dns.example.com
    }

    ... andere domain matchers hier ...

    handle @adguard-home {
        reverse_proxy http://10.1.28.3:3000
    }

    ... andere reverse proxy configuratie hier ...
}


Want bij problemen wordt dan door Caddy of de Caddy Docker Proxy het hele *.example.com configuratie blok weggelaten. Tegelijkertijd kreeg ik dan deze configuratie als minified JSON in de terminal / Docker logs :|. Het debuggen daarvan was op z'n zachtst gezegd irritant.

Ook bleef ik vage kleine problemen houden. Websockets verbonden bijvoorbeeld niet altijd opnieuw bij connectieproblemen. Hier had ik last van als ik thuiskwam met Home Assistant. De Caddy container crashte soms zonder reden. En soms startte Caddy ook niet op. Wederom zonder foutmelding of informatie.

De druppel was voor mij dat de Caddy Layer4 plugin onlangs niet meer werkte en daar een GitHub discussie op volgde. De Caddy ontwikkelaars noemde de Layer4 plugin experimenteel en niet geschikt voor productie met als klap op de vuurpijl een sarcastische opmerking dat ik "niet goed, geld terug"-garantie zou hebben :F.

Inmiddels ben ik over naar Traefik en alles is weer koek en ei :). De positieve punten:
  • Docker labels worden out-of-the-box ondersteund
  • Meerdere configuratiebronnen mogelijk
  • Plug-ins gaan via configuratie, dus geen custom Docker image nodig
  • Minder Docker labels nodig voor vergelijkbare configuratie
Het nadeel is wel dat meerdere Docker hosts zonder Swarm deployments alleen werken met een third-party tool: Traefik-kop. Geen grote ramp omdat het e.e.a. best eenvoudig in opzet is, maar dat had wel even wat uitzoekwerk nodig.

Met name door standaard te definiëren configuratie heb ik een stuk minder labels nodig en dat vind ik enorm prettig. Ook hoef ik de labels niet meer te nummeren of zijn er rare edge-cases. Bijvoorbeeld dat punten in labels bijwerkingen kunnen hebben.

Voor en na voorbeelden...

Caddy labels
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
services:
  adguard-home:
    container_name: adguard
    image: adguard/adguardhome:v0.107.67
    labels:
      caddy: "*.example.com"
      caddy.@adguard-home.host: "dns.example.com"
      caddy.handle: "@adguard-home"
      caddy.handle.crowdsec: ""
      caddy.handle.authorize: "with admin_access"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 3000{{ '}}' }}"
      caddy.layer4.udp/:53.route.proxy: "udp/{{ '{{' }}upstreams 53{{ '}}' }}"
      caddy.layer4.:853.@dns-over-tls.tls: "sni dns.example.com"
      caddy.layer4.:853.route: "@dns-over-tls"
      caddy.layer4.:853.route.1_tls: ""
      caddy.layer4.:853.route.2_proxy: "{{ '{{' }}upstreams 53{{ '}}' }}"

  pocket_id:
    container_name: pocket_id
    image: ghcr.io/pocket-id/pocket-id:v1.13.1
    labels:
      caddy: "*.example.com"
      caddy.@pocket_id.host: "id.example.com"
      caddy.handle: "@pocket_id"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}' }}"


Traefik labels
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
  adguard-home:
    container_name: adguard
    image: adguard/adguardhome:v0.107.67
    labels:
      traefik.enable: true
      traefik.http.routers.adguard-home.rule: "Host(`dns.example.com`)"
      traefik.http.routers.adguard-home.middlewares: "crowdsec@file, oidc-auth@file"
      traefik.http.services.adguard-home.loadbalancer.server.port: 3000
      traefik.udp.routers.dns-router.entryPoints: dns
      traefik.udp.routers.dns-router.service: dns-service
      traefik.tcp.routers.dns-over-tls-router.tls: true
      traefik.tcp.routers.dns-over-tls-router.rule: "HostSNI(`dns.example.com`)"
      traefik.tcp.routers.dns-over-tls-router.entryPoints: dns-over-tls
      traefik.tcp.routers.dns-over-tls-router.service: dns-service
      traefik.tcp.services.dns-service.loadbalancer.server.port: 53

  pocket_id:
    container_name: pocket_id
    image: ghcr.io/pocket-id/pocket-id:v1.13.1
    labels:
      traefik.enable: true
      traefik.http.routers.pocket_id.rule: "Host(`id.example.com`)"


De leercurve van Traefik is wel redelijk steil. Bij Caddy is het starten een stuk makkelijker. Wel zijn de foutmeldingen (ergernis) bij Traefik kort, bondig en duidelijk. Ook bij third party plugins, zoals Traefik OIDC. Het dashboard en middlewares zijn eveneens een verademing. Dat geeft veel meer inzicht in hoe flows lopen.

Ik ben vooralsnog blij dat ik de switch heb gemaakt. Maar het zal vast over een tijdje wel weer gaan kriebelen :9.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Naast Traefik ben ik ook bezig met observability van mijn platformen en Docker platformen. Ik heb al een tijdje Beszel draaien en alhoewel dat prima werkt, mis ik toch wat metrics. Het is soms simpelweg net iets te ver uitgekleed. Ik ben dus weer aan het kijken naar Prometheus + Grafana en heb dat daarom recent weer eens aangeslingerd.

Prometheus, Grafana en de node exporters lopen inmiddels prima. Maar ik wil toch wat Docker monitoring toevoegen. Normaal zou ik daar cAdvisor voor gebruiken, ware het niet dat ik daar elke keer problemen mee heb. Sowieso gebruikt die container soms ineens veel CPU of geheugen. Tegelijkertijd kloppen de metrics niet lijkt het :S. Gister had ik dat mijn Kopia (backup) tool een uurtje 20% CPU gebruikte, terwijl cAdvisor niet eens load leek te detecteren.

Ik had ook nog gekeken naar Docker Exporter, en die waardes lijken zinniger. Maar ik ben benieuwd of ik nu nog iets over het hoofd zie? Of dat ik iets anders kan proberen?

Acties:
  • 0 Henk 'm!

  • DjoeC
  • Registratie: November 2018
  • Nu online
@alex3305 Wat doen Caddy / Traefik eigenlijk "beter" dan NPM?

Ik moet eerlijk zeggen dat ik met NPM prima uit de voeten kan, zowel met toevoegen van hosts, redirects, certificaten als access lists als - tja, ik heb nog niks gemist of gevonden dat niet werkt of echt complex is. Maar misschien doe ik alleen maar simpele dingen?

Acties:
  • +4 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@DjoeC Kort antwoord: niets. Maar dat is natuurlijk niet de hele waarheid ;).

Het heeft simpelweg met de hele use-case te maken. Ik wil geen tweede administratie hebben in NPM. Ik wil dat in code doen met bijvoorbeeld Docker labels. Aangezien ik mijn services deploy met Docker Compose, Ansible en Forgejo Actions is dat een stuk beter beheersbaar dan NPM. Ook gebruik ik Renovate voor gecontroleerd versiebeheer. Hierdoor is mijn hele setup transparant, reproduceerbaar en idempotent.

Tegelijkertijd zijn ACL's voor mij veel en veel te beperkt. Ik heb een aardig complete SSO setup waardoor ik nog maar heel af en toe filter op basis van IP's. Toegang wordt gegeven op basis van rollen vanuit LDAP die propageren naar Pocket ID zodat deze ook gebruikt kunnen worden in OIDC clients. Attributen worden eveneens gesynct. Waaronder naam, foto en publieke SSH sleutel. Waarbij ik die laatst ook gebruik in Forgejo.

Ik heb het even in een flowchart gezet om het e.e.a. duidelijk te maken :9.

Afbeeldingslocatie: https://tweakers.net/i/xvfKq8SLq70zE1Ht8urzbWDfJio=/800x/filters:strip_exif()/f/image/SmCdptlLAU1n6UTfLT0dRjUN.png?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • DjoeC
  • Registratie: November 2018
  • Nu online
@alex3305 Tja, jouw setup is wat anders van opzet..... Voorlopig zit ik ook nog niet aan "meerdere" gebruikers en dus rollen. Er is maar 1 rol: Ikke....

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

alex3305 schreef op dinsdag 7 oktober 2025 @ 15:02:
Naast Traefik ben ik ook bezig met observability van mijn platformen en Docker platformen. Ik heb al een tijdje Beszel draaien en alhoewel dat prima werkt, mis ik toch wat metrics. Het is soms simpelweg net iets te ver uitgekleed. Ik ben dus weer aan het kijken naar Prometheus + Grafana en heb dat daarom recent weer eens aangeslingerd.

Prometheus, Grafana en de node exporters lopen inmiddels prima. Maar ik wil toch wat Docker monitoring toevoegen. Normaal zou ik daar cAdvisor voor gebruiken, ware het niet dat ik daar elke keer problemen mee heb. Sowieso gebruikt die container soms ineens veel CPU of geheugen. Tegelijkertijd kloppen de metrics niet lijkt het :S. Gister had ik dat mijn Kopia (backup) tool een uurtje 20% CPU gebruikte, terwijl cAdvisor niet eens load leek te detecteren.

Ik had ook nog gekeken naar Docker Exporter, en die waardes lijken zinniger. Maar ik ben benieuwd of ik nu nog iets over het hoofd zie? Of dat ik iets anders kan proberen?
Ik monitor - heel simpel - enkel CPU en diskverbruik via Telegraf, die het in Influxdb ramt waar ik ook het dashboard van gebruik. Mijn eerdere ervaringen met tools die 50 docker containers monitoort is dat mijn zuinige server geen zuinige server meer is: de monitoring kost factoren meer CPU tijd dan 50 containers.

Nu heb ik DEX nog nooit gebruikt, maar Prometheus is voor mij altijd een no-go vanweg het absurde CPU en Disk gebruik. Voorheen kreeg Prometheus het voor elkaar om één enkele E-core 100% te belasten.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

DjoeC schreef op dinsdag 7 oktober 2025 @ 17:33:
@alex3305 Tja, jouw setup is wat anders van opzet..... Voorlopig zit ik ook nog niet aan "meerdere" gebruikers en dus rollen. Er is maar 1 rol: Ikke....
Je kunt heel Treafik OIDC gewoon overslaan / niet gebruiken. Dan blijft de rest over voor een simpelere setup.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

alex3305 schreef op dinsdag 7 oktober 2025 @ 14:57:
Ik ben van mijn eerdere mening teruggekomen en ben inmiddels van Caddy naar Traefik gewisseld. Ik bleef maar kleine frustraties houden die groter en groter werden.
Thanx voor de "heads up".
Ik draai - zoals vaker - nog heel wat oude versies in mijn setup. Ik update niet zo vaak.
Als de L4 plugin nu kapot is, dan ga ik daar ook veel last van krijgen. Dat is niet de bedoeling. Nu kun je met Docker gewoon weer de oude container starten, maar ik zit niet te wachten op dit soort gezeik na een update.

Ik heb eerder / vaker met Treafik gespeeld en gewerkt, maar vind dat nog steeds een enorm waterhoofd. Dat zal ook nooit verbeteren dus anders worden: Traefik heeft wat meer "specificaties" nodig om zijn werk te doen dat natuurlijk komt door de vele routeer/filter mogelijkheden.

Gelukkig - voor mij - zijn er tegenwoordig chatbots waar ik gewoon een compose file met Caddy labels inpleur, en waar een - vaak in 1 keer werkende - Traefik versie uit komt rollen.
Natuurlijk moet je daarna ff kijken wat je in files gooit om alles eenduidig te houden, maar ook dat is zo'n chatbot wel wijs te maken.

Chatbots kunnen van bergen technische documentatie zonder ook maar enige samenhang tenminste iets samenhangends van maken. Lang leve die vooruitgang als techneuten dat nalaten _/-\o_

De reden dat ik aan het experimentern was/ben met Traefik voor thuis is dat ik geen Cloudflare heb (veel docker services hangen aan verschillende subdomeinen en toplevel domeinen, die vanzelfsprekend extern worden beheerd). Nu gebruik ik wel wat WAFjes, maar ik wil eigenlijk het gros van het botverkeer met Anubis en Crowdsec eruit filteren, eigenlijk dus volgens jouw plaatje.

Caddy heeft icm Anubis meerdere lagen/instanties nodig, terwijl Traefik dat netjes met middlewares kan afhandelen.

Crowdsec heb ik nog niet naar gekeken, maar zou ik dan ook willen toepassen.

Heb jij enig idee hoeveel verkeer jij met Anubis en Crowdsec blokkeert, ondanks dat je ook al Cloudflare gebruikt? Ik lees sterk varierende cijfers als je geen Cloudflare gebruikt: daar claimen mensen dat ze 70-90% van het verkeer kwijt zijn op hun backend services. Als ik zie wat Wordfence op Wordpress al blokkeert, dan wil ik dat best geloven.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Mars Warrior schreef op dinsdag 7 oktober 2025 @ 17:50:
maar Prometheus is voor mij altijd een no-go vanweg het absurde CPU en Disk gebruik. Voorheen kreeg Prometheus het voor elkaar om één enkele E-core 100% te belasten.
VictoriaMetrics zou ook een optie kunnen zijn. Kan dezelfde metrics endpoints scrapen, heeft "push" support op basis van het Influx protocol, en kan gequeried worden op basis van "MetricQL", dat zoals de naam al doet vermoeden, gebaseerd is op PromQL, van Prometheus.

* RobertMe draait nu een tijd VM op "de" VPS en data (vanaf zelfbouw router, servertje, ...) gaat er naartoe op basis van Telegraf. Geen idee hoe het met CPU gebruik zit, want draait toch buiten de deur :+.

Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
DjoeC schreef op dinsdag 7 oktober 2025 @ 17:33:
@alex3305 Tja, jouw setup is wat anders van opzet..... Voorlopig zit ik ook nog niet aan "meerdere" gebruikers en dus rollen. Er is maar 1 rol: Ikke....
Er zitten wat meer voordelen aan mijn setup en aan de OIDC laag dan wellicht op eerste gezicht duidelijk is. Uiteindelijk heb ik twee gebruikers en de rollen zijn vooral voor de show. Maar ik kan nu wel...
  • diensten met OAuth2 of OIDC ondersteuning afzonderlijk beveiligen
  • diensten met Trusted Header / Forwarded Header beveiligen
  • diensten zonder authenticatie beveiligen
Vooral die laatste use case vind ik enorm aantrekkelijk. Ik heb bijvoorbeeld mijn eigen gehoste shields instantie beveiligd door Forgejo als OAuth2 Server in te zetten. Deze dienst kan ik dus veilig ontsluiten naar het internet zonder dat er zonder toestemming gebruik van wordt gemaakt.

Vergeet ook niet dat het ook om een hobby gaat. En dan mag er best wat tijd en moeite in zitten :). Mocht je er mee willen spelen kan ik Pocket ID ten zeerste aanraden.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Mars Warrior schreef op dinsdag 7 oktober 2025 @ 17:50:
[...]

Ik monitor - heel simpel - enkel CPU en diskverbruik via Telegraf, die het in Influxdb ramt waar ik ook het dashboard van gebruik. Mijn eerdere ervaringen met tools die 50 docker containers monitoort is dat mijn zuinige server geen zuinige server meer is: de monitoring kost factoren meer CPU tijd dan 50 containers.
Beszel doet dat wel goed. Is enorm zuinig in mijn ervaring.

Telegraf had ik nog niet aan gedacht. Goede tip. Ik heb lang InfluxDB gebruikt voor Home Assistant, maar vond het visualiseren altijd een beetje net-niet. Dat vind of vond ik van Grafana ook. Vooral omdat daar altijd de edit mode aanstond en omdat je er teveel in kunt. Soms is beperken de beste optie, maar daar zal niet iedereen het met me eens zijn.

Ook wilde ik wat logs naar een centraal punt brengen. Vandaar dat ik bij LGTM en dan nu Loki en Grafana uitkwam. Maar wat een enorm geklooi is dat om een beetje werkend en gevisualiseerd te krijgen. Vooral omdat nu promtail deprecated is en Grafana Alloy gebruikt dient te worden. Daar loop ik niet voor warm...
Nu heb ik DEX nog nooit gebruikt, maar Prometheus is voor mij altijd een no-go vanweg het absurde CPU en Disk gebruik. Voorheen kreeg Prometheus het voor elkaar om één enkele E-core 100% te belasten.
Prometheus heb ik op mijn secundaire J4105 machine staan en daar verbruikt het zeer weinig. Volgens Node Exporter 3% load in idle waarvan Prometheus 0.5% zou zijn. Dat is verwaarloosbaar.

cAdvisor gebruikte gisteren op mijn 13500 20% CPU :'). Dat gaat 'em, zoals in de business zeggen, niet worden :P.

Acties:
  • 0 Henk 'm!

  • DjoeC
  • Registratie: November 2018
  • Nu online
alex3305 schreef op dinsdag 7 oktober 2025 @ 19:39:
[...]
Vergeet ook niet dat het ook om een hobby gaat. En dan mag er best wat tijd en moeite in zitten :). Mocht je er mee willen spelen kan ik Pocket ID ten zeerste aanraden.
Eens, maar ik heb nog andere hobbies en ook nog wat verplichtingen die ook tijd vreten.....

Maar dank voor de tips!

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Mars Warrior schreef op dinsdag 7 oktober 2025 @ 18:19:
Thanx voor de "heads up".
Ik draai - zoals vaker - nog heel wat oude versies in mijn setup. Ik update niet zo vaak.
Als de L4 plugin nu kapot is, dan ga ik daar ook veel last van krijgen. Dat is niet de bedoeling. Nu kun je met Docker gewoon weer de oude container starten, maar ik zit niet te wachten op dit soort gezeik na een update.
:Y Het is niet dat ik mensen vraag om mij te volgen, maar ik vind het wel leuk om mijn motieven hier te delen :). De L4 plugin werkt of zal binnenkort wel weer werken, maar ik vind nogal gaar om in Forgejo Actions een compleet irrelevante stack trace voor m'n giechel te krijgen als ik net een component heb toegevoegd:
code:
1
2
3
4
5
6
7
8
9
10
11
 > [builder 2/2] RUN GOTOOLCHAIN=go1.24.1 xcaddy build     --with github.com/caddy-dns/cloudflare     --with github.com/greenpau/caddy-security     --with github.com/hslatman/caddy-crowdsec-bouncer/http     --with github.com/hslatman/caddy-crowdsec-bouncer/layer4     --with github.com/hslatman/caddy-crowdsec-bouncer/appsec     --with github.com/lucaslorentz/caddy-docker-proxy/v2     --with github.com/mholt/caddy-l4     --with github.com/mholt/caddy-dynamicdns     --with github.com/WeidiDeng/caddy-cloudflare-ip:
124.4 go: added github.com/joho/godotenv v1.5.1
124.4 go: added github.com/lucaslorentz/caddy-docker-proxy/v2 v2.10.0
124.4 2025/08/19 10:48:01 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -v github.com/mholt/caddy-l4 github.com/caddyserver/caddy/v2@v2.10.0 
124.5 go: downloading github.com/mholt/caddy-l4 v0.0.0-20250814163833-b0a5a508a938
124.8 go: accepting indirect upgrade from github.com/cloudflare/circl@v1.6.0 to v1.6.1
124.8 go: accepting indirect upgrade from github.com/quic-go/quic-go@v0.50.1 to v0.54.0
124.8 go: github.com/mholt/caddy-l4@v0.0.0-20250814163833-b0a5a508a938 requires
124.8   github.com/caddyserver/caddy/v2@v2.10.1-0.20250720214045-8ba7eefd0767, but v2.10.0 is requested
124.8 go: github.com/mholt/caddy-l4@upgrade (v0.0.0-20250814163833-b0a5a508a938) requires github.com/caddyserver/caddy/v2@v2.10.1-0.20250720214045-8ba7eefd0767, not github.com/caddyserver/caddy/v2@v2.10.0
124.8 2025/08/19 10:48:01 [FATAL] exit status 1


En dan heb ik net te weinig kaas gegeten van de moderne Go toolchain om daar chocola van te maken. Buiten dat ik ook gewoon geen zin heb in dit soort vage issues. Het versionen, en als dat maar met 0.0.1, vind ik dan een kleine moeite en voorkomt dit soort problemen.

Ik vond Traefik aan de praat krijgen best wel straight forward. Toegegeven ik ken geen grote of populaire reverse proxy waar ik geen (professionele) ervaring mee heb. Dus dat helpt wel enorm, maar kort door de bocht:

Docker Compose
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
services:
  traefik:
    container_name: traefik
    image: traefik:v3.5.3
    restart: on-failure:10
    networks:
      ingress:
      ipvlan:
        ipv4_address: 192.168.1.4
        ipv6_address: aaaa:aaaa:aaaa:1:b00b::135
      monitoring:
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /opt/appdata/traefik/traefik.yaml:/traefik.yaml:ro
      - /opt/appdata/traefik/config:/configs:ro
      - /opt/appdata/traefik/certs/acme.json:/acme.json:rw
      - logs:/logs:rw
    security_opt:
      - no-new-privileges=true
    cpus: 1

networks:
  ingress:
    name: swarm-overlay
    external: true

  ipvlan:
    name: br0
    external: true

  monitoring:
    name: monitoring
    external: true

volumes:
  logs:
    name: traefik-logs


traefik.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
api:
  dashboard: True
  insecure: True

entryPoints:
  web:
    address: ":80"

    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  websecure:
    address: ":443"
    asDefault: true
    http:
      tls:
        certResolver: letsEncrypt
        domains:
          - main: "example.com"
            sans:
              - "*.example.com"

      middlewares:
        - traefik-real-ip@file
        - security-headers@file
        - rate-limit@file

    http3:
      advertisedPort: 443

    forwardedHeaders:
      trustedIPs:
        - 127.0.0.1/32
        - 192.168.0.0/16
        - 172.16.0.0/12
        - 10.0.0.0/8
        # Cloudflare IPs kunnen hier

  dns-over-tls:
      address: :853/tcp
  mqtt-over-tls:
      address: :8883/tcp
  smtp-over-tls:
      address: :465/tcp
  ssh:
      address: :22/tcp

providers:
  providersThrottleDuration: 15s

  file:
    directory: "/configs"

  docker:
    watch: true
    exposedByDefault: false
    network: "swarm-overlay"

certificatesResolvers:
  letsEncrypt:
    acme:
      email: alex3305@tweakers.net
      storage: /acme.json
      dnsChallenge:
        # Provider credentials should be stored in environment variables.
        provider: cloudflare
        resolvers:
          - "1.1.1.1:53"
          - "1.0.0.1:53"

metrics:
  prometheus: {}


configs/middlewares.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
http:
  middlewares:
    traefik-real-ip:
      plugin:
        traefik-real-ip: {}

    local-ips-allowed:
      ipAllowList:
        sourceRange:
          - 192.168.0.0/16
          - 172.16.0.0/12
          - 10.0.0.0/8

    security-headers:
      headers:
        customResponseHeaders:
          browserXssFilter: true
          contentTypeNosniff: true
          frameDeny: true

    rate-limit:
      rateLimit:
        average: 100
        period: 1
        burst: 100
Ik heb eerder / vaker met Treafik gespeeld en gewerkt, maar vind dat nog steeds een enorm waterhoofd.
Ik heb hier wat ik geknipt, maar mijn basis Caddyfile was ook gewoon 190 regels ;). Zoveel doet dit dus niet voor elkaar onder.
De reden dat ik aan het experimentern was/ben met Traefik voor thuis is dat ik geen Cloudflare heb (veel docker services hangen aan verschillende subdomeinen en toplevel domeinen, die vanzelfsprekend extern worden beheerd). Nu gebruik ik wel wat WAFjes, maar ik wil eigenlijk het gros van het botverkeer met Anubis en Crowdsec eruit filteren, eigenlijk dus volgens jouw plaatje.

Caddy heeft icm Anubis meerdere lagen/instanties nodig, terwijl Traefik dat netjes met middlewares kan afhandelen.
Yes. Dat zit er dus echt nét in :). Met Caddy moest ik het e.e.a. doorverwijzen, terwijl ik het nu als middleware kan configureren. Ik ben daar echt blij mee. Ik gebruik dat voor mijn Forgejo instantie.

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
services:
  forgejo:
    container_name: forgejo
    image: codeberg.org/forgejo/forgejo:12.0.4
    networks:
      internal:
      ingress:
      forgejo:
    labels:
      traefik.enable: true
      traefik.http.routers.forgejo.rule: "Host(`example.com`)"
      traefik.http.routers.forgejo.middlewares: "forgejo-anubis@docker"
      traefik.http.services.forgejo.loadbalancer.server.port: "80"
      traefik.tcp.routers.forgejo-ssh.entrypoints: "ssh"
      traefik.tcp.routers.forgejo-ssh.rule: "HostSNI(`*`)"
      traefik.tcp.services.forgejo-ssh.loadbalancer.server.port: "22"

  anubis:
    container_name: forgejo-anubis
    image: ghcr.io/techarohq/anubis:v1.22.0
    networks:
      internal:
      ingress:
    environment:
      BIND: ":8080"
      TARGET: " "
      COOKIE_DOMAIN: "example.com"
      SERVE_ROBOTS_TXT: "true"
      REDIRECT_DOMAINS: "example.com"
      PUBLIC_URL: "https://anubis.example.com"
    labels:
      traefik.enable: true
      traefik.http.routers.forgejo-anubis.rule: "Host(`anubis.example.com`)"
      traefik.http.services.forgejo-anubis.loadbalancer.server.port: "8080"
      traefik.http.middlewares.forgejo-anubis.forwardauth.address: "http://anubis:8080/.within.website/x/cmd/anubis/api/check"

networks:
  internal:
    name: forgejo-internal
    attachable: false

  forgejo:
    name: forgejo
    attachable: true
    driver: overlay

  ingress:
    name: swarm-overlay
    external: true
Crowdsec heb ik nog niet naar gekeken, maar zou ik dan ook willen toepassen.

Heb jij enig idee hoeveel verkeer jij met Anubis en Crowdsec blokkeert, ondanks dat je ook al Cloudflare gebruikt? Ik lees sterk varierende cijfers als je geen Cloudflare gebruikt: daar claimen mensen dat ze 70-90% van het verkeer kwijt zijn op hun backend services. Als ik zie wat Wordfence op Wordpress al blokkeert, dan wil ik dat best geloven.
Van Crowdsec wel, Anubis niet. Crowdsec en inmiddels ook AppSec gebruik ik voor al mijn HTTP diensten die allemaal aan het internet hangen. Ik heb een aantal regioblokkades via Cloudflare lopen en de Unifi firewall filtert ook het e.e.a.. Toch heb ik momenteel 9 actieve bans en volgens de Crowdsec Console zijn er de afgelopen 7 dagen 4800 requests geblokkeert. De afgelopen 30 dagen blijkbaar zo'n 140 bans. Dat vind ik best wel veel.

Mijn doel is overigens niet om Cloudflare-vrij te worden, maar wel om minder afhankelijk te worden. Crowdsec en Anubis zijn daar mooie stappen voor.

Acties:
  • +2 Henk 'm!

  • orvintax
  • Registratie: Maart 2018
  • Laatst online: 28-10 23:01

orvintax

www.fab1an.dev

alex3305 schreef op dinsdag 7 oktober 2025 @ 19:39:
[...]
  • diensten zonder authenticatie beveiligen
Vooral die laatste use case vind ik enorm aantrekkelijk. Ik heb bijvoorbeeld mijn eigen gehoste shields instantie beveiligd door Forgejo als OAuth2 Server in te zetten. Deze dienst kan ik dus veilig ontsluiten naar het internet zonder dat er zonder toestemming gebruik van wordt gemaakt.
Misschien interpreteer ik dit nu te simpel, maar hier gebruik ik gewoon HTTP basic authentication met Caddy voor. Maar goed, mijn belangrijkste design punt voor mijn homelab is KISS :P

[ Voor 4% gewijzigd door orvintax op 07-10-2025 23:22 . Reden: Typo + link ]

https://dontasktoask.com/


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
orvintax schreef op dinsdag 7 oktober 2025 @ 23:20:
Misschien interpreteer ik dit nu te simpel, maar hier gebruik ik gewoon HTTP basic authentication met Caddy voor.
Nu haal je mijn post uit context. Waarom zou ik een OAuth of OIDC laag opzetten om daarna de helft met Basic Auth te authenticeren 8)7...

Daarnaast vind ik Basic Auth een beroerde manier om diensten te beschermen. In de eerste plaats omdat je met Basic Auth de credentials in 'plain text' opslaat, het lastig is om wachtwoorden te veranderen en het enorm lastig is om bijvoorbeeld te rate limitten.
Maar goed, mijn belangrijkste design punt voor mijn homelab is KISS :P
Ik dacht even dat ik op het Viva forum was beland, maar volgens mij zitten we hier op Tweakers O-). Daarbij wil ik ook aangeven dat ik Basic Auth geen KISS vindt, maar verleden tijd. Een Golf Mk1 is ook KISS en soms erg mooi, maar niet meer van deze tijd.

Pocket ID met Caddy Security opzetten is daarnaast niet het einde van de wereld. Het is ook aardig beheersbaar.

Docker Compose
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
services:
  caddy:
    container_name: caddy
    image: alex3305/caddy:v2.10.0
    networks:
      ingress:
      ipvlan:
        ipv4_address: 192.168.1.10
    cap_add:
      - NET_ADMIN
    environment:
      CADDY_INGRESS_NETWORKS: swarm-overlay
    volumes:
      - /opt/appdata/caddy:/config
      - caddy-data:/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: ["docker-proxy", "--caddyfile-path", "/config/Caddyfile"]

  pocket_id:
    container_name: pocket-id
    image: ghcr.io/pocket-id/pocket-id:v1.13.1
    restart: on-failure:10
    networks:
      ingress:
    volumes:
      - pocket-id-data:/app/data
    labels:
      caddy: "*.example.com"
      caddy.@pocket-id.host: "id.example.com"
      caddy.handle: "@pocket-id"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 1411{{ '}}' }}"

networks:
  ingress:
    name: swarm-overlay
    external: true

  ipvlan:
    name: br0
    external: true

volumes:
  caddy-data:
  pocket-id-data:

Wel moet je hiervoor een eigen Caddy bouwen met bovenstaande plugin en Docker Proxy.

Caddyfile
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{
    order authenticate before respond
    order authorize before basicauth
    order authorize before reverse_proxy

    security {
        oauth identity provider pocket-id {
            realm pocket-id
            driver generic

            client_id CLIENT_ID_POCKET_ID
            client_secret CLIENT_SECRET_POCKET_ID
            scopes openid email profile groups
            extract all from userinfo

            base_auth_url https://id.example.com
            metadata_url https://id.example.com/.well-known/openid-configuration

            delay_start 3
        }

        authentication portal default-auth-portal {
            enable identity provider pocket-id

            crypto default token lifetime 86400
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            cookie domain example.com
            cookie insecure off

            cookie lifetime 172800

            ui {
                meta title "example.com Authentication Portal"
                meta author "example.com"
                meta description "Authentication portal for accessing homelab services"

                links {
                    "Apps" https://example.com/lovelace/apps icon "las la-sitemap"
                    "View Me" "/whoami" icon "las la-user"
                }
            }

            transform user {
                match role user
                action add role authp/user
            }

            transform user {
                match role admin
                action add role authp/admin

                ui link "User Management" https://users.example.com icon "las la-users"
                ui link "Whoami" https://whoami.example.com icon "las la-question-circle"
            }
        }

        authorization policy user_access {
            set auth url https://auth.example.com/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            allow roles user

            inject headers with claims
            inject header "X-Username" from "userinfo|preferred_username"
            inject header "X-Token-User-Picture" from picture

            validate bearer header
        }

        authorization policy admin_access {
            set auth url https://auth.example.com/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            allow roles admin

            inject headers with claims
            inject header "X-Username" from "userinfo|preferred_username"
            inject header "X-Token-User-Picture" from picture

            validate bearer header
        }
    }
}


Waarna diensten zeer eenvoudig beveiligd kunnen worden met authorization policies:
YAML:
1
2
3
4
5
6
7
8
services:
  my-service:
    labels:
      caddy: "*.example.com"
      caddy.@service.host: "service.example.com"
      caddy.handle: "@service"
      caddy.handle.authorize: "with user_access"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}' }}"


En door SSO hoef ik dus maar één keer in te loggen in plaats van n-aantal keer bij n-aantal diensten. Dat is pas simpel :).

Acties:
  • 0 Henk 'm!

  • orvintax
  • Registratie: Maart 2018
  • Laatst online: 28-10 23:01

orvintax

www.fab1an.dev

alex3305 schreef op woensdag 8 oktober 2025 @ 10:15:
[...]

Nu haal je mijn post uit context. Waarom zou ik een OAuth of OIDC laag opzetten om daarna de helft met Basic Auth te authenticeren 8)7...

Daarnaast vind ik Basic Auth een beroerde manier om diensten te beschermen. In de eerste plaats omdat je met Basic Auth de credentials in 'plain text' opslaat, het lastig is om wachtwoorden te veranderen en het enorm lastig is om bijvoorbeeld te rate limitten.


[...]

Ik dacht even dat ik op het Viva forum was beland, maar volgens mij zitten we hier op Tweakers O-). Daarbij wil ik ook aangeven dat ik Basic Auth geen KISS vindt, maar verleden tijd. Een Golf Mk1 is ook KISS en soms erg mooi, maar niet meer van deze tijd.

Pocket ID met Caddy Security opzetten is daarnaast niet het einde van de wereld. Het is ook aardig beheersbaar.

Docker Compose
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
services:
  caddy:
    container_name: caddy
    image: alex3305/caddy:v2.10.0
    networks:
      ingress:
      ipvlan:
        ipv4_address: 192.168.1.10
    cap_add:
      - NET_ADMIN
    environment:
      CADDY_INGRESS_NETWORKS: swarm-overlay
    volumes:
      - /opt/appdata/caddy:/config
      - caddy-data:/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: ["docker-proxy", "--caddyfile-path", "/config/Caddyfile"]

  pocket_id:
    container_name: pocket-id
    image: ghcr.io/pocket-id/pocket-id:v1.13.1
    restart: on-failure:10
    networks:
      ingress:
    volumes:
      - pocket-id-data:/app/data
    labels:
      caddy: "*.example.com"
      caddy.@pocket-id.host: "id.example.com"
      caddy.handle: "@pocket-id"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 1411{{ '}}' }}"

networks:
  ingress:
    name: swarm-overlay
    external: true

  ipvlan:
    name: br0
    external: true

volumes:
  caddy-data:
  pocket-id-data:

Wel moet je hiervoor een eigen Caddy bouwen met bovenstaande plugin en Docker Proxy.

Caddyfile
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{
    order authenticate before respond
    order authorize before basicauth
    order authorize before reverse_proxy

    security {
        oauth identity provider pocket-id {
            realm pocket-id
            driver generic

            client_id CLIENT_ID_POCKET_ID
            client_secret CLIENT_SECRET_POCKET_ID
            scopes openid email profile groups
            extract all from userinfo

            base_auth_url https://id.example.com
            metadata_url https://id.example.com/.well-known/openid-configuration

            delay_start 3
        }

        authentication portal default-auth-portal {
            enable identity provider pocket-id

            crypto default token lifetime 86400
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            cookie domain example.com
            cookie insecure off

            cookie lifetime 172800

            ui {
                meta title "example.com Authentication Portal"
                meta author "example.com"
                meta description "Authentication portal for accessing homelab services"

                links {
                    "Apps" https://example.com/lovelace/apps icon "las la-sitemap"
                    "View Me" "/whoami" icon "las la-user"
                }
            }

            transform user {
                match role user
                action add role authp/user
            }

            transform user {
                match role admin
                action add role authp/admin

                ui link "User Management" https://users.example.com icon "las la-users"
                ui link "Whoami" https://whoami.example.com icon "las la-question-circle"
            }
        }

        authorization policy user_access {
            set auth url https://auth.example.com/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            allow roles user

            inject headers with claims
            inject header "X-Username" from "userinfo|preferred_username"
            inject header "X-Token-User-Picture" from picture

            validate bearer header
        }

        authorization policy admin_access {
            set auth url https://auth.example.com/oauth2/pocket-id/authorization-code-callback
            crypto key sign-verify 703576704369326f4f6e11b1eeaf189a07f5590dd7fc983d1473efb6dbca4f49

            allow roles admin

            inject headers with claims
            inject header "X-Username" from "userinfo|preferred_username"
            inject header "X-Token-User-Picture" from picture

            validate bearer header
        }
    }
}


Waarna diensten zeer eenvoudig beveiligd kunnen worden met authorization policies:
YAML:
1
2
3
4
5
6
7
8
services:
  my-service:
    labels:
      caddy: "*.example.com"
      caddy.@service.host: "service.example.com"
      caddy.handle: "@service"
      caddy.handle.authorize: "with user_access"
      caddy.handle.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}' }}"


En door SSO hoef ik dus maar één keer in te loggen in plaats van n-aantal keer bij n-aantal diensten. Dat is pas simpel :).
Voor de duidelijkheid ik zeg niet dat jouw opzet "fout" is. Ik was meer benieuwd of ik je op dat vlak goed had begrepen.

OAuth en OIDC in samenwerking met HTTP Basic authenticatie slaat nergens op nee. Maar mijn punt was dan ook dat je die lagen niet nodig hebt. Puur vanuit functioneel blik. Maar ik snap dat je het leuk vind om te doen :)

Dat HTTP Basic authenticatie niet meer van deze tijd is ben ik het absoluut niet mee eens. Het is oud, het werkt en het is simpel. Ik vind dat persoonlijk drie grote pluspunten. Ik ben zelf tegenwooridg best waakzaam met het introduceren van extra complexiteit. Zeker voor mijn HomeLab, die ik niet alleen gebruik om mee te spelen maar ook " persoonlijke productie" op draai.

Maar goed heel veel mensen vinden dat leuk, hip en spannend. Dat zie ik ook in de professionele wereld. Tevens vind ik het wel tof om te zien dat je het allemaal hebt draaien. Het is natuurlijk ook gewoon leuk, hip en spannend ;)

Voor de goede orde, als je HTTP Basic authenticatie gebruikt met Caddy worden de wachtwoorden gehashed opgeslagen. Dus die staan nergens in plaintext.

[ Voor 1% gewijzigd door orvintax op 08-10-2025 12:20 . Reden: Nederlands is moeilijk ]

https://dontasktoask.com/


Acties:
  • +1 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

@alex3305 . Aangezien ik zowel http services als https services heb kan ik volgens mij geen automatische redirect configureren voor Traefik, en moet ik alle externe domeinen handmatig redirecten. Dat betekent dus dat 3 regels Caddy vertalen naar ca 10-12 regels Traefik...

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.any-service-rt.rule=Host(`as.example.com`)"
  - "traefik.http.routers.any-service-rt.entrypoints=websecure"
  - "traefik.http.routers.any-service-rt.tls=true"
  - "traefik.http.routers.any-service-rt.middlewares=security-headers@file,rate-limit@file,gzip-compress@file"
  - "traefik.http.services.any-service-svc.loadbalancer.server.port=80"
  # HTTP → HTTPS redirect
  - "traefik.http.routers.any-service-http-rt.rule=Host(`as.example.com`)"
  - "traefik.http.routers.any-service-http-rt.entrypoints=web"
  - "traefik.http.middlewares.any-service-redirect-mw.redirectscheme.scheme=https"
  - "traefik.http.routers.any-service-http-rt.middlewares=any-service-redirect-mw"


Edit:
Het kan nog 1 regel korter door de middleware voor te definieren:
YAML:
1
      traefik.http.routers.any-service-http-rt.middlewares: redirect-to-https@file

ChatGPT blijkt goed in staat om een docker compose file van ruim 2.000 regels van Caddy naar Traefik om te zetten, waarbij ik de Caddy labels laat staan, en de Traefik lables toevoeg. Daarmee kan ik namelijk makkelijk switchen tussen die 2 om te testen of alles nog werkt.

De compose files worden dus tijdelijk een heel stuk groter. Ik hak mijn huidige compose file namelijk ook meteen in stukken: dat maakt het ook eenvoudiger om een service of cluster van services toe te voegen en/of te verwijderen (tijdelijk). Dan is het namelijk enkel de include toevoegen/verwijderen.
Maakt het geheel ook een stuk overzichtelijker. :9~

Verder lijkt CrowdSec dus op alle domeinen te kunnen werken (onafhankelijk) en Anubis moet je dan per domein/subdomein koppelen, althans ik krijg daar geen hoogte van hoe je die ook tegelijkertijd op meerdere domeinen kan laten werken.

[ Voor 6% gewijzigd door Mars Warrior op 08-10-2025 14:05 ]

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@Mars Warrior Ik heb dus geen enkele HTTP dienst :$. Alles gaat bij mij via HTTPs. Het zou echter wel wat makkelijker kunnen:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
services:
  traefik:
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.https-redirectscheme.redirectscheme.scheme=https"
      - "traefik.http.middlewares.https-redirectscheme.redirectscheme.permanent=true"

  any-service:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.any-service-rt.rule=Host(`as.example.com`)"
      - "traefik.http.routers.any-service-rt.middlewares=https-redirectscheme, security-headers@file, rate-limit@file, gzip-compress@file"


Waarbij je de HTTPS redirect uiteraard ook in een file kunt doen. Volgens de documentatie luisteren services namelijk standaard naar alle EntryPoints
If not specified, HTTP routers will accept requests from all EntryPoints in the list of default EntryPoints. If you want to limit the router scope to a set of entry points, set the entryPoints option.
En de middleware leidt alleen om naar https wanneer het schema verschilt:
The RedirectScheme middleware redirects the request if the request scheme is different from the configured scheme.
Mars Warrior schreef op woensdag 8 oktober 2025 @ 13:27:
De compose files worden dus tijdelijk een heel stuk groter. Ik hak mijn huidige compose file namelijk ook meteen in stukken: dat maakt het ook eenvoudiger om een service of cluster van services toe te voegen en/of te verwijderen (tijdelijk). Dan is het namelijk enkel de include toevoegen/verwijderen.
Maakt het geheel ook een stuk overzichtelijker. :9~
Dat heb ik precies zo gedaan :Y . Alleen heb ik al mijn Compose opgesplitst en template ik via Ansible.
Verder lijkt CrowdSec dus op alle domeinen te kunnen werken (onafhankelijk) en Anubis moet je dan per domein/subdomein koppelen, althans ik krijg daar geen hoogte van hoe je die ook tegelijkertijd op meerdere domeinen kan laten werken.
CrowdSec werkt op alle domeinen. Anubis kan werken per cookie domein. Ik gebruik dus example.com als cookie domein en dat werkt dan ook voor shields.example.com. Meerdere redirect domains zijn wel mogelijk en volgens de documentatie zou de optie COOKIE_DYNAMIC_DOMAIN zijn die jij zoekt. Wel krijg je met een ander domain dan wel een nieuwe challenge, maar dat lijkt mij logisch.

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

alex3305 schreef op woensdag 8 oktober 2025 @ 16:10:
@Mars Warrior Ik heb dus geen enkele HTTP dienst :$. Alles gaat bij mij via HTTPs. Het zou echter wel wat makkelijker kunnen:
Aha. Tsja, ik heb nog zitten denken als ik alles https doe, dan heb ik ook geen gezeik meer met browsers die vinden dat http onveilig is, of zelfs niet meer op http willen gaan zitten...

Als ik dan een ip-allow-list erbij gooi die enkel lokale addressen toestaat, dan kan ik volgens mij nog steeds Traefik certificaten (http/tls challenge) laten ophalen, maar kan niemand er van buitenaf bij 8)
Geeft wel een hele buts aan certificaten extra, maar ik zag dat LE per domein rate-limiting doet van 50/week. Dat zou dan best goed uitkomen met 50 containers verspreid over een serie domeinen.
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
services:
  traefik:
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.https-redirectscheme.redirectscheme.scheme=https"
      - "traefik.http.middlewares.https-redirectscheme.redirectscheme.permanent=true"

  any-service:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.any-service-rt.rule=Host(`as.example.com`)"
      - "traefik.http.routers.any-service-rt.middlewares=https-redirectscheme, security-headers@file, rate-limit@file, gzip-compress@file"


Waarbij je de HTTPS redirect uiteraard ook in een file kunt doen. Volgens de documentatie luisteren services namelijk standaard naar alle EntryPoints
Aha. Dus al die instellingen zijn dan overbodig omdat de service toch al op beide poorten luistert. Dan is dat impliciet, en ChatGPT houdt regelmatig van expliciete definities heb ik gemerkt.
Dat heb ik precies zo gedaan :Y . Alleen heb ik al mijn Compose opgesplitst en template ik via Ansible.
Ik template dus met ChatGPT. Ook best wel reproduceerbaar, maar niet te automatiseren nog. Maar met af en toe een extra container perfect te doen. Ik geef de compose definitie op (of laat ChatGPT zoeken), en geef aan wat ik erbij wil hebben.

De enige beperking is dat ChatGPT af en toe dement is, wel een file van 2.000 regels kan invoeren, maar die op geen enkele manier meer kan uitvoeren: dat moet in batches. Helaas lukt het me nog steeds niet om alle batches in één keer te laten doen: na elke batch moet ik "Ja" zeggen, doe ze allemaal maar, maar nee hoor, bij de volgende weer de vraag of dat ding verder moet :F
CrowdSec werkt op alle domeinen. Anubis kan werken per cookie domein. Ik gebruik dus example.com als cookie domein en dat werkt dan ook voor shields.example.com. Meerdere redirect domains zijn wel mogelijk en volgens de documentatie zou de optie COOKIE_DYNAMIC_DOMAIN zijn die jij zoekt. Wel krijg je met een ander domain dan wel een nieuwe challenge, maar dat lijkt mij logisch.
Aha. Nou eerst maar eens de basis leggen met Traefik werkende krijgen. Daarna volgt CrowdSec wel. Als ik dan al een hoop troep kwijt ben, ben ik al blij.



Verder klinken zowel Beszel (systeem en container monitoring) als VictoriaMetrics voor app performance metrics interessant. Beiden hebben dashboards zag ik. Die van Beszel zijn lekker ingebouwd en overzichtelijk. Meer heb ik toch niet nodig om af en toe te kijken hoe contaieners het doen, en wat het effect van wijzigingen is.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +2 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Mars Warrior schreef op woensdag 8 oktober 2025 @ 17:29:
[...]

Aha. Tsja, ik heb nog zitten denken als ik alles https doe, dan heb ik ook geen gezeik meer met browsers die vinden dat http onveilig is, of zelfs niet meer op http willen gaan zitten...

Als ik dan een ip-allow-list erbij gooi die enkel lokale addressen toestaat, dan kan ik volgens mij nog steeds Traefik certificaten (http/tls challenge) laten ophalen, maar kan niemand er van buitenaf bij 8)
Geeft wel een hele buts aan certificaten extra, maar ik zag dat LE per domein rate-limiting doet van 50/week. Dat zou dan best goed uitkomen met 50 containers verspreid over een serie domeinen.


[...]

Aha. Dus al die instellingen zijn dan overbodig omdat de service toch al op beide poorten luistert. Dan is dat impliciet, en ChatGPT houdt regelmatig van expliciete definities heb ik gemerkt.

[...]

Ik template dus met ChatGPT. Ook best wel reproduceerbaar, maar niet te automatiseren nog. Maar met af en toe een extra container perfect te doen. Ik geef de compose definitie op (of laat ChatGPT zoeken), en geef aan wat ik erbij wil hebben.

De enige beperking is dat ChatGPT af en toe dement is, wel een file van 2.000 regels kan invoeren, maar die op geen enkele manier meer kan uitvoeren: dat moet in batches. Helaas lukt het me nog steeds niet om alle batches in één keer te laten doen: na elke batch moet ik "Ja" zeggen, doe ze allemaal maar, maar nee hoor, bij de volgende weer de vraag of dat ding verder moet :F


[...]

Aha. Nou eerst maar eens de basis leggen met Traefik werkende krijgen. Daarna volgt CrowdSec wel. Als ik dan al een hoop troep kwijt ben, ben ik al blij.



Verder klinken zowel Beszel (systeem en container monitoring) als VictoriaMetrics voor app performance metrics interessant. Beiden hebben dashboards zag ik. Die van Beszel zijn lekker ingebouwd en overzichtelijk. Meer heb ik toch niet nodig om af en toe te kijken hoe contaieners het doen, en wat het effect van wijzigingen is.
VictoriaMetrics moet je wel meer vergelijken met Prometheus & InfluxDB. Het is puur een time series database. Hoe je de data er in krijgt is aan jou (wat dus zowel via node-exporter en dergelijke kan, of via Telegraf, of via <whatever>). En dashboards is bij VM ook net zo basic als Prometheus (/volgens mij letterlijk hetzelfde?). Grafana dus aan te bevelen (en die kun je dus ook alleen starten als je er naar wilt kijken :P)

Acties:
  • +2 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Nou, nou, dat Beszel is lichtgewicht en echt belachelijk eenvoudig met compose te installeren.
In de webinterface voeg je dan een systeem toe (je lokale agent), en je knipt/plakt ff de key en token in je compose file en je start de agent.

Klaar!

Dashboards zijn voorgedefinieerd en worden direct gevuld met informatie.
  • Processorgebruik is gewoon van 0..100%. Geen gezeik met die maffe Linux percentages. Ik zie nu dat het gemiddelde verbruik 2% is
  • Alles in NL
  • Met een hover zie ik direct alle 50 containers van veel naar weinig resource verbruik
  • Je kunt simpelweg filteren op container/service naam: ik heb overal de groepsnaam voor, dus ik kan nu wel vreselijk eenvoudig zien wat infra, of websites verbruiken
Afbeeldingslocatie: https://tweakers.net/i/nr24BDD-qOxLJXrwFQ-aJBdg0r4=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/uIdEAtPOAu7oD5GegszfTyNE.png?f=user_large

Afbeeldingslocatie: https://tweakers.net/i/DogWrapD1asnjEBvQs1oU70-tso=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/NnE1oIQMAUJQNPlYiLCbdjwo.png?f=user_large

Je kunt alleen niet het Schijf I/O per docker container zien, enkel overall. Ik zie nu ca 250kB/sec gemiddeld, maar dus geen idee of dat Ubuntu is (journal, etc) of welke Docker container continue staat te schrijven.

En hoppa: ik zit nu op 1,52% CPU verbruik: een container die nu helemaal niet gebruikt wordt blijkt een health-check te hebben: dat pakt al bijna gemiddeld 0,5%.

Heel veel containers laten netjes 0,00% CPU verbruik zien: die doen het goed als ze niks te doen hebben...

Kiek: daar gaat mijn CPU verbruik lekker omlaag *O*

Afbeeldingslocatie: https://tweakers.net/i/rfg5HclQFnHzK60GerldwDEDkzU=/x800/filters:strip_exif()/f/image/coozWifjXYS7I6EmMbNqixy1.png?f=fotoalbum_large

[ Voor 61% gewijzigd door Mars Warrior op 08-10-2025 21:08 ]

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@Mars Warrior Certificaten worden onafhankelijk aangevraagd van eventuele IP allowlist. Zelf gebruik ik overigens een DNS Challenge zodat ik met wildcard certificaten kan werken. Dan komen specifieke apps eveneens niet voor in een eventuele transparency report.

Ik doe inmiddels al jaren alles op HTTPS met een split horizon DNS, waarbij de publieke DNS dus via Cloudflare loopt (zie flowchart boven) en intern of VPN verkeer dus direct via Traefik loopt. Ik heb hiervoor A-records toegevoegd in Unifi en AdGuard Home serveert ook nog eens een HTTPS record:

||example.com^$dnstype=HTTPS,dnsrewrite=NOERROR;HTTPS;1 . alpn=h3 ipv4hint=192.168.1.40

Hierdoor kan de browser direct via udp/443 HTTP/3 verbinden :).
Aha. Dus al die instellingen zijn dan overbodig omdat de service toch al op beide poorten luistert. Dan is dat impliciet, en ChatGPT houdt regelmatig van expliciete definities heb ik gemerkt.
Yes. Ik heb geen enkele moeite met de documentatie en schrijf al mijn code met het handje :+. Ik ben daarmee wellicht ouderwets, maar het meeste heb ik toch getemplate met Ansible. Daarmee is een uitrol inmiddels triviaal.
Verder klinken zowel Beszel (systeem en container monitoring) als VictoriaMetrics voor app performance metrics interessant. Beiden hebben dashboards zag ik. Die van Beszel zijn lekker ingebouwd en overzichtelijk. Meer heb ik toch niet nodig om af en toe te kijken hoe contaieners het doen, en wat het effect van wijzigingen is.
Leuke ontwikkelaar van Beszel ook. Alerting is ook echt dik in orde. Alleen wil ik gewoon wat meer. Ik wil bijvoorbeeld ook logging kunnen analyseren. Ook access logging bijvoorbeeld. En dan is Beszel onvoldoende.

Inmiddels heb ik besloten nav. posts hier om naar de TIG Stack te gaan kijken. Met InfluxDB zou ik logging namelijk ook kunnen tacklen.

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

alex3305 schreef op woensdag 8 oktober 2025 @ 20:51:
@Mars Warrior Certificaten worden onafhankelijk aangevraagd van eventuele IP allowlist. Zelf gebruik ik overigens een DNS Challenge zodat ik met wildcard certificaten kan werken. Dan komen specifieke apps eveneens niet voor in een eventuele transparency report.
Mooi. Dan zou ik dus wel alles op https kunnen zetten, waarbij die sites enkel intern bereikbaar zijn
Ik doe inmiddels al jaren alles op HTTPS met een split horizon DNS, waarbij de publieke DNS dus via Cloudflare loopt (zie flowchart boven) en intern of VPN verkeer dus direct via Traefik loopt. Ik heb hiervoor A-records toegevoegd in Unifi en AdGuard Home serveert ook nog eens een HTTPS record:

||example.com^$dnstype=HTTPS,dnsrewrite=NOERROR;HTTPS;1 . alpn=h3 ipv4hint=192.168.1.40

Hierdoor kan de browser direct via udp/443 HTTP/3 verbinden :).
Ik wist niet dat dat zo heette. Ik gebruik de DNS Rewrite van AdGuard om een lokale DNS te hebben die alles simpelweg doorzet naar het IP adres van de server.
Is die regel hierboven uit AdGuard dan? Dat zegt me niks namelijk :'(
Yes. Ik heb geen enkele moeite met de documentatie en schrijf al mijn code met het handje :+. Ik ben daarmee wellicht ouderwets, maar het meeste heb ik toch getemplate met Ansible. Daarmee is een uitrol inmiddels triviaal.
Voor mij is veel documentatie onsamenhangend: leuk om elke optie apart uit te leggen, maar als ik iets integraals wil, dan wil ik de samenhang zien, en veel technische documentatie levert dat niet.

Ik kan dus best wel dingen lezen, maar vind vaak niet wat ik zoek. Een bot als ChatGPT is wel in staat om dingen integraal (als je dit wilt, dan heb je de volgende combinatie van instellingen nodig...) ff in een paar seconden neer te zetten. Dat scheelt gewoon bergen tijd.
Leuke ontwikkelaar van Beszel ook. Alerting is ook echt dik in orde. Alleen wil ik gewoon wat meer. Ik wil bijvoorbeeld ook logging kunnen analyseren. Ook access logging bijvoorbeeld. En dan is Beszel onvoldoende.
Yep. Ik zie Beszel enkel als systeem/docker monitoring. Dan heb je nog applicatie monitoring (metrics), en uiteindelijk logmonitoring voor de details.
Feitelijk dus 3 aparte systemen in mijn geval.
Inmiddels heb ik besloten nav. posts hier om naar de TIG Stack te gaan kijken. Met InfluxDB zou ik logging namelijk ook kunnen tacklen.
Ben benieuwd hoe dat bevalt!

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op woensdag 8 oktober 2025 @ 20:51:
Ik doe inmiddels al jaren alles op HTTPS met een split horizon DNS, waarbij de publieke DNS dus via Cloudflare loopt (zie flowchart boven) en intern of VPN verkeer dus direct via Traefik loopt. Ik heb hiervoor A-records toegevoegd in Unifi en AdGuard Home serveert ook nog eens een HTTPS record:

||example.com^$dnstype=HTTPS,dnsrewrite=NOERROR;HTTPS;1 . alpn=h3 ipv4hint=192.168.1.40

Hierdoor kan de browser direct via udp/443 HTTP/3 verbinden :).
Heb je hier meer uitleg over / linkje? Nog nooit gehoord dat je HTTP/3 ook via DNS kunt adverteren (Traefik adverteert hem wel bij mij).
Inmiddels heb ik besloten nav. posts hier om naar de TIG Stack te gaan kijken. Met InfluxDB zou ik logging namelijk ook kunnen tacklen.
VictoriaMetrics & VictoriaLogs? O-)
Influx is bij mij een beetje afgedaan. Doe er eigenlijk vrijwel niks mee. Maar ze zijn niet heel "stabiel". In Influx v1 moest je data ophalen via SQL, vervolgens hebben ze hun eigen (query) taal bedacht, "flux". Toen kwam Influx 2 uit met alleen flux en geen SQL. En quess what? Influx 3 bevat weer alleen SQL :F . Als je dus "serieus" gebruik maakt van Influx mocht je de afgelopen jaren verplicht 3x de queries (her)schrijven.
En daarnaast is de OSS versie ook een onderschoven kindje meen ik. In de zin dat Influx 3 voor self hosting / open source lang op zich heeft laten wachten terwijl de cloud versie al lang beschikbaar was.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@Mars Warrior Voor de goede orde, het documentatiepunt was geen kritiek hè :). Ik snap niet dat mensen ChatGPT of iets vergelijkbaars eenvoudig vinden. Ik vind documentatie lezen dan vaak eenvoudiger :+.

@Mars Warrior @RobertMe HTTP/3 is een stuk complexer dan de voorgangers en gebruikt QUIC op basis van UDP voor bestandsoverdrachten. De 'standaardpoort' hiervoor is 443, maar dan moet een client - laten we zeggen een browser - dat wel weten. Een HTTPS record wordt daar dan als hint voor gebruikt. Er kan nog wel meer in, zoals ECH.

Cloudflare stuurt die hints al een tijdje standaard:
Members only:
Alleen zichtbaar voor ingelogde gebruikers. Inloggen
Door mijn split horizon DNS werkt dit dus niet (correct). Ik stuur dus vanuit AdGuard Home ook zo'n record mee. Alleen ondersteund AdGuard Home weer niet de hele subset/syntax. Althans niet op een eenvoudige manier.

Ik stuur die records al bijna een jaar mee zie ook mijn post in het AdGuard Home topic. Helaas zonder enige Henkjes :( :>

Afbeeldingslocatie: https://tweakers.net/i/cs3VSFj7Q0OwsnXb4rLoXrlsH84=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/oSFrlWPg63i6bQQwMqXY9EGq.png?f=user_large

Blijkbaar ben ik dus de enige die hier tegenaan loopt :+

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
RobertMe schreef op woensdag 8 oktober 2025 @ 21:06:
VictoriaMetrics & VictoriaLogs? O-)
Influx is bij mij een beetje afgedaan. Doe er eigenlijk vrijwel niks mee. Maar ze zijn niet heel "stabiel". In Influx v1 moest je data ophalen via SQL, vervolgens hebben ze hun eigen (query) taal bedacht, "flux". Toen kwam Influx 2 uit met alleen flux en geen SQL. En quess what? Influx 3 bevat weer alleen SQL :F . Als je dus "serieus" gebruik maakt van Influx mocht je de afgelopen jaren verplicht 3x de queries (her)schrijven.
En daarnaast is de OSS versie ook een onderschoven kindje meen ik. In de zin dat Influx 3 voor self hosting / open source lang op zich heeft laten wachten terwijl de cloud versie al lang beschikbaar was.
Ik heb dezelfde afkeer tegen InfluxDB... Maar heb je een linkje voor mij hoe ik bijv. nodes / Docker kan monitoren? Of logs kan verzamelen? Of een startpunt?

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Ik krijg alweer Déjà vu's...

code:
1
2
3
4
5
6
7
8
9
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:29+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:30+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:31+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:32+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:34+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:36+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:40+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:27:47+02:00","message":"Command error"}
infra-traefik  | {"level":"error","error":"command traefik error: field not found, node: middleware","time":"2025-10-09T16:28:00+02:00","message":"Command error"}


Waar? Welk veld?

Ach ja. De ontwikkelaars van Treafik zijn in de loop der jaren geen steek veranderd |:(

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op woensdag 8 oktober 2025 @ 21:58:
[...]

Ik heb dezelfde afkeer tegen InfluxDB... Maar heb je een linkje voor mij hoe ik bijv. nodes / Docker kan monitoren? Of logs kan verzamelen? Of een startpunt?
Uhm...

Ik heb toen gewoon Influx in Docker gestart (en later VictoriaMetrics), en Telegraf via de apt repo geïnstalleerd. V.w.b. Telegraf => Influx denk ik wel de docs gebruikt? Verder gewoon zelf het sample config bestand nagelopen en gekeken welke input ik aan of uit wilde hebben. Met de switch naar VM even gepuzzeld v.w.b. de juiste output config (IIRC moet dat influx (v1) zijn en niet influx_v2) en dat was het zo'n beetje.
Vrij letterlijk ook, want Grafana heb ik vrijwel niks in staan (en dus ook geen "standaard" dashboard over genomen).
Ik ben er dus niet heel fanatiek mee.

En v.w.b. VictoriaLogs weet ik uberhaupt alleen van het bestaan af. Nooit naar gekeken verder en heb het dus ook niet draaien.
Maar zou ik eigenlijk wel moeten doen, met in totaal 5 server like systemen. VPS, router, servertje, "NAS" (/server), en OrangePi voor backups bij familie. Allemaal Debian (/ARMBian op OrangePi). Jip. Dat is incl router die plain Debian draait.

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Overigens weet ik niet of ik nog welkom ben in dit topic? :+

Vorige maand de NAS / server opnieuw geïnstalleerd en Podman er op gezet. En vervolgens was ik een week later, terwijl dat nog niet eens goed en wel draaide, de router ook aan het over zetten naar Podman. Dus van de 4 systemen met een OCI runtime zijn er nu nog maar 2 met Docker, en 2 met Podman.

Waarom Docker / Podman op een router? Nouja, bv Unbound als DNS :p. Maar gezien het "servertje" 8GB gesoldeerd RAM heeft en vol zit, en de router SODIMM heeft, en ik begon met 1 8GB reepje van een oude 16GB set, en daarvan al veel vrij was, en intussen het andere reepje er ook in zit, draait er veel meer op de router. Waaonder intussen ook Forgejo & Renovate. En beide zijn dan mini PCtjes met een Intel N5105, dus gelijke performance. De nu NAS, met 3x 3,5" HDD en dus onzuinig, heeft wel meer paardenkrachtjes (i3-9100, 32GB RAM), maar die staat alleen on-demand aan. Zowel router als servertje zit een 4TB SSD in voor opslag die nodig is, en de Linux ISOs worden permanent op de NAS bewaard zeg maar :+

Enige "issue" waar ik nu met Podman tegenaan loop is dat Telegraf draaiende onder de telegraf user natuurlijk geen toegang heeft tot de Podman socket (Docker compatibiliteit) aangezien Podman alles doet onder de user die het commando uitvoert en dus geen "extra" toegang geeft (zoals bij Docker zelf dus iedereen in de "docker" user group toegang heeft tot de socket).

Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
RobertMe schreef op donderdag 9 oktober 2025 @ 17:32:
Overigens weet ik niet of ik nog welkom ben in dit topic? :+
Misschien is een topic naamswijziging wel op z'n plaats? Ik blijf OCI containers uit gewoonte nog toch steeds Docker containers noemen. Of die dan aangestuurd worden door de Docker of Podman runtime vind ik om het even. Ook heb ik uit gewoonte ook altijd een alias ingesteld op machines met podman.

Ik ben zelf al enige tijd aan het spelen met rootless containers. Ook in Docker. Zie bijvoorbeeld mijn Forgejo Runner + DIND image. Maar dat werkt niet optimaal. Ik krijg regelmatig vage foutmeldingen en VPNKit - die gebruikt wordt voor netwerktoegang - gebruikt soms achterlijk veel CPU. Ik heb dus ook al overwogen om dat om te bouwen naar Podman. En eventueel op termijn twee releases cq. Dockerfile's bij te houden.

Acties:
  • +2 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

RobertMe schreef op donderdag 9 oktober 2025 @ 17:32:
Overigens weet ik niet of ik nog welkom ben in dit topic? :+
Alleen dit topic 🥴🤣 ?

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Nou. Na 4 uur kloten met Traefik en 50 containers draait het op de belangrijkste containers.

Wat een ongelofelijk fout gevoelig en irritant pakket om sommige vlakken. Caddy draaide na een paar minuten en heeft geen moeite met bijv niet-healthy containers om maar iets te noemen.

Traefik slaat ze gewoon over. Dus geen toegang, geen certificaat, niks nakkes nada. Ook niks zichtbaar op de webgui. Waar bemoeit dat pakket zich mee 🧐

Ben er ff helemaal klaar mee.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Mars Warrior schreef op donderdag 9 oktober 2025 @ 21:42:
Wat een ongelofelijk fout gevoelig en irritant pakket om sommige vlakken. Caddy draaide na een paar minuten en heeft geen moeite met bijv niet-healthy containers om maar iets te noemen.

Traefik slaat ze gewoon over. Dus geen toegang, geen certificaat, niks nakkes nada. Ook niks zichtbaar op de webgui. Waar bemoeit dat pakket zich mee 🧐
De container is unhealthy, dus...? Wat zou die er dan mee moeten doen? Daadwerkelijk requests uitvoeren kan die toch niet.

En ja, wellicht dat die iets er mee kan. Maar blijkbaar is de implementatie dat die de hele service/route pas toevoegt als die healthy/started is en verwijderd als dat niet meer de status is. An zich best iets voor te zeggen IMO.

En uiteraard kun je de services / routes ook op een andere manier vastleggen (in een file bv), dan bestaan ze wel altijd.

Overigens niet alles gevolgd, maar waarom ben je nu, zo ontzettend tegen je zin in, alsnog de overstap aan het maken? Je geeft uhm, al jaren op Traefik af en vind Caddy geweldig.

Edit:
Owja, trouwens is er ook [Traefik - Proxy/Loadbalancer] Ervaringen & Discussie Daar is het onderwerp Traefik veel meer ontopic :P

[ Voor 6% gewijzigd door RobertMe op 09-10-2025 22:03 ]


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
RobertMe schreef op donderdag 9 oktober 2025 @ 21:50:
Overigens niet alles gevolgd, maar waarom ben je nu, zo ontzettend tegen je zin in, alsnog de overstap aan het maken? Je geeft uhm, al jaren op Traefik af en vind Caddy geweldig.
Die snap ik ook niet helemaal eigenlijk. Misschien toch lichtelijke FOMO voor @Mars Warrior :P ? Dat zou mij namelijk ook kunnen gebeuren O-).

Ik begrijp alleen niet zo goed waarom @Mars Warrior unhealthy containers heeft eigenlijk. Ik heb geen enkele unhealthy container, maar ik heb wel een boel containers zonder health check. Meestal omdat ik niet de moeite heb genomen om de health check in te stellen in Compose O-). Het is overigens wel mogelijk om de health check uit te zetten als je er 'last van hebt':

compose.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
services:
  # Oudere Docker Compose
  your-service:
    healthcheck:
      test: ["NONE"]

  # Moderne Docker Compose, waarschijnlijk wil je deze
  your-service:
    healthcheck:
      disable: true


Als ik het me goed kan herinneren scheelt dit ook (een aantal) CPU cycles :).

Eveneens lijkt het mogelijk om Traefik Docker health checks te laten negeren met de optie allowEmptyServices:

traefik.yaml
YAML:
1
2
3
4
5
6
7
8
providers:
  providersThrottleDuration: 15s

  docker:
    watch: true
    exposedByDefault: false
    allowEmptyServices: true
    network: "swarm-overlay"

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Om nog even terug te komen op mijn monitoring vraag. Ik ben vandaag toch weer teruggegaan naar Beszel. Ik heb geen zin om Grafana te leren. Hoe zeer mijn FOMO dan opspeelt :+. Daarbovenop komt dan ook nog dat Docker stats - wat voor mij een basiscomponent is - lastig energiezuinig én betrouwbaar in Prometheus te krijgen zijn. Het zal allicht allemaal aan mij en mijn setup liggen, maar tegen het eenvoudige karakter van Beszel kan dit dan gewoon niet op.

Wel heb ik met Ansible de disk mounts toegevoegd aan de agent container(s). Die miste ik wel echt in Beszel en was ook een van de redenen dat ik over wilde gaan. Ik heb hiermee nog twee punten openstaan:
  • Reverse Proxy statistieken en access logging (Traefik en...? maar hier OT)
  • Uitval van statistieken bij hoge load (maar hier ook enigszins OT)
Waarbij dat laatste door Unraid en mijn Docker setup lijkt te komen.

Maar goed, ik ben blij met het resultaat, inclusief Intel GPU monitoring en dus de afzonderlijke disks:
Afbeeldingslocatie: https://tweakers.net/i/it-Ic-98YNlsQsiePDQdHkXFnrk=/232x232/filters:strip_exif()/f/image/YuEti3cN8VE5XdKhbOaoidzs.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/kKYompGGw29scaMv-SM5GpkarFk=/232x232/filters:strip_exif()/f/image/ry75pQj9UcY8yC4IuXW6QMJL.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/LWZXPuqBV465dVq09V4nd7aYvUc=/232x232/filters:strip_exif()/f/image/enNosT7qp8BR4E78jt09dxoT.png?f=fotoalbum_tile

Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op donderdag 9 oktober 2025 @ 22:09:
Ik begrijp alleen niet zo goed waarom @Mars Warrior unhealthy containers heeft eigenlijk. Ik heb geen enkele unhealthy container, maar ik heb wel een boel containers zonder health check. Meestal omdat ik niet de moeite heb genomen om de health check in te stellen in Compose O-). Het is overigens wel mogelijk om de health check uit te zetten als je er 'last van hebt':

compose.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
services:
  # Oudere Docker Compose
  your-service:
    healthcheck:
      test: ["NONE"]

  # Moderne Docker Compose, waarschijnlijk wil je deze
  your-service:
    healthcheck:
      disable: true


Als ik het me goed kan herinneren scheelt dit ook (een aantal) CPU cycles :).
Ik denk dat @Mars Warrior daar bekend mee is. Want in het zuinige server topic begon die juist over een hoger stroomverbruik (of in ieder geval package power usage) door een container die "stiekem" een health check had geïntroduceerd :P

Bedoel je trouwens niet "Docker Compose" i.p.v. "oudere Docker Compose" en "Compose" i.p.v. "moderne Docker Compose" O-) De "nieuwe" is immers een semi onafhankelijke standaard.
Eveneens lijkt het mogelijk om Traefik Docker health checks te laten negeren met de optie allowEmptyServices:

traefik.yaml
YAML:
1
2
3
4
5
6
7
8
providers:
  providersThrottleDuration: 15s

  docker:
    watch: true
    exposedByDefault: false
    allowEmptyServices: true
    network: "swarm-overlay"
Cool. Gevalletje RTFM dus :+. Ik had wel even snel gezocht (/DuckDuckGo). En eerste hit was een issue met een "gaan we niet doen" reply en closed. Blijkbaar later dus alsnog toegevoegd.

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

RobertMe schreef op donderdag 9 oktober 2025 @ 21:50:
[...]
De container is unhealthy, dus...? Wat zou die er dan mee moeten doen? Daadwerkelijk requests uitvoeren kan die toch niet.
Als de health-check faalt wil dat niet per definitie zeggen dat er ook maar iets aan de container mankeert. Sommige containers hebben een manke health-check namelijk. Al mijn unhealthy containers werken gewoon, al jaaaaaaaaaaaaaaaaaaaaaren.

Het gedrag van Traefik in dit geval staat ook nergens uitgelegd als intro. Het is dat ik logging=DEBUG heb aangezet, dat ik die melding voorbij zag komen.

En ja, ook ik heb er op gezocht. Maar een naam als allowEmptyServices klinkt nu niet echt logisch, of wel?

De documentatie laat ook hier nogal wat steken vallen: https://doc.traefik.io/tr...providersThrottleDuration beschrijft geen defaults, laat staan of het ms/sec/uren zijn. Typische technische documentatie die voor mij zo ongeveer onbruikbaar is.
Overigens niet alles gevolgd, maar waarom ben je nu, zo ontzettend tegen je zin in, alsnog de overstap aan het maken? Je geeft uhm, al jaren op Traefik af en vind Caddy geweldig.
Ik vind de eenvoud van Caddy geweldig samen met de docker proxy plugin. 3 regels labels en gaan _/-\o_

Maar als je wat meer wilt, bijv met L4 of andere dingen, dan loop je tegen allerhande syntax problemen aan omdat de syntax soms conflicteerd met YAML maps, en dus ben ik veel tijd kwijt. Ook het niet kunnen mixen van een algemene config en de label config is soms een show stopper.

Verder heb ik steeds meer last van bots en andere irritante (AI) scrapers die robots.txt negeren en daarmee mijn back ends onnodig belasten: alles wordt wel tegengehouden dankzij WAFjes in de containers zelf, maar ik wil dat liever aan de voorkant allemaal om zeep helpen. Ik heb nu totaal richting de 2.000 (!!!) actieve lock-outs in de diverse containers.

Vandaar was ik al aan het inlezen over CrowdSec en Anubis, en stomtoevalig kwam @alex3305 vervolgens met wat voorbeelden op de proppen en liet dus zien hoeveel er - ondanks Cloudflare - toch wordt tegengehouden. En Traefik kan in deze een betere/makkelijkere integratie bieden dan Caddy, zeker als je het met de docker proxy plugin wilt regelen: dat is bijna geen doen :'(

En verder heb je tegenwoordig ChatGPT die de omzetting van Caddy labels naar Treafik labels stukken eenvoudiger maakt. Oké, dat ding verzint af en toe labels en functionaliteit die helemaal niet bestaan, maar dan crashed Traefik gewoon 8)7

En op mijn vraag waarom ChatGPT niet bestaande velden gebruikt...
💯 Hele terechte (en terechte felle 😉) vraag — en je hebt gelijk om dat scherp te stellen.
Laat me dat even goed uitleggen, want dit gaat over een grens tussen conceptuele uitleg en echte YAML-syntax bij Traefik.
🧩 1️⃣ Wat er precies gebeurde

Toen ik die snippet eerder schreef met:

regex: ".*(xx\\.com|yy\\.nl|zz\\.com).*"

… was dat bedoeld als commentaar / illustratief concept,
niet als geldige Traefik-config — maar ik heb dat niet duidelijk genoeg gemarkeerd.
In Caddy kun je soortgelijke domein-filters wél rechtstreeks doen in de global config,
en ik probeerde te laten zien hoe dat idee er in Traefik uit zou zien,
maar dat was fout geplaatst: het leek alsof dat veld echt bestond.

Kortom: mijn fout ✅ — dat hoort niet thuis in een echte traefik.yaml.
Dus ik was er al even mee bezig. Het is niet dat ik spontaan ff denk: ach laat ik ff voor de gein dingen gaan omzetten voor 50 containers die ook nog eens veel extern gebruikt worden :X

Ik heb nu weer een werkende config: ik zie wel dat Traefik ca 30ms trager is dan Caddy, maar dat is dan maar zo. Ik heb nog niet naar optimalisaties gekeken, of dat Redis oid nog kan helpen.

Ik ga ervan uit dat dankzij die enkele access.log van Traefik (ipv per domein/site) en de efficientie van CrowdSec, dat dit sowieso sneller is dan de PHP WAFjes op de backends.

Ook lijkt het minder werk dan alles met Fail2Ban trachten te regelen, zeker als ik ook de CrowdSec firewall gebruik die alles meteen op OS niveau blokkeert (iptables/nftables).

Dus er komen weer een paar leuke docker containers bij _/-\o_

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +1 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Zo!
alex3305 schreef op woensdag 8 oktober 2025 @ 21:57:
@Mars Warrior Voor de goede orde, het documentatiepunt was geen kritiek hè :). Ik snap niet dat mensen ChatGPT of iets vergelijkbaars eenvoudig vinden. Ik vind documentatie lezen dan vaak eenvoudiger :+.
Mijn neurodiverse brein ziet liever plaatjes en samenhang. Die ontbreekt vaak, dus ik heb vaak moeite met tig pagina's documentatie lezen terwijl ik niet weet wat ik zoek :D

Als ik ChatGPT de link geef van de actuele documentatie, dan is die vaak goed in staat om dingen te zoeken en samen te vatten. Scheelt me gewoon veel tijd.

Het is wel zo dat je altijd kennis moet hebben van de materie, want ChatGPT verzint nogal eens wat, of claimt dat iets kan wat helemaal niet kan. Dus je zult moeten blijven vragen, zo van "Ken je dit pakket". "Welke versies ken je", etc. om te weten wat de referentie voor de antwoorden is.

Maar heb je eenmaal wat dingen op orde met ChatGPT dan kan deze dus heel goed labels vertalen in dit geval van Caddy naar Traefik, maar ook vertaalbestanden aanmaken voor Wordpress. Er zit vaak wel een beperking in de output qua regels, oftewel je zult dingen zelf moeten ophakken, of ChatGPT in batches laten werken, maar het gaat alsnog factoren sneller dan ik ooit zelf zou kunnen doen.

Met CrowdSec (zie hieronder voor metrics) had ik ook ff problemen met ChatGPT die de oude parameters in eerste instantie nam...

code:
1
2
3
4
5
| Situatie                    | Te gebruiken parameters                          |
| --------------------------- | ------------------------------------------------ |
| Oudere plugin (≤ 1.2)       | `api_url`, `api_key`, `log_level`                |
| Nieuwe plugin (≥ 1.3 / 1.4) | `CrowdsecLapiUrl`, `CrowdsecLapiKey`, `LogLevel` |
| Jouw foutmelding?           | Gebruik **de nieuwe** namen                      |

Maar dat eenmaal duidelijk kwamen alle definities voor crowdsec zelf en Traefik eruit rollen. Die heb ik in de betreffende yaml bestanden gezet, en gaan met die banaan...

Ik laat dit voorlopig ff draaien om te zien wat CrowdSec oppikt. AppSec komt dan later wel.
Ik zag wel dat de GUI niet meer wordt meegeleverd, en dat je nu moet koppelen met een gratis account in de cloud.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Acquisition Metrics                                                                                                        │
├──────────────────────────────────┬────────────┬──────────────┬────────────────┬────────────────────────┬───────────────────┤
│ Source                           │ Lines read │ Lines parsed │ Lines unparsed │ Lines poured to bucket │ Lines whitelisted │
├──────────────────────────────────┼────────────┼──────────────┼────────────────┼────────────────────────┼───────────────────┤
│ file:/var/log/traefik/access.log │ 467        │ 467          │ -              │ 12                     │ 457               │
╰──────────────────────────────────┴────────────┴──────────────┴────────────────┴────────────────────────┴───────────────────╯
╭─────────────────────────────────────────────────╮
│ Local API Decisions                             │
├───────────────────────┬────────┬────────┬───────┤
│ Reason                │ Origin │ Action │ Count │
├───────────────────────┼────────┼────────┼───────┤
│ ssh:exploit           │ CAPI   │ ban    │ 516   │
│ vm-management:exploit │ CAPI   │ ban    │ 35    │
│ generic:scan          │ CAPI   │ ban    │ 1185  │
│ http:bruteforce       │ CAPI   │ ban    │ 6384  │
│ http:crawl            │ CAPI   │ ban    │ 18    │
│ http:exploit          │ CAPI   │ ban    │ 16    │
│ http:scan             │ CAPI   │ ban    │ 4446  │
│ ssh:bruteforce        │ CAPI   │ ban    │ 2394  │
╰───────────────────────┴────────┴────────┴───────╯
╭────────────────────────────────────╮
│ Local API Metrics                  │
├────────────────────┬────────┬──────┤
│ Route              │ Method │ Hits │
├────────────────────┼────────┼──────┤
│ /v1/alerts         │ GET    │ 3    │
│ /v1/heartbeat      │ GET    │ 20   │
│ /v1/usage-metrics  │ POST   │ 1    │
│ /v1/watchers/login │ POST   │ 4    │
╰────────────────────┴────────┴──────╯
╭───────────────────────────────────────────╮
│ Local API Machines Metrics                │
├───────────┬───────────────┬────────┬──────┤
│ Machine   │ Route         │ Method │ Hits │
├───────────┼───────────────┼────────┼──────┤
│ localhost │ /v1/alerts    │ GET    │ 3    │
│ localhost │ /v1/heartbeat │ GET    │ 20   │
╰───────────┴───────────────┴────────┴──────╯
╭────────────────────────────────────────────────────────────────╮
│ Parser Metrics                                                 │
├────────────────────────────────────┬───────┬────────┬──────────┤
│ Parsers                            │ Hits  │ Parsed │ Unparsed │
├────────────────────────────────────┼───────┼────────┼──────────┤
│ child-crowdsecurity/http-logs      │ 1.40k │ 1.09k  │ 316      │
│ child-crowdsecurity/traefik-logs   │ 467   │ 467    │ -        │
│ crowdsecurity/dateparse-enrich     │ 467   │ 467    │ -        │
│ crowdsecurity/geoip-enrich         │ 10    │ 10     │ -        │
│ crowdsecurity/http-logs            │ 467   │ 467    │ -        │
│ crowdsecurity/non-syslog           │ 467   │ 467    │ -        │
│ crowdsecurity/public-dns-allowlist │ 467   │ 467    │ -        │
│ crowdsecurity/traefik-logs         │ 467   │ 467    │ -        │
│ crowdsecurity/whitelists           │ 467   │ 467    │ -        │
╰────────────────────────────────────┴───────┴────────┴──────────╯
╭────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Scenario Metrics                                                                                   │
├──────────────────────────────────────┬───────────────┬───────────┬──────────────┬────────┬─────────┤
│ Scenario                             │ Current Count │ Overflows │ Instantiated │ Poured │ Expired │
├──────────────────────────────────────┼───────────────┼───────────┼──────────────┼────────┼─────────┤
│ crowdsecurity/http-crawl-non_statics │ -             │ -         │ 9            │ 9      │ 9       │
│ crowdsecurity/http-probing           │ -             │ -         │ 3            │ 3      │ 3       │
╰──────────────────────────────────────┴───────────────┴───────────┴──────────────┴────────┴─────────╯
╭───────────────────────────────────────────────────────────────────────────────────────╮
│ Whitelist Metrics                                                                     │
├────────────────────────────────────┬─────────────────────────────┬──────┬─────────────┤
│ Whitelist                          │ Reason                      │ Hits │ Whitelisted │
├────────────────────────────────────┼─────────────────────────────┼──────┼─────────────┤
│ crowdsecurity/public-dns-allowlist │ public DNS server           │ 467  │ -           │
│ crowdsecurity/whitelists           │ private ipv4/ipv6 ip/ranges │ 467  │ 457         │
╰────────────────────────────────────┴─────────────────────────────┴──────┴─────────────╯

Edit:
Gratis account aangemaakt, en de eerste bans zijn inmiddels uitgedeeld _/-\o_

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Nou. Crowdsec loopt lekker. Het aantal Alerts stijgt ook!

Maar wat me opvalt: Alle IP adressen van deze alerts staan ook in de lijst van https://threathive.net/
Deze IP lijst bevat iets van 120.000 IPv4 adressen van bekende etterbakjes en wordt elke 15 minuten bijgewerkt.

Er is een leuk script op deze site die deze lijst ophaalt en geschikt maakt om te importeren in CrowdSec. Dus misschien leuk om te gebruiken :D

Je bent dan in ieder geval van grote bekende overlastgevers af.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

@alex3305 , heb jij nog een voorbeeld van AppSec config?

Ik heb deze guide gevolgd: https://docs.crowdsec.net...ppsec/quickstart/traefik/

Ik kom niet uit de documentatie qua wat nu aan elkaar hangt. Bij mij is elke keer als ik AppSec actief maak dat alle websites geblokkeerd worden.

Maar ik zie talloze voorbeelden daarna met "bouncer", "crowdsec-bouncer" en meer. Dus hoe moet dat heten? Er wordt ook een bouncer "TRAEFIK" aangemaakt zie ik via een environment var: die moet dan BOUNCER_KEY_TRAEFIK heten.

YAML:
1
2
3
4
5
6
7
8
9
  infra-crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: infra-crowdsec
    environment:
      # - COLLECTIONS=crowdsecurity/traefik
      ## Please note the spaces between the collections names (hence why the quotes are needed)
      - 'COLLECTIONS=crowdsecurity/traefik crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules'
      - TZ=Europe/Amsterdam
      - BOUNCER_KEY_TRAEFIK="KEY"

Met wat geklooi heb ik nu 3 bouncers, ieder met hun eigen API key
code:
1
2
3
4
5
6
7
------------------------------------------------------------------------------
 Name              IP Address  Valid  Last API pull  Type  Version  Auth Type
------------------------------------------------------------------------------
 traefik-bouncer               ✔️                                   api-key
 TRAEFIK                       ✔️                                   api-key
 crowdsec-bouncer              ✔️                                   api-key
------------------------------------------------------------------------------


In traefik.yaml, conform voorbeelden:
YAML:
1
2
3
4
5
experimental:
  plugins:
    bouncer:
      moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
      version: v1.4.5


Ik heb in middlewares.yaml:
YAML:
1
2
3
4
5
6
7
8
9
10
11
    crowdsec:
      plugin:
        bouncer:
          crowdsecLapiUrl:  "http://infra-crowdsec:8080/"
          crowdsecLapiKey:  "KEY"
          LogLevel: DEBUG
          enabled: false
          crowdsecAppsecEnabled: false
          crowdsecAppsecHost: infra-crowdsec:7422
          crowdsecAppsecFailureBlock: false
          crowdsecAppsecUnreachableBlock: false


De AppSec yaml file, met volgens de documentatie 0.0.0.0 adres vanwege docker.
YAML:
1
2
3
4
5
6
7
appsec_config: crowdsecurity/appsec-default
labels:
    type: appsec
listen_addr: 0.0.0.0:7422
# listen_addr: 127.0.0.1:7422
source: appsec
name: myAppSecComponent

Maar wat ik ook invul onder "bouncer", alle sites gaan op 403 op het moment dat ik enabled op true zet :'(

Enig idee wat ik nu weer fout doe?

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +1 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Omdat @alex3305 zo aardig was om ff in het Traefik topic te helpen heb ik CrowdSec nu lekker draaien.

Ik krijg gemiddeld zo'n 100 alerts per dag. De gratis versie van de CrowdSec console toont enkel 500 alerts per maand: dat is voor mij dus na 5 dagen op :(
Gelukkig neemt dit aantal wel af doordat ik nu een dynamische bantijd gebruik: afhankelijk van het aantal voorgaande "decisions", wordt de bantijd nu verlengd!

Dus ik dacht ach: containertje erbij en hoppa: dan maak ik me eigen dashboards wel met Metabase:
  • Container erbij (enkel Metabase met eigen database, Postgres wilde niet op de één of andere manier)
  • Container erbij voor de ronde vlaggetjes (kon geen cdn vinden)
  • CrowdSec database ff leesbaar maken qua rechten
  • ChatGPT de queries laten maken nadat ik de tabel en veldnamen had doorgegeven. Dat ding snapt de queries voor SQLite zodat ik zonder zoekwerk die kolommen als "Geleden" en "Resterend" heb: dat zijn flinke CASE statements namelijk!
De Alerts, inclusief wat verdelingen naar land
Amerika en Japan zijn duidelijk de favoriteten, waarbij de ASN in heel veel gevallen of Amazon is, of Microsoft. Dus die cloud wordt goed gebruikt door de verschillende botjes :D

Afbeeldingslocatie: https://tweakers.net/i/2xyJBWru08GKgMP4H8mjCaAr1Z0=/800x/filters:strip_exif()/f/image/U5kNzYPNoCEQeC4ljdDyDJ8V.png?f=fotoalbum_large

De "Geleden" kolom in de "Laatste 100 Alerts" tabel als voorbeeld die ChatGPT er in één keer werkend uitpoepte. Of het allemaal perfect geoptimaliseerd is weet ik niet. De query duurt 6ms, dus ik maak me daar niet druk om:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
SELECT
    id,
    datetime(created_at, 'localtime') AS "Tijdstip",

    CASE
        WHEN CAST((julianday('now') - julianday(created_at)) * 24 * 60 AS INT) < 60
            THEN printf('%d minuten geleden',
                CAST(((julianday('now') - julianday(created_at)) * 24 * 60) % 60 AS INT)
            )
        WHEN CAST((julianday('now') - julianday(created_at)) AS INT) = 0
            THEN printf('%d uur geleden',
                CAST(((julianday('now') - julianday(created_at)) * 24) % 24 AS INT)
            )
        WHEN CAST((julianday('now') - julianday(created_at)) AS INT) = 1
            THEN
                CASE
                    WHEN CAST(((julianday('now') - julianday(created_at)) * 24) % 24 AS INT) = 0
                        THEN '1 dag geleden'
                    ELSE printf('1 dag, %d uur geleden',
                        CAST(((julianday('now') - julianday(created_at)) * 24) % 24 AS INT)
                    )
                END
        ELSE
            CASE
                WHEN CAST(((julianday('now') - julianday(created_at)) * 24) % 24 AS INT) = 0
                    THEN printf('%d dagen geleden',
                        CAST((julianday('now') - julianday(created_at)) AS INT)
                    )
                ELSE printf('%d dagen, %d uur geleden',
                    CAST((julianday('now') - julianday(created_at)) AS INT),
                    CAST(((julianday('now') - julianday(created_at)) * 24) % 24 AS INT)
                )
            END
    END AS "Geleden",

    source_ip          AS "IP",
    source_country     AS "Land",
    source_as_name     AS "ASN naam",
    scenario           AS "Scenario",
    events_count       AS "Aantal events",
    CASE
        WHEN remediation = 1 THEN '✅'
        WHEN remediation = 0 THEN '❌'
        ELSE '❔'
    END AS "Remedie"

FROM alerts
WHERE source_scope = 'Ip'
ORDER BY created_at DESC
LIMIT 100;


De Decisions, inclusief wat verdelingen naar land
Je ziet hier duidelijk het resultaat van dynamische / progressieve bantijden: bij elke overtreding komt er een dag bij namelijk.
Er zijn nu dus 142 actieve bans! (let op: meerdere per IP, omdat CrowdSec zo werkt)

Afbeeldingslocatie: https://tweakers.net/i/TvsvJ8zJFwhAVqNJfvVIlH4szgA=/800x/filters:strip_exif()/f/image/2F789DMg5dUreiqcSajdShU0.png?f=fotoalbum_large

De WAFjes (Web Application Firewalls) op de backends hebben de laatste dagen steeds minder te doen, sommige melden al dagen helemaal niks meer. Een teken dat de CrowdSec + AppSec firewall in Traefik zijn/haar werk doet!

[ Voor 5% gewijzigd door Mars Warrior op 18-10-2025 19:09 . Reden: Nu met ronde vlaggetjes! ]

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 10:56

StarWing

Huh ?!?

Ik heb afgelopen weekend een aparte post gemaakt met een vraag, maar het lijkt me ondertussen beter dat ik deze hier stel.
Ik ben al een tijdje bezig met docker, en heb een aantal containers draaien. Ik ben verre van een expert, en er zitten geen ingewikkelde scripts achter, maar alles werkt :)
Enkel een directory \docker met elke container in een aparte submap en bijhorende docker-compose, en een watchtower die de boel up-to-date houd.
Deze docker host staat op een ESXi machine, maar ik wil hier op termijn van af. De bedoeling is van de resterende services die een aparte VM vereisen (oa Home Assistant) in een nieuwe docker container te gooien.
Echter zitten deze op een aparte IoT vlan. En da's waar ik een probleem heb. Ik snap het idee achter netwerken etc, maar heb totaal geen idee hoe ik dit moet configureren in docker. Laat staan zonder de huidige config te breken.
Ik heb me ondertussen ingelezen in dit topic, maar 100% zeker ben ik toch niet, en ik heb totaal geen zin om mijn bestaande docker host te slopen (zoals ik in het verleden wel eens gedaan heb).

In eerste instantie is het idee van op de ubuntu host een 2de netwerkkaart toe te voegen en aldaar een test container aan te hangen om te zien of mijn opzet werkt, cfr de eerdere post die ik gemaakt heb.
Naderhand wil ik in eerste instantie de resterende services migreren naar docker en nadien een nieuwe server bouwen, maar dan bare metal ipv met esxi.

Onderstaande is een tekening hoe ik het in gedachten heb, lijkt dit wat, of sla ik hier de bal mis met mijn beperkte kennis ? En vooral, hoe moet ik dit aanpakken qua docker configuratie en aanpassingen in de docker-compose bestanden?
Afbeeldingslocatie: https://tweakers.net/i/IvxhVy7VzPtjQMQHXzekm8XO44I=/fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():strip_exif()/f/image/MRxiJ58Z1OSarQpajY5pIIXg.jpg?f=user_large

Page intentionally left blank.


Acties:
  • +2 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
@StarWing - de werking op een host is niet anders dan in een VM.

Dit wil zeggen dat de ens160 van je Ubuntu host automagically in je management vlan komt te zitten - doorgaans vlan 1. In de host networking config voeg je daar een of meer virtuele interfaces toe - bijvoorbeeld ens160.10 en ens160.30 voor respectievelijk vlan 10 en 30 - elk met hun eigen subnet.

Als je de containers start met de host interface (i.p.v. de standaard bridge interface) dan zijn alle containers via alle interfaces bereikbaar. Als je de containers start met de bridge interface kan je het IP adres van een van de host interfaces toevoegen aan de poortnummers waardoor de container alleen via dat IP adres bereikbaar is.

Hoewel je in Ubuntu kunt werken met secondary IP adressen is het niet handig om op een interface meerdere IP adressen te hebben. Ik weet ook niet hoe Docker containers dat gaan zien - nooit geprobeerd.

Weet dat een HASS-VM functioneel niet gelijk is aan een Docker uitvoering - je gaat hiervoor waarschijnlijk meerdere Docker containers moeten starten.

Als je perse van ESX af wil ben je het beste af bent met de inzet van Proxmox. En via een Proxmox VM ga je dan de puzzel kunnen leggen om alles met Docker containers in te kleuren. Heb je dit in een VM allemaal draaien, dan kan je dan die config porten naar de host. Maar je gaat hoe dan ook een steile leercurve tegemoet met als mogelijk eindresultaat een Proxmox host met een of meer VM's en/of LXC containers. En daarbinnen een of meer Docker containers... bij mij heeft dat in ieder geval zo uitgepakt... :+

makes it run like clockwork


Acties:
  • +3 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@StarWing Docker containers in een eigen VLAN lijkt snel een enorme uitdaging, maar is vaak relatief eenvoudig :). Kort door de bocht zul je één of meerdere bruggen moeten slaan tussen het netwerk in de container en de buitenwereld. Ongeacht of daar onder water 1, 2 of 20 NICs aan hangen. Zo draaien mijn machines in het beheernetwerk op 192.168.1.0/24, maar hebben de containers een eigen VLAN. Bijvoorbeeld op 192.168.12.0/24.

Er zijn in Docker twee manieren, of eigenlijk netwerkdrivers, om dit te bereiken: ipvlan en macvlan. Met de macvlan driver krijgen de containers een eigen MAC-adres en worden ze dus als apart device door de (switch of) router gezien. Bij ipvlan krijgen ze hetzelfde MAC-adres als de host, maar hebben de containers een eigen IP-adres. Zelf heb ik de voorkeur voor ipvlan, vooral omdat MAC-adressen nog weleens willen wijzigen na bijvoorbeeld een reboot.

Het opzetten van een ipvlan netwerk is kinderlijk eenvoudig:
docker network create -d ipvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    -o parent=enp3s0 \
    br0

Waarmee je netwerk br0 maakt zonder vlan tagging. Wil je ipvlan maken voor een vlan, dan is het commando net ff anders:
docker network create -d ipvlan \
    --subnet=192.168.38.0/24 \
    --gateway=192.168.12.1 \
    -o parent=enp3s0.12 \
    br0.12

Docker maakt nu voor mij het br0.12 netwerk aan en creeërt eveneens een nieuwe networkinterface:
$ ip a
2423: enp3s0.12@enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

Docker containers kan ik vervolgens koppelen aan dit netwerk om te testen:
$ docker run --rm -it --network br0.12 alpine /bin/sh
/ # wget -O- tweakers.net
Resolving tweakers.net (tweakers.net)... 2.18.244.96, 2.18.244.78
Connecting to tweakers.net (tweakers.net)|2.18.244.96|:80... connected.
...


Wel opletten dat dit alleen werkt in een VLAN-aware omgeving. Met mijn oude ASUS router kreeg ik dit niet aan de praat. Op mijn Unifi spullen moet ik ook het 192.168.12.0/24 netwerk aangemaakt hebben om het werkend te krijgen. Zorg er dus voor dat je dit van te voren configureert!

Verder zie ik weinig brood in jouw opzet, maar dat komt omdat ik het groeperen niet helemaal begrijp. Maar goed, je moet het opzetten zoals jij het wilt. Ik heb bijvoorbeeld een reverse proxy die aan ipvlan netwerk zit en de rest gaat allemaal met overlay netwerken. Een enkele uitzondering nagelaten. Tegelijkertijd ben ik ook niet zo begonnen jaren geleden. Dat is allemaal natuurlijk gegroeid. D'r is geen goed of fout hè. Jij moet het beheren.

In Docker kun je overigens ook meerdere netwerken aan containers hangen. Ik snap dus niet helemaal wat @Airw0lf bedoelt. Er zijn containers bij mij bij die 3 of 4 IP-adressen hebben. Vooral intern. In totaal heb ik meer dan 25 netwerken met twee of meer containers. Zo vind ik het prettig.

Op mijn lijstje staat ook nog container isolatie binnen netwerken. Maar daar moet ik nog een keer uitgebreid voor gaan zitten.

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
@alex3305 - misschien wat veel vragen tegelijk...
  1. Wat bedoel je precies met "meerdere netwerken aan containers hangen"?
  2. Wat is het idee achter "meer dan 25 netwerken met twee of meer containers"?
  3. Hoe doe je dat? Dat met 3 of 4 (interne) IP adressen aan een container?
Alvast unne dikke mercie voor de moeite! d:)b

[ Voor 40% gewijzigd door Airw0lf op 20-10-2025 21:58 ]

makes it run like clockwork


Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Airw0lf schreef op maandag 20 oktober 2025 @ 21:54:
@alex3305 - misschien wat veel vragen tegelijk...
Nee joh, natuurlijk niet. Daarvoor is toch dit topic? :) Ik zal ze stuk voor stuk beantwoorden.
1. Wat bedoel je precies met "meerdere netwerken aan containers hangen"?
Netwerken werken in Docker net zoals in Linux, maar dat wist je al :). Echter kun je natuurlijk zoveel mogelijk netwerken aan een Docker container hangen als je wilt. Sterker nog, je kunt zelfs verschillende netwerktypes combineren voor soms wat bijzondere set-ups :9.

Ik heb dus setups (bijna allemaal O-) ) waar ik meerdere netwerken aan één container heb hangen. Bijvoorbeeld mijn Traefik (reverse proxy) container:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
services:
  traefik:
    container_name: traefik
    image: traefik:v3.5.3
    networks:
      internal:
      ingress:
      ipvlan:
        ipv4_address: 192.168.10.10
        ipv6_address: 0123:4567:891a:1:b00b::135
      docker-socket:
      metrics:
    depends_on:
      - socket-proxy
      - valkey

  logrotate:
    container_name: traefik-logrotate
    image: ghcr.io/vegardit/traefik-logrotate:latest
    networks:
      docker-socket:
    depends_on:
      - traefik
      - socket-proxy
    volumes:
      - logs:/var/log/traefik:rw
    security_opt:
      - no-new-privileges=true

  socket-proxy:
    container_name: traefik-socket-proxy
    image: lscr.io/linuxserver/socket-proxy:latest
    restart: on-failure:5
    networks:
      docker-socket:
    environment:
      EVENTS: 1
      PING: 1
      VERSION: 1
      INFO: 1
      CONTAINERS: 1
      ALLOW_RESTARTS: 1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:rw
    healthcheck:
      test: "wget --no-verbose --tries=1 --spider http://localhost:2375/info || exit 1"
    read_only: true
    tmpfs:
      - /run
    security_opt:
      - no-new-privileges=true

networks:
  internal:
    name: traefik-internal
    driver: overlay
    attachable: true

  ingress:
    name: swarm-overlay
    external: true

  ipvlan:
    name: br0.10
    external: true

  docker-socket:
    name: traefik-docker-socket
    attachable: false

  logging:
    name: logging-overlay
    external: true

  metrics:
    name: metrics-overlay
    external: true


Waarbij elk netwerk een eigen functie heeft:
  • internal: is een intern Swarm overlay netwerk voor Traefik waar Traefik, Redis en op mijn andere host traefik-kop aan gekoppeld zitten. Zo kan traefik-kop verbinding maken met Redis en Traefik voor config changes.
  • ingress: is het Docker Swarm overlay 'ingress' netwerk waar alle services aan zitten die naar buiten ontsloten worden.
  • ipvlan: zorgt voor de koppeling naar buiten via een eigen IPv4 en IPv6 adres. Deze adressen heb ik hier 'vast' geconfigureerd
  • docker-socket: koppelt aan een Docker Socket container die beperkte machtigingen heeft naar de Docker Socket onder water. Ook logrotate maakt hier gebruik van zodat logs veilig opgeruimd kunnen worden
  • logging: zorgt ervoor dat Grafana Alloy (ook in de stack) de logs van Traefik naar Grafana Loki kan krijgen
  • metrics: verzorgt de Prometheus metrics en zit dus gekoppeld aan... Prometheus :9.
Naast een vorm van veiligheid, zorgt deze segregatie er ook voor dat ik eenvoudig kan zien en bijhouden welke diensten waar gebruik van maken. Met docker network inspect logging kan ik bijvoorbeeld zien welke containers er überhaupt aan het logging netwerk hangen.

Elk netwerk heeft dus ook eigen permissies en eventuele afhankelijkheden. Mijn stack deploy ik met Ansible, waar ik dit ingeregeld heb. Daar heb ik ook variabelen voor deze netwerknamen. En als die missen zal het netwerk simpelweg niet gekoppeld worden :). Op die manier kan ik ook heel eenvoudig modulair onderdelen toevoegen of weghalen als ik ze niet meer wil gebruiken, zonder dat ik heel mijn stack om moet gooien.
2. Wat is het idee achter "meer dan 25 netwerken met twee of meer containers"?
Naast bovenstaand voorbeeld, vind ik Forgejo ook nog een mooi voorbeeld om dit mee te illustreren. De Forgejo Docker Compose stack maakt een netwerk aan bij de deployment. Dit interne Forgejo netwerk gebruik ik vervolgens voor o.a. de Forgejo Runner(s) en communicatie. Hierdoor kan een gedeelte van de communicatie binnendoor lopen en hoeft het niet allemaal (onnodig) langs de reverse proxy.
3. Hoe doe je dat? Dat met 3 of 4 (interne) IP adressen aan een container?
Al deze netwerken hebben een eigen subnet, al dan niet door mij aangemaakt. Voor elk netwerk maakt Docker in de container een interface aan met een bijbehorend IP adres. Er is een prioriteit mogelijkheid, maar die werkt niet. Ik heb daar eerder ook al iets over geschreven. In de praktijk is de prioriteit alfabetisch. Wel zou je per netwerk een hostname aan kunnen geven waarmee je dus specifiek per netwerk zou kunnen routeren.

Eerlijk gezegd heb ik hier nog nooit echt problemen mee gehad. Je kunt het natuurlijk zo eenvoudig of complex maken als je zelf wilt. Zoals ik in mijn vorige post al zei is het allemaal natuurlijk. Momenteel werkt dit voor mij prima en vind ik dit prettig, maar wellicht is dat over een tijdje weer anders.

Ik ben vooral te spreken over de overlay netwerken, aangezien ik Swarm en Compose gebruik. Daarmee is het heel erg eenvoudig om applicaties over meerdere nodes te deployen terwijl het verkeer toch nog op hostname / container name niveau kan gaan. Helaas blijft alleen de DNS nog weleens plakken waardoor je 'onbereikbare' applicaties krijgt zonder herstart. Een vast IPv6 of IPv4 zou dit oplossen, maar het komt zo sporadisch voor dat ik het nog niet heb opgepakt.

Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Airw0lf schreef op maandag 20 oktober 2025 @ 21:54:
Wat bedoel je precies met "meerdere netwerken aan containers hangen"?
Ik ben dan niet @alex3305, maar je kunt prima bij een container meerdere netwerken opgeven. Zo zit bv bij mij de Unbound container (ik gebruik rechtstreeks Unbound met blocklists, geen PiHole / ADG) ook in een stuk of 5 verschillende netwerken.



En mijn opzet is weer heel anders. Doe vrijwel niks met IPv4 intern / op Docker (noch Podman). Container netwerken zitten in hun eigen ::/64 subnet (IPv6 dus) en kunnen rechtstreeks gerouteerd worden (de Docker / Podman host publiceert zijn "eigen" router advertisements dat verkeer voor die ::/64 naar hem gestuurd moeten worden, gaat dus niet expliciet over de router (alhoewel mijn zelfbouw router wel een Podman host is :+)). Indelen in VLANs gaat voor inkomend verkeer kinda vanzelf uiteraard afhankelijk van aan welke netwerken (/bridges) de container is gekoppeld. Uitgaand verkeer doe ik op basis van ip rules. Dus Linux weet bv dat als verkeer over br-prive het systeem verlaat dat die daarvoor de "prive" routing tabel moet gebruiken, en die tabel stelt dus weer dat de default gateway over de "prive" interface gaat (jip, mijn netwerk interfaces hebben logische namen i.p.v. eth0, eth1 of enp0s1, enp1s1, ...). Terwijl de main routing table als default gateway dan (bv) de "lan" interface heeft.

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
@alex3305 en @RobertMe - ja - die Docker overlay netwerken... ik vermoede al dat het die kant op zou gaan... :+

Dat maakt het geheel er niet makkelijker op - sterker nog - de beheer(s)baarheid neemt af en de administratieve (netwerk)lasten verdubbelen omdat je twee keer iets van een IPAM moet opzetten - een voor de vlans en een voor de overlays... tis te zeggen... voor zover ik het begrijp kun je die twee niet bij elkaar vegen via zoiets als pihole/dnsmasq - toch?

Want dat is wat ik op dit moment heb lopen - alles aan vlans, dns en dhcp loopt via pihole/dnsmasq - met een L3-switch als default gateway voor alle vlans en subnetten. Deze aanpak lijkt niet bruikbaar te zijn bij de inzet van een of meer overlay netwerken waardoor er een andere, aanvullende IPAM aanpak nodig is - zo is mijn inschatting tot nu toe.

De inzet van IPv6 lijkt hier niet zo heel veel aan te veranderen.

Dan nog even terug naar de vraag van @StarWing - mijn inschatting is dat zijn/haar leercurve exponentieel toe gaat nemen met de inzet van overlay netwerkjes en het daarmee samenhangende engineering en beheer(s) vraagstuk. Ik denk dat het voor de korte termijn beter is om het vraagstuk te beperken tot de inzet van vlans. En hoe dat te doen met Docker containers. Waarbij er imho maar twee opties zijn: het Docker bridge of host netwerk - ik gok dat die materie bij elkaar al een redelijk stijle leercurve voor hem/haar gaat zijn... :Y

makes it run like clockwork


Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Airw0lf schreef op dinsdag 21 oktober 2025 @ 08:22:
@alex3305 en @RobertMe - ja - die Docker overlay netwerken... ik vermoede al dat het die kant op zou gaan... :+
Ik gebruik helemaal geen overlay netwerk ;)

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
RobertMe schreef op dinsdag 21 oktober 2025 @ 09:05:
[...]

Ik gebruik helemaal geen overlay netwerk ;)
Klopt - jij lost alles op met IPv6 - komt op hetzelfde neer... :+

makes it run like clockwork


Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Airw0lf schreef op dinsdag 21 oktober 2025 @ 09:10:
[...]


Klopt - jij lost alles op met IPv6 - komt op hetzelfde neer... :+
Uhm, nee. Een overlay netwerk is toch echt een Docker specifieke feature (ok, K8s kan het ook). Slim het netwerk inrichten en Linux de juiste routing laten doen is niet afhankelijk van Docker. Noch dat ik het gebruik voor Docker. Containers op de verschillende hosts communiceren op exact dezelfde manier onderling als dat dat tussen PC/laptop en container gaat. (Syncthing op mijn laptop verbind ("hardcoded" / fixed address) met fd00:10:2::2:2000 (always on servertje) en fd00:10:3::2:2000 (on demand on NAS), en Syncthing op servertje verbindt (eveneens met fixed address) met fd00:10:3::2:2000 (NAS) en vise versa). En bv Home Assistant op het ene systeem verwijst ook op een soortgelijke manier naar Piper op het andere systeem. Ook voor die zaken die niet "publiekelijk" zijn maar wel over meerdere hosts draaien gebruik ik geen overlay.

Edit/aanvulling:
En exact hetzelfde kun je ook met IPv4 doen. Alleen is het makkelijker om met IPv6, via een router advertisement, een route naar een subnet te publiceren dan bij IPv4 (met DHCP?, geen idee of extra routes in een DHCP reply kunnen. In ieder geval kan het servertje nooit zijn eigen subnets bekend maken aangezien die geen DHCP server draait dus moet de router op de hoogte zijn van de routes die via het servertje moeten lopen).

[ Voor 17% gewijzigd door RobertMe op 21-10-2025 09:20 ]


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Airw0lf schreef op dinsdag 21 oktober 2025 @ 08:22:
Dat maakt het geheel er niet makkelijker op - sterker nog - de beheer(s)baarheid neemt af en de administratieve (netwerk)lasten verdubbelen omdat je twee keer iets van een IPAM moet opzetten - een voor de vlans en een voor de overlays... tis te zeggen... voor zover ik het begrijp kun je die twee niet bij elkaar vegen via zoiets als pihole/dnsmasq - toch?
Daar ben ik het dus compleet mee oneens. Het is een keuze om de IPAM-config op te zetten en zelf in te regelen. Ik laat dat gewoon aan de daemon zelf over en dat gaat vooralsnog prima. Een kennis van mij klaagde een tijdje terug dat de Docker daemon z'n interne netwerk hetzelfde subnet gaf als een VLAN in Unifi waardoor er vage problemen ontstonden. Echter heb ik dat nog niet eerder gezien, en om eerlijk te zijn heeft hij wel vaker van dit soort 'onbekende' problemen O-).

Overigens begrijp ik niet helemaal waarom je containers überhaupt via DNS of via een eigen DHCP wilt beheren. Op interne netwerken zijn containers sowieso bereikbaar op container naam, of op de hostname-optie, of met aliassen. Een voorbeeld vanuit Compose:

YAML:
1
2
3
4
5
6
7
8
9
services:
  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:2.0.22
    hostname: mosquitto.docker.internal
    networks:
      ingress:
        aliases:
          - mqtt


En in principe hoef ik alleen maar vanuit mijn ingress netwerk / container bij de applicaties te kunnen. Want naast Traefik, is AdGuard Home zowat de enige applicatie die nog aan mijn bridge netwerk hangt. ik wil voor DNS namelijk niet afhankelijk zijn van de reverse proxy.

Hoe de containers onderling adressen toewijzen zal me verder een spreekwoordelijke Unox wezen.
Dan nog even terug naar de vraag van @StarWing - mijn inschatting is dat zijn/haar leercurve exponentieel toe gaat nemen met de inzet van overlay netwerkjes en het daarmee samenhangende engineering en beheer(s) vraagstuk. Ik denk dat het voor de korte termijn beter is om het vraagstuk te beperken tot de inzet van vlans. En hoe dat te doen met Docker containers. Waarbij er imho maar twee opties zijn: het Docker bridge of host netwerk - ik gok dat die materie bij elkaar al een redelijk stijle leercurve voor hem/haar gaat zijn... :Y
Alhoewel ik zeker weet dat je het goed bedoelt, zie ik dat echt compleet anders. Overlay netwerken is misschien nog een brug te ver voor @StarWing, maar ik zou sterk adviseren om in ieder geval te starten met een ipvlan netwerk. Host netwerk is in 99% van de gevallen onnodig. Daarnaast kom je enorm vlug in de problemen met poorttoewijzingen. En het is enorm onveilig, omdat je de controle over poort mappings compleet uit handen geeft.

Het beste zou zijn om kennis over een reverse proxy - welke dan ook - op te gaan doen en op die manier containers te gaan ontsluiten. Dan maakt het uiteindelijk geen klap meer uit of het op een bridge, ipvlan of overlay netwerk draait. Simpelweg omdat je dat onderdeel niet meer naar buiten ontsluit.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@RobertMe Jouw IPv6 aanpak klinkt enorm interessant. Doe jij de IPv6 configuratie in Compose? En dan met SLAAC?

Een tijdje terug heb ik wel getest om mijn complete Docker omgeving naar IPv6 om te zetten aangezien ik van KPN een /48 krijg, maar ik had niet per se het gevoel grip te hebben over de situatie. Vooral security maakte ik me wat zorgen over. Ik had ook best het e.e.a. alleen achter een IP whitelist hangen. En ja, ik had ook mijn IPv6 range toegevoegd, maar toch voelde het... niet lekker :/.

Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
alex3305 schreef op dinsdag 21 oktober 2025 @ 12:43:
@RobertMe Jouw IPv6 aanpak klinkt enorm interessant. Doe jij de IPv6 configuratie in Compose? En dan met SLAAC?
Ik gebruik intern sowieso meerdere ULAs (fd00:<VLAN ID>::/64 met voor de Docker hosts na het VLAN ID het volgende blok een 1 / 2 / 3 voor resp. router / servertje / NAS). En vervolgens gewoon statistische adressering aan de containers.

SLAAC werkt AFAIK uberhaupt niet. Of nouja, als je MACVLAN gebruikt werkt SLAAC gewoon maar dat gaat natuurlijk buiten Docker om. Gebruik je gewoon het bridge network (zoals ik doe) dan heb je geen SLAAC.
Een tijdje terug heb ik wel getest om mijn complete Docker omgeving naar IPv6 om te zetten aangezien ik van KPN een /48 krijg, maar ik had niet per se het gevoel grip te hebben over de situatie.
Belangrijkste ding bij het gebruik van GUAs is dat je waarschijnlijk geen statische prefix hebt en je niet elke keer je Docker + container config overhoop wilt gooien als je een nieuwe prefix krijgt. Heb je wel een statische prefix dan kun je containers ook een statisch IP geven natuurlijk.
Daarom doe ik verkeer uit containers gewoon NATen naar buiten toe. Niet de 100% ideale situatie (IPv6 wil je natuurlijk niet NATen), maar goed genoeg.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@RobertMe Ik heb blijkbaar net te weinig kaas gegeten van IPv6 :9, maar ik begin te begrijpen hoe jouw setup in elkaar zit.

Ik wilde echt puur en alleen met een GUA gaan werken omdat die van KPN zo goad als statisch is. Daarnaast rol ik alles uit met Ansible en is het wisselen van prefix dus ook niet bijster veel werk. Ik heb dat dan zo geconfigureerd:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Global Network configuration
local_ip_range: 192.168.0.0/16
ipv6_prefix: "{{ vault_ipv6_prefix }}" # format 'a13c:3305:1337'

# Secondary Host specific config
ipvlan_ipv6_subnet: "{{ ipv6_prefix }}:2::/64"

# AdGuard Home (primary)
adguard_home_ipvlan_ipv6_address: "{{ ipv6_prefix }}:1:b00b::ad"
# AdGuard Home (secondary)
adguard_home_ipvlan_ipv6_address: "{{ ipv6_prefix }}:2:b00b::ad"

# Pocket ID configuration
pocket_id_local_ipv6_ranges: "{{ ipv6_prefix }}::/48"

Per comment / header een afzonderlijk bestand die wordt toegepast waar het nodig is, maar even om mijn punt te illustreren.

Misschien binnenkort toch nog eens uitproberen. Want het werkte op zichzelf prima :).

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
alex3305 schreef op dinsdag 21 oktober 2025 @ 12:33:
[...]

Daar ben ik het dus compleet mee oneens. Het is een keuze om de IPAM-config op te zetten en zelf in te regelen. Ik laat dat gewoon aan de daemon zelf over en dat gaat vooralsnog prima.
Hoe werkt het dan met meerdere containers verdeeld over meerdere hosts? Waarbij alle containers bij elkaar in hetzelfde subnet moeten komen?
[...]

Alhoewel ik zeker weet dat je het goed bedoelt, zie ik dat echt compleet anders. Overlay netwerken is misschien nog een brug te ver voor @StarWing, maar ik zou sterk adviseren om in ieder geval te starten met een ipvlan netwerk. Host netwerk is in 99% van de gevallen onnodig. Daarnaast kom je enorm vlug in de problemen met poorttoewijzingen. En het is enorm onveilig, omdat je de controle over poort mappings compleet uit handen geeft.
Bij IP-VLAN heb je meerdere IP's op een MAC-adres zitten - dat kan ARP-alarmen triggeren van firewalls.
Hoe ga je daar dan mee om?

Mijn aanpak is alles met host network. En dan de firewall van de LXC-host gebruiken om alleen die poorten open te zetten die nodig zijn. Zit er een overlap in de TCP-poorten van twee containers, dan kijk ik of er via een env-var een aanpassing mogelijk is. Is die er niet, dan start ik een nieuwe LXC-host, voeg daar de nieuwe container toe met zijn firewall rules.

Wat is hier niet veilig aan? En wat heeft hier een IP-VLAN nog voor meerwaarde?

[ Voor 5% gewijzigd door Airw0lf op 21-10-2025 14:27 ]

makes it run like clockwork


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Airw0lf schreef op dinsdag 21 oktober 2025 @ 14:22:
Hoe werkt het dan met meerdere containers verdeeld over meerdere hosts? Waarbij alle containers bij elkaar in hetzelfde subnet moeten komen?
Dat regelt het overlay netwerk vanuit Docker Swarm.
Bij IP-VLAN heb je meerdere IP's op een MAC-adres zitten - dat kan ARP-alarmen triggeren van firewalls.
Hoe ga je daar dan mee om?
Niet, want hier heb ik nog nooit last van gehad.
Mijn aanpak is alles met host network. En dan de firewall van de LXC-host gebruiken om alleen die poorten open te zetten die nodig zijn. Zit er een overlap in de TCP-poorten van twee containers, dan kijk ik of er via een env-var een aanpassing mogelijk is. Is die er niet, dan start ik een nieuwe LXC-host, voeg daar de nieuwe container toe met zijn firewall rules.

Wat is hier niet veilig aan? En wat heeft hier een IP-VLAN nog voor meerwaarde?
Ja, maar dit is geen Docker (LXD) hè. Dit is LXC.

Jij hebt het eerder over beheerbaarheid en beheersbaarheid, maar ik vind dit dus enorm veel aan de beheerbaarheid toevoegen. Immers heb je nu twee containerlagen boven op elkaar, die allebei (waarschijnlijk) nét anders werken. Ik kan verder geen uitspraken doen over de veiligheid van een dergelijke setup. Of meerwaarde van ipvlan, want die is er in jouw geval denk ik niet.

Echter vind ik Docker hosts met daarop Docker containers - of podman met containers - een stuk eenvoudiger dan verschillende LXC containers die ik dan nog met een (eventuele) firewall aan elkaar moet knopen.

Maar uiteindelijk zet ik nagenoeg nooit meer poorten open en ontsluit ik alles via een reverse proxy. Dan hoef ik niet aan te klooien met env-vars of firewalls. Ik hoef alleen maar een paar labels toe te voegen om een dienst werkend en bereikbaar te krijgen.

Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
alex3305 schreef op dinsdag 21 oktober 2025 @ 15:23:
[...]

Dat regelt het overlay netwerk vanuit Docker Swarm.

[...]
Zorgt die Docker Swarm dan ook dat IP-adressen niet dubbel uitgegeven worden over hosts en containers heen?
[...]

Ja, maar dit is geen Docker (LXD) hè. Dit is LXC.
Eens
Jij hebt het eerder over beheerbaarheid en beheersbaarheid, maar ik vind dit dus enorm veel aan de beheerbaarheid toevoegen. Immers heb je nu twee containerlagen boven op elkaar, die allebei (waarschijnlijk) nét anders werken. Ik kan verder geen uitspraken doen over de veiligheid van een dergelijke setup. Of meerwaarde van ipvlan, want die is er in jouw geval denk ik niet.

Echter vind ik Docker hosts met daarop Docker containers - of podman met containers - een stuk eenvoudiger dan verschillende LXC containers die ik dan nog met een (eventuele) firewall aan elkaar moet knopen.
Wat zijn in jouw geval de "Docker hosts"?

Een LXC gedraagt zich als een VM - of zo je wil - als een bare metal host - in ieder geval bezien vanuit de Docker containers.
Maar uiteindelijk zet ik nagenoeg nooit meer poorten open en ontsluit ik alles via een reverse proxy. Dan hoef ik niet aan te klooien met env-vars of firewalls. Ik hoef alleen maar een paar labels toe te voegen om een dienst werkend en bereikbaar te krijgen.
Kortom... ieder zijn ding @alex3305 - de beheer(s)aspecten lijken wat anders te liggen - tis maar net wat iemand ervaart als handig(er). :+

[ Voor 6% gewijzigd door Airw0lf op 21-10-2025 15:57 ]

makes it run like clockwork


Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 10:56

StarWing

Huh ?!?

Test gedaan, bos, bomen, verdwaald :)
Even een nieuwe vm opgezet, kale ubuntu + docker met 2 netwerkkaarten.
Bridge aangemaakt via onderstaand commando:

code:
1
sudo docker network create -d ipvlan  --subnet=10.0.2.0/24 --gateway=10.0.2.254 -o parent=ens192 br_iot


code:
1
2
3
4
5
6
sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2ec0e2e687b7   br_iot    ipvlan    local
92770f7dfb59   bridge    bridge    local
80dd6a4467e3   host      host      local
684e8f327ad4   none      null      local


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
sudo docker network inspect br_iot
[
    {
        "Name": "br_iot",
        "Id": "2ec0e2e687b750e2a8a5531e1ab53d5566d50528e04cc322a2060b7c93bbdeba",
        "Created": "2025-10-21T15:53:04.352792291Z",
        "Scope": "local",
        "Driver": "ipvlan",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.0.2.0/24",
                    "Gateway": "10.0.2.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "parent": "ens192"
        },
        "Labels": {}
    }
]



code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
test@test:/docker/portainer$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:0f:ff:c4 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.150/24 brd 192.168.10.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0f:ffc4/64 scope link
       valid_lft forever preferred_lft forever
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:0f:ff:ce brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 10.0.2.95/24 brd 10.0.2.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0f:ffce/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 06:4e:8c:77:13:8c brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever


Ik kan pingen van mijn lan naar IOT:
code:
1
2
3
ping 10.0.2.95
Pinging 10.0.2.95 with 32 bytes of data:
Reply from 10.0.2.95: bytes=32 time<1ms TTL=64


Maar een test portainer container is niet bereikbaar:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    environment:
      TZ: 'Europe/Brussels'
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /docker/portainer/data:/data
    ports:
      - '9000:9000'
    networks:
      - br0_IOT

networks:
  br0_IOT:
    external: true
    name: br_iot


Anderzijds, een ongewenst neveneffect. Op mijn bestaande dockerserver heb ik een extra netwerkkaart toegevoegd, en blijkbaar zijn de containers ook bereikbaar via deze netwerkkaart. Da's nu net niet de bedoeling. Waarschijnlijk simpel op te lossen, maar dat moet ik proberen uitzoeken.

//Edit:
Ik ben erachter gekomen dat de portainer-container blijkbaar een automagisch IP adress krijgt, en dit dus niet 10.0.2.95 is.
Toevoegen van:
code:
1
2
3
4
5
6
7
    networks:
       br0_IOT:
         ipv4_address: 10.0.2.100
networks:
  br0_IOT:
    name: br_iot
    external: true

En de container is bereikbaar op 10.0.2.100
Blijft de vraag of dit een correcte manier van werken is.
Indien ik nu een 2de container aanmaak, met 10.0.2.101, kunnen deze elkaar bereiken?

[ Voor 6% gewijzigd door StarWing op 21-10-2025 19:29 ]

Page intentionally left blank.


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
Airw0lf schreef op dinsdag 21 oktober 2025 @ 15:50:
Zorgt die Docker Swarm dan ook dat IP-adressen niet dubbel uitgegeven worden over hosts en containers heen?
Yes. Nogmaals, ik werk nagenoeg nooit meer met IP-adressen. Niet voor containers, maar ook niet voor machines. In principe probeer ik zoveel mogelijk op hostname niveau te doen waar mogelijk. Die abstractie zorgt ervoor dat ik me niet druk hoef te maken waar applicaties zich ergens op het netwerk bevinden. Hostnames worden toegewezen vanuit de router of vanuit Docker configuratie.
Wat zijn in jouw geval de "Docker hosts"?
Ik heb een viertal Docker hosts, waarvan er twee in een Swarm hangen. Die twee zijn mijn primaire en secundaire machines met elk eigen verantwoordelijkheden. De primaire machine is het krachtigste en fungeert eveneens als mijn NAS.

De derde machine is een Pi 3B die dienst doet als mijn digitale elektrische boiler thermometer en nog wat kleine verantwoordelijkheden, zoals uptime rapportage.

Tot slot is de vierde machine een VPS die ik (hopelijk) nooit nodig ga hebben. Die machine staat in Canada en fungeert als backup server.

Het grootste deel van de workload vindt dus plaats op machine 1 en 2. En ik voel niet per se de behoefte om nog VM's of LXC containers - hehe pleonasme O-) - te maintainen.

Docker laat ik overigens door de package manager van het OS installeren. Op mijn primaire machine is dat unRAID en op de secundaire komt het uit Debian. Docker Compose en andere configuratie manage ik met Ansible. Die update o.a. Compose automatisch met Renovate en heb ik geen omkijken naar.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
StarWing schreef op dinsdag 21 oktober 2025 @ 18:08:
Test gedaan, bos, bomen, verdwaald :)
De rest van de post suggereert toch echt iets anders :). Volgens mij lukt het best aardig, maar schort het nog aan wat kennis.
Anderzijds, een ongewenst neveneffect. Op mijn bestaande dockerserver heb ik een extra netwerkkaart toegevoegd, en blijkbaar zijn de containers ook bereikbaar via deze netwerkkaart. Da's nu net niet de bedoeling. Waarschijnlijk simpel op te lossen, maar dat moet ik proberen uitzoeken.
Het is voor mij niet helemaal duidelijk wat je hiermee bedoelt. Welke containers op welke machine zijn vanuit welke bron bereikbaar? En wat zou je dan willen afschermen?
//Edit:
Ik ben erachter gekomen dat de portainer-container blijkbaar een automagisch IP adress krijgt, en dit dus niet 10.0.2.95 is.
Ja, Docker pakt een IP-adres uit de pool die je op hebt gegeven. In jouw geval is dat dan 10.2.0.0-10.2.0.254. Dit kun je afkaderen door een strikter netmask op te geven. Het is op deze manier ook mogelijk IP conflicten te krijgen, aangezien je nu twee DHCP's in een zelfde vijver laat vissen.
En de container is bereikbaar op 10.0.2.100
Blijft de vraag of dit een correcte manier van werken is.
Indien ik nu een 2de container aanmaak, met 10.0.2.101, kunnen deze elkaar bereiken?
Ja die kunnen elkaar dan bereiken. En dit kan een correcte manier van werken zijn. Maar dat is afhankelijk wat je wilt. Mijn AdGuard Home wil ik bijvoorbeeld op een vast IP-adres hebben en heb ik dus geconfigureerd in Compose. Mijn Mosquitto broker daarentegen benader ik alleen op hostname en kan het mij dus een spreekwoordelijke worst wezen waar die zich bevindt.

Als je echt compleet gesegregeerde netwerken wilt is een ipvlan wellicht niet de beste keuze. Of je moet met een VLAN werken en deze beperken in de router. Je zou dan eventueel voor een overlay netwerk kunnen gaan. Echter moet je dan wel weer een manier hebben om het e.e.a. te ontsluiten.

Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 10:56

StarWing

Huh ?!?

alex3305 schreef op dinsdag 21 oktober 2025 @ 19:59:
Het is voor mij niet helemaal duidelijk wat je hiermee bedoelt. Welke containers op welke machine zijn vanuit welke bron bereikbaar? En wat zou je dan willen afschermen?
Wel, als ik op mijn werkende docker host, welke een ip heeft van 192.168.10.155, een additionele netwerkkaart toevoeg via esxi, met ip 10.0.2.155, dan zijn alle dockers die ik heb, op beide ip's bereikbaar. Da's nu niet de bedoeling van een scheiding iot <> lan :).

Maar dit kan ik waarschijnlijk correct oplossen door in de docker compose een ip te specifieren.

Page intentionally left blank.


Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
StarWing schreef op woensdag 22 oktober 2025 @ 04:42:
[...]

Wel, als ik op mijn werkende docker host, welke een ip heeft van 192.168.10.155, een additionele netwerkkaart toevoeg via esxi, met ip 10.0.2.155, dan zijn alle dockers die ik heb, op beide ip's bereikbaar. Da's nu niet de bedoeling van een scheiding iot <> lan :).

Maar dit kan ik waarschijnlijk correct oplossen door in de docker compose een ip te specifieren.
Klopt - en een standaard bridge netwerk werkt dan prima.

makes it run like clockwork


Acties:
  • +2 Henk 'm!

  • ed1703
  • Registratie: Januari 2010
  • Niet online
StarWing schreef op woensdag 22 oktober 2025 @ 04:42:
[...]

Maar dit kan ik waarschijnlijk correct oplossen door in de docker compose een ip te specifieren.
Ja, door dit in je ports op te geven:
code:
1
2
3
ports:
      - "ipv4adres:9000:9000"
      - "[ipv6adres]:9000:9000"

Overigens heeft het opgeven van ports in containers die onderdeel zijn van ipvlan of macvlan niet veel nut, want die zal docker negeren.

Zelf prefereer ik reverseproxy met caddy, npm of traefik. Die proxycontainer prop je samen met de container die je wilt gebruiken in een eigen netwerk en die benader je op naam. Het maakt namelijk geen drol uit welk ipadres dat ding dan heeft. Dat zoekt de proxy met docker wel voor je uit.
Hangt er verder wel een beetje vanaf wat je gaat doen welke proxy software je perse nodig hebt.

Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Nu online
Vraagje voor de kenners. Tijdje terug Docker Desktop geinstalleer op Linux, nu wil ik eigenlik weer terug naar alleen de engine. Weet iemand wat de beste manier is om dat te doen zonder verlies van containers, images etc ?

Strava | AP | IP | AW


Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
StarWing schreef op woensdag 22 oktober 2025 @ 04:42:
Wel, als ik op mijn werkende docker host, welke een ip heeft van 192.168.10.155, een additionele netwerkkaart toevoeg via esxi, met ip 10.0.2.155, dan zijn alle dockerscontainers die ik heb, op beide ip's bereikbaar.
Maar hoe zie je dat anders voor je dan? Dat Docker weet welke NIC jij in gedachte hebt bij welke container? Dat kan natuurlijk niet hè. Onder water werkt Docker 'gewoon' met iptables-regels. Out of the box zitten die regels aan alle NICs gekoppeld in de machine.
Da's nu niet de bedoeling van een scheiding iot <> lan :).
Ik begrijp nog steeds niet helemaal wat je nu wilt bereiken. Vooral niet omdat je in jouw spreadsheet voorbeelden geeft waarbij meerdere containers aan één /32 zitten. Waarom, geen idee... Containers zijn (heel kort door de bocht) gewoon lichte VM's. Daarvan wil je er ook niet meerdere aan één /32 hebben.

En of je de scheiding nu in /24, /16 of /8 maakt, maakt onder water vrij weinig uit. Jouw router routeert dat verkeer uiteindelijk toch. En eventuele blokkades zullen dan ook op dat niveau plaats moeten vinden.
ed1703 schreef op woensdag 22 oktober 2025 @ 08:48:
[...]

Zelf prefereer ik reverseproxy met caddy, npm of traefik. Die proxycontainer prop je samen met de container die je wilt gebruiken in een eigen netwerk en die benader je op naam. Het maakt namelijk geen drol uit welk ipadres dat ding dan heeft. Dat zoekt de proxy met docker wel voor je uit.
Hangt er verder wel een beetje vanaf wat je gaat doen welke proxy software je perse nodig hebt.
Maar uiteindelijk is dit het antwoord dus... Waarom aanklooien met NICs en IP-adressen? Laat dat onder water bestaan.

Geef elke container een eigen IP. Hoe je dat doet maakt geen klap uit. Het kan vanwege mDNS handig zijn dat bijvoorbeeld Home Assistant wel aan het netwerk hangt met bijvoorbeeld een host of ipvlan netwerk.

Acties:
  • +2 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Gelukkig ben ik niet zo goed in netwerken en lost Docker eigenlijk alles op in mijn geval:
  • Ik heb een "extern" netwerk met een vast IPv4 en IPv6 adres. De enige die in dat netwerk hangt is mijn proxy. Die is als enige bereikbaar over poort 80/443, ook extern. De rest van mijn docker netwerk is dus gewoon IPv4, maar dus via de proxy wel bereikbaar over IPv6
  • Dan heb ik een "proxy" netwerk waarin alle containers hangen, inclusief de proxy, die met de proxy moeten praten
  • En verder per set van applicaties die bij elkaar horen, of met elkaar moeten praten een eigen overlay netwerk. Apps praten dan via de service naam of alias.
Dit werkt gewoon. Behalve de proxy dus nergens port mappings of andere zaken. Om vanuit buiten bij een container te komen moet je voorbij de proxy weten te komen, oftewel je moet het domein (FQDN) weten.

In bovenstaand voorbeeld is het wel zo dat iedereen die in het "proxy" netwerk hangt elkaar ook kan bereiken. Als je dat niet wilt, dus dat een container enkel met de proxy kan praten, dan moet je dingen omkeren en moet je bijv. Traefik onderdeel maken van de overlay netwerken van de containers.
  • Traefik kan dan wel verkeer routeren naar de verschillende containers doordat deze in alle overlay netwerken zit.
  • Die containers kunnen enkel met Traefik en hun eigen containers praten, verder niet.
En als je Swarm gebruikt dan kun je ook "--internal" gebruiken voor je overlay netwerken. Dan heb je éénrichtingsverkeer, en kan een container gewoon niet naar buiten :9

Ik snap in deze het hele nut van vlans niet :?
alex3305 schreef op woensdag 22 oktober 2025 @ 11:59:
Geef elke container een eigen IP. Hoe je dat doet maakt geen klap uit. Het kan vanwege mDNS handig zijn dat bijvoorbeeld Home Assistant wel aan het netwerk hangt met bijvoorbeeld een host of ipvlan netwerk.
Of je gebruikt een mdns-repeater container. Die hangt natuurlijk wel aan je host netwerk, en gooit al die berichtjes door naar bijv. je docker bridge of het specifieke home assistant en/of jellyfin/plex overlay netwerk.

[ Voor 15% gewijzigd door Mars Warrior op 22-10-2025 12:15 ]

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
Mars Warrior schreef op woensdag 22 oktober 2025 @ 12:00:
Gelukkig ben ik niet zo goed in netwerken en lost Docker eigenlijk alles op in mijn geval:
  • Ik heb een "extern" netwerk met een vast IPv4 en IPv6 adres. De enige die in dat netwerk hangt is mijn proxy. Die is als enige bereikbaar over poort 80/443, ook extern. De rest van mijn docker netwerk is dus gewoon IPv4, maar dus via de proxy wel bereikbaar over IPv6
  • Dan heb ik een "proxy" netwerk waarin alle containers hangen, inclusief de proxy, die met de proxy moeten praten
  • En verder per set van applicaties die bij elkaar horen, of met elkaar moeten praten een eigen overlay netwerk. Apps praten dan via de service naam of alias.
Dit werkt gewoon. Behalve de proxy dus nergens port mappings of andere zaken. Om vanuit buiten bij een container te komen moet je voorbij de proxy weten te komen, oftewel je moet het domein (FQDN) weten.

In bovenstaand voorbeeld is het wel zo dat iedereen die in het "proxy" netwerk hangt elkaar ook kan bereiken. Als je dat niet wilt, dus dat een container enkel met de proxy kan praten, dan moet je dingen omkeren en moet je bijv. Traefik onderdeel maken van de overlay netwerken van de containers.
  • Traefik kan dan wel verkeer routeren naar de verschillende containers doordat deze in alle overlay netwerken zit.
  • Die containers kunnen enkel met Traefik en hun eigen containers praten, verder niet.
En als je Swarm gebruikt dan kun je ook "--internal" gebruiken voor je overlay netwerken. Dan heb je éénrichtingsverkeer, en kan een container gewoon niet naar buiten :9

Ik snap in deze het hele nut van vlans niet :?


[...]

Of je gebruikt een mdns-repeater container. Die hangt natuurlijk wel aan je host netwerk, en gooit al die berichtjes door naar bijv. je docker bridge of het specifieke home assistant en/of jellyfin/plex overlay netwerk.
Mja... wel bijzonder... je gebruikt de nodige overlays? Maar ziet vervolgens het nut van vlans niet? Wat denk je dat Docker gebruikt om dit allemaal te kunnen doen? Juist ja... :+

makes it run like clockwork


Acties:
  • +1 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Airw0lf schreef op woensdag 22 oktober 2025 @ 12:32:
[...]
Mja... wel bijzonder... je gebruikt de nodige overlays? Maar ziet vervolgens het nut van vlans niet? Wat denk je dat Docker gebruikt om dit allemaal te kunnen doen? Juist ja... :+
Docker gebruikt VxLANs, het is maar één letter verschil, maar daarmee totaal niet te vergelijken met VLANs.

Dus als je al VxLANs gebruikt, dan ontgaat mij totaal het nut van VLANs nog: Slechte / foutgevoelige isolatie & beheer van switches/ids/trunks, geen encryptie, maar 4K Ids ipv 16M, geen IP overlap mogelijk (in VxLANs kun je tenminste gewoon dezelfde IP adressen gebruiken per VNI :D), etc.

Maar goed. VxLANs zijn natuurlijk ook bedacht voor cloud / mult-tenant en multi-host toepassingen (Swarm/K*s), en VLANs zijn daar vziw nooit voor bedoeld.

Ik heb ooit - om te leren - 10 RPI's van mijn baas gekregen om een Docker Swarm cluster op te zetten en mee te spelen. Normaal is een cluster opzetten zonder netwerk kennis nogal een probleem, maar met een swarm was dat ook niet nodig. Elke ingress service krijgt automagisch een (gedistribueerde) VIP, zodat op welke van de RPI's ik ook kwam op poort 80 of 443, ik kwam altijd op de service proxy uit die op één of meerdere van de RPI's draaide. Alles dankzij load balancers en VxLANs!

Het was magisch _/-\o_

Op deze manier heb ik ooit ook die gevaarlijke Chinese camera's aan een macvlan gekoppeld: die konden dus enkel elkaar en die ene docker container zien. Meer niet. Beheer ging of via een WebSSH container in hetzelfde overlay netwerk, of via een WebGUI die enkel via een proxy beschikbaar was.

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • 0 Henk 'm!

  • Airw0lf
  • Registratie: Mei 2005
  • Laatst online: 07:16
@Mars Warrior - ok - maar een VXLAN heeft toch altijd een L3 transport mechanisme nodig? Wat - zeker in grotere bedrijven - is ingevuld met subnetten "verpakt" in vlans (d.w.z broadcast domains)?

Hier kom je pas vanaf als alle aangesloten apparaten native VXLAN kunnen - pas dan kun je uit de voeten met één plat netwerk - theoretisch dan toch. Dit lijkt me killing voor de verdienmodellen van de grote netwerk fabrikanten zoals Cisco, HP/Juniper, etc. Maar klinkt me als muziek in de oren... zeker als de intelligentie vergelijkbaar is met die van Docker containers in een Swarm/overlay netwerk... oOo

Unne dikke mercie voor je tijd en uitleg - ook @alex3305 - top! Ik heb een hoop bijgeleerd en ben ook tot een paar andere inzichten gekomen! *O*

makes it run like clockwork


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@Mars Warrior Het nut of onnut van VLANs komt bij de vraag van @StarWing vandaan. De vraag is niet per se duidelijk, heel erg eenvoudig of heeft een heel eenvoudig antwoord. ik zou hem adviseren om met een overlay netwerk en reverse proxy, of met een ipvlan netwerk te gaan werken. Dat laatste vond ik in ieder geval een veel eenvoudigere stap omdat applicaties dan ook nog via het netwerk routeerbaar zijn, waarna je eventueel een reverse proxy kunt toevoegen.

Mijn machines krijgen elk een /24 netwerk (VLAN) vanuit de router. Om de simpele reden dat ik op die manier eenvoudig containers kan scheiden per host en ik dus ook geen mogelijke IP collissions heb. Daarnaast heb ik er genoeg ruimte voor op mijn /16 netwerk. Dus waarom niet?

De communicatie tussen containers onderling vindt plaats via interne netwerken, dus VxLAN, of via de Traefik reverse proxy. Waarbij die laatste eveneens via een DNS toewijzing via het VLAN gaan. Elk Docker Compose project heeft, waar nodig, een eigen intern netwerk, waar ook geen andere container aan gekoppeld kan worden. Maar dit heb ik al eerder uitgebreid uitgelegd. Voor het ontsluiten zit het via een ingress overlay netwerk.

De mdns-repeater (waar ik overigens een eigen variant van heb O-) ) werkt in sommige gevallen niet helemaal zoals ik verwacht. Ik merkte dat niet alle SSDP berichten doorkomen bij mijn Home Assistant container. Bijvoorbeeld die van mijn Sonos of Chromecast. Dat staat nog op mijn todo lijst om op te pakken.

Ik gebruik ook geen Swarm deployments, maar alleen Compose met Docker in Swarm mode. Met Swarm kan ik namelijk geen CPU-affiniteit opgeven wat voor mij enorm belangrijk is met mijn energiezuinige server. Voor load balancen van o.a. Traefik en eerder Caddy heb ik nog gekeken naar keepalived. Maar uiteindelijk nog geen zin en tijd gehad om moeite in te steken.

Acties:
  • 0 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Airw0lf schreef op woensdag 22 oktober 2025 @ 15:21:
@Mars Warrior - ok - maar een VXLAN heeft toch altijd een L3 transport mechanisme nodig? Wat - zeker in grotere bedrijven - is ingevuld met subnetten "verpakt" in vlans (d.w.z broadcast domains)?

Hier kom je pas vanaf als alle aangesloten apparaten native VXLAN kunnen - pas dan kun je uit de voeten met één plat netwerk - theoretisch dan toch. Dit lijkt me killing voor de verdienmodellen van de grote netwerk fabrikanten zoals Cisco, HP/Juniper, etc. Maar klinkt me als muziek in de oren... zeker als de intelligentie vergelijkbaar is met die van Docker containers in een Swarm/overlay netwerk... oOo
Haha. Yep. En vanzelfsprekend is daar over nagedacht, want hoe krijg je nu die communicatie voor elkaar in die grote data centers zodat L3 gewoon op de juiste plek terechtkomt? Nou, met EVPN (Ethernet VPN). Dat is een BGP-based control-plane die VxLAN netwerken kan routeren. Net als op het grote boze internet (waar BGP vandaan komt) kan er op die manier worden gerouteerd tussen VTEPs (VxLAN endpoints).

En daarvoor zijn vanzelfsprekend door de grote hardware partijen switches bedacht die een hoop van de VxLAN zaken lekker in hardware implementeren/offloaden. (Cisco Nexus, Arista, Juniper QFX).
Dus die doen nog steeds leuk centjes verdienen, ook zonder VLANs 8)

Afbeeldingslocatie: https://www.juniper.net/documentation/us/en/software/junos/evpn-vxlan/images/g043185.gif

Voor thuis is dat natuurlijk onzin: elke switch kan gewoon L3 routeren, alleen dat kost net wat meer CPU.
Unne dikke mercie voor je tijd en uitleg - ook @alex3305 - top! Ik heb een hoop bijgeleerd en ben ook tot een paar andere inzichten gekomen! *O*
_/-\o_

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs


Acties:
  • +1 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 10:42
Mars Warrior schreef op woensdag 22 oktober 2025 @ 16:21:
Voor thuis is dat natuurlijk onzin: elke switch kan gewoon L3 routeren, alleen dat kost net wat meer CPU.
Routeren hoort dan wel bij L3, maar zeker niet veel consumer switches kunnen L3 routeren. Een "gewone" switch werkt op L2 (ethernet), niet op L3 (IP).

Tenzij je bv Uniquitis Pro / Enterprise switches hebt thuis, die doen wel L3. Maar de standaard TP-Link / ... switch zeker niet.

Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 10:56

StarWing

Huh ?!?

alex3305 schreef op woensdag 22 oktober 2025 @ 16:05:
ik zou hem adviseren om met een overlay netwerk en reverse proxy, of met een ipvlan netwerk te gaan werken.
:)
Ik heb het ondertussen werkend gekregen. Het ontbreken van kennis en de angst om wat te slopen zorgt ervoor dat ik niet simpelweg commando's ga beginnen inrammen.
Met de info van hier en wat hulp van ChatGPT heb ik een nieuwe brigde gemaakt "docker_lan" waaraan ik de containers koppel met een vast IP via docker-compose. Deze zijn dan enkel benaderbaar op mijn lan.
Via ipvlan een nieuw "vlan" netwerk gemaakt, welke ik dan ook correct kan benaderen, enkel op de vlan.

Volgende stap, maar dan eerder als test, is om een globale docker compose te maken met een .env, zodat alle variabelen op 1 plaats heb, mocht ik een migratie moeten doen.

Page intentionally left blank.


Acties:
  • +1 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 28-10 23:00
@StarWing Heel goed dat het e.e.a. werkt :). Let op ChatGPT antwoorden aangezien die soms (wat) achterlopen.

Ben niet bang om dingen zomaar te slopen. Docker is daar precies voor bedoeld. Dat je eenvoudig herbruikbare omgevingen hebt. Eventueel die je op meerdere plekken kunt deployen. Zolang je netjes volume mounts gebruikt, kan er weinig misgaan. Sterker nog, ik undeploy ook nog weleens wat. Op mijn werk was dat zelfs een vereiste stap om te kijken of een herstel ook goed zou gaan :).

Ik kan je nog wel een andere tip geven - althans dat doe ik altijd O-) - zoek ook het tegenovergestelde commando op. Dus:
docker network create ... br-vlan
# docker network ls
# docker network inspect br-vlan
docker network rm br-vlan

En probeer die commando's ook uit. Dan leer je ook wat er 'achter de schermen' gebeurt en wordt het wellicht wat minder eng om dingen uit te proberen.

Anderzijds kun je ook gewoon een tweede VM opzetten en daar gaan spelen.

Ik zou je wel aanraden om meerdere Compose files te hebben, maar dat is mijn voorkeur. Ik manage die via Dockge omdat ik daarmee ook gewoon .env bestanden kan gebruiken. Met Portainer moeten die bestanden stack.env heten. Als je dat niet weet werkt het niet. Dat vond ik op z'n zachtst gezegd irritant.

Acties:
  • +1 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Nu online
Even tussendoor. Het is inmiddels gelukt om docker helemaal opnieuw te installeren via de docs.

Kleine tip nog, gebruik op Linux nooit docker Desktop. Het gebruikt een vm laag die het ontzettend langzaam maakt in tegenstelling tot default docker engine.

Strava | AP | IP | AW


Acties:
  • +2 Henk 'm!

  • Mars Warrior
  • Registratie: Oktober 2003
  • Laatst online: 10:53

Mars Warrior

Earth, the final frontier

Ik heb inmiddels ook de CrowdSec firewall als docker container draaien :D
Omdat Docker officieel nog geen NFT tables ondersteund, draait de container netjes in iptables mode. Dat werkte in één keer goed.

De firewall van CrowdSec kan zowel in "managed" als in "set only" mode draaien. Ik heb hem gewoon in "managed" mode draaien.
In "managed" mode regelt CrowdSec alles, in "set only" mode moet je zelf die chains enzo aanmaken, en vult CrowdSec enkel wat er in moet of uit moet...

Verder heb ik logging aan staan, met prefix, zodat ik met journalctl (sudo journalctl -k | grep crowdsec) kan zien wat er geblokkeerd wordt.

De blocklists doen allemaal hun werk zie ik. Na 1 dag heb ik al 4.000 drops van de firewall. Ik zie dat sommige IP adressen wel 200x iets proberen met tussenpozen van 1 seconde.

De IPv4 en IPv6 logs na één dag, dus ca 4.000 blocks per dag op dit ogenblik:
  • blacklist 0 = crowdsec
  • blacklist 1 = community blocklist (15.000 adressen)
  • blacklist 2 = tor exit nodes.
Output van sudo nft list ruleset | grep -i crowdsec -A3
Bash:
1
2
3
4
5
6
7
8
9
10
        chain CROWDSEC_CHAIN {
                # match-set crowdsec-blacklists-2 src  counter packets 0 bytes 0 jump CROWDSEC_LOG
                # match-set crowdsec-blacklists-1 src  counter packets 2655 bytes 158060 jump 
                # match-set crowdsec-blacklists-0 src  counter packets 1308 bytes 74858 jump 
        }
        chain CROWDSEC_CHAIN {
                # match-set crowdsec6-blacklists-2 src  counter packets 110 bytes 9913 jump CROWDSEC_LOG
                # match-set crowdsec6-blacklists-1 src  counter packets 0 bytes 0 jump CROWDSEC_LOG
                # match-set crowdsec6-blacklists-0 src  counter packets 27 bytes 2160 jump CROWDSEC_LOG
        }


Logischerwijs heb ik nu dus ook factoren minder events en alerts (20-40% over, dus factor 2-5 minder) en vanzelfsprekend ook andere decisions: dat zijn enkel nieuwe overtreders, want de oude worden immers door de firewall bouncer tegengehouden. Ik ben dan ook van plan om de default ban tijd naar 576 uur (max van ipset regels vziw) te verhogen.

De configuratie van de cs-firewall-bouncer:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
mode: iptables
update_frequency: 10s
log_mode: file
log_dir: /var/log/
log_level: info
log_compression: true
log_max_size: 100
log_max_backups: 3
log_max_age: 30
api_url: ${API_URL}
api_key: ${API_KEY}

## TLS Authentication
# cert_path: /etc/crowdsec/tls/cert.pem
# key_path: /etc/crowdsec/tls/key.pem
# ca_cert_path: /etc/crowdsec/tls/ca.crt
insecure_skip_verify: false
disable_ipv6: false
deny_action: DROP
#deny_log: false
deny_log: true

supported_decisions_types:
  - ban
#to change log prefix
deny_log_prefix: "crowdsec: "
#to change the blacklists name
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists
#type of ipset to use
ipset_type: nethash
#if present, insert rule in those chains
iptables_chains:
  - INPUT
#  - FORWARD
  - DOCKER-USER
iptables_add_rule_comments: true

## nftables
nftables:
  ipv4:
    enabled: false
    set-only: false
    table: crowdsec
    chain: crowdsec-chain
    priority: -10
  ipv6:
    enabled: false
    set-only: false
    table: crowdsec6
    chain: crowdsec6-chain
    priority: -10

nftables_hooks:
  - input
  - forward

# packet filter


En het docker compose gedeelte:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  infra-cs-firewall-bouncer:
    image: ghcr.io/shgew/cs-firewall-bouncer-docker:latest
    container_name: infra-cs-firewall-bouncer
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    security_opt:
      - no-new-privileges:true
    volumes:
      - $DOCKERDIR/infra/cs-firewall-bouncer/config/crowdsec-firewall-bouncer.yaml:/config/crowdsec-firewall-bouncer.yaml:ro
      - $DOCKERDIR/infra/cs-firewall-bouncer/log:/var/log/
      - /etc/localtime:/etc/localtime:ro
    restart: always

Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs

Pagina: 1 ... 14 15 Laatste