# NGINX Pathfinder Proxy Solução moderna de Proxy Reverso containerizado, construída com NGINX, ModSecurity WAF e automação de SSL. ## 🚀 Funcionalidades ### 🛡️ Segurança em Primeiro Lugar - **ModSecurity WAF**: Conjunto de Regras OWASP (CRS) integrado rodando como proxy sidecar/frontend. - **Fail2ban**: Serviço "cão de guarda" que bane IPs com comportamento suspeito (bots ruins, excesso de erros 4xx/5xx). - **Mapas de Segurança**: Bloqueio automatizado de User-Agents maliciosos e restrições de rede interna. ### ⚡ Performance - **HTTP/3 (QUIC)**: Habilitado para conexões modernas de baixa latência. - **Compressão Brotli**: Melhores taxas de compressão que o Gzip padrão. - **Headers More**: Manipulação avançada de cabeçalhos para respostas limpas. ### 🔒 SSL Automatizado - **Renovação Zero-Touch**: O Certbot integrado verifica a validade diariamente. - **Auto-Renovação**: Renova automaticamente certificados próximos do vencimento (<= 3 dias). - **Injeção Inteligente**: Injeta automaticamente os snippets de desafio ACME nas configurações dos sites. --- ## 🛠️ Como Trabalhar neste Repositório ### Pré-requisitos - Docker & Docker Compose instalados - Acesso à internet (para baixar imagens e validar SSL) ### 1. Implantar o Servidor (Deploy) Para iniciar toda a infraestrutura: ```bash ./deploy.sh ``` *Este script detecta seu IP público, configura o ambiente e sobe os containers.* ### 2. Adicionar um Novo Site Todas as configurações de sites ficam na pasta `conf.d/`. 1. **Crie o arquivo de configuração**: Crie um arquivo `.conf` em `conf.d/` (ex: `meusite.com.br.conf`). Use um dos arquivos existentes como modelo. **Modelo Básico (com SSL):** ```nginx # Backend (para onde vai o tráfego) upstream meu_backend { server 192.168.1.10:8080; } # Redirecionamento HTTP -> HTTPS server { listen 80; server_name meusite.com.br; include /etc/nginx/snippets/acme_challenge.conf; # Importante para SSL return 301 https://$host$request_uri; } # Bloco HTTPS server { listen 443 ssl; http2 on; server_name meusite.com.br; ssl_certificate /etc/nginx/ssl/meusite.com.br.crt; ssl_certificate_key /etc/nginx/ssl/meusite.com.br.key; include /etc/nginx/snippets/ssl_params.conf; location / { proxy_pass http://meu_backend; include /etc/nginx/includes/proxy_backend.conf; } } ``` 2. **Aplique as alterações**: ```bash docker compose restart nginx-proxy ``` *No reinício, o script de pre-flight validará o DNS e injetará configurações de SSL necessárias.* ### 3. Modificar Configurações Globais As configurações globais são modularizadas na pasta `snippets/`. - **Rate Limiting**: Edite `snippets/rate_limit.conf` para ajustar os limites de requisições por segundo. - **Bloqueio de Bots**: Edite `snippets/security_maps.conf` para adicionar novos User-Agents à lista negra. - **Cache**: Edite `snippets/cache_zones.conf` para definir novas zonas ou tempos de cache. ### 3.1. Modificar Regras do WAF (ModSecurity) O WAF agora utiliza uma estrutura modular de regras localizada na pasta `modsec_rules/`. - **Arquivos Específicos**: Regras para Gitea, Nextcloud, Exchange, Zabbix, etc. ficam em seus respectivos arquivos `.conf`. - **Global**: `global-exceptions.conf` contém apenas whitelists de rede interna. - **Aplicação**: Após editar qualquer regra, reinicie o container do WAF para aplicar: ```bash docker compose restart modsecurity ``` > **Nota Técnica**: O arquivo `modsec.conf.template` na raiz é injetado no container durante o boot para contornar problemas de permissão e garantir o carregamento das regras customizadas. ### 4. Gerenciar Certificados SSL O sistema gerencia isso automaticamente, mas você pode intervir manualmente se necessário. - **Verificar Validade**: Verifique os logs do startup para ver o status de todos os domínios: ```bash docker compose logs nginx-proxy | grep "SSL" ``` - **Forçar Renovação**: Se precisar renovar um certificado imediatamente: ```bash docker compose exec nginx-proxy /scripts/renew_ssl.sh ``` - **Reload sem Downtime (Recomendado)**: Para aplicar alterações de configuração (vhosts, SSL) sem derrubar conexões ativas: ```bash ./scripts/reload.sh ``` ### 5. Monitorar e Debugar - **Verificar Status dos Containers**: ```bash docker compose ps ``` - **Ver Logs em Tempo Real**: ```bash docker compose logs -f ``` - **Verificar se o WAF (ModSecurity) bloqueou algo**: ```bash docker compose logs modsecurity | grep "Access denied" ``` - **Verificar Banimentos do Fail2ban**: ```bash docker compose exec fail2ban fail2ban-client status nginx-badbots ``` --- ## 🏗️ Visão Geral da Stack ```mermaid graph TD subgraph Internet Client[Cliente Externo] end subgraph Host["Host Docker (Portainer)"] subgraph PathfinderStack["Stack: Pathfinder-Proxy
Rede: 172.112.0.0/16"] WAF["ModSecurity WAF
172.112.0.3
:80, :443"] NGINX["nginx-proxy
172.112.0.2
:8080 interno"] F2B["fail2ban
network: host"] end subgraph HostNetwork["Rede Física do Host"] HostIP["host.docker.internal
(gateway)"] end subgraph OtherStacks["Outras Stacks Docker"] Container1["Container A
172.111.0.x"] Container2["Container B
172.113.0.x"] end end subgraph ExternalServers["Servidores Externos"] Server254["10.10.253.254"] Server128["10.10.253.128
Gitea"] end Client -->|":80/:443"| WAF WAF -->|"proxy_pass :8080"| NGINX F2B -.->|"lê logs"| WAF F2B -.->|"lê logs"| NGINX NGINX -->|"extra_hosts
host-gateway"| HostIP NGINX -.->|"bridge network"| Container1 NGINX -.->|"bridge network"| Container2 HostIP -->|"roteamento"| Server254 HostIP -->|"roteamento"| Server128 style WAF fill:#e74c3c,stroke:#c0392b,color:#fff style NGINX fill:#3498db,stroke:#2980b9,color:#fff style F2B fill:#27ae60,stroke:#1e8449,color:#fff style Server128 fill:#9b59b6,stroke:#8e44ad,color:#fff style Server254 fill:#9b59b6,stroke:#8e44ad,color:#fff style HostIP fill:#f39c12,stroke:#d68910,color:#fff style Container1 fill:#1abc9c,stroke:#16a085,color:#fff style Container2 fill:#1abc9c,stroke:#16a085,color:#fff ``` --- ## 📋 Sistemas e Servidores Configurados Lista de todos os sistemas roteados pelo proxy, organizados por tipo de infraestrutura. | Domínio | IP/Backend | Docker | VM | LXC | Descrição | |---------|------------|:------:|:--:|:---:|-----------| | `git.itguys.com.br` | 10.10.253.128 | ❌ | ❌ | ✅ | Gitea - Servidor Git | | `zammad.itguys.com.br` | 172.16.254.59 | ❌ | ❌ | ✅ | Zammad - Helpdesk | | `monitoramento.itguys.com.br` | 172.16.254.x | ❌ | ❌ | ✅ | Zabbix/Grafana | | `mimir.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Mimir - Métricas | | `windmill.grupopralog.com.br` | 172.16.253.103:8000 | ❌ | ❌ | ✅ | Windmill - Automação | | `katalog.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Katalog | | `verbocloud.itguys.com.br` | 172.16.253.13:11580 | ❌ | ❌ | ✅ | Nextcloud AIO | | `cloud.grupopralog.com.br` | 172.16.253.12 | ❌ | ❌ | ✅ | Nextcloud Pralog | | `srvoffice001.itguys.com.br` | 172.16.253.101 | ❌ | ✅ | ❌ | Exchange Server | | `business.itguys.com.br` | 172.16.121.13 | ❌ | ✅ | ❌ | Exchange OWA | | `vcenter.itguys.com.br` | 172.16.254.110:443 | ❌ | ✅ | ❌ | VMware vCenter | | `unifi.itguys.com.br` | 172.16.254.123:8443 | ❌ | ✅ | ❌ | UniFi Controller | | `workspace.itguys.com.br` | 172.16.121.2 | ❌ | ✅ | ❌ | Workspace Windows | | `vscode.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | VS Code Server | | `telefonia.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Central Telefônica | | `proxy.itguys.com.br` | localhost | ✅ | ❌ | ❌ | Este proxy | | `itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Principal | | `pralog.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Pralog | | `anatram.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Anatram | | `ferreirareal.com.br` | 172.16.x.x | ✅ | ❌ | ❌ | Site Ferreira Real | | `petytransportes.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Pety Transportes | | `solucionei.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Solucionei | | `rhema.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Rhema | | `integra.grupopralog.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Integração Pralog | | `ns1.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Primário | | `ns2.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Secundário | | `dns-primario.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Admin | > [!NOTE] > **Legenda:** Docker = Container Docker | VM = Máquina Virtual (VMware/Hyper-V) | LXC = Linux Container (Proxmox) > > IPs marcados como `172.16.x.x` precisam ser verificados nos arquivos de configuração individuais. --- *Mantido por IT Guys*