2.5.1 防火墙概念与策略类型

防火墙的定义与作用#

防火墙是部署在主机或网络边界上的访问控制系统,通过检测、过滤与记录网络流量,控制不同安全域之间的通信。其核心目标是最小化攻击面、隔离风险、保障业务可用性与合规性

文章图片

防火墙的部署形态#

  • 主机型防火墙:运行在单台服务器上(如 iptables/firewalld),精细控制本机入站与出站流量。
  • 网络型防火墙:部署在边界或核心链路,统一控制多个网段之间的访问。
  • 云安全组/ACL:云厂商提供的虚拟化防火墙,常与主机防火墙配合使用。

防火墙策略的基础概念#

  • 方向:入站(INPUT)、出站(OUTPUT)、转发(FORWARD)。
  • 动作:允许(ACCEPT)、拒绝(REJECT)、丢弃(DROP)、记录(LOG)。
  • 匹配条件:源/目标IP、端口、协议、接口、连接状态(ESTABLISHED/NEW)。
  • 默认策略:未命中规则时的处理方式,通常建议“默认拒绝”。

策略匹配流程示例(iptables)

文章图片

策略类型与适用场景#

  1. 白名单策略(默认拒绝)
    - 仅允许明确授权的流量,其余全部阻断。
    - 适用于生产环境、核心业务系统、暴露公网服务。

  2. 黑名单策略(默认允许)
    - 默认放行,仅阻断已知风险来源。
    - 适用于内网低风险场景或临时调试环境。

  3. 最小权限策略
    - 只开放业务所需端口与来源。
    - 与白名单策略结合使用,提高安全性。

  4. 基于状态的策略(Stateful)
    - 根据连接状态动态放行回包流量。
    - 适用于绝大多数业务访问控制。

  5. 分区策略(Zone-Based)
    - 根据安全域划分(内网/外网/DMZ),实现不同区域访问控制。
    - firewalld与云安全组常见模式。


典型策略设计原则#

  • 先拒绝后放行:优先建立最小化规则,再逐步开放。
  • 分层防护:边界防火墙 + 主机防火墙 + 应用层控制。
  • 规则可审计:统一命名、备注、日志追踪,便于排错与合规。
  • 变更可回滚:规则调整需有回退方案,避免误封生产流量。

示例:白名单策略(iptables)#

目标:仅允许 SSH(22) 来自 10.0.0.0/24,允许 HTTP(80),其余入站拒绝。
安装与启用

# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y iptables-persistent

# RHEL/CentOS
sudo yum install -y iptables-services
sudo systemctl enable iptables && sudo systemctl start iptables

配置与命令解释

# 清空已有规则
sudo iptables -F

# 设置默认策略为拒绝
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立连接回包
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许内网网段SSH
sudo iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT

# 允许HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 记录并拒绝其他流量
sudo iptables -A INPUT -j LOG --log-prefix "IPT_DROP: " --log-level 4
sudo iptables -A INPUT -j DROP

持久化(示例路径)

# Debian/Ubuntu: 保存到 /etc/iptables/rules.v4
sudo netfilter-persistent save

# RHEL/CentOS: 保存到 /etc/sysconfig/iptables
sudo service iptables save

预期效果
- 10.0.0.0/24 可 SSH 登录;
- 任何来源可访问 80;
- 其他入站被记录并丢弃。


示例:分区策略(firewalld)#

目标:将公网口设为 public,仅开放 80/443;内网口设为 internal,开放 22。
安装与启用

sudo yum install -y firewalld
sudo systemctl enable firewalld && sudo systemctl start firewalld

配置

# 查看网卡
ip -br a

# 绑定区域
sudo firewall-cmd --permanent --zone=public --add-interface=eth0
sudo firewall-cmd --permanent --zone=internal --add-interface=eth1

# public 区域开放 80/443
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

# internal 区域开放 SSH
sudo firewall-cmd --permanent --zone=internal --add-service=ssh

# 重新加载
sudo firewall-cmd --reload

命令解释
- --permanent:写入持久配置;
- --zone:指定安全域;
- --add-service:按服务定义开放端口。


常见排错方法#

  1. 规则是否生效
sudo iptables -L -n -v
sudo firewall-cmd --list-all --zone=public
  1. 是否因默认策略被拒
sudo iptables -S | head -n 5
  1. 日志定位
# 查看内核日志中的防火墙记录
sudo journalctl -k | grep IPT_DROP
  1. 端口监听与连通性
ss -lntp | grep :80
curl -I http://127.0.0.1

练习#

  1. 用 iptables 实现“只允许 192.168.1.0/24 访问 22 和 80,其他全部拒绝”,并保存规则。
  2. 用 firewalld 新建一个名为 dmz 的区域,开放 8080,并将 eth2 绑定到该区域。
  3. 模拟误封:先将 INPUT 默认策略设为 DROP,再用日志查出被阻断的源地址与端口。

常见误区#

  • 只开放端口,不限制来源。
  • 忽略出站控制,导致数据外泄风险。
  • 规则过多且无序,影响性能与排错效率。
  • 长期依赖黑名单,缺乏系统性安全策略。