CentOS 7防火墙实战:用firewalld为Nginx服务配置IP白名单,只让特定服务器访问
CentOS 7防火墙实战:用firewalld为Nginx服务配置IP白名单
在分布式架构中,服务间的访问控制如同建筑的门禁系统。想象这样一个场景:您的Web集群中,Nginx服务器需要像VIP休息室一样,只对持有通行证的应用服务器开放。本文将带您深入firewalld的规则引擎,实现精准的IP白名单控制。
1. 理解防火墙区域与规则优先级
firewalld的zone概念是其核心设计。默认情况下,新规则会添加到public区域,但理解区域的工作机制能让我们更灵活地控制流量:
# 查看所有可用区域 firewall-cmd --get-zones # 查看默认区域 firewall-cmd --get-default-zone关键差异点:
--permanent参数决定规则是否持久化- 临时规则会覆盖永久规则直到下次重载
- 规则评估遵循"首次匹配"原则
提示:生产环境中建议始终使用
--permanent参数,并通过firewall-cmd --runtime-to-permanent将运行时规则转为永久规则
2. 构建精准的IP白名单体系
2.1 清理现有规则(关键准备步骤)
许多配置失败源于残留规则干扰。以下是标准清理流程:
# 移除现有80端口开放规则 firewall-cmd --permanent --zone=public --remove-port=80/tcp # 重载防火墙使更改生效 firewall-cmd --reload验证规则是否清除:
# 检查当前生效规则 firewall-cmd --list-all # 测试访问性(应无法访问) curl -I http://192.168.100.1012.2 配置Rich规则实现IP过滤
Rich规则是firewalld的高级语法,支持复杂条件组合:
# 允许特定IP访问80端口 firewall-cmd --permanent --zone=public \ --add-rich-rule='rule family="ipv4" \ source address="192.168.100.102" \ port protocol="tcp" port="80" accept'规则组件解析:
family:指定IPv4/IPv6协议族source address:定义源IP或网段port:指定目标端口和协议类型accept/reject:设置动作类型
2.3 验证规则有效性
采用双端验证法确保配置准确:
# 在允许的IP(102)上验证 ssh 192.168.100.102 "curl -I http://192.168.100.101" # 在禁止的IP(100)上测试 ssh 192.168.100.100 "curl -I http://192.168.100.101"3. 生产环境进阶配置方案
3.1 多IP段管理策略
当需要管理多个IP段时,推荐使用zone分离策略:
# 创建专用zone firewall-cmd --permanent --new-zone=nginx_whitelist # 添加多个信任IP firewall-cmd --permanent --zone=nginx_whitelist \ --add-rich-rule='rule family="ipv4" \ source address="192.168.100.102" accept' firewall-cmd --permanent --zone=nginx_whitelist \ --add-rich-rule='rule family="ipv4" \ source address="10.0.1.0/24" accept' # 将zone绑定到网卡 firewall-cmd --permanent --zone=nginx_whitelist \ --add-interface=eth03.2 服务模板化配置
将常用配置封装为服务定义,提升复用性:
# 创建nginx-whitelist服务定义 cat > /etc/firewalld/services/nginx-whitelist.xml <<EOF <?xml version="1.0" encoding="utf-8"?> <service> <short>Nginx with IP whitelist</short> <description>Nginx service with IP restriction</description> <port protocol="tcp" port="80"/> <port protocol="tcp" port="443"/> </service> EOF # 应用服务配置 firewall-cmd --permanent --zone=public \ --add-service=nginx-whitelist4. 防火墙规则维护与排错
4.1 规则持久化最佳实践
避免规则丢失的配置流程:
- 先测试临时规则
firewall-cmd --add-rich-rule='...' - 验证功能正常后转为永久规则
firewall-cmd --runtime-to-permanent - 确认永久配置
firewall-cmd --permanent --list-all
4.2 常见问题诊断工具
当规则不生效时,使用以下工具排查:
# 查看完整规则链 firewall-cmd --list-all --zone=public # 检查内核级规则 iptables -L -n -v # 实时监控被拒绝的连接 journalctl -u firewalld -f典型问题处理:
- 规则顺序错误:使用
--priority参数调整 - 服务未重载:确保执行
firewall-cmd --reload - 区域绑定错误:检查
firewall-cmd --get-active-zones
5. 扩展应用到其他服务
同样的原理可应用于各类服务防护:
MySQL访问控制:
firewall-cmd --permanent --zone=db_zone \ --add-rich-rule='rule family="ipv4" \ source address="192.168.100.110" \ port protocol="tcp" port="3306" accept'Redis防护配置:
firewall-cmd --permanent --zone=redis_zone \ --add-rich-rule='rule family="ipv4" \ source address="10.0.2.15" \ port protocol="tcp" port="6379" accept'在实际运维中,发现将相关规则按业务分组到不同zone,比全部堆砌在public区域更易维护。例如为每个微服务创建独立zone,再通过--change-interface动态调整网络边界。
