Skip to content

Wireguard en un clúster Swarm

Aún siento que Docker Swarm está subestimado. Swarm es excelente para cargas de trabajo simples, especialmente si estás construyendo en instalaciones locales. Si usas Swarm en un VPS, es muy útil tener la posibilidad de conectarse al clúster Swarm desde el exterior. Personalmente, prefiero Wireguard por su velocidad, diseño liviano y estabilidad. Ofrece una solución VPN optimizada y eficiente que constantemente brinda un desempeño confiable.

Vamos a crear una red separada para Wireguard

shell
docker network create wg_net

Luego necesitamos un directorio para la configuración que se montará dentro del contenedor.

shell
mkdir -p wg/config
chmod 777 -R wg/config

Luego podemos modificar el stack con algunos servicios del sistema; uso un stack separado para esto. Las propiedades más importantes son:

  • SERVERURL=*.*.*.* deberías cambiarlo por tu dirección IP o nombre de dominio.
  • PEERS=1 cuando Swarm inicia el contenedor, Wireguard crea 1 configuración para el peer y lo agrega en la configuración del servidor.
yaml
services:
  Wireguard:
    image: lscr.io/linuxserver/Wireguard:latest
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - SERVERURL=*.*.*.*
      - SERVERPORT=51820
      - PEERS=1
      - PEERDNS=auto
      - INTERNAL_SUBNET=10.11.11.0
      - ALLOWEDIPS=0.0.0.0/0
      - LOG_CONFS=true
    volumes:
      - $PWD/wg/config:/config
      - /lib/modules:/lib/modules
    networks:
      - wg_net
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    deploy:
      placement:
        constraints: [node.role == manager]
networks:
  wg_net:
    external: true

Luego podemos desplegar el stack mediante docker stack deploy --with-registry-auth -c system.yaml system

Después de iniciar el contenedor, Wireguard crea la configuración de peer en wg/config/peer1img1

peer1.conf es nuestra configuración de cliente Wireguard.

Para usar la red de Wireguard dentro del clúster, necesitamos añadir explícitamente su red a cualquier servicio deseado. Por ejemplo, tenemos un stack montioring.yaml y queremos conectarnos a Prometheus.

yaml
services:
  prometheus:    
    image: prom/prometheus:v2.55.1
    networks:
      - wg_net

Para conectarse a Prometheus podemos usar http://monitoring_prometheus:9090