防火墙是服务器安全的第一道防线,合理配置防火墙可以有效防止未授权访问和网络攻击。本文将详细介绍Linux系统下iptables和firewalld两种主流防火墙工具的配置方法。
一、防火墙基础概念
什么是防火墙
防火墙是一种网络安全系统,根据预设的安全规则监控和控制进出网络流量。它可以基于IP地址、端口号、协议类型等条件过滤数据包。
防火墙的工作原理
- 包过滤:检查每个数据包的源/目标IP、端口、协议
- 状态检测:跟踪连接状态,允许已建立连接的响应流量
- NAT转换:网络地址转换,隐藏内部网络结构
- 应用层代理:深度检测应用层数据
二、iptables详解
iptables简介
iptables是Linux系统经典的防火墙工具,基于Netfilter框架,功能强大但配置相对复杂。适用于CentOS 6、Debian等系统。
iptables四表五链
四张表
- filter表:默认表,用于数据包过滤
- nat表:网络地址转换
- mangle表:修改数据包头部信息
- raw表:配置 exemptions
五条链
- PREROUTING:数据包进入路由前
- INPUT:到达本机的数据包
- FORWARD:需要转发的数据包
- OUTPUT:本机产生的数据包
- POSTROUTING:数据包离开路由后
iptables基本命令
# 查看规则
iptables -L -n -v
# 查看特定表的规则
iptables -t nat -L -n -v
# 清空所有规则
iptables -F
iptables -X
iptables -Z
# 保存规则(CentOS)
service iptables save
# 保存规则(Ubuntu)
iptables-save > /etc/iptables/rules.v4
iptables常用规则示例
# 允许本地回环
cmd iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接
cmd iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(端口22)
cmd iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP(端口80)
cmd iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许HTTPS(端口443)
cmd iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许特定IP访问
cmd iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 拒绝特定端口
cmd iptables -A INPUT -p tcp --dport 3306 -j DROP
# 拒绝所有其他入站连接
cmd iptables -A INPUT -j DROP
iptables完整配置脚本
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -Z
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许Ping(可选)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 保存规则
service iptables save
三、firewalld详解
firewalld简介
firewalld是CentOS 7+和RHEL 7+默认的防火墙管理工具,采用动态管理方式,支持区域(Zone)概念,配置更加灵活。
firewalld区域
- public:公共区域,仅接受选定的连接
- home:家庭网络,信任大部分连接
- work:工作网络,信任大部分连接
- internal:内部网络,信任大部分连接
- dmz:隔离区域,仅接受特定服务
- block:拒绝所有连接
- drop:丢弃所有连接
firewalld基本命令
# 启动/停止/重启
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
# 查看状态
systemctl status firewalld
firewall-cmd --state
# 查看当前区域
firewall-cmd --get-default-zone
# 查看所有区域配置
firewall-cmd --get-active-zones
# 查看区域详细信息
firewall-cmd --zone=public --list-all
# 重新加载配置
firewall-cmd --reload
firewalld常用规则配置
# 允许服务(永久生效)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
# 允许端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=1000-2000/tcp
# 允许特定IP
firewall-cmd --permanent --add-source=192.168.1.100
# 拒绝特定IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject'
# 删除规则
firewall-cmd --permanent --remove-service=http
firewall-cmd --permanent --remove-port=8080/tcp
# 重新加载生效
firewall-cmd --reload
firewalld富规则(Rich Rules)
富规则提供更精细的控制能力:
# 允许特定IP访问特定端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept'
# 限制连接速率
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept limit value="10/m"'
# 允许特定时间访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept limit value="3/m"'
# 端口转发
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
四、iptables与firewalld对比
| 特性 | iptables | firewalld |
|---|---|---|
| 配置方式 | 命令行,需保存 | 动态配置,即时生效 |
| 学习曲线 | 较陡峭 | 较平缓 |
| 区域概念 | 不支持 | 支持 |
| IPv6支持 | 需单独配置(ip6tables) | 原生支持 |
| 适用系统 | CentOS 6, Debian | CentOS 7+, RHEL 7+ |
| 运行时修改 | 不支持 | 支持 |
五、安全最佳实践
⚠️ 配置防火墙前的注意事项
- 配置前确保有替代访问方式(如IPMI、VNC)
- 先测试规则,确认无误后再设为默认策略
- 不要直接屏蔽SSH端口,否则会被锁在服务器外
- 建议先添加允许规则,最后添加拒绝规则
最小权限原则
- 只开放必要的端口
- 限制特定IP访问敏感端口
- 使用非标准端口增加安全性
- 定期审查和清理规则
常用安全规则
# 防止SYN Flood攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/second --limit-burst 3 -j ACCEPT
# 防止Ping Flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m limit --limit 1/second -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
# 记录并丢弃可疑流量
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j LOG --log-prefix "SSH_BRUTE_FORCE: "
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
六、故障排查
常见问题1:规则不生效
- 检查规则顺序,匹配即停止
- 确认默认策略设置
- 检查是否有其他防火墙冲突
- 验证规则语法是否正确
常见问题2:无法连接SSH
- 检查SSH端口是否被允许
- 确认INPUT链的默认策略
- 检查是否误封了自己的IP
- 通过控制台或IPMI登录修复
常见问题3:firewalld与iptables冲突
# 停止iptables服务
systemctl stop iptables
systemctl disable iptables
# 使用firewalld管理
systemctl enable firewalld
systemctl start firewalld
七、测试防火墙规则
配置完成后,使用以下工具测试防火墙效果:
八、总结
防火墙配置是服务器安全的基础,建议:
- 根据系统选择合适的防火墙工具
- 遵循最小权限原则配置规则
- 定期审查和更新防火墙规则
- 结合其他安全措施(如Fail2ban)增强防护
- 配置前做好备份,避免误操作导致无法访问
通过合理配置防火墙,可以有效保护服务器免受未授权访问和常见网络攻击。