238 lines
9.0 KiB
Markdown
238 lines
9.0 KiB
Markdown
# 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<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.x` precisam ser verificados nos arquivos de configuração individuais.
|
|
|
|
---
|
|
|
|
*Mantido por IT Guys* |