Linux防火墙详解:firewalld与iptables实用指南

在Linux系统中,防火墙是保障网络安全的核心组件,负责控制进出服务器的网络流量。本文将详细解析firewalldiptables两大防火墙工具,从基础概念到实战命令,帮助你快速掌握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防火墙基础防护,后续可根据实际需求细化规则,保障服务器安全。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐