Linux防火墙终极对决:iptables与firewalld完整配置教程
文章讨论了Linux系统中的防火墙解决方案iptables和firewalld的功能与配置方法,并通过实战案例展示了如何在Web服务器和数据库服务器上应用这些工具进行安全防护。 2025-10-7 00:0:0 Author: www.freebuf.com(查看原文) 阅读量:2 收藏

图片

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基本语法

iptables [-t table] -[ADI] chain rule-specificationiptables [-t table] -[FLZ] [chain]iptables [-t table] -N chainiptables [-t table] -X [chain]iptables [-t table] -Pchain target

2.3 iptables常用命令

2.3.1 查看规则

# 查看所有规则iptables -L -n -v# 查看特定表的规则iptables -t nat -L -n -v# 查看规则编号iptables -L INPUT --line-numbers

2.3.2 添加规则

# 允许SSH连接iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许HTTP和HTTPSiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -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 删除规则

# 删除特定规则iptables -D INPUT -p tcp --dport 80 -j ACCEPT# 按行号删除iptables -D INPUT 3# 清空所有规则iptables -Fiptables -Xiptables -Z

2.3.4 设置默认策略

# 设置默认拒绝策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT

2.4 iptables高级配置

2.4.1 端口范围和多端口

# 端口范围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 时间限制

# 只在工作时间允许访问iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT

2.4.3 连接限制

# 限制并发连接数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配置

# 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系统

# 保存规则service iptables save# 或者手动保存iptables-save > /etc/sysconfig/iptables# 恢复规则iptables-restore < /etc/sysconfig/iptables

2.5.2 Ubuntu/Debian系统

# 安装iptables-persistentapt-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 服务管理

# 启动firewalldsystemctl start firewalld# 停止firewalldsystemctl stop firewalld# 重启firewalldsystemctl restart firewalld# 查看状态systemctl status firewalldfirewall-cmd --state

3.2.2 区域管理

# 查看默认区域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 服务管理

# 查看可用服务firewall-cmd --get-services# 查看已开放的服务firewall-cmd --list-services# 添加服务firewall-cmd --add-service=httpfirewall-cmd --add-service=https# 删除服务firewall-cmd --remove-service=http# 永久添加服务firewall-cmd --permanent --add-service=http

3.2.4 端口管理

# 添加端口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 自定义服务

# 创建自定义服务配置文件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 富规则配置

# 允许特定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'# 阻止特定IPfirewall-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 接口绑定

# 将接口绑定到区域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伪装和端口转发

# 启用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配置

#!/bin/bash# Web服务器防火墙配置脚本# 清空现有规则iptables -Fiptables -Xiptables -Z# 设置默认策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -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 REJECTiptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许HTTP和HTTPSiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT# 允许FTPiptables -A INPUT -p tcp --dport 21 -j ACCEPTiptables -A INPUT -p tcp --dport 20 -j ACCEPT# 允许DNSiptables -A INPUT -p udp --dport 53 -j ACCEPT# 保存规则service iptables save

4.1.2 firewalld配置

#!/bin/bash# Web服务器防火墙配置脚本# 设置默认区域firewall-cmd --set-default-zone=public# 添加服务firewall-cmd --permanent --add-service=httpfirewall-cmd --permanent --add-service=httpsfirewall-cmd --permanent --add-service=sshfirewall-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配置

#!/bin/bash# 数据库服务器防火墙配置# 清空现有规则iptables -Fiptables -Xiptables -Z# 设置默认策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -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 ACCEPTiptables -A INPUT -s 192.168.1.101 -p tcp --dport 3306 -j ACCEPT# 保存规则service iptables save

4.2.2 firewalld配置

#!/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.

文章来源: https://www.freebuf.com/articles/451713.html
如有侵权请联系:admin#unsafe.sh