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. 练习#
- 仅允许
10.10.0.0/16访问 SSH,禁止其他来源;验证从非管理网段无法登录。 - 在
publiczone 上开放8080/tcp,并限制每秒 10 个新连接。 - 给
eth1绑定internalzone,只允许3306/tcp来自10.20.0.0/16。 - 开启拒绝日志,访问一个被禁止端口,定位日志记录并截图保存到审计文档。