很多新手都会遇到一个致命问题:服务启动成功、端口正常监听,外网却死活访问不了,90%的情况都是防火墙在“搞鬼”。
部署完项目,明明服务在运行,浏览器就是打不开页面;
跟着网上教程放行端口,重启服务器后规则就失效了,又要重新配置;
分不清firewalld、ufw、iptables三个工具,不知道自己的系统用的是哪个;
不知道什么是“永久生效”,什么是“临时规则”,配置完总不生效,越改越乱……
本文从核心概念、工具选型,到高频端口放行、实战场景、避坑指南,全程用通俗解释+可直接复制的命令,新手跟着敲一遍就能学会,再也不用为防火墙配置发愁。
前置说明
- 本文所有命令严格适配主流Linux发行版,不同工具对应不同系统,新手先看清楚再操作:
ufw:Ubuntu 18.04+/Debian 10+ 系统默认防火墙工具,优先使用;firewalld:CentOS 7+/Anolis OS/Rocky Linux/RHEL 系统默认防火墙工具,优先使用;iptables:所有Linux系统通用的底层防火墙工具,无默认封装工具的极简系统使用,新手了解即可。
- 所有防火墙配置命令均需
sudo 提权,普通用户直接执行会提示权限不足; - 致命避坑提醒:启用防火墙前,务必先放行SSH远程端口(默认22),否则会直接断开远程连接,无法登录服务器;
- 文中所有代码块均标注「可直接复制」,实操时注意替换端口号、IP地址等占位符;
一、先搞懂:防火墙核心概念
很多新手学不会防火墙,本质是没搞懂底层逻辑,先用人话讲透核心概念,后面的命令一学就会。
1. 什么是Linux防火墙?
通俗类比:Linux防火墙就相当于你服务器的「防盗门+安保系统」,它会严格管控进出服务器的所有网络流量:
- 放行合法的访问(比如你用SSH远程登录、用户访问你的网站);
没有防火墙的服务器,就像家门不上锁,任何人都能随意进出,风险极高;但配置错了防火墙,就像把自己锁在门外,连正常的服务都无法访问。
2. 必须懂的3个核心术语
| | |
|---|
| 从外部网络访问你的服务器的流量(比如用户访问网站、你远程SSH登录) | |
| 从你的服务器访问外部网络的流量(比如服务器下载软件、调用外部接口) | |
| 你给安保系统定的“规矩”,比如“允许所有人访问80端口”“只允许公司IP访问22端口” | |
3. 三个工具的关系与定位(新手一眼看懂)
很多新手最懵的就是这三个工具的区别,一句话讲透:
iptables 是Linux内核层面的底层防火墙工具,所有防火墙规则最终都会交给iptables执行;ufw和firewalld是基于iptables开发的上层封装工具,把复杂的iptables命令简化成了新手能看懂的简单指令,大幅降低使用门槛。
新手一句话结论:你的系统默认带哪个工具,就用哪个!Ubuntu用ufw,CentOS用firewalld,不用碰iptables,完全能满足所有日常需求。
二、ufw 入门实战(Debian/Ubuntu 首选)
ufw全称Uncomplicated Firewall,翻译过来就是“不复杂的防火墙”,正如其名,它是专为新手设计的极简防火墙工具,配置逻辑简单、命令易懂,是Ubuntu/Debian系统的默认防火墙。
2.1 基础操作:安装、启用与状态查看
1. 安装ufw
Ubuntu/Debian默认预装ufw,若提示命令不存在,手动安装即可:
# Ubuntu/Debian 安装ufw
sudo apt install ufw -y
2. 核心基础命令
# 1. 查看防火墙状态(最常用,先看状态再操作)
sudo ufw status
# 输出Status: active 表示已启用,inactive 表示未启用
# 2. 启用防火墙(致命提醒:执行前必须先放行SSH 22端口!!!)
sudo ufw enable
# 执行后会提示:Command may disrupt existing ssh connections. Proceed with operation (y|n)?
# 已经放行22端口输入y,否则先执行放行命令再启用!
# 3. 关闭防火墙(仅测试用,生产环境禁止关闭)
sudo ufw disable
# 4. 重启防火墙(配置修改后重启生效)
sudo ufw reload
# 5. 重置防火墙(清空所有自定义规则,恢复默认)
sudo ufw reset
2.2 核心常用配置(90%场景都用这些)
所有命令执行后立即生效,重启服务器不会丢失,无需额外配置永久生效,这是ufw对新手最友好的一点。
1. 端口放行(最常用)
# 语法:sudo ufw allow 端口号/协议
# 1. 放行TCP 80端口(Web服务HTTP)
sudo ufw allow 80/tcp
# 2. 放行TCP 443端口(Web服务HTTPS)
sudo ufw allow 443/tcp
# 3. 放行SSH默认22端口(启用防火墙前必须执行!!!)
sudo ufw allow 22/tcp
# 4. 放行端口范围(比如FTP被动端口)
sudo ufw allow 20000:20100/tcp
# 5. 同时放行TCP和UDP协议的端口
sudo ufw allow 53
# 等价于 sudo ufw allow 53/tcp + sudo ufw allow 53/udp,DNS服务常用
2. 服务名放行(更直观,不用记端口号)
ufw支持直接通过服务名放行,不用记对应的端口号,新手更不容易出错:
# 语法:sudo ufw allow 服务名
# 1. 放行SSH服务(等价于放行22端口)
sudo ufw allow ssh
# 2. 放行HTTP服务(等价于放行80端口)
sudo ufw allow http
# 3. 放行HTTPS服务(等价于放行443端口)
sudo ufw allow https
# 4. 查看ufw支持的所有服务名
less /etc/services
3. 禁止端口/删除规则
# 1. 禁止端口访问(比如关闭不用的3306端口)
sudo ufw deny 3306/tcp
# 2. 删除已有的规则(两种方法,推荐用序号删除,不容易出错)
# 方法1:先查看规则序号,再按序号删除(推荐)
sudo ufw status numbered
# 输出会给每条规则标序号,比如22端口是序号1,执行下面的命令删除
sudo ufw delete 1
# 方法2:按原命令反向删除
sudo ufw delete allow 80/tcp
# 原命令是allow,delete后面跟完整的原命令即可
4. IP黑白名单配置(安全进阶)
# 1. 只允许指定IP访问22端口(SSH安全加固,强烈推荐)
sudo ufw allow from 192.168.1.100 to any port 22
# 解读:只允许IP 192.168.1.100访问本机22端口,其他IP全部拦截
# 2. 允许指定IP段访问端口(比如公司内网)
sudo ufw allow from 192.168.1.0/24 to any port 3306
# 解读:允许192.168.1.0-255整个网段访问3306数据库端口
# 3. 禁止指定IP访问
sudo ufw deny from 10.0.0.100
# 解读:拦截IP 10.0.0.100的所有访问请求
2.3 进阶实用配置
# 1. 设置默认规则(新手不用改,默认即可)
# 默认入站流量全部拒绝,出站流量全部放行(最安全的默认配置)
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 查看详细的防火墙规则(带序号、接口、日志)
sudo ufw status verbose
# 3. 开启防火墙日志(排查问题必备)
sudo ufw logging on
# 查看日志:tail -f /var/log/ufw.log
新手避坑提示
⚠️ 致命提醒:执行ufw enable前,必须先执行sudo ufw allow 22/tcp放行SSH端口,否则会直接断开远程连接,无法登录服务器!
✅ 技巧:放行端口后,用sudo ufw status确认规则已添加,再启用防火墙;
✅ 技巧:删除规则优先用序号删除,避免记不住原命令导致删错规则。
三、firewalld 入门实战(CentOS/Anolis 首选)
firewalld是红帽系Linux(CentOS 7+、Anolis OS、Rocky Linux)的默认防火墙工具,核心优势是支持规则热加载,修改规则不用重启防火墙,不会中断现有连接,同时支持“区域”管理,适配不同网络场景的规则切换,对服务器场景非常友好。
3.1 先搞懂核心概念:区域(Zone)
区域是firewalld的核心设计,新手很容易懵,用人话讲透:
区域就是一套预设好的规则模板,不同的区域对应不同的安全等级,你可以把不同的网卡、不同的访问场景绑定到不同的区域,实现规则的快速切换。
新手不用记所有区域,只需要掌握默认的public区域即可,99%的服务器场景都用这个区域:
- public区域:默认的公共区域,安全等级高,默认只放行SSH和dhcpv6-client服务,其他所有入站流量全部拒绝,完全适配外网服务器的安全需求。
其他区域简单了解即可:
| | |
|---|
| | |
| | 家庭内网,默认放行SSH、samba等家庭常用服务 |
| | |
| | |
3.2 基础操作:安装、启用与状态查看
1. 安装firewalld
红帽系系统默认预装firewalld,若提示命令不存在,手动安装:
# CentOS/Anolis/Rocky 安装firewalld
sudo yum install firewalld -y
2. 核心基础命令
# 1. 查看防火墙运行状态
sudo systemctl status firewalld
# 输出active (running) 表示已运行,inactive 表示未运行
# 2. 启动防火墙
sudo systemctl start firewalld
# 3. 开机自启防火墙(服务器必做,重启后自动运行)
sudo systemctl enable --now firewalld
# 4. 停止防火墙(仅测试用,生产环境禁止)
sudo systemctl stop firewalld
# 5. 关闭开机自启
sudo systemctl disable firewalld
# 6. 重启防火墙
sudo systemctl restart firewalld
# 7. 重新加载防火墙规则(修改永久规则后必须执行!!!)
sudo firewall-cmd --reload
3.3 核心概念:临时规则 vs 永久规则(新手最容易踩的坑)
firewalld的规则分为临时规则和永久规则,这是新手最容易踩的坑,必须先搞懂:
| | | |
|---|
| | | |
| 必须加--permanent参数,执行--reload后生效 | | |
新手必记口诀:正式配置加--permanent,改完必须--reload才能生效!
3.4 核心常用配置(90%场景都用这些)
所有命令默认操作public区域,服务器场景无需指定区域,新手直接复制即可。
1. 端口放行(最常用)
# 语法:sudo firewall-cmd [--permanent] --add-port=端口号/协议
# 1. 临时放行TCP 80端口(重启后失效,测试用)
sudo firewall-cmd --add-port=80/tcp
# 2. 永久放行TCP 443端口(HTTPS,正式环境用)
sudo firewall-cmd --permanent --add-port=443/tcp
# 必须执行reload才能生效!
sudo firewall-cmd --reload
# 3. 永久放行SSH 22端口(新服务器必做)
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload
# 4. 永久放行端口范围
sudo firewall-cmd --permanent --add-port=20000-20100/tcp
sudo firewall-cmd --reload
# 5. 同时放行TCP和UDP端口
sudo firewall-cmd --permanent --add-port=53/tcp
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --reload
2. 服务名放行(更直观,不用记端口号)
# 语法:sudo firewall-cmd [--permanent] --add-service=服务名
# 1. 永久放行HTTP服务(等价于80端口)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
# 2. 永久放行HTTPS服务(等价于443端口)
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 3. 永久放行MySQL服务(3306端口)
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload
# 4. 查看firewalld支持的所有服务名
sudo firewall-cmd --get-services
3. 关闭端口/删除规则
# 语法:把--add换成--remove即可,临时/永久规则对应删除
# 1. 删除永久放行的80端口规则
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --reload
# 2. 删除永久放行的http服务规则
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload
4. IP黑白名单配置(安全进阶)
firewalld通过**富规则(rich-rule)**实现IP黑白名单配置,功能强大,语法清晰,新手直接复制模板即可。
# 1. 只允许指定IP访问22端口(SSH安全加固,强烈推荐)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'
sudo firewall-cmd --reload
# 2. 允许指定IP段访问3306数据库端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload
# 3. 禁止指定IP访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" reject'
sudo firewall-cmd --reload
# 4. 删除富规则(把--add-rich-rule换成--remove-rich-rule即可)
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.100" reject'
sudo firewall-cmd --reload
3.5 进阶实用配置
# 1. 查看当前所有生效的规则
sudo firewall-cmd --list-all
# 2. 查看所有永久生效的规则
sudo firewall-cmd --list-all --permanent
# 3. 查看当前放行的端口
sudo firewall-cmd --list-ports
# 4. 查看当前放行的服务
sudo firewall-cmd --list-services
# 5. 查看所有富规则
sudo firewall-cmd --list-rich-rules
# 6. 切换默认区域(新手不用改)
sudo firewall-cmd --set-default-zone=public --permanent
新手避坑提示
⚠️ 致命提醒:新服务器启动firewalld前,必须先放行22端口,否则会断开SSH连接!
✅ 技巧:先配置临时规则测试,确认没问题后再配置永久规则,避免配置错误导致断连;
✅ 技巧:所有永久规则配置完成后,必须执行sudo firewall-cmd --reload才能生效,新手最容易忘这一步;
✅ 技巧:配置完规则,用--list-all确认规则已添加,避免配置不生效。
四、iptables 基础入门(底层工具,新手了解即可)
iptables是Linux内核原生的底层防火墙工具,功能最强大,但配置逻辑复杂、上手难度高,新手很容易配错。现在有了ufw和firewalld的封装,日常场景完全不需要直接操作iptables,这里只讲最基础的查看、放行、保存命令,新手了解即可。
4.1 基础常用命令
# 1. 查看当前所有iptables规则(最常用,先看规则)
sudo iptables -L -n -v
# -n 不解析域名,加快显示速度;-v 显示详细信息
# 2. 放行TCP 22端口(SSH)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 3. 放行TCP 80端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 4. 禁止指定IP访问
sudo iptables -A INPUT -s 10.0.0.100 -j DROP
# 5. 删除指定规则
# 先查看规则序号
sudo iptables -L -n --line-numbers
# 按序号删除规则(比如删除序号1的规则)
sudo iptables -D INPUT 1
# 6. 清空所有规则(测试用,谨慎执行)
sudo iptables -F
4.2 规则永久保存
iptables的规则默认是临时的,重启服务器后会丢失,需要手动保存:
# Ubuntu/Debian 保存iptables规则
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload
# CentOS/Anolis 保存iptables规则
sudo yum install iptables-services -y
sudo service iptables save
sudo systemctl enable iptables
新手建议:除非是极简系统没有ufw/firewalld,否则不要直接使用iptables,上层工具能更简单、更安全地实现同样的效果。
五、三大工具对比表(新手一眼看懂怎么选)
六、新手高频场景实战(直接复制就能用)
整理了新手最常用的5个场景,分别给出ufw和firewalld的配置命令,直接复制就能用,不用自己改。
场景1:Web服务器配置(放行80/443端口)
# ========== ufw 配置 ==========
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 或用服务名
sudo ufw allow http
sudo ufw allow https
# ========== firewalld 配置 ==========
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
场景2:SSH安全加固(只允许指定IP访问22端口)
# ========== ufw 配置 ==========
# 先删除默认的22端口放行规则(如果有)
sudo ufw delete allow 22/tcp
# 只允许公司IP访问22端口
sudo ufw allow from 你的公网IP to any port 22
# ========== firewalld 配置 ==========
# 先删除默认的ssh服务放行规则
sudo firewall-cmd --permanent --remove-service=ssh
# 添加IP白名单规则
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的公网IP" port port="22" protocol="tcp" accept'
sudo firewall-cmd --reload
场景3:数据库端口放行(MySQL 3306)
# ========== ufw 配置 ==========
# 只允许内网IP段访问3306端口,禁止公网直接访问
sudo ufw allow from 192.168.1.0/24 to any port 3306/tcp
# ========== firewalld 配置 ==========
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload
场景4:禁止/放行ping请求
# ========== ufw 禁止ping ==========
sudo ufw deny icmp
# ========== ufw 放行ping ==========
sudo ufw allow icmp
# ========== firewalld 禁止ping ==========
sudo firewall-cmd --permanent --add-icmp-block=echo-request
sudo firewall-cmd --reload
# ========== firewalld 放行ping ==========
sudo firewall-cmd --permanent --remove-icmp-block=echo-request
sudo firewall-cmd --reload
场景5:FTP服务端口放行(20/21端口+被动端口)
# ========== ufw 配置 ==========
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 20000:20100/tcp
# ========== firewalld 配置 ==========
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=20000-20100/tcp
sudo firewall-cmd --reload
七、常见问题与避坑指南(重中之重)
1. 配置了端口放行,外部还是访问不了服务
这是新手最常见的问题,按以下步骤逐一排查,99%的问题都能解决:
- 先确认服务是否正常运行、端口是否正常监听:执行
sudo ss -tulnp | grep 端口号,确认服务在监听0.0.0.0(所有IP),而非127.0.0.1(仅本机); - 确认防火墙规则是否正确生效:ufw用
sudo ufw status,firewalld用sudo firewall-cmd --list-all,确认端口/服务已放行; - 确认云服务器的安全组是否放行端口:阿里云、腾讯云、华为云等云服务器,除了系统防火墙,还有控制台的安全组,必须同时放行端口才能访问;
- 确认服务本身没有访问限制,比如MySQL的bind-address配置、nginx的访问控制。
2. firewalld配置了规则不生效
- 原因1:只加了
--permanent,没有执行sudo firewall-cmd --reload重载规则; - 原因2:配置了临时规则,重启防火墙/服务器后规则丢失,没有加
--permanent配置永久规则; - 解决方法:正式配置必须加
--permanent,配置完成后必须执行--reload重载,再用--list-all确认规则已生效。
3. 配置防火墙后,SSH远程连接断开,连不上服务器
- 原因:启用防火墙前,没有放行SSH 22端口,防火墙直接拦截了远程连接;
- 云服务器:通过控制台的VNC/紧急终端登录服务器,放行22端口;
- 预防方法:永远先放行22端口,再启用防火墙,这是新手的生命线!
4. 重启服务器后,防火墙规则全部丢失
- ufw原因:执行了
ufw reset重置了规则,或用了临时规则(ufw默认都是永久规则,极少出现); - firewalld原因:配置规则时没有加
--permanent,只配置了临时规则,重启后丢失; - iptables原因:没有安装持久化工具,没有保存规则;
- 解决方法:正式配置必须用永久规则,配置完成后确认规则已永久保存。
5. 想关闭防火墙,又怕不安全
- 新手误区:服务访问不了,就直接关闭防火墙,这是非常危险的操作,相当于家门不上锁;
- 正确做法:排查端口放行规则,确认服务端口已正确放行,而不是直接关闭防火墙;
- 仅在测试环境、内网环境可以临时关闭防火墙调试,生产环境必须开启防火墙,只放行必要的端口。
八、常用命令速查表(建议收藏,日常直接查)
ufw 常用命令速查表
# 基础操作
sudo ufw status # 查看防火墙状态
sudo ufw enable# 启用防火墙
sudo ufw disable# 关闭防火墙
sudo ufw reload # 重启防火墙
sudo ufw reset # 重置防火墙
# 端口/服务管理
sudo ufw allow 80/tcp # 放行端口
sudo ufw allow http # 放行服务
sudo ufw deny 3306/tcp # 禁止端口
sudo ufw delete 1 # 按序号删除规则
sudo ufw status numbered # 查看带序号的规则
# IP黑白名单
sudo ufw allow from 192.168.1.100 to any port 22 # 允许指定IP访问端口
sudo ufw deny from 10.0.0.100 # 禁止指定IP访问
firewalld 常用命令速查表
# 基础操作
sudo systemctl start firewalld # 启动防火墙
sudo systemctl enable --now firewalld # 开机自启防火墙
sudo systemctl status firewalld # 查看运行状态
sudo firewall-cmd --reload # 重载永久规则
# 端口/服务管理
sudo firewall-cmd --permanent --add-port=80/tcp # 永久放行端口
sudo firewall-cmd --permanent --add-service=http # 永久放行服务
sudo firewall-cmd --permanent --remove-port=80/tcp # 删除端口规则
sudo firewall-cmd --list-all # 查看所有生效规则
sudo firewall-cmd --list-ports # 查看放行的端口
sudo firewall-cmd --list-services # 查看放行的服务
# 富规则(IP黑白名单)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'
sudo firewall-cmd --reload
九、总结
本文从新手视角出发,完整讲解了Linux三大防火墙工具的用法,总结5个核心要点,帮你快速掌握:
- 工具选型:Ubuntu/Debian用ufw,CentOS/Anolis用firewalld,新手不要直接碰iptables,上层工具简单、安全、不易出错;
- 生命线原则:启用防火墙前,永远先放行SSH 22端口,避免断开远程连接,这是新手最致命的坑;
- 核心配置:90%的日常需求都是端口放行、服务放行、IP黑白名单,文中的模板直接复制就能用,不用自己写命令;
- 永久生效:ufw默认永久生效,firewalld必须加
--permanent,配置完执行--reload才能永久生效; - 安全原则:最小权限原则,只放行必要的端口,不要关闭防火墙,数据库端口不要对公网开放,尽量用IP白名单限制访问。
Linux防火墙是服务器安全的第一道防线,不用啃复杂的底层原理,只要掌握本文的核心配置,就能搞定日常所有场景,同时保障服务器的安全。
如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓
记录每一次真实的折腾 (#^.^#)
🚀 想看到更多实用折腾技巧?
👉 先关注
💬 评论区说说你的经历或想看的内容
👍 点赞表示支持
🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎