Linux 防火墙管理 新手超详细教程
防火墙是 Linux 系统安全的第一道防线,核心作用是管控进出系统的网络流量:允许合法的访问通过,拦截非法、可疑的连接,相当于系统的「网络门卫」。
Linux 主流的防火墙工具有三层:
- 底层核心:
iptables(操作内核 netfilter 模块,所有发行版通用,功能极强但语法复杂) - 上层简化工具
ufw:Ubuntu/Debian 系列默认,专为简化 iptables 设计,语法极其简单,新手首选firewalld:CentOS/RHEL 系列默认,引入「区域」概念,适合多网络环境,支持动态更新
本质关系:ufw 和 firewalld 都是「壳」,底层最终还是调用 iptables(或新一代 nftables)来执行规则,只是把复杂的语法封装成了简单易懂的命令。
下面我们从基础原理到每个工具的实操,逐层讲解,每个命令都配逐成分拆解 + 真实场景举例 + 新手避坑提醒。
一、先搞懂:防火墙核心基础概念
1. 防火墙管什么?三个流量方向
防火墙根据流量的走向,分成三类管控,新手 99% 的场景只需要管「入站流量」。
2. 核心工作逻辑:规则匹配 + 默认策略
防火墙是一条条「规则」的集合,数据包过来时从上到下按顺序匹配:
- 匹配到某条规则:直接执行规则对应的动作,不再往下检查
三种基础动作
| | |
|---|
ACCEPT | | |
DROP | | 拉黑恶意 IP,对方会表现为「连接超时」,不知道端口是否存在,更安全 |
REJECT | | |
安全最佳实践:默认策略设为拒绝,只手动开放需要的端口(白名单模式),比「默认全放,只拉黑」安全得多。
二、底层核心工具:iptables
iptables 是 Linux 内核级防火墙的标准管理工具,所有发行版都支持,嵌入式精简系统也基本自带。它功能极强,但语法繁琐、容易写错,新手先掌握基础入站规则即可。
1. 基础语法结构
iptables [-t 表名] 操作命令 [链名] [匹配条件] -j 执行动作
- 表名:不写默认是
filter 表,新手 99% 的场景都用这个表(专门管控数据包过滤);其他表(nat、mangle 等)新手不用深入。 - 操作命令
- 链名:INPUT / OUTPUT / FORWARD,对应三个流量方向
- 匹配条件
- 动作
2. 常用操作与匹配条件
核心操作命令
常用匹配条件
| | |
|---|
-p 协议 | | -p tcp |
--dport 端口 | | --dport 22 |
-s 源IP | | -s 192.168.1.100 |
-i 网卡名 | | -i eth0 |
3. 新手必学实操举例
⚠️ 远程操作服务器 / 开发板警告:永远先放开 SSH 22 端口,再修改默认策略!不然直接把自己挡在外面,只能通过串口 / 机房恢复。
例 1:查看当前所有规则
iptables-L-n:以数字形式显示 IP 和端口,不解析域名,速度更快
- 输出会按 INPUT、FORWARD、OUTPUT 分成三块,分别对应三个链的规则。
例 2:允许 SSH(22 端口)的 TCP 入站流量
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT-p tcp--dport 22-j ACCEPT
- 效果:外部机器可以通过 22 端口 SSH 连接到本机。
例 3:设置入站默认策略为丢弃(白名单模式)
- 拆解:
-P INPUT DROP 给 INPUT 链设置默认策略为 DROP - 效果:所有没被规则明确允许的入站数据包,全部直接丢弃,安全性最高。
- 🚨 再次提醒:执行这条之前,必须已经放开了 SSH 端口!
例 4:只允许特定 IP 访问 SSH(白名单)
iptables -I INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
- 拆解
-I INPUT-s 192.168.1.100:只有源 IP 是 192.168.1.100 才匹配
- 效果:只有 192.168.1.100 这台机器能 SSH 连过来,其他 IP 都被默认策略挡住,是最安全的远程登录方式。
例 5:拉黑恶意 IP,所有流量都丢弃
iptables -I INPUT -s 192.168.1.200 -j DROP
- 效果:192.168.1.200 这个 IP 发的所有包直接丢掉,完全访问不了本机。
例 6:允许 ping 通本机(ICMP 协议)
iptables -A INPUT -p icmp -j ACCEPT
- 效果:别人执行
ping 你的IP 能收到回应,方便调试网络。
例 7:删除一条规则
方法一:按编号删除(推荐,不容易写错)
# 先查看规则编号iptables -L -n --line-numbers# 删除 INPUT 链第 3 条规则iptables -D INPUT 3
方法二:按规则内容删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
4. 新手重要注意事项
- 规则是临时的:iptables 规则默认存在内存里,重启系统就会全部消失。
- 保存规则到文件:
iptables-save > /etc/iptables.rules - 重启后恢复:
iptables-restore < /etc/iptables.rules - Ubuntu 可以装
iptables-persistent 工具实现开机自动加载。
- 规则顺序很重要:从上到下匹配,匹配到就停。比如前面已经 DROP 了某个 IP,后面再写允许也没用。
- 嵌入式场景:OK62xx 这类精简嵌入式 Linux 一般只带 iptables,没有 ufw/firewalld,直接用 iptables 配置即可。
三、新手首选工具:ufw
ufw 全称 Uncomplicated Firewall,是 Ubuntu/Debian 系列默认的防火墙工具,专门为了简化 iptables 设计,语法极其简单,是新手学习防火墙的最佳选择。
WSL 里的 Ubuntu 也自带 ufw,但注意:WSL2 网络共享 Windows 内核,流量优先经过 Windows 防火墙,ufw 的管控效果有限;实体机 / 虚拟机 / 服务器上的 Ubuntu 完全生效。
1. 基础状态管理
例 1:查看防火墙状态
- 输出
Status: inactive 代表未启用,Status: active 代表已启用
例 2:启用防火墙
- 执行后会提示「可能中断现有 SSH 连接」,输入
y 回车确认即可。
例 3:关闭防火墙
例 4:重置所有规则,恢复默认
2. 默认策略(新手不用改,默认就很安全)
ufw 出厂默认就是最安全的白名单模式:
也就是:你主动访问外面不受限制,外面主动连你默认全被挡住,需要什么端口就手动开放什么端口,完全符合最小权限原则。
3. 核心实操:端口与 IP 规则
语法非常直观:ufw 动作 条件,动作主要有 allow(允许)、deny(拒绝)、limit(限流)。
例 1:开放 SSH 服务(22 端口)
写法一:按服务名(ufw 内置了常用服务和端口的对应关系)
写法二:按端口 + 协议(更精准,推荐)
- 拆解
- 为什么指定 tcp:SSH 只用 TCP 协议,不写的话会同时放开 TCP 和 UDP,没必要。
例 2:开放网页服务 80 和 443 端口
sudo ufw allow 80/tcpsudo ufw allow 443/tcp
- 对应 HTTP 和 HTTPS 服务,搭网站必开。
例 3:开放一段端口范围
比如开放 1000~2000 的所有 TCP 端口:
sudo ufw allow 1000:2000/tcp
例 4:只允许指定 IP 访问 SSH(IP 白名单)
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp
allow from 192.168.1.100to any port 22proto tcp
- 效果:除了 192.168.1.100,其他 IP 都连不上 SSH,生产环境推荐这么配置。
例 5:禁止某个 IP 访问所有端口
sudo ufw deny from 192.168.1.200
例 6:限制 SSH 连接速率(防暴力破解)
- 作用:同一个 IP 30 秒内最多发起 6 次 SSH 连接,超过就拒绝,能有效防止暴力破解密码。
4. 删除规则
方法一:按规则内容删除
sudo ufw delete allow 80/tcp
- 拆解:在原来的允许命令前面加
delete,就能删除对应规则。
方法二:按编号删除(不容易错)
# 先查看带编号的规则列表sudo ufw status numbered# 删除第 2 条规则sudo ufw delete 2
5. 新手完整配置流程示例
场景:新服务器配置防火墙,只开放 SSH 和网页端口,限制 SSH 暴力破解
# 1. 先放开SSH,防止启用后自己断连sudo ufw allow 22/tcp# 2. 开启SSH速率限制,防暴力破解sudo ufw limit 22/tcp# 3. 开放网页端口sudo ufw allow 80/tcpsudo ufw allow 443/tcp# 4. 启用防火墙sudo ufw enable# 5. 查看状态,确认规则都在sudo ufw status
四、区域化管理工具:firewalld
firewalld 是 CentOS、RHEL、Rocky Linux 等红帽系发行版的默认防火墙,和 ufw 同级,都是上层简化工具。它的核心特点是「区域(Zone)」设计:不同网络环境对应不同安全级别的区域,网卡可以归属到不同区域,适合经常切换网络、多网卡的场景。
1. 核心概念:区域(Zone)
系统预设了多个安全等级不同的区域,常用的有:
| | |
|---|
drop | | |
block | | |
public | | 公共网络环境,只开放手动添加的端口 / 服务,默认最常用 |
home | | |
trusted | | |
新手只用默认的 public 区域就足够了。
2. 最容易踩的坑:运行时 vs 永久配置
firewalld 的规则分两种:
- 运行时配置:默认修改的就是这个,立即生效,但重启 firewalld 服务就消失
- 永久配置:加
--permanent 参数,不立即生效,重启服务后永久保留
✅ 标准操作流程:加 --permanent 写规则 → 执行 firewall-cmd --reload 加载生效 → 既立即生效,又永久保存。
3. 基础状态命令
例 1:查看防火墙运行状态
sudo firewall-cmd --state
- 输出
running 代表正在运行,not running 代表未启动。
例 2:查看当前默认区域
sudo firewall-cmd --get-default-zone
例 3:查看当前区域的所有生效规则
sudo firewall-cmd --list-all
- 会输出区域名、绑定的网卡、开放的服务、开放的端口等完整信息。
例 4:启动 / 停止 firewalld 服务
# 启动服务sudo systemctl start firewalld# 设置开机自启sudo systemctl enable firewalld# 停止服务sudo systemctl stop firewalld
4. 常用规则配置举例
以下都以默认 public 区域为例,不指定 --zone 就默认操作当前区域。
例 1:永久开放 HTTP 服务(80 端口)
# 添加永久规则sudo firewall-cmd --permanent --add-service=http# 重新加载,让规则立即生效sudo firewall-cmd --reload
--permanent--add-service=http:添加 http 服务,系统内置了服务对应的端口,不用记端口号
- 可用的内置服务可以用
firewall-cmd --get-services 查看全部。
例 2:永久开放自定义端口(比如 MySQL 3306)
sudo firewall-cmd --permanent --add-port=3306/tcpsudo firewall-cmd --reload
例 3:移除端口 / 服务
# 移除服务sudo firewall-cmd --permanent --remove-service=http# 移除端口sudo firewall-cmd --permanent --remove-port=3306/tcp# 重载生效sudo firewall-cmd --reload
例 4:添加 IP 白名单,允许该 IP 所有访问
sudo firewall-cmd --permanent --add-source=192.168.1.100sudo firewall-cmd --reload
例 5:禁止指定 IP 访问(富规则)
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.200' drop"sudo firewall-cmd --reload
- 效果:丢弃 192.168.1.200 的所有入站数据包。
五、新手选型与避坑指南
1. 我该选哪个工具?
❌ 不要多个工具混着用!选一个就好,同时启用多个会导致规则混乱、异常。
2. 新手最高频踩坑预警
坑 1:远程配置先把自己关外面了
- 错误操作
- 后果:SSH 连接直接断开,再也连不上,只能通过串口 / 机房重装 / 控制台恢复。
- 正确顺序:永远先加 SSH 允许规则 → 确认规则生效 → 再启用防火墙 → 不要关闭当前终端,新开一个终端测试登录正常再退出。
坑 2:firewalld 改完规则不生效
- 原因:没加
--permanent,或者加了但没 reload。
坑 3:分不清 DROP 和 REJECT
DROP:静默丢包,对方表现为连接超时,不知道端口是否存在,更安全隐蔽,生产环境用。REJECT:明确返回拒绝,对方知道端口存在但不让连,调试的时候用。
坑 4:WSL 里防火墙不生效
WSL2 的网络是共享 Windows 的,流量优先经过 Windows 防火墙,WSL 内部的 ufw/iptables 只能管控 WSL 内部的流量,要对外管控端口需要在 Windows 防火墙里设置。
3. 排错小技巧
- 服务连不上,先临时关防火墙测试一下:关了就能通,99% 是防火墙规则的问题。
- 检查规则顺序:iptables/ufw 都是从上到下匹配,前面拒绝了后面再允许也没用。
- 嵌入式设备排查:先用
iptables -L -n 看有没有规则,嵌入式系统默认一般是空规则、全放行。