Este documento descreve, em detalhes, o escopo completo do desenvolvimento de um pacote/módulo para pfSense baseado em FreeBSD 15.x. O objetivo é criar um proxy https transparente capaz de inspecionar o ip de origem e o hostname (via sni) para aplicar políticas de bloqueio/liberação com registro de logs e integração futura à interface web do pfsense.
Visão Geral
- **Nome do pacote:** `sni_filter_proxy`
- **Plataforma alvo:** pfSense 2.8.1 (FreeBSD 14.x)
- **Linguagens preferenciais:** C/C++ (alternativamente Go/Rust, desde que compatível e com bom desempenho)
- **Funcionamento:** Proxy TLS transparente (porta 443) que captura o Clienthello, extrai o sni, cruza com o ip de origem e aplica regras do tipo allow/block. Todas as decisões devem ser registradas em log.
- **Requisito crítico:** o serviço precisa rodar como daemon e possuir script rc.d completo (start/stop/reload/status) para garantir persistência após reboots.
---
## Requisitos Funcionais
### 1. Core do Proxy
- Interceptar conexões tcp/443 (https) via redirecionamento `pf`.
- Ler a mensagem TLS ClientHello para extrair o hostname (SNI).
- Registrar ip de origem e sni e checar contra as regras definidas.
- Aplicar **allow** ou **block** com prioridade para allow; ausência de regra implica allow.
- Ao bloquear, encerrar a conexão rapidamente (RST) sem alertar o usuário.
### 2. Regras e Configurações
- Arquivo principal: `/usr/local/etc/sni_filter/
access_rules.txt`.
- Formato da linha: `[tipo];[ip de origem/cidr ou *];[hostname ou *]`.
- Suporte a IPv4/IPv6 e hostnames com wildcard (`*
.dominio.com`).
- Implementar recarga das regras em runtime via sinal `SIGHUP`.
- Manter estrutura thread-safe ou processos múltiplos conforme necessário para atender a várias conexões.
### 3. Logs
- Local padrão: `/var/log/
sni_filter_proxy.log`.
- Cada entrada precisa conter: timestamp, ip de origem, hostname e ação final (allow/block/erros).
- Manter o log rotativo via `newsyslog` (documentar sugestões) e garantir permissões corretas.
---
Fases de Entrega
### Fase 1 – Daemon + Serviço rc.d
1. Implementar o daemon (processo CLI executável em FreeBSD) com:
- Proxy TCP transparente.
- Parser de TLS ClientHello/SNI.
- Engine de regras conforme formato acima.
- Logging estruturado.
- Tratamento de sinais (sighup → reload, sigterm → shutdown limpo).
2. Entregar script rc.d completo em `/usr/local/etc/rc.d/sni_filter_proxy` com funções `start/stop/restart/status/reload`.
3. Produzir documentação detalhando:
- Dependências.
- Comandos de build (`make`/`gmake`).
- Instalação manual (copiar binário + configs + script rc.d).
- Como configurar regras e testar com `openssl s_client`.
Fase 2 – Integração GUI no pfSense
1. Criar arquivos xml/php necessários para expor o serviço em **services > sni filter proxy**:
- formulário para editar as regras (`
access_rules.txt`), campos de configuração (porta, timeout etc.).
- Botões para `start/stop/reload/status` e visualização das últimas linhas do log.
2. Integrar com o `
config.xml` do pfSense:
- Salvar as regras na seção própria e sincronizá-las com o arquivo físico.
- Garantir que o `rc.d` seja acionado conforme o usuário aplica mudanças.
3. Descrever, em documentação, como empacotar o módulo (Makefile do pacote, `pkg-descr`, `pkg-plist`) para distribuição pelo Package Manager do pfSense.
Instruções para os Desenvolvedores
1. **Referência:** utilizar o pacote `e2guardian` para pfSense como base de estrutura e boas práticas (organização, integração com GUI, scripts de instalação).
2. **Organização do código:** manter padrão profissional com diretórios `src/`, `include/`, `scripts/`, `docs/`, `config/`.
3. **Testes:**
- Fornecer testes unitários/automatizados quando aplicável (ex.: Parser de regras, parser SNI).
- Documentar testes manuais com `openssl s_client` simulando cenários allow/block e recarga.
4. **Segurança:** validar inputs (regras, hostnames) para evitar crashes; tratar conexões sem SNI com bloqueio seguro.
Entregáveis Esperados
1. Código-fonte completo do daemon (C/C++ ou Go/Rust) com build instructions.
2. Script rc.d** funcional para instalação em `/usr/local/etc/rc.d/`.
3. Arquivo de regras de exemplo** e instruções para criação de diretórios/configs.
4. Documentação Fase 1:
- Passo a passo de build/instalação/teste.
- Comandos para start/stop/reload e verificação de logs.
5. Documentação Fase 2:
- Guia de implementação dos arquivos xml/php e do package para pfsense.
- Descrição de como a GUI salva/aplica regras e interage com o daemon.
6. Checklist de testes (cli e gui) para validar o comportamento antes da entrega final.
Critérios de Aceite
- Daemon roda estavelmente no pfSense 2.8.1, reiniciando automaticamente via rc.d.
- Regras são aplicadas corretamente (allow prioritário, block quando aplicável, fallback allow).
- Logs registram todas as conexões analisadas, ações e recargas.
- `SIGHUP` recarrega as regras sem interromper conexões em andamento.
Plazo de Entrega: No definido