我有 2 个 ipset:(friends
允许列表)和enemies
(阻止列表)。
我的默认区域(public
)会丢弃所有流量,但某些服务除外(例如http
)。
我已经编辑了block
firewalld附带的区域以添加ipset:enemies
为源。
firewall-cmd --permanent --new-ipset=enemies --type='hash:net'
firewall-cmd --permanent --zone=drop --add-source=ipset:enemies
Firewalld 按字母顺序查看区域,并且block
位于之前public
,因此将首先考虑。
如果源 IP 匹配,则将其 DROP。很好。
但我还想有一个friends
包含永远不应被阻止的地址的列表。所以我想我需要类似的东西:
firewall-cmd --permanent --zone=drop --add-source=NOT ipset:friends
我尝试过的事情。
我认为答案可能是“丰富规则”,因为您可以在其中指定 NOT 作为源。但我不知道“元素”或“动作”应该是什么。
我在博客等上读到的答案建议创建新区域,例如a_zone_before_block
使用--add-source=ipset:friends
和--set-target=ACCEPT
。但是,我不想从这个允许列表中全面接受流量;我仍然希望它使用我public
区域中的规则。
我可以通过将 中的所有细节复制到public
中来解决这个问题,a_zone_before_block
但要添加source=ipset:friends
,但这感觉很乱 - 重复会带来两者不同步的问题。所以我希望有更好的方法。
所以我想要的是:
block
如果流量的来源位于 ipset:enemies 中,则应将其放入该区域除非其来源在ipset:friends。或者
一种方法是说如果流量在
block
区域中但其来源在ipset:friends
则将区域更改为public
或者
000_first
一种创建匹配区域的方法ipset:friends
,如果匹配,它会传递下去public
,跳过第二个区域block
。或者
在区域声明中使用继承的方法。