Linux防火墙配置完全指南:从iptables到firewalld与ufw实战管理

Linux防火墙是服务器安全的第一道防线,无论是个人桌面还是生产环境,合理的防火墙规则直接决定了系统能否抵御外部扫描和恶意访问。本文将系统讲解iptables、firewalld和ufw三大主流防火墙工具的配置方法,覆盖规则编写、区域管理、端口放行以及常见误区排查,帮助你建立一套可维护的访问控制体系。

一、Linux防火墙的核心原理:Netfilter与数据包过滤

Linux内核自2.4版本起内置了Netfilter框架,它是所有防火墙工具的底层引擎。Netfilter在内核协议栈的关键位置挂载了5个钩子点,分别对应数据包的5条链路:

  • PREROUTING:数据包进入网卡后、路由判断前
  • INPUT:数据包目标地址是本机,准备递交给本地进程
  • FORWARD:数据包目标地址不是本机,需要转发到其他网卡
  • OUTPUT:本机进程产生的数据包,准备发出
  • POSTROUTING:数据包即将离开网卡前

iptables、firewalld和ufw本质上都是Netfilter的配置前端。iptables直接操作规则链;firewalld引入了区域(zone)概念并提供D-Bus接口;ufw则是Ubuntu为简化iptables语法封装的命令行工具。三者可以理解为同一内核能力的不同表达层。

二、iptables:最经典的规则管理工具

iptables按功能分为四张表:filter(过滤)、nat(地址转换)、mangle(修改包头)、raw(跳过连接跟踪)。日常防护主要操作filter表。默认包含三条链:INPUT、FORWARD、OUTPUT。

2.1 基本语法与默认策略

查看当前规则并显示行号:

iptables -L -n --line-numbers

设置默认策略(建议先放行SSH再设置DROP,避免锁死自己):

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 放行已建立连接和本地回环
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# 放行SSH和HTTP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

2.2 常用匹配条件

iptables支持丰富的匹配模块,以下是生产环境高频使用的场景:

# 按源IP限制SSH访问(仅允许 10.0.0.0/24 网段)
iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT

# 限制单个IP对22端口的连接频率(每分钟最多5次新连接)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 6 -j DROP

# 丢弃ICMP ping(可选,减少信息泄露)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

规则匹配遵循自上而下的顺序,第一条命中的规则即为最终动作。因此放行规则要写在拒绝规则前面,否则永不生效。

三、firewalld:区域化管理与运行时/持久化分离

firewalld是CentOS 7+/RHEL 8+/Fedora的默认防火墙管理器。相比iptables,它引入了zone(区域)概念,将网络接口按信任程度分组,并提供运行时(runtime)和持久化(permanent)两层配置。

3.1 区域概念

firewalld预定义了多个区域,常用的有:

  • public:默认区域,仅放行SSH和DHCP
  • trusted:完全信任,放行所有流量
  • block:拒绝所有入站连接,仅允许出站
  • dmz:隔离区,仅放行SSH
  • home:家庭网络,放行SSH、mDNS、Samba

3.2 常用操作命令

# 查看当前区域和活跃接口
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones

# 永久放行端口(--permanent 写入配置文件,需 reload 生效)
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-service=mysql
firewall-cmd --reload

# 查看已放行的端口和服务
firewall-cmd --list-all

# 将接口切换到trusted区域(内网调试用)
firewall-cmd --zone=trusted --change-interface=eth1 --permanent

一个常见误区是只写了--permanent但忘记--reload,导致运行时规则未更新。最佳实践是每次永久修改后立即reload,或先添加运行时规则再持久化。

四、ufw:Ubuntu下的极简防火墙

ufw(Uncomplicated Firewall)是Ubuntu/Debian系的默认防火墙前端,语法极其简洁,适合个人服务器和小型部署。底层仍然调用iptables。

# 启用ufw(首次使用前确保SSH已放行)
ufw allow 22/tcp
ufw enable

# 放行常用服务
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 3306/tcp  # MySQL,建议绑定内网IP

# 按源IP限制
ufw allow from 10.0.0.0/24 to any port 22

# 按端口范围放行
ufw allow 3000:3100/tcp

# 查看规则状态
ufw status verbose

# 删除规则(先列出编号再删)
ufw status numbered
ufw delete 3

ufw的日志功能对排查连接问题很有帮助:ufw logging medium会记录被阻断的连接,可以用journalctl -u ufw查看。如果想深入了解日志系统的使用方法,可以参考Linux日志系统完全指南

五、生产环境配置策略与排障

5.1 安全基线建议

一份合理的防火墙策略应遵循最小权限原则:

  • 默认INPUT策略设为DROP,仅显式放行必要端口
  • SSH端口限制源IP网段,或配合密钥认证禁止密码登录(可参考SSH完全实战指南
  • 数据库端口(3306、5432、6379)不暴露公网,仅限内网或本地回环
  • 对高频扫描IP使用limit模块做频率限制
  • 定期审计规则,清理过期条目

5.2 规则持久化

iptables默认规则仅在内存中生效,重启即丢失。持久化方式因发行版而异:

# Debian/Ubuntu
apt install iptables-persistent
netfilter-persistent save

# CentOS/RHEL
yum install iptables-services
service iptables save
# 规则保存在 /etc/sysconfig/iptables

firewalld和ufw的持久化则由各自服务自动管理,无需额外操作。

5.3 常见故障排查

症状:规则已添加但服务仍无法访问。排查步骤:

  1. 检查规则顺序:用iptables -L -n --line-numbers确认放行规则是否在DROP规则之前
  2. 确认运行时与持久化一致:firewalld执行--reload后重新检查
  3. 检查应用本身是否绑定在0.0.0.0而非127.0.0.1
  4. 检查云平台安全组:阿里云/腾讯云的安全组规则优先于系统防火墙,需同步放行
  5. 查看防火墙日志:iptables可添加LOG规则记录被丢弃的包,定位具体匹配链路

如果服务本身无法启动,可能还涉及软件包安装和进程管理的问题,可以参考Linux软件安装与包管理实战Linux进程管理完全指南做进一步排查。

六、总结

iptables、firewalld和ufw三者没有绝对的优劣,选择取决于使用场景和个人习惯。iptables语法灵活但规则量大后维护困难;firewalld的区域管理适合多接口环境;ufw极简易用,适合个人服务器。无论选择哪种工具,核心都是理解Netfilter的数据包流向,按最小权限原则编写规则,并做好持久化和定期审计。把防火墙配置和系统其他安全层(SSH加固、日志监控、定时任务巡检)结合起来,才能构建完整的防护体系。

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

请登录后发表评论

    暂无评论内容