Algumas adivinhações abaixo tão emptor caveat. No entanto, é uma configuração muito típica que confunde muitas pessoas que iniciam combinando roteamento, filtragem de pacotes (firewall) e NAT (Network Address Translation).
Você não afirma claramente, mas imagino que sua rede seja assim:
Internet <-A-> SOHO Router <-B-> Server/workstation <-C-> VM
Seu servidor DNS está na rede B, que é 192.168.1.0/24
Acredito que o seu roteador SOHO na Internet é 192.168.1.1 e está definido como gateway padrão para a rede. Essa seria uma configuração extremamente comum.
Você afirma que o servidor DNS está em 192.168.1.2 e a interface em ponte dos servidores é 192.168.1.10. Por trás disso você tem a rede 10.9.9.0/24.
Sua configuração do iptables encaminhará todos pacotes na interface . Na prática, você envia todos os pacotes de uma rede para outra - até mesmo pacotes locais. Essa é a diferença importante.
Em sua configuração de pf você não encaminha todos pacotes na interface . Você especificou uma rede em1:network
. Nós não temos a configuração completa, mas eu acho que você realmente tem uma configuração barebones agradável e funcional. O que te morde são as rotas que faltam.
Quando você envia um pacote a partir do 10.9.9.0/24, ele alcançará a rede 192.168.1.0/24. Seu servidor tem uma perna nessa rede para que você alcance seu DNS diretamente. Mas o servidor DNS na rede B não tem idéia de como alcançar a rede não local C 10.9.9.0/24. Todas as respostas seriam então enviadas para o "roteador padrão", que eu acho que é o seu roteador SOHO. Este roteador também só sabe onde encontrar a rede 192.168.1.0/24 (não 10.9.9.0/24) e normalmente rotearia tudo para o seu link de Internet externo. Nesse caso, você está usando endereços privados apropriados - para que o pacote seja descartado, pois os endereços privados não são roteados na Internet.
A solução "adequada" seria configurar uma rota no seu roteador SOHO, informando-a para rotear os pacotes de 10.9.9.0/24 a 192.168.1.10. Um roteador decente permitirá que você faça isso. Muitos roteadores SOHO baratos infelizmente não. Nesse caso, você poderia adicionar a rota em seu servidor DNS para testá-lo.
- O motivo pelo qual funciona com o iptables é que o pacote de resposta é visto na interface eth0 e todos os pacotes são encaminhados. Todo o tráfego na rede B é enviado para a rede C (e reverso). Isso inclui tráfego que poderia / deveria ter permanecido local. Com efeito, você configurou uma ponte de rede.
- O motivo pelo qual ele não funciona para você na sua primeira configuração de pf é que você especificou a rede que espera ver. Apenas uma máquina na rede B sabe onde encontrar a rede C. Isso é 192.168.1.10, pois tem uma interface na rede C. Com efeito, você configurou um firewall básico. A filtragem está pronta, mas você não filtra nada ainda. Mas o roteamento está faltando.
- A razão que funciona na sua segunda configuração pf (sua própria resposta) é que você NAT a rede 10.9.9.0/24 no espaço de endereço de 192.168.1.0/24. Todo o tráfego da rede C 10.9.9.0/24 na rede B parece vir de 192.168.1.10. O NAT deve ser evitado sempre que possível e ser usado apenas como último recurso .
Se você não precisa / quer filtrar pacotes - então eu aconselho você a não usar um firewall. O que você está tentando fazer deve ser tratado pelo roteamento simples .