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