Compare commits

..

9 Commits

8 changed files with 123 additions and 35 deletions

View File

@@ -25,6 +25,8 @@ services:
- USER_GID=100 - USER_GID=100
- TZ=Europe/Madrid - TZ=Europe/Madrid
- GITEA__server__ROOT_URL=https://gitea.ognir-server.synology.me/ - 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 - GITEA__database__DB_TYPE=sqlite3
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
@@ -47,6 +49,20 @@ services:
# Se actualiza de 'seguridad-general' a 'security-headers' según el inventario dinámico. # Se actualiza de 'seguridad-general' a 'security-headers' según el inventario dinámico.
- "traefik.http.routers.gitea.middlewares=security-headers@file" - "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: networks:
services-internal-net: services-internal-net:
external: true external: true

3
test.txt Normal file
View File

@@ -0,0 +1,3 @@
Hola mundo sin contraseña!!!
Feliz fin del mundo!

View File

@@ -1,9 +1,8 @@
# ============================================================================== # ==============================================================================
# OGNIRNAS - INFRAESTRUCTURA CORE: TRAEFIK V3 & DOCKER-SOCKET-PROXY # 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) # Propietario: Ognir (UID 1032 / GID 100)
# Objetivo: Reverse Proxy con autenticación reforzada y aislamiento del socket.
# ============================================================================== # ==============================================================================
version: "3.9" version: "3.9"
@@ -11,7 +10,7 @@ version: "3.9"
services: services:
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# SERVICE: traefik-socket-proxy # 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: traefik-socket-proxy:
image: tecnativa/docker-socket-proxy:latest image: tecnativa/docker-socket-proxy:latest
@@ -30,50 +29,54 @@ services:
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# SERVICE: traefik (v3.0) # SERVICE: traefik (v3.0)
# Orquestador principal. Gestiona TLS y Dashboard seguro. # Reverse Proxy con TLS, Dashboard seguro y registro de actividad (Logs).
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
traefik: traefik:
image: traefik:v3.0 image: traefik:v3.0
container_name: traefik container_name: traefik
restart: always restart: always
user: "1032:100" # Ejecución bajo el usuario Ognir para permisos de archivos user: "1032:100"
depends_on: depends_on:
traefik-socket-proxy: traefik-socket-proxy:
condition: service_started condition: service_started
networks: networks:
proxy-macvlan-net: 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: {} services-internal-net: {}
volumes: volumes:
- /volume1/docker/configs/traefik:/etc/traefik:ro - /volume1/docker/configs/traefik:/etc/traefik:ro
- /volume1/docker/data/traefik:/letsencrypt - /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: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.docker.network=services-internal-net" - "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.rule=Host(`traefik.ognir-server.synology.me`)"
- "traefik.http.routers.traefik-dash.entrypoints=websecure" - "traefik.http.routers.traefik-dash.entrypoints=websecure"
- "traefik.http.routers.traefik-dash.tls=true" - "traefik.http.routers.traefik-dash.tls=true"
- "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt" - "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt"
# --- SERVICIO INTERNO (API V3) ---
- "traefik.http.routers.traefik-dash.service=api@internal" - "traefik.http.routers.traefik-dash.service=api@internal"
# --- MIDDLEWARES (ORDEN PRIORITARIO: LOGIN > SEGURIDAD) --- # --- MIDDLEWARES (SEGURIDAD REFORZADA) ---
# Colocamos auth-dashboard primero para asegurar que el prompt salte antes # Primero Auth (Login) y luego Headers de seguridad.
# de aplicar las cabeceras de seguridad que podrían bloquearlo en caché.
- "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file" - "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file"
command: command:
- "--configFile=/etc/traefik/traefik.yml" - "--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: networks:
proxy-macvlan-net: proxy-macvlan-net:

View File

@@ -1,11 +1,16 @@
# ################################################################# #
# CONFIGURACIÓN DEL DASHBOARD DE TRAEFIK - ACCESO SEGURO #
# ################################################################# #
http: http:
routers: routers:
api: router-traefik-dash:
rule: "Host(`traefik.ognir-server.synology.me`) || Host(`ognir-server.synology.me`)" rule: "Host(`traefik.ognir-server.synology.me`) || Host(`ognir-server.synology.me`)"
service: api@internal
middlewares:
- auth-dashboard@file
entryPoints: entryPoints:
- websecure - "websecure"
service: "api@internal"
middlewares:
- "muro-seguro@file" # Control por IP (Whitelist)
- "auth-dashboard@file" # Control por Usuario (Basic Auth)
tls: tls:
certResolver: letsencrypt certResolver: "letsencrypt"

View File

@@ -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
View 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. #
# ################################################################# #

View 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"
# ################################################################# #

View File

@@ -31,6 +31,8 @@ entryPoints:
scheme: https scheme: https
websecure: websecure:
address: ":443" address: ":443"
ssh-git:
address: ":2222"
# --- Proveedores: Docker (vía Proxy) y Archivos Locales --- # --- Proveedores: Docker (vía Proxy) y Archivos Locales ---
providers: providers: