From 0ee283eab1b98abebd99a89ada480400a0587cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro?= Date: Thu, 22 Jan 2026 18:18:44 -0300 Subject: [PATCH] feat(rede): Implementa conectividade com redes Docker internas e IPs externos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Tarefa 4 - Conexão Direta na Interface do Host ### Alterações no Docker Compose - Adicionado host.docker.internal:host-gateway no modsecurity e nginx-proxy - Permite acesso à rede física do host para alcançar IPs externos (10.10.253.x) - Adicionados mapeamentos extras para server-254 e gitea-server ### Novos Arquivos - snippets/docker_resolver.conf: Resolver DNS Docker para containers dinâmicos - conf.d/test-connectivity.conf: Endpoints temporários para validar conectividade (REMOVER após testes no host de deploy) ### Documentação - README.md: Diagrama de arquitetura atualizado com cores mais legíveis - README.md: Adicionada tabela de sistemas/servidores (Docker/VM/LXC) - TODO.md: Status da tarefa 4 atualizado para 'Aguardando Teste' ### Próximos Passos (no host de deploy) 1. docker compose build --no-cache nginx-proxy 2. docker compose down && docker compose up -d 3. Testar ping para 10.10.253.254 e 10.10.253.128 4. Remover test-connectivity.conf após validação --- .gemini/TODO.md | 21 ++++++++ README.md | 99 ++++++++++++++++++++++++++++++----- conf.d/test-connectivity.conf | 45 ++++++++++++++++ docker-compose.yml | 16 ++++++ snippets/docker_resolver.conf | 11 ++++ 5 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 conf.d/test-connectivity.conf create mode 100644 snippets/docker_resolver.conf diff --git a/.gemini/TODO.md b/.gemini/TODO.md index 5b022ef..a54a09b 100644 --- a/.gemini/TODO.md +++ b/.gemini/TODO.md @@ -17,3 +17,24 @@ - **Status:** ✅ Concluído. - **Solução Implementada:** Script `./scripts/reload.sh` que executa `nginx -t` e `nginx -s reload` (Reload Suave/Process-Level Blue-Green). - **Como usar:** Execute `./scripts/reload.sh` após alterar qualquer `.conf`. + +## 4. Conexão Direta na Interface do Host +**Objetivo:** Configurar o proxy para rotear tráfego tanto internamente (entre containers Docker) quanto externamente (para serviços fora do Docker). +- **Status:** 🧪 Implementado - Aguardando Teste no Host +- **Solução Implementada:** + - Adicionado `host.docker.internal:host-gateway` no `docker-compose.yml` para ambos containers + - Criado `snippets/docker_resolver.conf` para resolução DNS dinâmica de containers + - Criado `conf.d/test-connectivity.conf` (temporário) com endpoints de teste + - Atualizado diagrama de arquitetura no `README.md` +- **Testes Necessários (no host de deploy):** + ```bash + # Rebuild e restart + docker compose build --no-cache nginx-proxy + docker compose down && docker compose up -d + + # Testar conectividade + docker compose exec nginx-proxy ping -c 2 10.10.253.254 + docker compose exec nginx-proxy ping -c 2 10.10.253.128 + ``` +- **Após Validação:** Deletar `conf.d/test-connectivity.conf` e marcar como ✅ Concluído. + diff --git a/README.md b/README.md index b64cb49..7402367 100644 --- a/README.md +++ b/README.md @@ -144,20 +144,95 @@ O sistema gerencia isso automaticamente, mas você pode intervir manualmente se ## 🏗️ Visão Geral da Stack ```mermaid -graph LR - Internet((Internet)) --> WAF[Container ModSecurity] - WAF -- Tráfego Limpo --> Proxy[Container NGINX Proxy] - Proxy --> Backend1[App 1] - Proxy --> Backend2[App 2] +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 - Logs[Logs Compartilhados] - WAF -.-> Logs - Proxy -.-> Logs - - F2B[Container Fail2ban] - F2B -- Lê --> Logs - F2B -- Bane IP --> WAF + 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* \ No newline at end of file diff --git a/conf.d/test-connectivity.conf b/conf.d/test-connectivity.conf new file mode 100644 index 0000000..b7a5337 --- /dev/null +++ b/conf.d/test-connectivity.conf @@ -0,0 +1,45 @@ +# ============================================================================== +# ARQUIVO TEMPORÁRIO: Teste de Conectividade +# REMOVER APÓS VALIDAÇÃO DA TAREFA 4 +# ============================================================================== + +server { + listen 8080; + server_name localhost test-connectivity; + + # Health check simples + location /health { + return 200 "OK - nginx-proxy respondendo\n"; + add_header Content-Type text/plain; + } + + # Teste 1: Ping para 10.10.253.254 + location /test/254 { + proxy_pass http://10.10.253.254/; + proxy_connect_timeout 5s; + proxy_read_timeout 10s; + error_page 502 504 = @test_failed; + } + + # Teste 2: Ping para 10.10.253.128 (Gitea - porta 3000) + location /test/128 { + proxy_pass http://10.10.253.128:3000/; + proxy_connect_timeout 5s; + proxy_read_timeout 10s; + error_page 502 504 = @test_failed; + } + + # Teste 3: Acesso via host.docker.internal (rede do host) + location /test/host { + # Tenta acessar a porta 80 do próprio host + proxy_pass http://host.docker.internal/; + proxy_connect_timeout 5s; + error_page 502 504 = @test_failed; + } + + # Fallback para testes que falharam + location @test_failed { + return 503 "FALHA: Não foi possível conectar ao backend\n"; + add_header Content-Type text/plain; + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 668d649..1996f71 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,7 @@ services: depends_on: - nginx-proxy extra_hosts: + - "host.docker.internal:host-gateway" - "srvproxy001.itguys.com.br:172.16.254.1" - "srvproxy001:172.16.254.1" - "git.itguys.com.br:10.10.253.128" @@ -53,6 +54,21 @@ services: - nginx_logs:/var/log/nginx - ./certbot/conf:/etc/letsencrypt - ./certbot/www:/var/www/certbot + extra_hosts: + - "host.docker.internal:host-gateway" + - "server-254:10.10.253.254" + - "gitea-server:10.10.253.128" + - "srvproxy001.itguys.com.br:172.16.254.1" + - "srvproxy001:172.16.254.1" + - "git.itguys.com.br:10.10.253.128" + - "git:10.10.253.128" + - "zammad.itguys.com.br:172.16.254.59" + - "zammad:172.16.254.59" + - "cloud.grupopralog.com.br:172.16.253.12" + - "business.itguys.com.br:172.16.121.13" + - "verbocloud.itguys.com.br:172.16.253.13" + - "srvoffice001.itguys.com.br:172.16.253.101" + - "srvoffice001:172.16.253.101" # ============================================ # Fail2ban (Lê logs e bane IPs) diff --git a/snippets/docker_resolver.conf b/snippets/docker_resolver.conf new file mode 100644 index 0000000..04fc90b --- /dev/null +++ b/snippets/docker_resolver.conf @@ -0,0 +1,11 @@ +# Docker DNS Resolver +# Use dentro de location blocks quando precisar resolver +# nomes de containers dinamicamente (ex: com variáveis) +# +# Uso: +# set $backend "container-name:port"; +# include /etc/nginx/snippets/docker_resolver.conf; +# proxy_pass http://$backend; + +resolver 127.0.0.11 valid=30s ipv6=off; +resolver_timeout 5s;