Eu gostaria de configurar uma regra simples de encaminhamento (não encaminhamento de porta!) no FreeBSD 12.3 que filtra com base na interface de recepção e na interface de saída. As redes IP não devem fazer parte da regra, pois funciona como um roteador para todos os tipos de IPs. As redes roteadas serão definidas dinamicamente por um daemon de roteamento (BIRD com OSPF).
No FreeBSD usando PF eu só posso definir uma ifspec
regra por filtro ( [ "on" ifspec ]
) conforme man 5 pf.conf :
pf-rule = action [ ( "in" | "out" ) ]
[ "log" [ "(" logopts ")"] ] [ "quick" ]
[ "on" ifspec ] [ route ] [ af ] [ protospec ]
hosts [ filteropt-list ]
Eu gostaria que a combinação de interface de entrada e interface de saída correspondesse. Como eu posso fazer isso?
No Linux usando nft
/nftables eu faria isso:
define iface_site2site = { "tun0", "tun1", "tun9" }
[...]
chain forward {
type filter hook forward priority 0;
policy drop;
iifname $iface_site2site oifname $iface_site2site accept \
comment "Freely forward packets between site-to-site links, firewalled at final destination."
}
[...]
No Linux usando iptables
eu faria isso:
iptables -A [...] --in-interface tun+ --out-interface tun+ -j ACCEPT
Como posso fazer o acima no FreeBSD?
Apenas para ser claro; Não estou procurando por encaminhamento de porta ou regras NAT.
Parece não ser possível fazer isso em uma única regra no FreeBSD. Então, em vez disso, podemos usar uma
match
regra para marcar o tráfego de entrada nessas interfaces, seguida por duaspass
regras, uma parain
e outra paraout
, que só permite que o tráfego saia se estiver marcado como tal.Conforme man pf.conf(5) no FreeBSD 12.3:
que menciona bem o caso de uso da pergunta ("fornecer confiança entre interfaces"). ?
Os s do FreeBSD
tag
são semelhantes aosmark
s do netfilter do Linux.Exemplo:
Observe que o tráfego também precisa ser
pass
edin
, exceto quando é destinado a si mesmo, caso contrário, poderíamos ignorar outras regras de firewall de entrada.Dica de depuração adicional: habilite
pflog
(configurepflog_enable="YES"
emrc.conf
) e usetcpdump -e -n -i pflog0
para ver o que está sendo bloqueado. A-e
opção mostra qual regra corresponde para fazer com que o pacote seja bloqueado.