我想在 FreeBSD 12.3 上设置一个简单的转发规则(不是端口转发!),根据接收接口和传出接口进行过滤。 IP 网络不应该成为规则的一部分,因为它就像所有类型 IP 的路由器一样。路由网络将由路由守护程序(带有 OSPF 的 BIRD)动态设置。
在使用 PF 的 FreeBSD 中,我只能为ifspec
每个过滤规则 ( ) 设置一个[ "on" ifspec ]
man 5 pf.conf:
pf-rule = action [ ( "in" | "out" ) ]
[ "log" [ "(" logopts ")"] ] [ "quick" ]
[ "on" ifspec ] [ route ] [ af ] [ protospec ]
hosts [ filteropt-list ]
我希望输入接口和输出接口的组合能够匹配。我怎样才能做到这一点?
在 Linux 中使用nft
/nftables 我会这样做:
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 规则。
答案1
在 FreeBSD 上似乎不可能通过单个规则来做到这一点。因此,我们可以使用一条match
规则来标记这些接口上的入站流量,然后使用两条pass
规则,一条为in
,一条为out
,然后仅允许流量在被标记为这样的情况下流出。
根据 FreeBSD 12.3 上的 man pf.conf(5):
tag <string> Packets matching this rule will be tagged with the specified string. The tag acts as an internal marker that can be used to identify these packets later on. This can be used, for example, to provide trust between interfaces and to determine if packets have been processed by translation rules. Tags are "sticky", meaning that the packet will be tagged even if the rule is not the last matching rule. [...]
其中很好地提到了问题的用例(“在接口之间提供信任”)。