Linux 防火墙管理 新手超详细教程
目录
Linux 防火墙管理 新手超详细教程
一、先搞懂:防火墙核心基础概念
1. 防火墙管什么?三个流量方向
2. 核心工作逻辑:规则匹配 + 默认策略
三种基础动作
二、底层核心工具:iptables
1. 基础语法结构
2. 常用操作与匹配条件
核心操作命令
常用匹配条件
3. 新手必学实操举例
例 1:查看当前所有规则
例 2:允许 SSH(22 端口)的 TCP 入站流量
例 3:设置入站默认策略为丢弃(白名单模式)
例 4:只允许特定 IP 访问 SSH(白名单)
例 5:拉黑恶意 IP,所有流量都丢弃
例 6:允许 ping 通本机(ICMP 协议)
例 7:删除一条规则
4. 新手重要注意事项
三、新手首选工具:ufw
1. 基础状态管理
例 1:查看防火墙状态
例 2:启用防火墙
例 3:关闭防火墙
例 4:重置所有规则,恢复默认
2. 默认策略(新手不用改,默认就很安全)
3. 核心实操:端口与 IP 规则
例 1:开放 SSH 服务(22 端口)
例 2:开放网页服务 80 和 443 端口
例 3:开放一段端口范围
例 4:只允许指定 IP 访问 SSH(IP 白名单)
例 5:禁止某个 IP 访问所有端口
例 6:限制 SSH 连接速率(防暴力破解)
4. 删除规则
5. 新手完整配置流程示例
四、区域化管理工具:firewalld
1. 核心概念:区域(Zone)
2. 最容易踩的坑:运行时 vs 永久配置
3. 基础状态命令
例 1:查看防火墙运行状态
例 2:查看当前默认区域
例 3:查看当前区域的所有生效规则
例 4:启动 / 停止 firewalld 服务
4. 常用规则配置举例
例 1:永久开放 HTTP 服务(80 端口)
例 2:永久开放自定义端口(比如 MySQL 3306)
例 3:移除端口 / 服务
例 4:添加 IP 白名单,允许该 IP 所有访问
例 5:禁止指定 IP 访问(富规则)
五、新手选型与避坑指南
1. 我该选哪个工具?
2. 新手最高频踩坑预警
坑 1:远程配置先把自己关外面了
坑 2:firewalld 改完规则不生效
坑 3:分不清 DROP 和 REJECT
坑 4:WSL 里防火墙不生效
3. 排错小技巧
防火墙是 Linux 系统安全的第一道防线,核心作用是管控进出系统的网络流量:允许合法的访问通过,拦截非法、可疑的连接,相当于系统的「网络门卫」。
Linux 主流的防火墙工具有三层:
- 底层核心:
iptables(操作内核 netfilter 模块,所有发行版通用,功能极强但语法复杂) - 上层简化工具:
ufw:Ubuntu/Debian 系列默认,专为简化 iptables 设计,语法极其简单,新手首选firewalld:CentOS/RHEL 系列默认,引入「区域」概念,适合多网络环境,支持动态更新
本质关系:ufw 和 firewalld 都是「壳」,底层最终还是调用 iptables(或新一代 nftables)来执行规则,只是把复杂的语法封装成了简单易懂的命令。
下面我们从基础原理到每个工具的实操,逐层讲解,每个命令都配逐成分拆解 + 真实场景举例 + 新手避坑提醒。
一、先搞懂:防火墙核心基础概念
1. 防火墙管什么?三个流量方向
防火墙根据流量的走向,分成三类管控,新手 99% 的场景只需要管「入站流量」。
| 流量方向 | 对应链名 | 含义 | 日常场景 |
|---|---|---|---|
| 入站流量 | INPUT | 外部机器主动发往本机的数据包 | 别人 SSH 连你、别人访问你搭的网站 |
| 出站流量 | OUTPUT | 本机主动发往外部的数据包 | 你访问百度、你下载软件、你连别人的服务器 |
| 转发流量 | FORWARD | 经过本机转发给其他机器的数据包 | 本机当路由器、网关时,中转其他设备的流量 |
2. 核心工作逻辑:规则匹配 + 默认策略
防火墙是一条条「规则」的集合,数据包过来时从上到下按顺序匹配:
- 匹配到某条规则:直接执行规则对应的动作,不再往下检查
- 所有规则都不匹配:执行「默认策略」
三种基础动作
| 动作 | 效果 | 适用场景 |
|---|---|---|
ACCEPT | 允许数据包通过 | 开放合法的端口 / IP |
DROP | 直接丢弃数据包,不做任何回应 | 拉黑恶意 IP,对方会表现为「连接超时」,不知道端口是否存在,更安全 |
REJECT | 拒绝数据包,并返回「连接被拒绝」的提示 | 明确告诉对方端口不可用,调试时用 |
安全最佳实践:默认策略设为拒绝,只手动开放需要的端口(白名单模式),比「默认全放,只拉黑」安全得多。
二、底层核心工具:iptables
iptables是 Linux 内核级防火墙的标准管理工具,所有发行版都支持,嵌入式精简系统也基本自带。它功能极强,但语法繁琐、容易写错,新手先掌握基础入站规则即可。
1. 基础语法结构
iptables [-t 表名] 操作命令 [链名] [匹配条件] -j 执行动作- 表名:不写默认是
filter表,新手 99% 的场景都用这个表(专门管控数据包过滤);其他表(nat、mangle 等)新手不用深入。 - 操作命令:增、删、查、改规则
- 链名:INPUT / OUTPUT / FORWARD,对应三个流量方向
- 匹配条件:按 IP、端口、协议等条件过滤数据包
- 动作:ACCEPT / DROP / REJECT
2. 常用操作与匹配条件
核心操作命令
| 命令 | 作用 |
|---|---|
-L | 查看当前链的所有规则 |
-A | 追加一条规则到链的末尾 |
-I | 插入一条规则到链的开头(优先级最高,先匹配) |
-D | 删除指定规则 |
-P | 设置链的默认策略 |
常用匹配条件
| 条件 | 作用 | 示例 |
|---|---|---|
-p 协议 | 匹配网络协议 | -p tcp、-p udp、-p icmp |
--dport 端口 | 匹配目标端口(入站时是本机被访问的端口) | --dport 22 |
-s 源IP | 匹配发送方的 IP 地址 | -s 192.168.1.100 |
-i 网卡名 | 匹配从哪个网卡进来的数据包 | -i eth0 |
3. 新手必学实操举例
⚠️ 远程操作服务器 / 开发板警告:永远先放开 SSH 22 端口,再修改默认策略!不然直接把自己挡在外面,只能通过串口 / 机房恢复。
例 1:查看当前所有规则
iptables -L -n- 逐成分拆解:
iptables:命令名-L:列出所有规则-n:以数字形式显示 IP 和端口,不解析域名,速度更快
- 输出会按 INPUT、FORWARD、OUTPUT 分成三块,分别对应三个链的规则。
例 2:允许 SSH(22 端口)的 TCP 入站流量
iptables -A INPUT -p tcp --dport 22 -j ACCEPT- 逐成分拆解:
-A INPUT:给 INPUT 入站链追加一条规则-p tcp:只匹配 TCP 协议的数据包--dport 22:目标端口是 22(SSH 默认端口)-j ACCEPT:匹配到就执行「允许通过」的动作
- 效果:外部机器可以通过 22 端口 SSH 连接到本机。
例 3:设置入站默认策略为丢弃(白名单模式)
iptables -P INPUT DROP- 拆解:
-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 ACCEPT4. 新手重要注意事项
- 规则是临时的: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:查看防火墙状态
sudo ufw status- 输出
Status: inactive代表未启用,Status: active代表已启用 - 启用状态下会列出当前所有生效的规则
例 2:启用防火墙
sudo ufw enable- ⚠️远程操作必须先放开 SSH 端口再执行!
- 执行后会提示「可能中断现有 SSH 连接」,输入
y回车确认即可。
例 3:关闭防火墙
sudo ufw disable例 4:重置所有规则,恢复默认
sudo ufw reset- 清空所有自定义规则,回到初始状态。
2. 默认策略(新手不用改,默认就很安全)
ufw 出厂默认就是最安全的白名单模式:
- 入站默认:
deny(全部拒绝) - 出站默认:
allow(全部允许)
也就是:你主动访问外面不受限制,外面主动连你默认全被挡住,需要什么端口就手动开放什么端口,完全符合最小权限原则。
3. 核心实操:端口与 IP 规则
语法非常直观:ufw 动作 条件,动作主要有allow(允许)、deny(拒绝)、limit(限流)。
例 1:开放 SSH 服务(22 端口)
写法一:按服务名(ufw 内置了常用服务和端口的对应关系)
sudo ufw allow ssh写法二:按端口 + 协议(更精准,推荐)
sudo ufw allow 22/tcp- 拆解:允许 TCP 协议的 22 端口入站
- 为什么指定 tcp:SSH 只用 TCP 协议,不写的话会同时放开 TCP 和 UDP,没必要。
例 2:开放网页服务 80 和 443 端口
sudo ufw allow 80/tcp sudo 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.100:只有源 IP 是这个地址才允许to any port 22:目标端口是 22proto tcp:TCP 协议
- 效果:除了 192.168.1.100,其他 IP 都连不上 SSH,生产环境推荐这么配置。
例 5:禁止某个 IP 访问所有端口
sudo ufw deny from 192.168.1.200- 效果:这个 IP 的所有入站流量全部拒绝。
例 6:限制 SSH 连接速率(防暴力破解)
sudo ufw limit ssh/tcp- 作用:同一个 IP 30 秒内最多发起 6 次 SSH 连接,超过就拒绝,能有效防止暴力破解密码。
- 只要开了 SSH 远程登录,都建议加上这条规则。
4. 删除规则
方法一:按规则内容删除
sudo ufw delete allow 80/tcp- 拆解:在原来的允许命令前面加
delete,就能删除对应规则。
方法二:按编号删除(不容易错)
# 先查看带编号的规则列表 sudo ufw status numbered # 删除第 2 条规则 sudo ufw delete 25. 新手完整配置流程示例
场景:新服务器配置防火墙,只开放 SSH 和网页端口,限制 SSH 暴力破解
# 1. 先放开SSH,防止启用后自己断连 sudo ufw allow 22/tcp # 2. 开启SSH速率限制,防暴力破解 sudo ufw limit 22/tcp # 3. 开放网页端口 sudo ufw allow 80/tcp sudo 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/internal | 中低 | 家庭 / 内部局域网,信任度高,开放更多服务 |
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- 默认一般是
public。
例 3:查看当前区域的所有生效规则
sudo firewall-cmd --list-all- 会输出区域名、绑定的网卡、开放的服务、开放的端口等完整信息。
例 4:启动 / 停止 firewalld 服务
# 启动服务 sudo systemctl start firewalld # 设置开机自启 sudo systemctl enable firewalld # 停止服务 sudo systemctl stop firewalld4. 常用规则配置举例
以下都以默认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/tcp sudo firewall-cmd --reload- 格式:
--add-port=端口号/协议
例 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.100 sudo 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. 我该选哪个工具?
| 系统 / 场景 | 推荐工具 | 理由 |
|---|---|---|
| Ubuntu / Debian / WSL | ufw | 语法最简单,新手零门槛,系统默认自带 |
| CentOS / RHEL / Rocky | firewalld | 系统默认,区域化管理适合服务器场景 |
| 嵌入式 Linux / 精简系统 | iptables | 体积小,通用性强,上层工具一般没装 |
❌ 不要多个工具混着用!选一个就好,同时启用多个会导致规则混乱、异常。
2. 新手最高频踩坑预警
坑 1:远程配置先把自己关外面了
- 错误操作:直接启用防火墙,没先开放 SSH 端口。
- 后果: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看有没有规则,嵌入式系统默认一般是空规则、全放行。