1. 需求概述
在服务器安全加固中,我们常常需要只允许特定的 IP 访问特定的服务,而拒绝其他所有流量。本教程将实现以下目标:
192.168.3.2:完全信任,可访问服务器所有端口(如 SSH、HTTP、HTTPS、数据库等)。192.168.3.100:仅允许访问** 80 端口**(HTTP 服务)。127.0.0.1(本机回环):允许访问所有端口(用于本地服务调用)。- 其他任何 IP:全部拒绝,无法访问任何端口。
本方案使用 firewalld 的 drop 区域,结合 rich rules 实现精细化控制,配置简洁、安全且易于维护。
2. 环境准备
- 操作系统:CentOS / RHEL / Fedora(或任何使用 firewalld 的发行版)
- 网络接口:例如
eno1(请根据实际情况替换) - 防火墙服务:
firewalld已安装并运行
# 检查 firewalld 状态
systemctl status firewalld
# 如未启动,则启动并设置开机自启
systemctl start firewalld
systemctl enable firewalld
3. 配置步骤
3.1 查看当前区域和接口绑定
首先确认当前活动的区域和绑定的网络接口:
firewall-cmd --get-active-zones
假设输出显示 drop 区域已激活,并且接口 eno1 已绑定。如果尚未绑定,请执行:
firewall-cmd --permanent --zone=drop --add-interface=eno1
firewall-cmd --reload
3.2 设置 drop 区域默认策略为 DROP
drop 区域默认就是 DROP,但为了确保,可以显式设置:
firewall-cmd --permanent --zone=drop --set-target=DROP
3.3 添加 rich rules
我们使用 rich rules 定义访问规则,逐步添加:
3.3.1 允许 172.26.75.215 访问所有端口
firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.26.75.215" accept'
3.3.2 允许 172.26.75.99 仅访问 80 端口
firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.26.75.99" port port="80" protocol="tcp" accept'
3.3.3 允许本地回环 127.0.0.1 访问所有端口
firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="127.0.0.1" accept'
3.4 重载防火墙使配置生效
firewall-cmd --reload
3.5 验证配置
查看当前 drop 区域的完整规则:
firewall-cmd --zone=drop --list-all
输出应类似于:
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eno1
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="172.26.75.215" accept
rule family="ipv4" source address="172.26.75.99" port port="80" protocol="tcp" accept
rule family="ipv4" source address="127.0.0.1" accept
4. 验证测试
4.1 从 172.26.75.215 测试(应全部成功)
# SSH(22 端口)
ssh root@<服务器IP>
# HTTP(80 端口)
curl -I http://<服务器IP>
# HTTPS(443 端口)
curl -I https://<服务器IP>
# 其他任意端口(例如 MySQL 3306)
telnet <服务器IP> 3306
所有连接应正常建立。
4.2 从 172.26.75.99 测试(仅 80 端口成功)
# HTTP(80 端口)成功
curl -I http://<服务器IP>
# SSH(22 端口)失败(超时或拒绝)
ssh root@<服务器IP>
# HTTPS(443 端口)失败
curl -I https://<服务器IP>
4.3 从其他 IP 测试(全部失败)
# 任何端口都应被丢弃(连接超时)
telnet <服务器IP> 22
telnet <服务器IP> 80
4.4 在服务器本地测试
# 本机访问全部成功
curl -I http://localhost
curl -I http://127.0.0.1
telnet 127.0.0.1 22
5. 管理命令速查
5.1 添加新规则
例如,允许 172.26.75.99 访问 443 端口(HTTPS):
firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.26.75.99" port port="443" protocol="tcp" accept'
firewall-cmd --reload
5.2 允许一个 IP 访问端口范围
例如,允许 172.26.75.99 访问 8000-9000 端口:
firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.26.75.99" port port="8000-9000" protocol="tcp" accept'
firewall-cmd --reload
5.3 删除已有规则
# 删除 172.26.75.99 的 80 端口规则
firewall-cmd --permanent --zone=drop --remove-rich-rule='rule family="ipv4" source address="172.26.75.99" port port="80" protocol="tcp" accept'
firewall-cmd --reload
5.4 清空所有 rich rules(谨慎操作)
firewall-cmd --permanent --zone=drop --remove-rich-rule='rule family="ipv4" source address="172.26.75.215" accept'
firewall-cmd --permanent --zone=drop --remove-rich-rule='rule family="ipv4" source address="172.26.75.99" port port="80" protocol="tcp" accept'
firewall-cmd --permanent --zone=drop --remove-rich-rule='rule family="ipv4" source address="127.0.0.1" accept'
firewall-cmd --reload
5.5 临时添加规则(重启后失效)
去掉 --permanent 参数即可:
firewall-cmd --zone=drop --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept'
5.6 查看当前所有规则
firewall-cmd --zone=drop --list-all
# 或仅查看 rich rules
firewall-cmd --zone=drop --list-rich-rules
6. 注意事项
- 规则顺序:firewalld 处理规则时,
sources中的 IP 优先级高于 rich rules;rich rules 按添加顺序匹配。本教程未使用sources,全部采用 rich rules,顺序不影响结果(因为每条规则都是独立的允许规则,最终策略为 DROP)。 - 本地回环:如果服务器上的服务需要互相通信(如 Nginx 代理到本地应用),必须允许
127.0.0.1。否则可能导致服务异常。 - SSH 访问:请确保
172.26.75.215包含您的管理 IP,否则配置完成后您将无法远程 SSH 登录。如果不慎将自己锁在门外,可以通过控制台(VNC/IPMI)或本地终端执行firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="YOUR_IP" accept' && firewall-cmd --reload恢复。 - 备份配置:修改前可备份规则:
firewall-cmd --zone=drop --list-all > /tmp/firewall_backup.txt
- 持久化:所有带
--permanent的规则会在系统重启后保留。
7. 总结
通过以上配置,您实现了基于 IP 和端口的精细化访问控制:
- 一个完全信任的管理 IP
- 一个仅允许 HTTP 的服务 IP
- 本地回环畅通
- 其他所有流量被丢弃
此方案使用 drop 区域 + rich rules,避免了创建自定义区域的复杂性,且规则清晰、易于维护。您可以根据实际需求灵活增删规则,满足各种安全策略。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








暂无评论内容