1.9.4 防火墙与网络边界策略

防火墙与网络边界策略#

目标与原则
- 默认拒绝(Default Deny),按需放行
- 最小暴露面:仅开放业务必需端口
- 分区分段:内外网、管理网、业务网隔离
- 变更可追溯:规则有文档、可回滚


1. 原理与边界模型#

防火墙数据面与控制面

文章图片

常见策略分区
- Public:对外服务(80/443)
- DMZ:反向代理层
- Internal:业务/数据库
- Mgmt:管理与运维通道(SSH/监控)


2. firewalld 基础策略(推荐)#

安装与启用

# 安装
yum install -y firewalld

# 启动并设置开机自启
systemctl enable --now firewalld

# 验证状态
firewall-cmd --state

基础概念与查看

# 查看默认zone
firewall-cmd --get-default-zone

# 查看当前zone的规则
firewall-cmd --list-all

# 查看已启用的zones
firewall-cmd --get-active-zones

示例:仅开放 SSH + Web

# 设置默认zone为public
firewall-cmd --set-default-zone=public

# 放行 ssh/http/https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

# 重新加载规则
firewall-cmd --reload

# 预期效果:list-all 中含 ssh http https
firewall-cmd --list-all

示例:仅允许管理网段访问 SSH

# 移除默认放行的ssh
firewall-cmd --permanent --remove-service=ssh

# 添加rich rule限制来源
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" service name="ssh" accept'

# 重新加载并验证
firewall-cmd --reload
firewall-cmd --list-rich-rules

示例:开放业务端口并限制速率

# 仅允许每秒最多20个新连接到 8080
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="8080" protocol="tcp" limit value="20/s" accept'
firewall-cmd --reload

3. nftables / iptables 适配(了解)#

nftables 简单规则示例

# 安装
yum install -y nftables
systemctl enable --now nftables

# 创建基础表与链
nft add table inet filter
nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'

# 放行已建立连接、SSH和HTTP
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 ip saddr 10.10.0.0/16 accept
nft add rule inet filter input tcp dport {80,443} accept

# 查看规则
nft list ruleset

iptables 简单规则示例(兼容)

# 默认拒绝
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 放行已建立连接、SSH、HTTP/HTTPS
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 10.10.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 保存规则(CentOS 7)
service iptables save 2>/dev/null || true

4. 边界策略与端口清单#

端口基线示例(示意)

管理网段(10.10.0.0/16) -> SSH(22), 监控(9100), 日志(1514)
公网 -> 80/443
内网业务 -> 3306(MySQL), 6379(Redis), 9092(Kafka) 仅内部

结合反向代理

文章图片

5. 日志与审计(示例)#

# firewalld 开启拒绝日志
firewall-cmd --set-log-denied=all

# 验证
firewall-cmd --get-log-denied

# 查看日志(不同发行版路径可能不同)
journalctl -u firewalld --since "10 min ago"

6. 排错与应急回滚#

常见问题与处理

# 规则未生效:检查是否忘记 --permanent 或未 reload
firewall-cmd --list-all
firewall-cmd --reload

# 端口不通:检查服务监听
ss -lntp | grep -E ':(80|443|22|8080)'

# zone 绑定错误:查看网卡归属
firewall-cmd --get-active-zones
firewall-cmd --zone=public --change-interface=eth0
firewall-cmd --reload

# 临时放行应急端口(重启后失效)
firewall-cmd --add-port=2222/tcp

安全回滚(示例:恢复到基线策略)

# 清理当前zone永久规则
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --remove-service=http
firewall-cmd --permanent --remove-service=https
firewall-cmd --permanent --remove-port=8080/tcp

# 恢复基线放行
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

7. 练习#

  1. 仅允许 10.10.0.0/16 访问 SSH,禁止其他来源;验证从非管理网段无法登录。
  2. public zone 上开放 8080/tcp,并限制每秒 10 个新连接。
  3. eth1 绑定 internal zone,只允许 3306/tcp 来自 10.20.0.0/16
  4. 开启拒绝日志,访问一个被禁止端口,定位日志记录并截图保存到审计文档。