O arquivo do meu servidor pf.conf
possui estas linhas (entre outras para outros protocolos):
block in proto udp all
pass out proto udp all
Agora este servidor precisa verificar o estado de algumas máquinas vizinhas através de transmissão UDP:
- Abre um soquete UDP em qualquer endereço; o sistema operacional atribui uma porta a ele
- Ele usa este soquete para enviar uma mensagem UDP de transmissão para uma porta bem definida
- O host na mesma rede responde a esta mensagem com uma resposta unicast ou de transmissão para a mesma porta usada pelo servidor
- O servidor registra essas respostas e pode dizer se alguma das máquinas vizinhas está inoperante
Para dar um exemplo:
- Meu servidor 192.168.1.1 envia um pacote UDP
192.168.1.1:52361 -> 192.168.1.255:4545
- Host 192.168.1.3 responde com
192.168.1.3:4545 -> 192.168.1.1:52361
- Host 192.168.1.4 responde com
192.168.1.4:37243 -> 192.168.1.1:52361
- Host 192.168.1.5 responde com
192.168.1.5:4545 -> 255.255.255.255:52361
- O servidor registra que 192.168.1.{3,4,5} está instalado e funcionando.
Agora o problema é que a PF está impedindo que minha aplicação receba essas respostas. O Tcpdump mostra que as respostas estão chegando, mas o aplicativo não recebe nada. Se eu desabilitar o PF, recebo as respostas que espero.
O que posso adicionar pf.conf
para obter as respostas?
Como os IPs src e dst são diferentes na solicitação (
192.168.1.1
,192.168.1.255
) e nas respostas subsequentes (192.168.1.*
,255.255.255.255
), o estado mantido para a solicitação não será suficiente para permitir respostas recebidas.Você pode permitir que todos os pacotes recebidos cheguem ao endereço de broadcast proveniente da porta de origem desejada (por exemplo
52361
):Você também pode permitir respostas no endereço de transmissão da interface (por exemplo, para
eth0
):