9.0 KiB
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:
./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/.
-
Crie o arquivo de configuração: Crie um arquivo
.confemconf.d/(ex:meusite.com.br.conf). Use um dos arquivos existentes como modelo.Modelo Básico (com SSL):
# 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; } } -
Aplique as alterações:
docker compose restart nginx-proxyNo 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.confpara ajustar os limites de requisições por segundo. - Bloqueio de Bots: Edite
snippets/security_maps.confpara adicionar novos User-Agents à lista negra. - Cache: Edite
snippets/cache_zones.confpara 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.confcontém apenas whitelists de rede interna. - Aplicação: Após editar qualquer regra, reinicie o container do WAF para aplicar:
docker compose restart modsecurity
Nota Técnica: O arquivo
modsec.conf.templatena 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:
docker compose logs nginx-proxy | grep "SSL" -
Forçar Renovação: Se precisar renovar um certificado imediatamente:
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:
./scripts/reload.sh
5. Monitorar e Debugar
-
Verificar Status dos Containers:
docker compose ps -
Ver Logs em Tempo Real:
docker compose logs -f -
Verificar se o WAF (ModSecurity) bloqueou algo:
docker compose logs modsecurity | grep "Access denied" -
Verificar Banimentos do Fail2ban:
docker compose exec fail2ban fail2ban-client status nginx-badbots
🏗️ Visão Geral da Stack
graph TD
subgraph Internet
Client[Cliente Externo]
end
subgraph Host["Host Docker (Portainer)"]
subgraph PathfinderStack["Stack: Pathfinder-Proxy<br/>Rede: 172.112.0.0/16"]
WAF["ModSecurity WAF<br/>172.112.0.3<br/>:80, :443"]
NGINX["nginx-proxy<br/>172.112.0.2<br/>:8080 interno"]
F2B["fail2ban<br/>network: host"]
end
subgraph HostNetwork["Rede Física do Host"]
HostIP["host.docker.internal<br/>(gateway)"]
end
subgraph OtherStacks["Outras Stacks Docker"]
Container1["Container A<br/>172.111.0.x"]
Container2["Container B<br/>172.113.0.x"]
end
end
subgraph ExternalServers["Servidores Externos"]
Server254["10.10.253.254"]
Server128["10.10.253.128<br/>Gitea"]
end
Client -->|":80/:443"| WAF
WAF -->|"proxy_pass :8080"| NGINX
F2B -.->|"lê logs"| WAF
F2B -.->|"lê logs"| NGINX
NGINX -->|"extra_hosts<br/>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.xprecisam ser verificados nos arquivos de configuração individuais.
Mantido por IT Guys