Linux防火墙详解:firewalld与iptables实用指南
·
Linux防火墙详解:firewalld与iptables实用指南
在Linux系统中,防火墙是保障网络安全的核心组件,负责控制进出服务器的网络流量。本文将详细解析firewalld和iptables两大防火墙工具,从基础概念到实战命令,帮助你快速掌握Linux防火墙配置技巧。

一、firewalld:动态防火墙管理工具
firewalld是CentOS 7+、RHEL 7+默认的防火墙工具,以"区域(zone)"为核心概念,通过划分信任级别简化规则配置。
1. 核心概念:区域(Zone)
firewalld通过"区域"实现分级管理,每个区域对应不同的信任级别,可将网卡关联到区域,自动应用预设规则。核心作用:通过划分信任范围,简化不同网络环境下的策略配置。
默认配置目录:/etc/firewalld/(用户配置)、/usr/lib/firewalld/(系统预设)。
2. 9个默认区域及特性(按信任级别排序)
| 区域名称(中文) | 英文名称 | 信任级别 | 核心规则说明 | 适用场景 |
|---|---|---|---|---|
| 信任区域 | trusted | 最高(完全信任) | 允许所有进出流量,无限制 | 封闭测试环境(绝对安全的内部网络) |
| 家庭区域 | home | 高(信任内部) | 信任内部设备,允许家庭常用服务(如文件共享) | 家庭网络(已知设备:PC、打印机) |
| 工作区域 | work | 高(信任内部) | 信任内部设备,允许办公服务(如VPN) | 办公网络(信任同事设备) |
| 隔离区域(DMZ) | dmz | 中(有限信任) | 仅允许对外服务端口(如Web、邮件) | 公开服务服务器(如网站服务器) |
| 内部区域 | internal | 中高(信任内部) | 信任内部网络,限制外部非必要访问 | 企业内部局域网 |
| 公共区域 | public | 低(不信任外部) | 仅允许手动指定的连接(默认区域) | 公共网络(咖啡馆、酒店WiFi) |
| 外部区域 | external | 低(不信任外部) | 隐藏内部网络,常用于NAT场景 | 网关服务器(对外隐藏内部IP) |
| 阻塞区域 | block | 极低(主动阻塞) | 主动拒绝所有入站流量,记录日志 | 需严格隔离的敏感设备 |
| 丢弃区域 | drop | 最低(静默丢弃) | 静默丢弃所有入站流量,无响应无日志 | 防止被探测的服务器 |
3. firewalld常用命令实战
(1)基础状态管理
# 查看防火墙状态
firewall-cmd --state # 输出:running(运行中)/not running(已停止)
# 启动/停止/重启服务
systemctl start firewalld # 启动
systemctl stop firewalld # 停止
systemctl restart firewalld # 重启
# 设置开机自启动/禁用
systemctl enable firewalld # 开机启动
systemctl disable firewalld # 禁止开机启动
(2)区域管理
# 查看默认区域(默认public)
firewall-cmd --get-default-zone # 输出:public
# 查看所有区域
firewall-cmd --get-zones # 输出:block dmz drop external home internal public trusted work
# 查看当前活跃区域(已关联网卡的区域)
firewall-cmd --get-active-zones
# 示例输出:
# public (active)
# interfaces: ens33
# 切换默认区域(如切换到home)
firewall-cmd --set-default-zone=home
# 将网卡关联到区域(临时生效)
firewall-cmd --zone=work --add-interface=eth0 # 网卡eth0关联到work区域
(3)端口与服务管理
# 查看当前区域允许的服务
firewall-cmd --list-services # 示例:ssh dhcpv6-client
# 查看当前区域允许的端口
firewall-cmd --list-ports # 示例:80/tcp 9090/tcp
# 永久开放端口(如8080/tcp,需重载生效)
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 永久开放服务(如http)
firewall-cmd --zone=public --add-service=http --permanent
# 批量开放端口(如1000-2000/tcp)
firewall-cmd --zone=public --add-port=1000-2000/tcp --permanent
# 移除端口(如8080/tcp)
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
# 重载规则(使永久配置生效)
firewall-cmd --reload
(4)富规则(高级自定义规则)
富规则用于配置复杂策略(如基于IP、端口的精细化控制),支持accept(允许)、reject(拒绝并回应)、drop(静默丢弃)动作。
示例1:拒绝特定IP的所有流量
# 临时拒绝192.168.0.11的IPv4流量
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.11" reject'

示例2:允许特定IP访问80端口
# 永久允许192.168.0.10访问80/tcp
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.10" port port="80" protocol="tcp" accept' --permanent
firewall-cmd --reload # 重载生效

示例3:删除富规则(需完整匹配规则内容)
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.0.11" reject'
# 通过修改xml文件并重载**firewall-cmd --reload** 防火墙规则进行修改
[root@master zones]# cd /etc/firewalld/
[root@master firewalld]# ls
firewalld.conf helpers icmptypes ipsets lockdown-whitelist.xml services zones
[root@master firewalld]# cd zones
[root@master zones]# ls
public.xml public.xml.old
[root@master zones]# cat public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="80"/>
<port protocol="tcp" port="9090"/>
<port protocol="tcp" port="100-1000"/>
</zone>
[root@master zones]# vim public.xml #删除放行100-1000端口的规则
[root@master zones]# firewall-cmd --reload
success
[root@master zones]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 80/tcp 9090/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:


(5)图形化工具:firewall-config
通过图形界面直观配置规则:
firewall-config # 启动图形化界面
界面左侧选择区域,右侧可添加服务、端口、富规则等,勾选"永久"选项后点击"应用"即可生效。
二、iptables:经典防火墙工具
iptables是Linux传统防火墙工具,基于"四表五链"模型,适合复杂规则配置。

1. 核心概念:四表五链
-
四表(按功能划分,优先级从高到低):
raw:处理数据包追踪(出口)mangle:修改数据包标记(双向)nat:网络地址转换(入口)filter:默认表,过滤数据包(最常用)
-
五链(按数据流向划分):
INPUT:入站流量(目标是本机)OUTPUT:出站流量(源是本机)FORWARD:转发流量(经过本机但目标非本机)PREROUTING:路由前处理(修改目标地址)POSTROUTING:路由后处理(修改源地址)
2. 常用命令语法
iptables [-t 表名] [选项] [链名] [匹配条件] -j 动作
- 选项:
-A(追加规则)、-I(插入规则)、-D(删除规则)、-L(查看规则)、-F(清空规则) - 动作:
ACCEPT(允许)、REJECT(拒绝并回应)、DROP(静默丢弃)
3. 实战示例
(1)基础规则管理
# 查看filter表所有规则(-n:数字显示IP,-L:列表)
iptables -t filter -n -L
# 允许所有入站TCP流量(追加到INPUT链)
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 禁止ping(入站ICMP流量)
iptables -I INPUT -p icmp -j REJECT
# 删除INPUT链的第1条规则
iptables -D INPUT 1
# 清空所有表的规则
iptables -F # 等价于 iptables -t filter -F(默认操作filter表)
(2)基于IP和端口的规则
# 禁止192.168.0.100通过eth0网卡访问本机
iptables -I INPUT -i eth0 -s 192.168.0.100 -j DROP
# 允许本机访问外部SSH服务(22端口)
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
# 仅允许已建立的连接(防止外部主动连接)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(3)NAT地址转换(nat表)
# 配置SNAT(源地址转换,本机作为网关时使用)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 配置DNAT(目标地址转换,将80端口转发到内部服务器192.168.1.10)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.10:80
三、总结
- firewalld:适合快速配置,通过区域简化规则,支持动态重载(不中断连接),推荐新手或简单场景使用。
- iptables:适合复杂规则(如NAT、端口转发),功能更强大但配置较繁琐,推荐进阶用户或定制化场景使用。
根据网络环境选择工具,核心原则:最小权限原则——仅开放必要的端口和服务,拒绝所有非必要流量。
通过本文的实战命令,你可以快速搭建Linux防火墙基础防护,后续可根据实际需求细化规则,保障服务器安全。
更多推荐
所有评论(0)