Evaluando propuestas

Desenvolvimento de Proxy Https Transparente (Sni Filter) para Pfsense 2.8.1

Publicado el 11 Diciembre, 2025 en Programación y Tecnología

Sobre este proyecto

Abierto

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.

Categoría Programación y Tecnología
Subcategoría Aplicaciones de escritorio
¿Cuál es el alcance del proyecto? Crear una aplicación nueva

Plazo de Entrega: No definido

Habilidades necesarias

Otros proyectos publicados por G. M.