Je vous ai parlé de Pangolin comme alternative libre à Cloudflare et depuis que j'ai mis en production la solution s'est bien étoffée avec une communauté qui grandit et propose tout un tas d'extensions ou de façon de gérer sa stack. Ici je vous présente la mienne.

On va partir sur une stack Docker qui va contenir toutes les briques nécessaires:

  • Gerbil: qui va gérer les tunnels
  • Pangolin: l'orchestrateur
  • Traefik: le reverse proxy bien connu

Avant de créer la stack il y a quelques prérequis :

  • un domaine vers lequel faire pointer l'interface
  • les ports 80, 443 et 51820 ouverts, voire 21820 si vous voulez faire de l'accès à des ressources privées via VPN
  • Une arborescence de fichiers précise qui est détaillée ici

Ensuite il n'y a plus qu'à lancer l'installeur:

curl -fsSL https://static.pangolin.net/get-installer.sh | bash

sudo ./installer

En répondant correctement à toutes les questions cela devrait vous donner une stack comme ceci:

name: pangolin
networks:
  default:
    driver: bridge
    enable_ipv6: true
    name: pangolin

services:

  crowdsec:
    command: -t
    container_name: crowdsec
    environment:
      COLLECTIONS: crowdsecurity/traefik crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules
      ENROLL_INSTANCE_NAME: pangolin-crowdsec
      ENROLL_TAGS: docker
      GID: "1000"
      PARSERS: crowdsecurity/whitelists
    healthcheck:
      interval: 10s
      retries: 3
      test:
        - CMD
        - cscli
        - lapi
        - status
      timeout: 5s
      start_period: 30s
    image: docker.io/crowdsecurity/crowdsec:latest
    labels:
      - traefik.enable=false
    ports:
      - 6060:6060
    restart: unless-stopped
    volumes:
      - ./config/crowdsec:/etc/crowdsec
      - ./config/crowdsec/db:/var/lib/crowdsec/data
      - ./config/traefik/logs:/var/log/traefik

  gerbil:
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    command:
      - --reachableAt=http://gerbil:3003
      - --generateAndSaveKeyTo=/var/config/key
      - --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config
      - --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth
    container_name: gerbil
    depends_on:
      pangolin:
        condition: service_healthy
    image: docker.io/fosrl/gerbil:latest
    ports:
      - 51820:51820/udp
      - 21820:21820/udp
      - 443:443
      - 80:80
    restart: unless-stopped
    volumes:
      - ./config/:/var/config

  pangolin:
    container_name: pangolin
    healthcheck:
      interval: 10s
      retries: 15
      test:
        - CMD
        - curl
        - -f
        - http://localhost:3001/api/v1/
      timeout: 10s
    image: fosrl/pangolin:latest
    #image: docker.io/fosrl/pangolin:1.15.4
    restart: unless-stopped
    volumes:
      - ./config:/app/config

  traefik:
    command:
      - --configFile=/etc/traefik/traefik_config.yml
    container_name: traefik
    depends_on:
      crowdsec:
        condition: service_healthy
      pangolin:
        condition: service_healthy
    image: docker.io/traefik:v3.6.8
    network_mode: service:gerbil
    restart: unless-stopped
    volumes:
      - ./config/traefik:/etc/traefik:ro
      - ./config/letsencrypt:/letsencrypt
      - ./config/traefik/logs:/var/log/traefik
      - ./config/traefik/rules:/rules

Vous noterez que si je laisse Gerbil et Crowdsec en latest, je préfère contrôler moi-même la version de Traefik et Pangolin.

Important aussi: on sort bien les logs de Traefik dans un volume que Crowdsec va pouvoir venir lire, sinon cela ne sert à rien : les attaques ne seront pas repérées et donc pas bloquées. Les règles sont aussi exposées dans un volume accessible, ça nous permettra plus tard de les modifier au besoin.

Normalement avec cette stack vous devriez vous retrouver avec un Pangolin fonctionnel !

Il reste maintenant à se connecter au tableau de bord pour la première fois. Rendez-vous sur https://<votre-domaine>/auth/initial-setup, récupérez le setup token affiché dans les logs (docker compose logs pangolin), puis créez votre compte admin et votre organisation.

Avant de créer une ressource, il faut un site pour la rattacher : dans la section Sites de votre organisation, créez-en un et Pangolin vous affiche aussitôt sa conf Newt, un ID et un secret propres au site, plus l'endpoint, l'URL de votre Pangolin. Il ne reste qu'à lancer Newt sur la machine qui héberge vos services que ce soit via Docker ou via le binaire. Dans tous les cas Pangolin vous fournit la conf toute faite !

Ensuite, on peut créer une ressource (c'est-à-dire exposer un service) que Pangolin va exposer en reverse proxy à votre place, TLS compris. On lui donne une target, l'IP et le port du service en interne, rattachée au site qu'on vient de créer. Selon l'install de Newt choisie on peut faire pointer directement vers un conteneur Docker.

Et voilà Pangolin s'occupe ensuite de tout : certificats, règles d'accès et même de l'authentification.