Firewalld 访问控制教程:基于 IP 和端口的精确限制

1. 需求概述

在服务器安全加固中,我们常常需要只允许特定的 IP 访问特定的服务,而拒绝其他所有流量。本教程将实现以下目标:

  • 192.168.3.2:完全信任,可访问服务器所有端口(如 SSH、HTTP、HTTPS、数据库等)。
  • 192.168.3.100:仅允许访问** 80 端口**(HTTP 服务)。
  • 127.0.0.1(本机回环):允许访问所有端口(用于本地服务调用)。
  • 其他任何 IP:全部拒绝,无法访问任何端口。

本方案使用 firewallddrop 区域,结合 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. 注意事项

  1. 规则顺序:firewalld 处理规则时,sources 中的 IP 优先级高于 rich rules;rich rules 按添加顺序匹配。本教程未使用 sources,全部采用 rich rules,顺序不影响结果(因为每条规则都是独立的允许规则,最终策略为 DROP)。
  2. 本地回环:如果服务器上的服务需要互相通信(如 Nginx 代理到本地应用),必须允许 127.0.0.1。否则可能导致服务异常。
  3. 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 恢复。
  4. 备份配置:修改前可备份规则:
   firewall-cmd --zone=drop --list-all > /tmp/firewall_backup.txt
  1. 持久化:所有带 --permanent 的规则会在系统重启后保留。

7. 总结

通过以上配置,您实现了基于 IP 和端口的精细化访问控制:

  • 一个完全信任的管理 IP
  • 一个仅允许 HTTP 的服务 IP
  • 本地回环畅通
  • 其他所有流量被丢弃

此方案使用 drop 区域 + rich rules,避免了创建自定义区域的复杂性,且规则清晰、易于维护。您可以根据实际需求灵活增删规则,满足各种安全策略。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容