Linux 防火墙的核心作用是 过滤网络流量(允许 / 禁止特定端口、IP、协议的访问),保障系统网络安全。主流 Linux 发行版的防火墙工具分为三类:

  • firewalld(CentOS 7+/RHEL 7+/Fedora,默认工具,动态规则,推荐);
  • iptables(传统工具,兼容所有红帽系 / Debian 系,静态规则);
  • ufw(Ubuntu/Debian 默认工具,简化版,适合桌面 / 轻量服务器)。

以下按「工具分类 + 核心概念 + 常用配置 + 实战场景」详细介绍,覆盖 90% 服务器 / 桌面使用场景。

一、先明确:你的系统用哪个防火墙工具?

发行版 默认防火墙工具 切换说明(如需)
CentOS 7+/RHEL 7+/Fedora firewalld 若想改用 iptables:需停止 firewalld 并禁用
CentOS 6/RHEL 6 iptables 无默认替代工具
Ubuntu/Debian ufw 若想改用 iptables:直接安装配置即可

查看当前防火墙状态(快速判断):

bash

运行

# 查看 firewalld 状态(CentOS 7+)
systemctl status firewalld

# 查看 ufw 状态(Ubuntu)
ufw status

# 查看 iptables 规则(所有系统)
iptables -L -n

二、firewalld 配置详解(CentOS 7+/RHEL 7+ 推荐)

firewalld 是 动态防火墙(修改规则无需重启服务,即时生效),核心概念是「区域(Zone)」—— 通过不同区域定义不同的安全策略(如允许哪些端口 / IP 访问)。

1. 核心概念

(1)区域(Zone):按场景划分安全策略

firewalld 预设 9 个区域,常用 4 个:

区域名 核心策略(默认) 适用场景
public 允许出站流量,仅开放常用服务(ssh、dhcp) 服务器公网环境(默认区域,推荐)
trusted 允许所有流量 内网信任环境(如局域网服务器)
drop 拒绝所有入站流量(无响应) 高安全场景(仅开放必要端口)
block 拒绝所有入站流量(返回拒绝响应) 需明确拒绝访问的场景

查看当前默认区域:firewall-cmd --get-default-zone切换默认区域(如切到 drop):sudo firewall-cmd --set-default-zone=drop

(2)规则类型:临时规则 vs 永久规则
  • 临时规则:firewall-cmd 不加 --permanent,重启 firewalld 或系统后失效;
  • 永久规则:加 --permanent,需执行 firewall-cmd --reload 生效(无需重启服务)。

2. 基础命令(启动 / 停止 / 状态)

bash

运行

# 启动 firewalld
sudo systemctl start firewalld

# 停止 firewalld(不推荐,暴露风险)
sudo systemctl stop firewalld

# 重启 firewalld(临时规则会丢失,永久规则保留)
sudo systemctl restart firewalld

# 开机自启(推荐服务器开启)
sudo systemctl enable firewalld

# 禁止开机自启
sudo systemctl disable firewalld

# 查看状态(active 为运行中)
sudo systemctl status firewalld
# 或查看详细规则状态
sudo firewall-cmd --list-all

3. 核心配置(常用场景)

(1)开放端口(最常用,如 80/443/22)

bash

运行

# 临时开放 80 端口(TCP 协议,web 服务)
sudo firewall-cmd --add-port=80/tcp

# 永久开放 443 端口(HTTPS)+ 立即生效(reload 加载永久规则)
sudo firewall-cmd --add-port=443/tcp --permanent && sudo firewall-cmd --reload

# 永久开放端口范围(如 8080-8090,TCP 协议)
sudo firewall-cmd --add-port=8080-8090/tcp --permanent && sudo firewall-cmd --reload
(2)开放服务(按服务名,无需记端口)

firewalld 预设了常用服务的端口映射(如 http=80,ssh=22),直接用服务名更方便:

bash

运行

# 永久开放 ssh 服务(22 端口,远程登录必备)
sudo firewall-cmd --add-service=ssh --permanent && sudo firewall-cmd --reload

# 永久开放 http + https 服务(web 服务器)
sudo firewall-cmd --add-service=http --permanent && sudo firewall-cmd --add-service=https --permanent && sudo firewall-cmd --reload

# 查看所有支持的服务名
sudo firewall-cmd --get-services
(3)禁止端口 / IP(拦截恶意访问)

bash

运行

# 永久禁止 3306 端口(MySQL,不对外暴露)
sudo firewall-cmd --remove-port=3306/tcp --permanent && sudo firewall-cmd --reload

# 永久禁止单个 IP 访问(如 192.168.1.100)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject" --permanent && sudo firewall-cmd --reload

# 永久禁止 IP 段访问(如 192.168.1.0/24 网段)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject" --permanent && sudo firewall-cmd --reload
(4)查看当前规则

bash

运行

# 查看所有开放的端口和服务(当前生效的规则)
sudo firewall-cmd --list-all

# 查看永久规则(需加 --permanent)
sudo firewall-cmd --list-all --permanent

# 查看开放的端口(仅端口)
sudo firewall-cmd --list-ports

# 查看开放的服务(仅服务)
sudo firewall-cmd --list-services

4. 高级配置(进阶场景)

(1)端口转发(如 80 转发到 8080)

适合服务端口变更但不想暴露新端口的场景:

bash

运行

# 永久转发 80 端口(TCP)到 8080 端口(需开启 IP 伪装)
sudo firewall-cmd --add-masquerade --permanent  # 开启 IP 伪装(NAT)
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:to-port=8080 --permanent
sudo firewall-cmd --reload
(2)IP 伪装(内网服务器上网 / 对外提供服务)

相当于 NAT 功能,让内网机器通过防火墙主机访问外网:

bash

运行

# 永久开启 IP 伪装(仅在 public 区域,根据实际区域调整)
sudo firewall-cmd --zone=public --add-masquerade --permanent && sudo firewall-cmd --reload
(3)自定义服务(如自己的应用端口)

如果服务端口不在预设列表中,可自定义服务名:

bash

运行

# 1. 复制模板创建自定义服务(如 myapp,端口 9000)
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/myapp.xml

# 2. 编辑 myapp.xml,修改服务名、端口(用 vi 编辑)
sudo vi /etc/firewalld/services/myapp.xml
# 内容修改为:
<service>
  <short>MyApp</short>  <!-- 服务简称 -->
  <description>My Custom Application</description>  <!-- 描述 -->
  <port protocol="tcp" port="9000"/>  <!-- 对应端口 -->
</service>

# 3. 重新加载 firewalld,即可使用服务名开放端口
sudo firewall-cmd --reload
sudo firewall-cmd --add-service=myapp --permanent && sudo firewall-cmd --reload
(4)富规则(灵活匹配多条件)

支持组合 IP、端口、协议、动作(允许 / 拒绝 / 日志),适合复杂场景:

bash

运行

# 允许 192.168.1.0/24 网段访问 3306 端口(MySQL 仅内网访问)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' port protocol='tcp' port='3306' accept" --permanent && sudo firewall-cmd --reload

# 拒绝 10.0.0.5 访问 22 端口(禁止特定 IP 远程登录)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='10.0.0.5' port protocol='tcp' port='22' reject" --permanent && sudo firewall-cmd --reload

# 日志记录 80 端口的访问(日志前缀 "HTTP_ACCESS")
sudo firewall-cmd --add-rich-rule="rule family='ipv4' port protocol='tcp' port='80' log prefix='HTTP_ACCESS' level='info' accept" --permanent && sudo firewall-cmd --reload

三、iptables 配置详解(传统工具,兼容所有系统)

iptables 是 静态防火墙(修改规则后需重启服务或刷新规则),核心是「规则链」和「默认策略」,适合旧系统(CentOS 6)或需要复杂自定义规则的场景。

1. 核心概念

(1)规则链(默认 5 条,常用 3 条)
  • INPUT:处理进入系统的流量(如外部访问本机端口);
  • OUTPUT:处理系统发出的流量(如本机访问外部网站);
  • FORWARD:处理转发的流量(如防火墙作为网关转发内网流量)。
(2)默认策略(链的默认动作)
  • ACCEPT:允许流量通过(默认策略,安全性低);
  • DROP:拒绝流量通过(无响应,推荐服务器使用,仅开放必要端口);
  • REJECT:拒绝流量并返回「拒绝响应」。
(3)规则匹配优先级

按规则添加顺序匹配,匹配到第一条规则后立即执行,不再继续匹配。

2. 基础命令(查看 / 清空规则)

bash

运行

# 查看所有规则(-L 列表,-n 数字显示 IP/端口,-v 详细信息)
sudo iptables -L -n -v

# 查看 INPUT 链规则(仅关注入站流量)
sudo iptables -L INPUT -n -v

# 清空所有规则(-F 清空,-X 清除自定义链)
sudo iptables -F && sudo iptables -X

# 重置默认策略(如 INPUT 链默认 DROP,OUTPUT 链默认 ACCEPT)
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP

3. 核心配置(常用场景)

(1)开放必要端口(如 22/80/443)

bash

运行

# 允许本地回环(lo 接口,本机内部通信必备,如数据库本地连接)
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接(如本机访问外部后,外部的响应流量)
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 开放 22 端口(ssh 远程登录)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 开放 80(http)和 443(https)端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
(2)禁止 IP / 端口访问

bash

运行

# 禁止单个 IP 访问(如 192.168.1.100)
sudo iptables -A INPUT -s 192.168.1.100 -j DROP

# 禁止 IP 段访问(如 10.0.0.0/24)
sudo iptables -A INPUT -s 10.0.0.0/24 -j DROP

# 禁止访问 3306 端口(MySQL 不对外暴露)
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
(3)端口转发(如 80 转发到 8080)

需开启内核转发(临时生效):

bash

运行

# 开启内核 IP 转发(需 root 权限)
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久开启内核转发(编辑 sysctl.conf)
sudo vi /etc/sysctl.conf
# 添加/修改:net.ipv4.ip_forward = 1
# 生效:sysctl -p

# 转发 80 端口到 8080(需开启 NAT)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

4. 规则保存(避免重启失效)

iptables 规则默认是「临时的」,重启系统或 iptables 服务后丢失,需手动保存:

bash

运行

# CentOS 7+/RHEL 7+(firewalld 已禁用,用 iptables-services)
# 1. 安装 iptables-services
sudo yum install -y iptables-services

# 2. 保存规则(保存到 /etc/sysconfig/iptables)
sudo service iptables save

# 3. 开机自启 iptables
sudo systemctl enable iptables

# Ubuntu/Debian
# 1. 安装 iptables-persistent
sudo apt install -y iptables-persistent

# 2. 保存规则(ipv4 规则保存到 /etc/iptables/rules.v4)
sudo netfilter-persistent save

四、ufw 配置详解(Ubuntu/Debian 默认,简化版)

ufw(Uncomplicated Firewall)是 iptables 的简化封装,命令直观,适合桌面用户和轻量服务器(如 Ubuntu 云服务器)。

1. 基础命令(启动 / 禁用 / 状态)

bash

运行

# 启用 ufw(默认策略:拒绝所有入站,允许所有出站,安全)
sudo ufw enable

# 禁用 ufw
sudo ufw disable

# 查看状态(verbose 显示详细规则)
sudo ufw status verbose

# 重置所有规则(恢复默认)
sudo ufw reset

2. 核心配置(常用场景)

(1)开放端口 / 服务

bash

运行

# 开放 22 端口(ssh,远程登录)
sudo ufw allow 22/tcp

# 开放 80(http)+ 443(https)端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 用服务名开放(如开放 ssh 服务,等同于 22/tcp)
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

# 开放端口范围(如 8080-8090)
sudo ufw allow 8080:8090/tcp
(2)禁止端口 / IP 访问

bash

运行

# 禁止 3306 端口(MySQL)
sudo ufw deny 3306/tcp

# 禁止单个 IP 访问(如 192.168.1.100)
sudo ufw deny from 192.168.1.100

# 禁止 IP 段访问(如 10.0.0.0/24)
sudo ufw deny from 10.0.0.0/24

# 禁止特定 IP 访问 22 端口
sudo ufw deny from 192.168.1.100 to any port 22
(3)删除规则

bash

运行

# 先查看规则编号(--line-numbers 显示编号)
sudo ufw status numbered

# 删除编号为 3 的规则(根据实际编号调整)
sudo ufw delete 3

五、服务器常用场景实战配置

场景 1:Web 服务器(开放 80/443/22 端口)

bash

运行

# firewalld(CentOS 7+)
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# ufw(Ubuntu)
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

场景 2:MySQL 仅内网访问(3306 端口不对外暴露)

bash

运行

# firewalld(仅允许 192.168.1.0/24 网段访问 3306)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' port protocol='tcp' port='3306' accept" --permanent && sudo firewall-cmd --reload

# ufw(仅允许 192.168.1.0/24 访问 3306)
sudo ufw allow from 192.168.1.0/24 to any port 3306

场景 3:禁止恶意 IP 访问(如频繁尝试 ssh 登录的 IP)

bash

运行

# firewalld
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='123.45.67.89' reject" --permanent && sudo firewall-cmd --reload

# iptables
sudo iptables -A INPUT -s 123.45.67.89 -j DROP && sudo service iptables save

六、工具对比与选择建议

工具 优点 缺点 适用场景
firewalld 动态规则(无需重启)、区域化管理、功能全 仅支持 CentOS 7+/RHEL 7+/Fedora 红帽系服务器(推荐)
iptables 兼容所有系统、规则灵活、可自定义程度高 静态规则(需重启 / 保存)、命令复杂 旧系统(CentOS 6)、复杂规则场景
ufw 命令简单、配置快速、Ubuntu 默认 功能较少,不支持复杂转发 / 伪装 Ubuntu 桌面 / 轻量服务器

七、注意事项(避坑指南)

  1. 临时规则 vs 永久规则

    • firewalld 不加 --permanent 是临时规则,重启后失效;
    • iptables 规则默认临时,必须用 service iptables save(CentOS)或 netfilter-persistent save(Ubuntu)保存。
  2. 默认策略优先安全:服务器建议默认策略设为「拒绝所有入站流量」(firewalld 选 drop 区域,iptables/ufw 设 INPUT 链为 DROP),仅开放必要端口。

  3. 避免误封 ssh 端口:配置前确保已开放 22 端口(ssh),否则远程登录会被断开,需物理机或控制台修复。

  4. 测试规则是否生效:开放端口后,用外部机器测试(如 telnet 服务器IP 80 或 curl 服务器IP:80),能连通则规则生效。

  5. 防火墙与 SELinux 区分:SELinux 是「系统内部访问控制」(如限制进程访问文件),防火墙是「网络访问控制」,二者互补,不冲突(服务器建议都开启)。

通过以上配置,可实现 Linux 系统的网络安全防护,根据自己的发行版和需求选择对应的工具即可。如果需要更复杂的场景(如负载均衡、VPN 转发),可基于 firewalld/iptables 的高级规则扩展。

Logo

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

更多推荐