- O desenvolvimento de relayd(8) e httpd(8), que estava estagnado com a perda de interesse dos desenvolvedores tradicionais do OpenBSD, voltou a ganhar ritmo com a participação de contribuidores que tinham demanda real em produção
- Partindo da ideia de que, justamente na era em que os LLMs passam a substituir conhecimento de programação, é preciso aprender C e encarar o desafio diretamente, o trabalho começou modernizando o sistema artesanal de imsg do relayd(8)
- Foram revisados e em grande parte resolvidos os patches não incorporados da lista
tech@entre 2024 e 2026, além de issues antigas do mirror no GitHub, e também foram preparados um mirror Git e README para novos contribuidores - O relayd(8) reforçou a segurança da API de imsg, do TLS e do parsing de requisições, além de corrigir conflitos de recarga; o httpd(8) adicionou defesa contra request smuggling, cabeçalhos personalizados e controle de cache para arquivos estáticos
- Segurança, estabilidade e escalabilidade dos dois daemons avançaram juntas, mas o trabalho também aumentou o backlog, e ideias e feedback continuam sendo bem-vindos
O contexto de reviver um projeto que havia perdido interesse
- Como tratado em principais mudanças do OpenBSD 7.8, o desenvolvimento de
relayd(8)ehttpd(8)estava parado- Vários contribuidores enviaram patches para a lista
tech@, mas quase nada foi incorporado ao repositório - A principal causa foi que os desenvolvedores tradicionais do OpenBSD já não tinham mais interesse nos dois daemons
- Vários contribuidores enviaram patches para a lista
- Junto com
kirill@, o autor passou a desenvolver os dois daemons ativamente com base na experiência de usá-los regularmente e lidar com casos reais de uso- A demanda prática de dar suporte a clientes OpenBSD com configurações complexas de
httpd(8)erelayd(8)também foi um impulso direto
- A demanda prática de dar suporte a clientes OpenBSD com configurações complexas de
Por que voltar ao C na era dos LLMs
- O maior gatilho foi o surgimento dos LLMs
- No passado, o autor escrevia código moderno em C++ de forma especializada, mas depois migrou para arquitetura de soluções, engenharia de plataforma e formação de equipes, deixando quase totalmente de programar no dia a dia
- Acabou ficando mais em escrever YAML declarativo e ler/portar código para o
ports(7)do OpenBSD
- Ao contrário da ideia de que “programação está resolvida”, concluiu que, quanto mais o conhecimento é delegado para fora, mais importante é possuir esse conhecimento diretamente
- C++ e Rust assumem parte das decisões difíceis, mas C não faz isso; por isso, o autor tomou isso como desafio e decidiu contribuir para
relayd(8)ehttpd(8)
Contribuição sustentada por disciplina, não por motivação
- Contribuir em open source pode terminar em frustração em poucas semanas, mas depois da fase inicial mais dolorosa foi possível entrar em um ritmo de trabalho constante
- No começo, ler a base de código de forma passiva foi desanimador em vários pontos
- A causa eram comentários insuficientes, algumas decisões ruins de projeto e código muito entrelaçado; ainda não está claro se isso é característica de código C ou falta de experiência pessoal
- Após discutir com os mantenedores dos daemons do OpenBSD, decidiu-se modernizar o sistema artesanal de mensagens imsg
- Primeiro com foco em
relayd(8), depois ampliando o escopo parahttpd(8) - O próprio trabalho de modernização foi usado como meio para entender a base de código
- Primeiro com foco em
Limpeza de patches não incorporados e issues antigas
- Foram revisados os registros da lista
tech@entre 2024 e 2026 para reunir patches e issues pendentes, e a avaliação é que a maior parte já foi tratada - Os dois daemons foram originalmente desenvolvidos por Reyk Floeter, hoje aposentado do OpenBSD
- Também foram revisadas issues antigas do mirror do relayd no GitHub, mantido por Reyk
- Todas as issues podem ser encerradas ou corrigidas, e algumas já não são mais válidas
Um mirror Git para novos contribuidores
- Inspirado no mirror já existente no GitHub, foi criado um mirror separado para facilitar a entrada de novos contribuidores mais jovens e criar um ponto de contato com a comunidade fora das listas de e-mail do OpenBSD
- A árvore CVS é usada como mirror Git, com o desenvolvimento acontecendo primeiro em uma instância do Gothub e depois sincronizado com os demais repositórios
- Primary: https://rsadowski.gothub.org/
- Mirror: https://codeberg.org/rsadowski/relayd
- Mirror: https://github.com/sizeofvoid/relayd
- O mesmo método foi aplicado a
httpd(8), com a criação de umREADME.mddetalhado com as informações necessárias
Modernização e qualidade de código no relayd(8)
- O sistema de imsg foi migrado para acessores mais seguros:
imsg_get_data,imsg_get_typeeimsgbuf_get - Foi adicionada tratativa de erro adequada em todo o processo de leitura do payload de imsg
- Logging e comentários foram padronizados para ficar consistentes com
bgpd - O tratamento da linha inicial HTTP foi separado em uma função dedicada, melhorando a organização do código
- Foi aplicado o formato
knfmt
Reforço de segurança no relayd(8)
- A cifra TLS padrão foi alterada de
HIGH:!aNULLparasecure - Foi adicionado suporte a ECDSA no mecanismo de privilégio separado (privsep) da CA
- Cabeçalhos
Content-Lengthduplicados passam a ser rejeitados com resposta HTTP 400 - Cabeçalhos
obs-foldnão são permitidos, para evitar diferenças entre parsers conforme a RFC 9112 5.2 - Foi adicionada verificação de ID de processo, e
IMSG_CTL_PROCFDpassou a ser restrito ao processo pai explicit_bzeropassou a ser usado para apagar dados sensíveis de senha
Correções de bugs e melhorias de estabilidade no relayd(8)
- Foi corrigida uma condição de corrida na recarga que causava crashes
- Vários vazamentos de memória ligados a
X509_dup,config_purgeetls_cfgforam eliminados - Foram corrigidas verificações de NULL e de limites
- Foi adicionada tratativa de erro adequada para falhas do OpenSSL
- Em falhas de TLS, a fila de erros do OpenSSL agora é esvaziada
Recursos adicionados ao relayd(8)
- Suporte ao método HTTP
MKCALENDAR - Passou a ser possível usar TLS em vários listeners
- Suporte a vários endereços com resolução de nome
- Agora é possível definir explicitamente os caminhos de certificado, chave e OCSP staple
- Requisições de health check HTTP podem definir
User-Agent - Respostas HTTP sem corpo agora são tratadas corretamente
Modernização e qualidade de código no httpd(8)
proc.cfoi migrado para a nova API de imsg, alinhando a consistência comrelayd(8)- A ordem dos tokens foi alterada para facilitar futuras expansões das opções de configuração
- O logging foi padronizado para ficar consistente com
bgpd - Código duplicado e funções vazias foram removidos
- Foi aplicado o formato
knfmt - O tratamento de funcionalidades embutidas foi separado em funções dedicadas
Reforço de segurança no httpd(8)
- A cifra TLS padrão foi alterada de
compatparasecure - O enquadramento de requisições CL.TE agora é rejeitado para bloquear ataques de request smuggling
- Cabeçalhos
obs-foldpassam a receber HTTP 400 conforme a RFC 9112 5.2 - A presença simultânea de
Content-LengtheTransfer-Encodingpassa a ser tratada como erro - Um relink aleatório é executado no boot como proteção adicional
- Foi adicionada verificação de ID de processo, e
IMSG_CTL_PROCFDpassou a ser restrito ao processo pai - Foi adicionada a opção
no bannerpara ocultar informações de identificação do servidor na resposta
Correções de bugs e melhorias de estabilidade no httpd(8)
- Foi corrigido o tratamento de suffix range em requisições HTTP
server_http_time()foi corrigido para emitir corretamente horário em GMT- Erros de
timegm(3)agora são verificados conforme especificado no manual - Foram resolvidos problemas em uploads com
chunked transfer-encoding - Foi corrigido o envio duplicado de
fcgiparamsem location - Foi adicionada tratativa de erro adequada em
dispatch_parent - Respostas abortadas agora são drenadas corretamente via
bufferevent - Armazenamentos desnecessários encontrados pelo
scan-buildforam removidos return_uri_lenagora é validado antes de copiar os dados
Novos recursos no httpd(8) e trabalho restante
- Suporte a cabeçalhos HTTP personalizados
gzip-staticagora é herdado em location para melhorar a herança de configuração- As flags do servidor foram expandidas para inteiro de 64 bits para comportar mais opções
- Foi adicionado controle de cache para arquivos estáticos
- À medida que o trabalho avançou, o backlog também cresceu, e ideias e feedback para o desenvolvimento futuro continuam sendo aceitos
1 comentários
Comentários no Lobste.rs
Fico feliz com o suporte a cabeçalhos HTTP personalizados. Antes, por falta desse recurso, eu não conseguia usar o httpd nem para casos simples, então é ótimo saber que agora ele é suportado
O desenvolvimento do relayd(8) e do httpd(8) estava estagnado, e vários contribuidores enviaram patches para a lista tech@, mas quase nada foi incorporado ao repositório. Ao que parece, o principal motivo foi que os desenvolvedores antigos do OpenBSD não tinham mais interesse nesses daemons, então sou grato a quem assumiu a manutenção
Uso os dois softwares regularmente, então fico feliz em ver que eles estão sendo bem mantidos de novo. Eu não fazia ideia de que o desenvolvimento tinha ficado parado
Graças à estrutura simples do software, parece que foi possível retomar o desenvolvimento e incorporar toda essa quantidade de recursos e correções sem precisar de uma equipe grande
Por um bom tempo eu fiquei confuso com o número depois do nome do software, mas descobri que ele indica o número da seção do manual
1 significa programas executáveis e comandos de shell, 2 chamadas de sistema, 3 chamadas de biblioteca, 4 arquivos especiais, 5 formatos e convenções de arquivo, 6 jogos, 7 diversos, 8 comandos de administração do sistema, e o 9 não padronizado indica rotinas do kernel
man 1 manou, de forma curta,man manpara verificar o man(1). Em especial, várias páginasintroemSEE ALSOsão úteisFico curioso se essas melhorias vão entrar no OpenBSD 8.0
Fico me perguntando se o link foi feito para ser legível desde o começo. No Firefox para Android ele aparece assim
https://imgur.com/a/oTimS9R
https://i.ibb.co/V0BgWFbV/image.png
https://hypertekst.net/Screenshot.png