news 2026/7/6 12:09:28

Linux防火墙实战:firewalld与UFW配置指南与避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux防火墙实战:firewalld与UFW配置指南与避坑

1. 项目概述:为什么你需要亲手管理Linux防火墙?

在云服务器上部署了一个Web应用,明明服务进程跑得好好的,端口也监听着,但用户就是死活访问不了。排查了一圈代码和配置,最后发现,是防火墙把端口给拦了。这种场景,但凡在Linux服务器上折腾过几天的人,大概率都遇到过。防火墙,这个默默守护在操作系统网络层入口的“门卫”,配置得当是安全卫士,配置失误就是“断网元凶”。

很多人,尤其是刚接触Linux运维的朋友,对防火墙有种莫名的畏惧。要么图省事,直接systemctl stop firewalld一关了之,把服务器赤裸裸地暴露在公网;要么就是被firewall-cmd那一长串参数搞得晕头转向,规则配得乱七八糟,该通的没通,不该通的反而开了口子。其实,Linux防火墙的管理,核心逻辑非常清晰,一旦掌握了几个关键命令和背后的设计思想,你就能把它驯服得服服帖帖,让它既保障安全,又不给业务添堵。

今天,我们就抛开那些复杂的底层iptables规则(当然,理解它很有帮助),聚焦于两个最主流、最易用的防火墙管理工具:firewalld(CentOS/RHEL/Fedora/Alibaba Cloud Linux系)和UFW(Ubuntu/Debian系)。我会带你从零开始,理解它们的工作原理,一步步完成查看状态、安全启用、开放端口、管理服务以及故障排查的全过程。无论你是个人项目开发者,还是需要维护企业服务器的运维工程师,这套清晰、安全的操作流程都能让你在面对防火墙时,心里有底,手上有招。

2. 核心概念与工具选型:firewalld与UFW的江湖

在深入实操之前,我们得先搞清楚手上有哪些“兵器”,以及它们各自的“门派”。Linux世界里的防火墙,底层基石是Netfilter框架,它提供了内核级别的数据包过滤能力。而iptables是直接操作Netfilter规则的传统命令行工具,功能强大但规则复杂,对新手不友好。firewalldufw可以看作是iptables的“现代化管理前端”,它们通过更友好的命令和抽象概念(如区域、服务),让防火墙管理变得简单。

2.1 firewalld:红帽系的动态防火墙管理者

firewalld是Red Hat系列发行版(CentOS, RHEL, Fedora, AlmaLinux等)及阿里云Alibaba Cloud Linux的默认防火墙解决方案。它的核心设计思想是“动态管理”和“区域划分”。

  • 动态管理:传统的iptables规则修改后,需要全部重新加载,可能导致现有连接中断。firewalld的规则运行时存储在内存中,你可以随时添加或删除规则,而不会破坏现有连接,修改完成后通过--reload优雅地应用所有变更。
  • 区域(Zone):这是firewalld最精妙的设计。你可以为不同的网络环境(如公司内网、家庭网络、咖啡馆Wi-Fi)预定义不同的信任级别和规则集。每个网络接口可以被分配到一个区域。例如,你的服务器可能将连接公网的eth0网卡放在public(公共)区域,仅开放少数必要端口;而将连接内部数据库的eth1网卡放在trusted(信任)区域,允许所有流量。默认情况下,新接口会进入public区域。

常用区域简介:

  • trusted: 信任所有流量。相当于关闭防火墙。
  • home: 用于家庭网络,允许SSH、mdns、samba-client等。
  • internal: 类似home,用于内部网络。
  • work: 用于工作场所,允许SSH、dhcpv6-client等。
  • public:默认区域。用于公共区域,仅允许SSH和dhcpv6-client。最严格的区域之一。
  • dmz: 用于非军事区(对外提供服务,但隔离内网),允许SSH。
  • block: 拒绝所有传入连接,只有主动发起的连接才能收到回复。
  • drop: 丢弃所有传入数据包,且不回复任何信息(最严格)。

2.2 UFW:为人类设计的防火墙

UFW(Uncomplicated Firewall)是Ubuntu和Debian系统的默认防火墙配置工具。它的名字就道出了其宗旨:简单化。它通过极其简洁的命令语法,将复杂的iptables规则封装起来。

  • 极简语法sudo ufw allow sshsudo ufw allow 80/tcp。几乎不用记参数,一看就懂。
  • 默认策略清晰:UFW默认的策略是拒绝所有传入(incoming),允许所有传出(outgoing)。这是一个非常安全且合理的起点。你只需要手动去开放那些需要从外部访问的服务端口即可。
  • 规则持久化:通过ufw添加的规则会自动保存,重启后依然生效。

选型小结:如果你的系统是CentOS/RHEL系,那么学习和使用firewalld是必经之路。如果你的系统是Ubuntu/Debian系,那么ufw是你的首选,它简单到让你觉得防火墙管理本该如此。当然,在CentOS上你也可以安装ufw,在Ubuntu上也可以安装firewalld,但跟随发行版的默认选择,能获得最好的兼容性和社区支持。

注意:在云服务器(如阿里云ECS、腾讯云CVM)环境中,防火墙配置是双重关卡。第一关是云厂商提供的安全组,它是在物理网络层之前的虚拟防火墙;第二关才是我们这里讨论的操作系统内部的防火墙。流量必须同时通过这两者的放行规则,才能到达你的应用。很多“配置了防火墙却还无法访问”的问题,根源在于忘记了在云控制台配置安全组规则。

3. firewalld 实战配置与管理全流程

假设我们正在管理一台CentOS 8或Alibaba Cloud Linux 3的服务器,需要部署一个Web应用(Nginx/Apache)和一个后端API服务(运行在8080端口)。

3.1 检查与安装

首先,我们确认firewalld的状态。

sudo systemctl status firewalld

或者使用更直接的命令:

sudo firewall-cmd --state

如果显示running,说明防火墙正在运行。如果显示not running,说明已停止。如果提示command not found,则需要安装:

# CentOS 7/Alibaba Linux 2 sudo yum install firewalld firewalld-config -y # CentOS 8+/Alibaba Linux 3 sudo dnf install firewalld firewalld-config -y

firewalld-config是图形化配置工具(firewall-config),在桌面环境可用,服务器环境下我们主要用命令行。

3.2 安全地启用防火墙(防“失联”)

这是最关键的一步!绝对不要在没有任何允许规则的情况下直接启动防火墙,否则你会立刻断开与服务器的SSH连接,俗称“被踢下线”。

正确的“先放行,后启用”流程如下:

  1. 首先,确保SSH服务被放行。SSH是我们远程管理服务器的生命线。

    # 将ssh服务永久添加到默认区域(通常是public)的允许规则中 sudo firewall-cmd --permanent --add-service=ssh

    --permanent参数表示规则永久生效,否则重启防火墙或服务器后规则会丢失。但注意,仅使用--permanent参数,规则不会立即生效,它被写入配置文件。

  2. 重新加载防火墙,使永久规则生效。这不会中断现有连接。

    sudo firewall-cmd --reload
  3. 现在,可以安全地启动防火墙服务了。

    sudo systemctl start firewalld
  4. (可选)设置开机自启。

    sudo systemctl enable firewalld

完成以上步骤,你的SSH连接依然保持,防火墙也已运行并保护着你的服务器,仅开放了22端口(SSH)。

3.3 开放业务所需端口与服务

我们的Web应用需要HTTP(80)和HTTPS(443),后端API在8080端口。

方法一:按服务名开放(推荐)firewalld预定义了许多常见的服务,如http,https,ssh,mysql等。使用服务名更直观,且包含了该服务通常需要的所有端口和协议。

# 永久添加http和https服务 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 重新加载使规则生效 sudo firewall-cmd --reload

方法二:按端口号开放对于firewalld没有预定义的服务,或者自定义端口(如我们的8080),需要直接指定端口和协议。

# 永久开放8080端口的TCP协议 sudo firewall-cmd --permanent --add-port=8080/tcp # 重新加载使规则生效 sudo firewall-cmd --reload

验证规则是否生效:

# 查看默认区域(public)的所有活动规则 sudo firewall-cmd --list-all

输出会显示类似以下内容:

public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh http https ports: 8080/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

这里清晰地看到,services里包含了ssh,http,httpsports里包含了8080/tcp

3.4 高级管理与区域操作

查看所有可用区域:

sudo firewall-cmd --get-zones

查看指定区域的规则:

sudo firewall-cmd --zone=home --list-all

为网卡指定区域:假设你的服务器有两张网卡,eth0对外提供服务,eth1连接内部管理网络。

# 将eth1接口永久分配到internal区域 sudo firewall-cmd --permanent --zone=internal --change-interface=eth1 sudo firewall-cmd --reload

然后你可以为internal区域配置更宽松的规则,比如允许所有内部IP访问。

移除规则:如果误操作或需要关闭某个端口。

# 移除端口规则 sudo firewall-cmd --permanent --remove-port=8080/tcp # 移除服务规则 sudo firewall-cmd --permanent --remove-service=https sudo firewall-cmd --reload

3.5 临时关闭与完全禁用

临时关闭(用于故障排查):停止防火墙服务,规则配置依然保留,重启服务后会再次生效。

sudo systemctl stop firewalld

完全禁用(并取消开机自启):

sudo systemctl disable --now firewalld

--now参数表示同时停止当前运行的服务。

实操心得:在生产环境中,我强烈建议永远不要完全禁用防火墙。如果为了排查问题,可以stop它。一旦确认问题与防火墙无关,应立即start。对于长期不需要防火墙的特殊环境(如完全隔离的内网测试机),也应考虑使用trusted区域,而不是直接禁用服务,这样可以保留一个清晰的管理状态。

4. UFW 实战配置与管理全流程

现在,我们把场景切换到一台Ubuntu 22.04 LTS服务器上。UFW的哲学是“默认拒绝,简单允许”。

4.1 检查与安装

检查UFW状态:

sudo ufw status

如果显示Status: inactive,表示防火墙未激活。如果显示Status: active,则表示已启用,并会列出当前规则。如果提示command not found,则安装:

sudo apt update && sudo apt install ufw -y

4.2 安全地启用防火墙

UFW的默认策略(拒绝入站,允许出站)已经很安全,但我们仍需先放行SSH。

  1. 放行SSH连接:

    sudo ufw allow ssh

    这条命令等价于sudo ufw allow 22/tcp,因为UFW知道ssh服务对应22端口。

  2. 启用UFW:

    sudo ufw enable

    执行时,系统会警告“此命令可能会中断现有的ssh连接”,因为我们已提前允许了SSH,所以输入y确认即可,连接不会中断。启用后,UFW会自动设置开机自启。

4.3 开放业务所需端口与服务

同样,我们需要开放80、443和8080端口。

按服务名开放:

sudo ufw allow http sudo ufw allow https

按端口号开放:

sudo ufw allow 8080/tcp

UFW的规则是即时生效并自动持久化的,无需执行额外的重载命令。

验证规则:

sudo ufw status numbered

numbered参数会为每条规则编号,这在后续删除特定规则时非常有用。 输出示例:

Status: active To Action From -- ------ ---- [ 1] 22/tcp ALLOW IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443/tcp ALLOW IN Anywhere [ 4] 8080/tcp ALLOW IN Anywhere [ 5] 22/tcp (v6) ALLOW IN Anywhere (v6) [ 6] 80/tcp (v6) ALLOW IN Anywhere (v6) [ 7] 443/tcp (v6) ALLOW IN Anywhere (v6) [ 8] 8080/tcp (v6) ALLOW IN Anywhere (v6)

可以看到,UFW自动为IPv4和IPv6地址都添加了规则。

4.4 更精细的规则控制

UFW同样支持基于IP和端口的精细控制。

允许特定IP访问所有端口:

sudo ufw allow from 192.168.1.100

允许特定IP访问特定端口:

sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp

这条规则允许192.168.1.0/24网段的所有IP访问本机的3306端口(MySQL)。

拒绝特定IP或端口:

# 拒绝某个IP的所有访问 sudo ufw deny from 203.0.113.10 # 拒绝所有人访问某个端口 sudo ufw deny 21/tcp

删除规则:有两种方式:

  1. 使用创建规则时的原始命令,将allowdeny替换为delete
    sudo ufw delete allow 8080/tcp
  2. 使用规则编号删除(推荐,更准确)。
    sudo ufw status numbered # 先查看编号 sudo ufw delete 4 # 删除编号为4的规则(例如上面的8080/tcp)

4.5 关闭与重置

禁用UFW(规则配置保留):

sudo ufw disable

重置UFW为初始状态(清空所有规则):

sudo ufw reset

这个命令会禁用UFW,并删除所有用户定义的规则。执行前务必确认。

5. 生产环境最佳实践与深度避坑指南

配置几条规则只是开始,要让防火墙真正成为安全的助力而非麻烦的源头,你需要遵循一些原则并了解常见的“坑”。

5.1 安全配置的黄金法则

  1. 最小权限原则:这是网络安全的核心。只开放业务绝对必需的端口。例如,MySQL数据库的3306端口,绝不应该对公网(0.0.0.0/0)开放。应该只允许特定的管理IP或应用服务器所在的内部网段访问。使用firewalld的富规则或ufw的源IP限制来实现。

    • firewalld示例:
      sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept' sudo firewall-cmd --reload
    • UFW示例:见上文4.4节。
  2. 变更前预留“逃生通道”:在进行可能阻断现有连接的规则修改前(比如修改默认区域策略、删除SSH规则),务必确保你有一个已建立的、不会被新规则影响的连接会话。可以通过云控制台的VNC登录功能,或者提前开启一个不会被中断的备用端口(并在安全组放行),例如使用screentmux维持一个会话。一旦规则配错导致失联,可以通过这个通道进行修复。

  3. 善用区域(firewalld):充分利用firewalld的区域功能。为不同安全级别的网络接口分配不同的区域。比如,公网IP用public,内网管理IP用internaltrusted。这样规则集更清晰,管理更便捷。

5.2 故障排查三板斧

当服务无法从外部访问时,按照以下顺序排查,可以解决90%的问题:

第一板斧:检查云安全组。这是云服务器环境下最容易被忽略的一环!登录到你的云服务商控制台(阿里云、腾讯云等),找到你的ECS实例,检查其绑定的安全组规则。确保入方向(Inbound)规则已经允许了你的公网IP访问目标端口(如80, 443, 8080)。操作系统防火墙是第二道门,安全组是第一道门。

第二板斧:检查服务监听状态。在服务器内部,确认你的应用进程是否真的在运行,并且监听在了正确的IP和端口上。

# 使用ss命令(推荐,更高效) sudo ss -tunlp | grep :80 # 或使用netstat命令 sudo netstat -tunlp | grep :80

查看输出中,进程是否监听在0.0.0.0:80:::80(表示所有IPv4/IPv6地址)。如果只监听在127.0.0.1:80,那么外部是无法访问的。

第三板斧:检查防火墙规则与状态。

  • 确认防火墙服务是否运行(systemctl status firewalld/sudo ufw status)。
  • 确认规则是否已正确添加并生效(firewall-cmd --list-all/sudo ufw status numbered)。
  • 临时性测试:可以尝试临时停止防火墙(systemctl stop firewalld/sudo ufw disable),然后从外部测试访问。如果此时能访问了,问题就出在防火墙规则上;如果还不能,那问题就在更前面(安全组或服务本身)。

5.3 日志与监控

防火墙日志是发现攻击和异常访问的重要来源。

  • firewalld日志:日志由系统日志服务journald管理。
    # 查看firewalld的实时日志 sudo journalctl -u firewalld -f # 查看特定时间段的日志 sudo journalctl -u firewalld --since "2023-10-01" --until "2023-10-02"
  • UFW日志:日志通常位于/var/log/ufw.log。需要先启用日志。
    # 启用日志(默认级别为low) sudo ufw logging on # 可以设置级别为 low, medium, high, full sudo ufw logging medium # 查看日志 sudo tail -f /var/log/ufw.log

定期审查这些日志,可以帮助你发现扫描行为、暴力破解尝试(针对SSH端口)等,及时调整安全策略。

5.4 我踩过的那些“坑”

  1. “我明明开放了端口,为什么还不行?”——协议类型。开放端口时一定要指定协议是tcp还是udp。比如DNS服务可能需要53/tcp53/udp,DHCP服务需要67/udp68/udp。用firewall-cmd --add-port=53而不加协议,或者ufw allow 53,通常只开放了TCP。最稳妥的方法是明确指定/tcp/udp

  2. “重启服务器后规则丢了!”——忘记--permanentfirewalld中,直接使用firewall-cmd --add-port添加的是运行时规则,重启服务后即失效。务必记得重要的规则要加上--permanent参数,并执行--reload。或者,更规范的做法是,始终先使用--permanent参数在配置文件中修改规则,然后用--reload一次性加载,避免运行时规则和永久规则不一致。

  3. “UFW规则顺序问题。”UFW的规则是有顺序的,第一条匹配的规则生效。如果你先设置了一条allow from 192.168.1.0/24,然后又设置了一条deny 22/tcp,那么来自192.168.1.0/24的SSH访问依然会被允许,因为第一条规则已经匹配并放行了。在配置多条规则时,要心里有数。使用sudo ufw status numbered查看顺序。

  4. Docker与防火墙的冲突。Docker在安装和创建网络时,可能会自动修改iptables规则,这有时会绕过或干扰firewalld/ufw的管理。如果你发现Docker容器能访问而主机服务不能,或者反之,很可能就是这个问题。解决方案通常是在Docker配置中禁用其iptables管理,或者将Docker网桥接口放入firewalldtrusted区域。这是一个相对进阶的话题,需要根据具体场景处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 12:09:12

Siri AI秋季上线在即:苹果用两年时间,交出了一份怎样的答卷?

2011年,Siri随着iPhone 4S一同诞生,成为智能手机时代最早的语音助手之一。此后的十多年里,它却长期停留在“设个闹钟、查个天气”的基础指令阶段。当ChatGPT等能连续对话、理解上下文的AI助手席卷全球时,Siri与对手的差距被迅速拉…

作者头像 李华
网站建设 2026/7/6 12:07:39

5步实现跨平台资源下载:res-downloader视频解密工具完整指南

5步实现跨平台资源下载:res-downloader视频解密工具完整指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-…

作者头像 李华
网站建设 2026/7/6 12:03:56

Netdata 1.45 集群监控实战:3步配置Streaming,聚合5台服务器数据

Netdata 1.45 集群监控实战:3步配置Streaming,聚合5台服务器数据在分布式系统架构中,服务器集群的性能监控一直是运维工程师面临的挑战。当你有5台、10台甚至更多服务器需要监控时,传统的单机监控方案就显得力不从心。Netdata的St…

作者头像 李华
网站建设 2026/7/6 12:03:42

前缀和题解:多加一个哨兵,少掉一堆边界判断

前缀和题解:多加一个哨兵,少掉一堆边界判断 一、前缀和不是只会套公式 前缀和是区间问题里的基础工具。很多题解会直接写 sum[r] - sum[l - 1]。这个公式没错,但实现时边界容易出问题。尤其是 l 为 0 或 1 时,代码要么多写 if&…

作者头像 李华
网站建设 2026/7/6 12:01:06

Ubuntu 环境变量实战:3个常见配置错误与排查修复指南

Ubuntu 环境变量实战:3个常见配置错误与排查修复指南环境变量是Linux系统中至关重要的配置项,它们决定了系统如何查找和执行命令。对于Ubuntu用户来说,正确配置环境变量不仅能提高工作效率,还能避免许多莫名其妙的"command n…

作者头像 李华