我想在 FreeBSD 12.3 上设置一个简单的转发规则(不是端口转发!),它根据接收接口和外出接口进行过滤。IP 网络不应成为规则的一部分,因为它就像所有类型 IP 的路由器一样。路由网络将由路由守护程序(带有 OSPF 的 BIRD)动态设置。
在使用 PF 的 FreeBSD 中,我只能按照man 5 pf.confifspec
为每个过滤规则 ( [ "on" ifspec ]
)设置一个:
pf-rule = action [ ( "in" | "out" ) ]
[ "log" [ "(" logopts ")"] ] [ "quick" ]
[ "on" ifspec ] [ route ] [ af ] [ protospec ]
hosts [ filteropt-list ]
我希望输入接口和输出接口的组合匹配。我怎样才能做到这一点?
在使用nft
/nftables 的 Linux 中,我会这样做:
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."
}
[...]
在 Linux 中使用iptables
我会这样做:
iptables -A [...] --in-interface tun+ --out-interface tun+ -j ACCEPT
如何在 FreeBSD 上进行上述操作?
只是要清楚; 我不是在寻找端口转发或 NAT 规则。
在 FreeBSD 上的单一规则中似乎不可能做到这一点。因此,我们可以使用一条
match
规则来标记这些接口上的入站流量,然后使用两条pass
规则,一条 forin
和一条 forout
,然后只允许流量在被标记为这样的情况下流出。根据 FreeBSD 12.3 上的 man pf.conf(5) :
它很好地提到了问题的用例(“在接口之间提供信任”)。?
FreeBSD 的
tag
s 类似于mark
Linux 的 netfilter 中的 s。例子:
请注意,流量也需要
pass
edin
,除非它的目的地是它自己,否则我们可能会绕过其他传入的防火墙规则。附加调试提示:启用
pflog
(pflog_enable="YES"
在 中设置rc.conf
)并用于tcpdump -e -n -i pflog0
查看被阻止的内容。该-e
选项显示匹配哪个规则以导致数据包被阻止。