TLSStress.Art — Para que serve¶
Leia no seu idioma: English · Português · Español
Estado do escopo (pós-Scope-Freeze 2026-05-10) — Veja ARCHITECTURE.md para a arquitetura canônica de 37 MÓDULOs + 7 Test Kinds + DOM/CPOS/PIE-PA de segurança. ADRs 0014, 0019-0025 cobrem adições pós-Freeze. Web Agent Cluster for NGFW TLS Inspection performance test — bancada de testes open-source para medir a capacidade real de inspeção TLS de Next-Generation Firewalls (NGFWs) sob carga HTTP/2 e HTTP/3.
Autor: André Luiz Gallon · Licença: PolyForm Noncommercial 1.0.0 + Appendix A · Público-alvo: o licenciante e os parceiros autorizados pelo licenciante
1. Por que este software existe¶
Quando uma empresa precisa testar a capacidade de inspeção TLS de um firewall corporativo, o mercado tem dois extremos:
| Categoria | Exemplos | Limitação |
|---|---|---|
| Ferramentas gratuitas | TRex, iPerf3, wrk, Locust | Não geram tráfego TLS realista em escala — pacotes crus ou HTTP simples, sem JavaScript, sem handshake TLS completo, sem HTTP/3 |
| Appliances comerciais | Spirent CyberFlood, Ixia BreakingPoint, IXIA IxLoad | US$ 50K–500K por chassi; hardware proprietário; difícil de automatizar em CI/CD |
| TLSStress.Art | Este projeto (open-source, PolyForm Noncommercial) | Roda em hardware commodity (Ubuntu + k3s); navegador real (browser engine) + carga sintética (k6); HTTP/2 e HTTP/3 nativos; sem custo de licença para o público elegível |
TLSStress.Art preenche essa lacuna: oferece teste de inspeção TLS com realismo de nível de produção — navegadores reais, JavaScript, cookies, certificados válidos — sem custo de licença e com automação completa via Kubernetes e GitHub Actions.
A pergunta que o produto responde: quantas conexões TLS simultâneas o firewall consegue lidar antes que o desempenho degrade — e qual é o impacto comparativo entre HTTP/2 e HTTP/3?
2. Como funciona — visão de 30 segundos¶
┌─────────────────────────┐
│ Load robots │ browser engine (real browser) + k6 (HTTP)
│ up to 300 PW + 1000 synthetic-load engine │ generate TLS traffic against the personas
└──────────┬──────────────┘
│ Leg 1: encrypted HTTPS (robots trust the firewall cert)
▼
┌─────────────────────────┐
│ FIREWALL (DUT) │ Appliance under test — decrypts, inspects,
│ — under test, measured │ re-encrypts every packet
└──────────┬──────────────┘
│ Leg 2: re-encrypted HTTPS (firewall talks to persona)
▼
┌─────────────────────────┐
│ 30 Caddy personas │ 20 Synthetic (always-on) + 10 Cloned slots
│ 20 Synthetic + 10 │ (operator picks public sites to clone)
│ Cloned slots │
└─────────────────────────┘
┌─── Telemetry collected in parallel (4 pillars) ─────┐
▼ ▼
SNMP exporter Promtail/Loki DUT API REST OpenTelemetry → Tempo
(CPU/mem/IF of (events from Nexus, (config + state (distributed tracing
Nexus + DUT) NGFW, UCS hosts) of FTD/Nexus/ opt-in in agents)
UCS/Fortinet)
Leg 1 — robôs abrem conexões HTTPS para os endereços das personas. O firewall intercepta e apresenta seu próprio certificado (o operador configura os agentes para confiar em ngfw-ca).
Leg 2 — o firewall abre uma segunda conexão HTTPS para a persona de destino. O certificado é emitido pelo cert-manager (CA persona-ca).
4 pilares de telemetria coletam evidência simultaneamente — métricas (Prometheus + SNMP), eventos (correlação de syslog via Loki), estado do dispositivo (DUT API REST) e traces (Tempo) — respondendo não apenas "qual foi o p99" mas também "o que aconteceu no DUT quando o p99 disparou".
3. As 30 personas¶
A frota de personas é dividida em dois grupos:
20 Synthetic (always-on)¶
Definidas em personas.yaml, geradas a partir de templates Caddy. Cada persona roda em um namespace Kubernetes dedicado, com certificado TLS, IP fixo, VLAN exclusiva (101–120) e entrada DNS dedicada.
Distribuídas em 4 arquétipos:
| Arquétipo | Exemplos | Como o tráfego é gerado |
|---|---|---|
| skin | CDN, blog, portal, news, gov, edu, gallery, stream, download, docs | HTML/CSS/JS sintético; assets estáticos de alto throughput |
| mock | api-rest, api-graphql, chat, webhook, telemetry, ads | JSON/XML configurável via YAML; simula microsserviços |
| har-replay | har-saas, har-social, har-webmail, har-media | Replay de gravações HAR (HTTP Archive) de sessões reais |
| real-app | shop (Saleor, e-commerce completo) | Aplicação real com banco de dados, estado, JavaScript dinâmico |
10 Cloned slots (preenchidos pelo operador)¶
VLANs 200–209. O operador escolhe um site público (ex.: globo.com, cnn.com), o Cloner faz crawl + snapshot do conteúdo estático e a réplica passa a servir localmente como uma persona "real" em *.persona.internal.
O Cloner usa três interfaces de rede distintas: OOBI (mgmt), VLAN 40 (DHCP do ISP do cliente, para baixar conteúdo da Internet pública) e uma VLAN macvlan dentro do cluster (para servir conteúdo clonado às demais personas/agentes).
4. Os 4 pilares de telemetria¶
O produto não mede apenas latência. Para responder por que uma métrica mudou — pré-requisito para que um teste NGFW seja válido — coletamos evidência de quatro fontes simultaneamente:
| Pilar | Fonte | O que captura | Endpoint |
|---|---|---|---|
| 1. Métricas (SNMP + Caddy + agentes) | SNMP exporter, Caddy /metrics, browser-engine/synthetic-load |
CPU, memória e contadores de interface do switch e do firewall; req/s, bytes, conexões ativas, QUIC vs TCP nas personas; latência, throughput, taxa de erro, handshake TLS nos agentes | Prometheus → Grafana |
| 2. Eventos (correlação Syslog) | Promtail (NodePort 30514) → Loki | Eventos do Nexus 9000, do NGFW DUT, dos hosts UCS. Política OOBI-only (NUNCA no data plane). Ingestão é imposta por dois recursos NetworkPolicy em nível de cluster |
Loki → Grafana Explore + dashboard "Syslog Correlation" |
| 3. Estado do DUT (REST API) | Worker de polling no pod Dashboard | Para cada DUT registrado: versão, config NTP, política de inspeção SSL/TLS, estado de HA, vizinhos LLDP/CDP, inventário de hardware. Snapshots assinados com SHA-256 (cadeia de custódia forense) | DUT API REST adapters (FTD, Nexus, UCS, Fortinet) → Postgres dut_api_snapshots |
| 4. Traces (OpenTelemetry → Tempo) | SDK opt-in em browser-engine + synthetic-load | Distributed tracing por ciclo de teste, com spans para cada handshake TLS. Cobre o caminho ponta-a-ponta: agente → NGFW → persona | Tempo → Grafana → Dashboard |
A combinação dos quatro permite respostas como: "latência p99 disparou às 14:23 → confirmado no syslog: NGFW logou CPU alta às 14:22 → confirmado na DUT API: política de decryption foi alterada por outro operador 4 minutos antes → trace mostra handshake levando 380ms vs baseline de 95ms".
5. DUT API — integração multi-vendor¶
Padrão adapter com 4 vendors entregues (Palo Alto no roadmap):
| Vendor | Adapter | Auth | Status |
|---|---|---|---|
| Cisco FTD (FDM-managed) | cisco-ftd.ts |
OAuth2 → Bearer | ✅ Entregue |
| Cisco Nexus 9000 | cisco-nexus.ts |
NX-API cookie (APIC-cookie) | ✅ Entregue |
| Cisco UCS C-Series CIMC | cisco-ucs-cimc.ts |
Basic Auth (Redfish) | ✅ Entregue |
| Fortinet FortiGate | fortinet-fortigate.ts |
API key Bearer (FortiOS REST v2) | ✅ Entregue |
| Palo Alto (PAN-OS) | — | API key (XML API) | 📋 Roadmap |
Fluxo do operador:
1. UI em /admin/dut-api registra um dispositivo (URL, credenciais — criptografadas com AES-256-GCM)
2. Worker de polling no Dashboard coleta snapshots a cada N minutos (configurável; padrão 5min)
3. Cada snapshot vira uma linha em dut_api_snapshots com payload JSON + SHA-256 da forma canônica
4. Snapshots aparecem em dashboards Grafana ("DUT Live State") e (no roadmap) nos Anexos B/C/D do Test Run Report
Catálogo de 45 features mapeado por vendor — qual adapter expõe config NTP, qual expõe estado HA, etc. — em docs/API_FEATURE_CATALOG.{md,pt-BR,es}.md.
6. Test Plans + Test Run Reports¶
Test Plan engine — 15 planos pré-configurados (catálogo em docs/TEST_PLANS.{md,pt-BR,es}.md):
- Identificadores estáveis (string ID, não hash) para comparações entre engagements
- Validados por schema Zod, sincronizados ao Postgres no boot
- Cada plano declara o estado NGFW esperado (ex.: ngfw_state_required: decryption-on)
- Os planos cobrem: baseline H2/H3, max-CPS handshake, throughput sustentado, decryption-on vs decryption-off, falhas de cert, protocolo misto, etc.
Test Run Report — Fase 1 entregue (#185):
- HTML print-styled (/runs/{id}/report) com capa, página de licença em 3 idiomas, resumo executivo, config do plano, anexos placeholder
- Rodapé de licença fixado em cada página
- Hashes SHA-256 do relatório completo + plan-snapshot + por-anexo (cadeia forense)
- API JSON paralela: /api/test-runs/{id}/report.json
Roadmap das fases pendentes: - Fase 2 — render server-side com Puppeteer → PDF real (atualmente HTML print) - Fase 3 — Anexos B/C/D conectados (snapshots Nexus/NGFW/UCS embutidos no relatório) - Fase 4 — assinatura Cosign + entrada Rekor/Sigstore (log de transparência público) - Fase 5 — comparação N-runs (run A vs run B), rollups de tendência (semanal/mensal), replay de snapshot
7. Pre-flight, time-sync, validade do test bed¶
Pre-flight checks (engine + catálogo de 5) — antes de cada run, valida o estado do lab:
- ngfw-deploy-clean — nenhum deploy pendente no DUT
- ngfw-decrypt-state-matches-plan — estado de decryption alinhado com o plano
- ntp-source-configured — todo componente tem NTP definido
- ngfw-ha-state-sane — par HA em estado consistente
- snapshot-fresh — última coleta DUT API < threshold
Camada time-sync — relógio de todo o lab sincronizado:
- Script scripts/check-time-sync.sh mede skew entre componentes; alertas Prometheus disparam acima do threshold
- O Cloner pode atuar como NTP relay (stratum-2) quando a Internet do data center é restrita
- Browser-clock fallback documentado e implementado: a UI admin em /admin/time-sync envia o horário do laptop do operador via POST /api/time-sync/set-from-browser (com acknowledgement: NOT_FORENSIC obrigatório), retorna o comando kubectl chronyc settime para o operador aplicar manualmente. O audit log marca forensic_grade: false automaticamente.
Prova de validade do test-bed — evolução de observabilidade em 4 fases entregues: 1. Thresholds deployment-aware + fleet readiness (PR-1+2, #173) — alertas que sabem qual deploy mode (single/dual/tri/multi) está ativo 2. Correlação causal topology-aware (PR-3, #177) — correlaciona métricas pelos nós/personas/agentes que de fato se comunicam entre si 3. SLO + alertas multi-window multi-burn-rate + detecção de anomalia + Tempo (PR-4, #179) 4. Banner de licença sempre visível em Dashboard, Grafana, Prometheus (#178)
8. Compliance, forense, proteção de IP¶
Marca registrada e tagline oficial: - Nome: TLSStress.Art (™ — registro em andamento) - Tagline: Web Agent Cluster for NGFW TLS Inspection performance test
Licença: PolyForm Noncommercial 1.0.0 + Appendix A — uso somente não-comercial, e o Appendix A restringe o público elegível ao licenciante (e ao pessoal que ele autoriza) e aos engenheiros pré-/pós-vendas dos parceiros comerciais certificados ou autorizados pelo licenciante. Detalhes em LICENSE e USAGE_POLICY.md.
License Acceptance Modal — o primeiro login no Dashboard intercepta o operador com um modal exigindo aceite da licença + USAGE_POLICY. O aceite grava uma linha em audit_log (visível em /admin/audit/license-acceptances). Política de privacidade em PRIVACY_POLICY.md, política de auditoria em AUDIT_LOG.md.
Infraestrutura forense (IP_PROTECTION.md):
- FINGERPRINT_REGISTRY em branch privado (private/forensic) — fingerprints intencionais no código que comprovam autoria caso surja um clone
- Asset hashes manifest assinado a cada release
- Tamper-check workflow roda em PRs e em main, comparando hashes contra o manifest
- Roadmap: migrar FINGERPRINT_REGISTRY para um repo separado para evitar vazamento via Access Broker
TLS Decrypt Mode Verification (#180) — probe que cruza o issuer-cert observado na conexão contra a política de decryption esperada do plano. Garante que a medição reflete o modo operacional real do NGFW (sem esperar pelos logs do dispositivo).
9. Onboarding do operador¶
Cinco docs encadeados para levar um operador do zero ao primeiro run:
Access Request → Clone → Install (Runbook)
[ACCESS_REQUEST] [CLONE_FOR_INSTALL] [RUNBOOK_FIRST_INSTALL]
│
└── alternate: [AIRGAP_INSTALL]
Maintainer-only setup (one-time): [PRIVATE_REPO_SETUP]
- Access Broker (
ACCESS_REQUEST.md) — template de issue + GitHub Action/approve/deny. Auto-list de domínios controlados pelo licenciante; fluxo manual com partner ID para os parceiros autorizados pelo licenciante. - Clone (
CLONE_FOR_INSTALL.md) — 4 opções degit cloneautenticado (HTTPS+PAT, SSH key, GitHub CLI, tarball assinado). - Runbook First Install (
RUNBOOK_FIRST_INSTALL.md) — protocolo de 4 passos: lab→DUT→smoke→measure. Time budget: ~2h. - Instalação airgap (
AIRGAP_INSTALL.md) — alternativa para data centers sem Internet (regulamentado / classificado). - Private repo setup (
PRIVATE_REPO_SETUP.md) — setup maintainer-only (uma vez, pelo dono do repo).
10. Tuning aplicado em cada camada¶
Para que os resultados reflitam o limite real do firewall — não limitações do test bed — cada componente da plataforma foi tunado com parâmetros específicos. Scripts automatizados aplicam o tuning de forma reproduzível.
| Componente | Parâmetros | Impacto |
|---|---|---|
Linux Ubuntu host (DaemonSet node-tuning) |
rmem_max/wmem_max = 64 MB; TCP BBR + FQ; tcp_max_syn_backlog=65535; vm.swappiness=5; CPU governor performance; THP madvise; nf_conntrack_max=2M; tcp_orphan_retries=2 |
Crítico para QUIC/HTTP3: buffers UDP grandes evitam drops; BBR melhora throughput em redes com variação de RTT |
| Caddy webserver (por pod persona) | GOMAXPROCS via resourceFieldRef; GOMEMLIMIT=460MiB; GOGC=200; QoS Guaranteed (CPU 2/2, Mem 512Mi/512Mi) |
Go usa todos os cores disponíveis sem over-commit; GC menos frequente reduz tail latency |
| Switch Nexus 9000 (script automatizado) | EEE off, flow control off, MTU 9216 (jumbo frames), QoS DSCP AF41, hash ECMP com porta UDP, ARP timeout 300s | Jumbo frames aumentam throughput; EEE desabilitado elimina latência adicionada; ECMP com porta UDP distribui QUIC corretamente |
| agentes browser-engine + synthetic-load | NODE_EXTRA_CA_CERTS / SSL_CERT_FILE apontando para persona-ca; GOMAXPROCS/GOMEMLIMIT no k6; resources right-sized; topology spread; CYCLE_CONCURRENCY=3 |
Confiança nos certs sem warnings; UDP 443 aberto; ocupação máxima de cores sem conflito |
Guias detalhados: docs/PERFORMANCE_TUNING_HOST.md, docs/NEXUS9K_TUNING.md, além dos artefatos k8s/85-node-tuning.yaml + scripts/nexus/0[1-3]-*.nxos.
A configuração completa foi desenhada para ser low-friction: ./scripts/k8s-dut-up.sh up sobe toda a plataforma em fases automáticas.
11. Arquitetura de rede¶
Ubuntu Server (k3s)
├── eth0 → OOBI network (mgmt, metrics, dashboard, control, Service VIPs)
└── eth1 → Nexus 9000 trunk (data VLANs)
├── VLAN 20 (172.16.0.0/16) → browser-engine agents (dut-pw)
├── VLAN 30 (172.17.0.0/16) → synthetic-load agents (dut-k6)
├── VLAN 40 (DHCP from ISP) → Cloner ISP egress (Internet uplink, outside our scheme)
├── VLAN 99 (192.168.90.0/24) → OOBI mgmt (dut-mgmt, SNMP, syslog, NTP)
│
│ 20 Synthetic VLANs (101–120) — one per Caddy persona:
├── VLAN 101–120 (10.1.x.0/27) → shop, news, blog, docs, gallery, stream, download,
│ edu, gov, cdn, api-rest, api-graphql, chat, webhook,
│ telemetry, ads, har-saas, har-social, har-webmail, har-media
│
│ 10 Cloned VLANs (200–209) — dynamic slots filled by the Cloner:
└── VLAN 200–209 (10.2.x.0/27) → cloned-1 .. cloned-10
│
FIREWALL (DUT) ←── inspects TLS on all VLANs
│
4 telemetry pillars collect evidence in parallel
(SNMP + Syslog + DUT API + Tempo)
Por que separação estrita entre OOBI ↔ data plane?
- O data plane (VLANs 20, 30, 40, 101–120, 200–209) carrega o tráfego de teste. Qualquer tráfego de mgmt aqui contamina métricas por ciclo.
- A OOBI (VLAN 99 / 192.168.90.0/24) é exclusiva para mgmt — Prometheus scrape, SNMP, syslog, NTP, kubectl, dashboard. As políticas syslog-oobi-only + syslog-deny-data-plane são impostas em nível de cluster por dois recursos NetworkPolicy complementares.
- Service VIPs na OOBI (.50–.69) — Promtail :514, NTP relay :123, Dashboard :3000, Prometheus :9090, Grafana :3001, Loki :3100, SNMP-Exporter, Alertmanager, Tempo. Dispositivos DUT apontam para IPs fixos, não para NodePorts em um UCS específico.
12. 4 modos de deployment¶
| Modo | Quando usar | Guia |
|---|---|---|
| Single-node (1 UCS) | Avaliação inicial; hardware limitado | UBUNTU_K3S_SINGLENODE |
| Dual-node (2 UCS) | UCS-1 = agentes; UCS-2 = personas + serviços + observabilidade | UBUNTU_K3S_DUALNODE |
| Tri-node (3 UCS) | UCS-1 = só browser engine; UCS-2 = só k6; UCS-3 = personas + serviços + obs | UBUNTU_K3S_TRINODE |
| Multi-node (4 UCS dedicados) | UCS-1 = 30 personas · UCS-2 = browser engine · UCS-3 = k6 · UCS-4 = Dashboard/Postgres/Grafana/Cloner. Throughput máximo, sem contenção | UBUNTU_K3S_MULTINODE |
Os modos dual/tri/multi usam overlays Kustomize sob overlays/{dual-node,tri-node,multi-node}/ que aplicam nodeSelector a cada Deployment/StatefulSet. Permitem escalar browser engine até 300 instâncias e k6 até 1.000 instâncias sem compartilhar CPU/memória com os webservers das personas.
13. Dashboard operacional¶
Cockpit web (Next.js) em /. Páginas principais:
- Overview — status das 30 personas em tempo real (running, paused, error)
- Personas individuais — start/pause/deprovision; configurar rotas de resposta da mock-persona (YAML inline via API)
/admin/dut-api— registrar dispositivos DUT, testar conectividade, disparar snapshot, rodar pre-flight/admin/time-sync— UI admin para o fluxo de browser-clock fallback (com acknowledgement NOT_FORENSIC obrigatório)/admin/audit/license-acceptances— visualizador dos aceites de licença (auditoria forense)- Test Plans — escolher um plano, disparar um run, monitorar progresso
- Test Runs — histórico, link para HTML report (Fase 1)
- Métricas Grafana — embutidas por persona e por protocolo (HTTP/2 vs HTTP/3 vs HTTP/3-fallback-TCP)
Resumo em uma frase¶
TLSStress.Art é uma bancada de testes open-source (PolyForm Noncommercial, público restrito ao licenciante) que preenche a lacuna entre ferramentas gratuitas sem escala (TRex, iPerf) e appliances comerciais que custam até US$ 500K (Spirent, Ixia) — simulando até 30 sites realistas (20 Synthetic + 10 slots Cloned pelo operador) com browser-engine/synthetic-load contra o NGFW sob teste, integrando 4 pilares de telemetria (SNMP de hardware + correlação de syslog + DUT API REST multi-vendor para FTD/Nexus/UCS/Fortinet + tracing OpenTelemetry), com 15 planos de teste pré-configurados, Test Run Reports HTML/PDF assinados forensicamente, License Acceptance Modal + audit log + tamper-check, e tudo tunado do host Linux ao switch Nexus para que o gargalo medido seja sempre o NGFW — nunca o test bed.