首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux防火墙终极对决:iptables与firewalld完整配置教程

Linux防火墙终极对决:iptables与firewalld完整配置教程

作者头像
ICT系统集成阿祥
发布2026-07-13 19:00:18
发布2026-07-13 19:00:18
210
举报
文章被收录于专栏:数通数通

1. 防火墙基础概念

1.1 什么是防火墙

防火墙是一种网络安全设备,用于监控和控制网络流量,根据预定义的安全规则来允许或阻止数据包通过。Linux系统中主要有两种防火墙解决方案:iptables和firewalld。

1.2 iptables vs firewalld

  • iptables:传统的Linux防火墙工具,直接操作内核的netfilter框架
  • firewalld:动态防火墙管理器,提供更高级的抽象和动态配置能力

2. iptables详解

2.1 iptables基本概念

2.1.1 表(Tables)
  • filter表:默认表,用于过滤数据包
  • nat表:用于网络地址转换
  • mangle表:用于修改数据包头部信息
  • raw表:用于配置连接跟踪
2.1.2 链(Chains)
  • INPUT:处理入站数据包
  • OUTPUT:处理出站数据包
  • FORWARD:处理转发数据包
  • PREROUTING:在路由决策前处理数据包
  • POSTROUTING:在路由决策后处理数据包
2.1.3 目标(Targets)
  • ACCEPT:接受数据包
  • DROP:丢弃数据包
  • REJECT:拒绝数据包并返回错误信息
  • LOG:记录日志
  • MASQUERADE:IP伪装

2.2 iptables基本语法

代码语言:javascript
复制
iptables [-t table] -[ADI] chain rule-specification
iptables [-t table] -[FLZ] [chain]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target

2.3 iptables常用命令

2.3.1 查看规则
代码语言:javascript
复制
# 查看所有规则
iptables -L -n -v

# 查看特定表的规则
iptables -t nat -L -n -v

# 查看规则编号
iptables -L INPUT --line-numbers
2.3.2 添加规则
代码语言:javascript
复制
# 允许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

# 允许特定IP访问
iptables -A INPUT -s 192.168.1.100 -j ACCEPT

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

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.3.3 删除规则
代码语言:javascript
复制
# 删除特定规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# 按行号删除
iptables -D INPUT 3

# 清空所有规则
iptables -F
iptables -X
iptables -Z
2.3.4 设置默认策略
代码语言:javascript
复制
# 设置默认拒绝策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

2.4 iptables高级配置

2.4.1 端口范围和多端口
代码语言:javascript
复制
# 端口范围
iptables -A INPUT -p tcp --dport 3000:3010 -j ACCEPT

# 多端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
2.4.2 时间限制
代码语言:javascript
复制
# 只在工作时间允许访问
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
2.4.3 连接限制
代码语言:javascript
复制
# 限制并发连接数
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# 限制连接速率
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 10 -j ACCEPT
2.4.4 NAT配置
代码语言:javascript
复制
# SNAT(源地址转换)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# DNAT(目标地址转换)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

2.5 iptables规则持久化

2.5.1 CentOS/RHEL系统
代码语言:javascript
复制
# 保存规则
service iptables save

# 或者手动保存
iptables-save > /etc/sysconfig/iptables

# 恢复规则
iptables-restore < /etc/sysconfig/iptables
2.5.2 Ubuntu/Debian系统
代码语言:javascript
复制
# 安装iptables-persistent
apt-get install iptables-persistent

# 保存规则
netfilter-persistent save

# 恢复规则
netfilter-persistent reload

3. firewalld详解

3.1 firewalld基本概念

3.1.1 区域(Zones)
  • drop:丢弃所有传入连接
  • block:拒绝所有传入连接
  • public:公共区域,默认区域
  • external:外部区域,用于NAT
  • dmz:DMZ区域
  • work:工作区域
  • home:家庭区域
  • internal:内部区域
  • trusted:信任区域,允许所有连接
3.1.2 服务(Services)

预定义的服务配置,包含端口、协议等信息。

3.1.3 富规则(Rich Rules)

提供更复杂的规则配置语法。

3.2 firewalld基本命令

3.2.1 服务管理
代码语言:javascript
复制
# 启动firewalld
systemctl start firewalld

# 停止firewalld
systemctl stop firewalld

# 重启firewalld
systemctl restart firewalld

# 查看状态
systemctl status firewalld
firewall-cmd --state
3.2.2 区域管理
代码语言:javascript
复制
# 查看默认区域
firewall-cmd --get-default-zone

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

# 查看活动区域
firewall-cmd --get-active-zones

# 查看所有区域
firewall-cmd --get-zones

# 查看区域信息
firewall-cmd --zone=public --list-all
3.2.3 服务管理
代码语言:javascript
复制
# 查看可用服务
firewall-cmd --get-services

# 查看已开放的服务
firewall-cmd --list-services

# 添加服务
firewall-cmd --add-service=http
firewall-cmd --add-service=https

# 删除服务
firewall-cmd --remove-service=http

# 永久添加服务
firewall-cmd --permanent --add-service=http
3.2.4 端口管理
代码语言:javascript
复制
# 添加端口
firewall-cmd --add-port=8080/tcp

# 删除端口
firewall-cmd --remove-port=8080/tcp

# 查看开放端口
firewall-cmd --list-ports

# 永久添加端口
firewall-cmd --permanent --add-port=8080/tcp

3.3 firewalld高级配置

3.3.1 自定义服务
代码语言:javascript
复制
# 创建自定义服务配置文件
cat > /etc/firewalld/services/myapp.xml << EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MyApp</short>
  <description>My Application Service</description>
  <port protocol="tcp" port="8080"/>
  <port protocol="tcp" port="8443"/>
</service>
EOF

# 重新加载配置
firewall-cmd --reload

# 添加自定义服务
firewall-cmd --add-service=myapp
3.3.2 富规则配置
代码语言:javascript
复制
# 允许特定IP访问特定端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'

# 限制连接速率
firewall-cmd --add-rich-rule='rule service name="ssh" limit value="10/m" accept'

# 阻止特定IP
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.200" drop'

# 端口转发
firewall-cmd --add-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080"'
3.3.3 接口绑定
代码语言:javascript
复制
# 将接口绑定到区域
firewall-cmd --zone=internal --add-interface=eth1

# 查看接口绑定
firewall-cmd --get-zone-of-interface=eth1

# 更改接口区域
firewall-cmd --zone=public --change-interface=eth1
3.3.4 IP伪装和端口转发
代码语言:javascript
复制
# 启用IP伪装
firewall-cmd --add-masquerade

# 端口转发
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100

# 查看转发规则
firewall-cmd --list-forward-ports

4. 实战配置案例

4.1 Web服务器防火墙配置

4.1.1 iptables配置
代码语言:javascript
复制
#!/bin/bash
# Web服务器防火墙配置脚本

# 清空现有规则
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 -m connlimit --connlimit-above 3 -j REJECT
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

# 允许FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

# 允许DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# 保存规则
service iptables save
4.1.2 firewalld配置
代码语言:javascript
复制
#!/bin/bash
# Web服务器防火墙配置脚本

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

# 添加服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=ftp

# 限制SSH连接
firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept'

# 重新加载配置
firewall-cmd --reload

4.2 数据库服务器防火墙配置

4.2.1 iptables配置
代码语言:javascript
复制
#!/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 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

# 允许MySQL(仅限应用服务器)
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 192.168.1.101 -p tcp --dport 3306 -j ACCEPT

# 保存规则
service iptables save
4.2.2 firewalld配置
代码语言:javascript
复制
#!/bin/bash
# 数据库服务器防火墙配置

# 创建数据库区域
firewall-cmd --permanent --new-zone=database

# 设置默认区域
firewall-cmd --set-default-zone=database

# 添加SSH服务(限制源IP)
firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'

# 添加MySQL服务(限制源IP)
firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="mysql" accept'
firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.1.101" service name="mysql" accept'

# 重新加载配置
firewall-cmd --reload

5. 故障排查和优化

5.1 常见问题排查

5.1.1 规则不生效
代码语言:javascript
复制
# 检查规则是否正确添加
iptables -L -n -v
firewall-cmd --list-all

# 检查服务状态
systemctl status iptables
systemctl status firewalld

# 检查日志
tail -f /var/log/messages
journalctl -u firewalld -f
5.1.2 连接被拒绝
代码语言:javascript
复制
# 启用日志记录
iptables -A INPUT -j LOG --log-prefix "INPUT DROP: "

# 查看日志
tail -f /var/log/messages

# firewalld日志
firewall-cmd --set-log-denied=all

5.2 性能优化

5.2.1 规则优化
代码语言:javascript
复制
# 将常用规则放在前面
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

# 使用状态匹配减少规则数量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 使用multiport匹配多个端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
5.2.2 监控和统计
代码语言:javascript
复制
# 查看规则统计
iptables -L -n -v --line-numbers

# 重置计数器
iptables -Z

# 实时监控
watch -n 1 'iptables -L -n -v'

6. 安全最佳实践

6.1 基本安全原则

  1. 1. 最小权限原则:只开放必要的端口和服务
  2. 2. 白名单策略:默认拒绝所有连接,只允许必要的连接
  3. 3. 定期审计:定期检查和更新防火墙规则
  4. 4. 日志监控:启用日志记录并定期分析

6.2 配置建议

代码语言:javascript
复制
# 设置合理的默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 启用连接跟踪
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 限制连接速率
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 10 -j ACCEPT

# 防止扫描
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

6.3 备份和恢复

代码语言:javascript
复制
# 备份iptables规则
iptables-save > /root/iptables.backup.$(date +%Y%m%d)

# 恢复iptables规则
iptables-restore < /root/iptables.backup.20231201

# 备份firewalld配置
cp -r /etc/firewalld /root/firewalld.backup.$(date +%Y%m%d)

7. 总结

iptables和firewalld都是Linux系统中强大的防火墙工具。iptables提供了更底层的控制能力,适合对防火墙规则有详细要求的场景;firewalld则提供了更友好的管理界面和动态配置能力,更适合日常运维管理。

选择使用哪种工具主要取决于具体的应用场景和个人偏好。在实际部署中,建议根据系统的具体需求制定合适的防火墙策略,并定期进行安全审计和规则优化。

记住防火墙只是网络安全的一个组成部分,还需要结合其他安全措施(如入侵检测、日志监控、定期更新等)来构建完整的安全防护体系。

不想错过文章内容?读完请点一下“关注”,您的支持是我创作的动力

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ICT系统集成阿祥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 防火墙基础概念
    • 1.1 什么是防火墙
    • 1.2 iptables vs firewalld
    • 2. iptables详解
      • 2.1 iptables基本概念
      • 2.2 iptables基本语法
      • 2.3 iptables常用命令
      • 2.4 iptables高级配置
      • 2.5 iptables规则持久化
    • 3. firewalld详解
      • 3.1 firewalld基本概念
      • 3.2 firewalld基本命令
      • 3.3 firewalld高级配置
    • 4. 实战配置案例
      • 4.1 Web服务器防火墙配置
      • 4.2 数据库服务器防火墙配置
    • 5. 故障排查和优化
      • 5.1 常见问题排查
      • 5.2 性能优化
    • 6. 安全最佳实践
      • 6.1 基本安全原则
      • 6.2 配置建议
      • 6.3 备份和恢复
    • 7. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档