Compare commits
9 Commits
7a496b235c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 272dff8b90 | |||
| 975763db58 | |||
| ff4214e006 | |||
| 8d5f4a4ac1 | |||
| 566c73b306 | |||
| 6c761c409c | |||
| 2c3cfbf159 | |||
| 36f44190a8 | |||
| 590cf0a27a |
@@ -25,6 +25,8 @@ services:
|
||||
- USER_GID=100
|
||||
- TZ=Europe/Madrid
|
||||
- GITEA__server__ROOT_URL=https://gitea.ognir-server.synology.me/
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
- GITEA__server__SSH_LISTEN_PORT=22
|
||||
- GITEA__database__DB_TYPE=sqlite3
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
@@ -47,6 +49,20 @@ services:
|
||||
# Se actualiza de 'seguridad-general' a 'security-headers' según el inventario dinámico.
|
||||
- "traefik.http.routers.gitea.middlewares=security-headers@file"
|
||||
|
||||
# --- NUEVO: BLOQUE SSH (SELLADO) ---
|
||||
- "traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)"
|
||||
- "traefik.tcp.routers.gitea-ssh.entrypoints=ssh-git"
|
||||
- "traefik.tcp.routers.gitea-ssh.service=gitea-ssh-svc"
|
||||
- "traefik.tcp.routers.gitea-ssh.priority=100"
|
||||
- "traefik.tcp.services.gitea-ssh-svc.loadbalancer.server.port=22"
|
||||
|
||||
|
||||
# El Sello de Seguridad (Whitelist)
|
||||
# ESTE ES EL SELLO: Solo estas IPs pueden cruzar el puente
|
||||
# Nota: En TCP puro (sin TLS), Traefik v3 usa el filtrado por IP en el middleware o router
|
||||
- "traefik.tcp.routers.gitea-ssh.middlewares=whitelist-ssh"
|
||||
- "traefik.tcp.middlewares.whitelist-ssh.ipallowlist.sourcerange=100.120.105.35,192.168.178.30-192.168.178.39"
|
||||
|
||||
networks:
|
||||
services-internal-net:
|
||||
external: true
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
# ==============================================================================
|
||||
# OGNIRNAS - INFRAESTRUCTURA CORE: TRAEFIK V3 & DOCKER-SOCKET-PROXY
|
||||
# ==============================================================================
|
||||
# Última revisión: 2026-01-06
|
||||
# Última revisión: 2026-01-06 (Fase: Auditoría y Seguridad Activa)
|
||||
# Propietario: Ognir (UID 1032 / GID 100)
|
||||
# Objetivo: Reverse Proxy con autenticación reforzada y aislamiento del socket.
|
||||
# ==============================================================================
|
||||
|
||||
version: "3.9"
|
||||
@@ -11,7 +10,7 @@ version: "3.9"
|
||||
services:
|
||||
# ----------------------------------------------------------------------------
|
||||
# SERVICE: traefik-socket-proxy
|
||||
# Capa de seguridad que evita el acceso directo de Traefik al socket de Docker.
|
||||
# Cortafuegos para el socket de Docker. Aísla a Traefik del motor del NAS.
|
||||
# ----------------------------------------------------------------------------
|
||||
traefik-socket-proxy:
|
||||
image: tecnativa/docker-socket-proxy:latest
|
||||
@@ -30,50 +29,54 @@ services:
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# SERVICE: traefik (v3.0)
|
||||
# Orquestador principal. Gestiona TLS y Dashboard seguro.
|
||||
# Reverse Proxy con TLS, Dashboard seguro y registro de actividad (Logs).
|
||||
# ----------------------------------------------------------------------------
|
||||
traefik:
|
||||
image: traefik:v3.0
|
||||
container_name: traefik
|
||||
restart: always
|
||||
user: "1032:100" # Ejecución bajo el usuario Ognir para permisos de archivos
|
||||
user: "1032:100"
|
||||
depends_on:
|
||||
traefik-socket-proxy:
|
||||
condition: service_started
|
||||
|
||||
networks:
|
||||
proxy-macvlan-net:
|
||||
ipv4_address: 192.168.178.25 # IP estática en red local
|
||||
ipv4_address: 192.168.178.25 # IP fija en red local (Fritz!Box)
|
||||
services-internal-net: {}
|
||||
|
||||
volumes:
|
||||
- /volume1/docker/configs/traefik:/etc/traefik:ro
|
||||
- /volume1/docker/data/traefik:/letsencrypt
|
||||
- /volume1/docker/data/traefik/logs:/var/log/traefik
|
||||
- /volume1/docker/data/traefik/logs:/var/log/traefik # Persistencia de logs
|
||||
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.docker.network=services-internal-net"
|
||||
|
||||
# --- CONFIGURACIÓN DEL ROUTER (DASHBOARD) ---
|
||||
# --- ROUTER DASHBOARD ---
|
||||
- "traefik.http.routers.traefik-dash.rule=Host(`traefik.ognir-server.synology.me`)"
|
||||
- "traefik.http.routers.traefik-dash.entrypoints=websecure"
|
||||
- "traefik.http.routers.traefik-dash.tls=true"
|
||||
- "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt"
|
||||
|
||||
# --- SERVICIO INTERNO (API V3) ---
|
||||
- "traefik.http.routers.traefik-dash.service=api@internal"
|
||||
|
||||
# --- MIDDLEWARES (ORDEN PRIORITARIO: LOGIN > SEGURIDAD) ---
|
||||
# Colocamos auth-dashboard primero para asegurar que el prompt salte antes
|
||||
# de aplicar las cabeceras de seguridad que podrían bloquearlo en caché.
|
||||
# --- MIDDLEWARES (SEGURIDAD REFORZADA) ---
|
||||
# Primero Auth (Login) y luego Headers de seguridad.
|
||||
- "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file"
|
||||
|
||||
command:
|
||||
- "--configFile=/etc/traefik/traefik.yml"
|
||||
# --- CONFIGURACIÓN DEL VIGILANTE (ACCESS LOGS) ---
|
||||
# Activa el registro de cada petición que llega desde internet.
|
||||
- "--accesslog=true"
|
||||
# Ruta interna (mapeada al volumen data/traefik/logs)
|
||||
- "--accesslog.filepath=/var/log/traefik/access.log"
|
||||
# Buffering para no castigar el disco/SSD del NAS constantemente
|
||||
- "--accesslog.bufferingsize=100"
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# REDES EXTERNAS PRE-EXISTENTES
|
||||
# REDES EXTERNAS
|
||||
# ------------------------------------------------------------------------------
|
||||
networks:
|
||||
proxy-macvlan-net:
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
# ################################################################# #
|
||||
# CONFIGURACIÓN DEL DASHBOARD DE TRAEFIK - ACCESO SEGURO #
|
||||
# ################################################################# #
|
||||
|
||||
http:
|
||||
routers:
|
||||
api:
|
||||
router-traefik-dash:
|
||||
rule: "Host(`traefik.ognir-server.synology.me`) || Host(`ognir-server.synology.me`)"
|
||||
service: api@internal
|
||||
middlewares:
|
||||
- auth-dashboard@file
|
||||
entryPoints:
|
||||
- websecure
|
||||
- "websecure"
|
||||
service: "api@internal"
|
||||
middlewares:
|
||||
- "muro-seguro@file" # Control por IP (Whitelist)
|
||||
- "auth-dashboard@file" # Control por Usuario (Basic Auth)
|
||||
tls:
|
||||
certResolver: letsencrypt
|
||||
certResolver: "letsencrypt"
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
http:
|
||||
routers:
|
||||
router-fritz:
|
||||
rule: "Host(`fritz.ognir-server.synology.me`)"
|
||||
entryPoints:
|
||||
- "websecure"
|
||||
service: "fritz-service"
|
||||
tls:
|
||||
certResolver: "letsencrypt"
|
||||
|
||||
services:
|
||||
fritz-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.178.1"
|
||||
32
traefik/dynamic/fritz-box.yml
Executable file
32
traefik/dynamic/fritz-box.yml
Executable file
@@ -0,0 +1,32 @@
|
||||
# ################################################################# #
|
||||
# MIDDLEWARE DE WHITELIST - ACCESO RESTRINGIDO OGNIRNAS #
|
||||
# ################################################################# #
|
||||
# Este middleware ya está definido en tu configuración global, #
|
||||
# pero lo vinculamos aquí para proteger el acceso al Router. #
|
||||
|
||||
http:
|
||||
routers:
|
||||
# Definición del Router para Fritz!Box
|
||||
# Aplica TLS con LetsEncrypt y restringe por IP
|
||||
router-fritz:
|
||||
rule: "Host(`fritz.ognir-server.synology.me`)"
|
||||
entryPoints:
|
||||
- "websecure"
|
||||
middlewares:
|
||||
- "muro-seguro"
|
||||
service: "fritz-service"
|
||||
tls:
|
||||
certResolver: "letsencrypt"
|
||||
|
||||
services:
|
||||
# Redirección al hardware físico del Router
|
||||
fritz-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.178.1"
|
||||
|
||||
# ################################################################# #
|
||||
# NOTA DE MANTENIMIENTO: #
|
||||
# Si necesitas acceso externo temporal, comenta la línea de #
|
||||
# 'middlewares' y reinicia Traefik. #
|
||||
# ################################################################# #
|
||||
42
traefik/dynamic/gestion-segura.yml
Executable file
42
traefik/dynamic/gestion-segura.yml
Executable file
@@ -0,0 +1,42 @@
|
||||
# ################################################################# #
|
||||
# CONFIGURACIÓN DE GESTIÓN PROTEGIDA - OGNIRNAS #
|
||||
# ################################################################# #
|
||||
http:
|
||||
routers:
|
||||
# --- Traefik Dashboard ---
|
||||
router-traefik-dash:
|
||||
rule: "Host(`traefik.ognir-server.synology.me`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))"
|
||||
entryPoints: ["websecure"]
|
||||
middlewares: ["muro-seguro"]
|
||||
service: "api@internal"
|
||||
tls: { certResolver: "letsencrypt" }
|
||||
|
||||
# --- Portainer (Mismo nombre que en Labels para sobrescribir) ---
|
||||
portainer:
|
||||
rule: "Host(`portainer.ognir-server.synology.me`)"
|
||||
entryPoints: ["websecure"]
|
||||
# Añadimos ambos: tus cabeceras originales y el muro
|
||||
middlewares:
|
||||
- "muro-seguro"
|
||||
- "security-headers"
|
||||
service: "portainer-service"
|
||||
tls: { certResolver: "letsencrypt" }
|
||||
|
||||
# --- AdGuard Home ---
|
||||
router-adguard:
|
||||
rule: "Host(`adguard.ognir-server.synology.me`)"
|
||||
entryPoints: ["websecure"]
|
||||
middlewares: ["muro-seguro"]
|
||||
service: "adguard-service"
|
||||
tls: { certResolver: "letsencrypt" }
|
||||
|
||||
services:
|
||||
portainer-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.178.25:9000"
|
||||
adguard-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.178.26:80"
|
||||
# ################################################################# #
|
||||
@@ -31,6 +31,8 @@ entryPoints:
|
||||
scheme: https
|
||||
websecure:
|
||||
address: ":443"
|
||||
ssh-git:
|
||||
address: ":2222"
|
||||
|
||||
# --- Proveedores: Docker (vía Proxy) y Archivos Locales ---
|
||||
providers:
|
||||
|
||||
Reference in New Issue
Block a user