Para o BSD eu procuraria relayd(8)
- é nativo do OpenBSD, mas eu acredito que o FreeBSD também tem um port. É bastante poderoso e pode fazer mais do que algumas coisas (ex., Proxy, balanceador de carga, gateway de aplicativo) incluindo o que você está pedindo.
Leia as man pages, particularmente a seção 'Regras de filtro' e 'Protocolos':
Definitivamente, pule na lista de discussão 'misc' do openbsd se tiver problemas. A comunidade é rápida e o autor está sempre disponível.
relayd
está intimamente conectado ao filtro de pacotes pf
, que é como ele é capaz de criar regras em conjunto para a Camada 3 e 7