下午好🌅🌅🌅
本答案参考通义千问
在 CentOS 8 系统中,firewalld 是默认的防火墙管理工具,它通过 firewall-cmd 命令进行配置。你提到的问题是:如何通过 firewall 配置访问策略(白名单),并且希望只允许特定 IP 段访问特定端口,同时阻止其他 IP 的访问。
✅ 核心问题分析
- 默认策略:
firewalld 默认是 允许所有流量,除非你明确设置了 拒绝或丢弃规则。 - 富规则(Rich Rules):用于更精细的控制,比如基于源 IP、端口等。
- 区域(Zone)设置:不同的网络接口可以绑定到不同的区域(如 public、internal),每个区域有不同的默认策略。
✅ 实现“白名单”访问控制的步骤
1. 设置默认区域为 public(或其他需要的区域)
sudo firewall-cmd --set-default-zone=public
注意:如果你使用的是 internal 区域,可能默认允许更多流量,建议使用 public 并手动设置规则。
2. 查看当前区域的默认策略
sudo firewall-cmd --zone=public --list-all
如果看到 policy: accept,说明默认是允许所有流量。你需要修改为 drop 或 reject。
3. 修改区域的默认策略为 drop(即默认拒绝所有流量)
sudo firewall-cmd --permanent --zone=public --set-policy=drop
sudo firewall-cmd --reload
重要提示:这个操作会拒绝所有流量,包括你自己的连接。务必确保你有其他方式(如 SSH 通道)可以重新连接。
4. 添加允许特定 IP 段访问的规则
假设你要允许 192.168.1.0/24 这个网段访问 22 端口(SSH):
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
加粗重点:
family="ipv4":指定 IPv4source address="192.168.1.0/24":允许的 IP 段port port="22":要开放的端口protocol="tcp":协议类型accept:允许该流量
5. 添加拒绝其他 IP 访问的规则(可选)
如果你想显式地拒绝其他 IP 的访问(虽然默认已经拒绝,但为了保险):
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source not address="192.168.1.0/24" port port="22" protocol="tcp" drop'
加粗重点:
source not address="192.168.1.0/24":排除该 IP 段drop:丢弃流量,不响应
6. 重新加载防火墙配置
sudo firewall-cmd --reload
✅ 完整解决方案步骤(有序列表)
-
设置默认区域
sudo firewall-cmd --set-default-zone=public
-
查看当前区域配置
sudo firewall-cmd --zone=public --list-all
-
修改区域默认策略为 drop
sudo firewall-cmd --permanent --zone=public --set-policy=drop
sudo firewall-cmd --reload
-
添加允许特定 IP 段访问的规则
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
-
添加拒绝其他 IP 的规则(可选)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source not address="192.168.1.0/24" port port="22" protocol="tcp" drop'
-
重新加载防火墙配置
sudo firewall-cmd --reload
✅ 常见问题解答
❓为什么我设置了白名单,其他 IP 还能访问?
- 原因:
firewalld 默认是 accept,没有设置 drop 策略。即使你设置了允许规则,如果没有设置默认拒绝,其他 IP 也会被允许。 - 解决方法:将区域默认策略改为
drop,并添加允许规则。
❓设置 drop 后,我的 IP 也被阻断了怎么办?
- 原因:你的 IP 不在允许的 IP 段内,导致被
drop 规则拦截。 - 解决方法:
- 确保你的 IP 在允许的 IP 段中。
- 使用
--add-source 来允许你的 IP。 - 或者临时切换到
trusted 区域(仅限内部网络)。
✅ 示例:允许一个 IP 和一个网段访问 22 端口
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
sudo firewall-cmd --reload
✅ 总结
| 步骤 | 内容 |
|------|------|
| 1 | 设置默认区域为 public |
| 2 | 查看区域配置 |
| 3 | 设置默认策略为 drop |
| 4 | 添加允许特定 IP 段的规则 |
| 5 | 可选:添加拒绝其他 IP 的规则 |
| 6 | 重新加载防火墙配置 |
如果你还有其他问题,比如如何配置 HTTP、HTTPS、MySQL 等服务的白名单,也可以继续提问,我可以提供对应的配置命令。