Firewalld配置咨询:允许子网内单个IP访问并拒绝其余IP的实现方案
嘿,你的思路其实没走偏,firewalld完全能搞定这种「先把整个子网放进DROP区拒绝访问,再单独放行其中某个IP」的需求,操作起来也挺简单的,我给你一步步说清楚:
先确认当前DROP zone的配置,看看你已经添加的子网是否在里面,执行这条命令:
firewall-cmd --list-sources --zone=drop
这样能确保你要操作的目标子网确实被归在DROP规则里。核心逻辑是:firewalld的允许规则优先级高于拒绝规则,所以我们只需要给那个需要放行的单个IP,在DROP zone里添加一条允许规则就行(因为这个IP属于DROP里的子网,规则要在同一个zone里才会优先匹配)。
- 临时生效(重启firewalld后会失效)的命令:
firewall-cmd --zone=drop --add-source=192.168.1.100/32 - 永久生效的命令:
firewall-cmd --permanent --zone=drop --add-source=192.168.1.100/32 - 执行完永久命令后,记得重载配置让规则生效:
firewall-cmd --reload
- 临时生效(重启firewalld后会失效)的命令:
验证规则是否生效:再次执行
firewall-cmd --list-sources --zone=drop,你会看到那个单个IP(/32格式)和对应的子网都在列表里。这时候firewalld会优先匹配精确的/32规则,允许这个IP访问,而子网里的其他IP依然会被DROP拒绝。关于你提到的「其他子网的限制在系统默认接口zone」:默认接口zone(比如常见的public)的规则是针对接口上的流量,而DROP zone的source规则是针对来源IP的,两者可以互补。你只需要确保默认zone里没有给那些子网开不必要的权限就行,比如可以用
firewall-cmd --list-all --zone=public检查配置,确保没有允许那些子网的规则,这样其他子网的流量如果没匹配到DROP zone的source,就会走默认zone的限制规则,完全符合你的需求。
如果之后要撤销这个单个IP的放行权限,只需要执行firewall-cmd --permanent --zone=drop --remove-source=192.168.1.100/32,再重载配置就可以了。
备注:内容来源于stack exchange,提问作者El_Tel

