起因
因为觉得服务器的内存占用太高,但是不知道要清理哪些进程,于是重启了一下服务器。重启服务器之后Xshell连不上了,于是折腾了一个晚上,搞明白了关于防火墙的一些相关知识。
同时突然想起之前一次使用firewall-cmd开放端口后,服务器也无法远程连接,可能也就是和今天学到的有关吧。
各种防火墙工具
在 Linux 系统中,有多种防火墙工具可供选择,每种工具都有其特点和适用场景。以下是常见防火墙工具的梳理,包括它们的异同、开机自启动方法以及常用命令。
1. iptables
特点
底层工具:直接操作 Linux 内核的 Netfilter 框架。
静态规则:规则是静态的,修改后需要手动保存。
灵活性高:适合需要精细控制规则的高级用户。
开机自启动
iptables本身不是一个服务,但可以通过以下方法实现开机自启动:
Debian/Ubuntu:使用 iptables-persistent 包。
sudo apt-get install iptables-persistent
- CentOS/RHEL:使用
iptables-services包。
sudo yum install iptables-services
sudo systemctl enable iptablessudo systemctl start iptables
常用命令
查看规则:
sudo iptables -L -v -n添加规则:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT保存规则:
sudo iptables-save > /etc/iptables/rules.v4加载规则:
sudo iptables-restore < /etc/iptables/rules.v4
2. firewalld
特点
动态管理:支持运行时更新规则,无需重启服务。
高级抽象:使用 zones 和 services 简化配置。
适合服务器:常用于 CentOS、RHEL、Fedora。
开机自启动
- 启用开机自启动:
sudo systemctl enable firewalld
sudo systemctl start firewalld
常用命令
查看状态:
sudo firewall-cmd --state查看当前区域规则:
sudo firewall-cmd --list-all添加服务:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload添加端口:
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload
3. UFW(Uncomplicated Firewall)
特点
简单易用:适合初学者或需要快速配置的场景。
基于 iptables:底层仍然使用
iptables。(主要基于 iptables,也在逐步支持 nftables)适合桌面:常用于 Ubuntu 和基于 Ubuntu 的发行版。
开机自启动
- 启用开机自启动:
sudo systemctl enable ufw
sudo systemctl start ufw
常用命令
查看状态:
sudo ufw status启用 UFW:
sudo ufw enable允许服务:
sudo ufw allow ssh允许端口:
sudo ufw allow 80/tcp删除规则:
sudo ufw delete allow 80/tcp
4. nftables
特点
iptables 的继任者:更高效、更灵活。
统一框架:支持 IPv4 和 IPv6。
适合高级用户:语法更复杂,但功能更强大。
开机自启动
- 启用开机自启动:
sudo systemctl enable nftables
sudo systemctl start nftables
常用命令
查看规则:
sudo nft list ruleset添加规则:
sudo nft add rule ip filter input tcp dport 22 accept保存规则:
sudo nft list ruleset > /etc/nftables.conf加载规则:
sudo nft -f /etc/nftables.conf
5. 总结对比
| 工具 | 特点 | 开机自启动方法 | 适用场景 |
|---|---|---|---|
| iptables | 静态规则,灵活性高 | 使用 iptables-persistent 或 iptables-services | 高级用户、服务器 |
| firewalld | 动态管理,支持 zones 和 services | systemctl enable firewalld | 服务器、云环境 |
| UFW | 简单易用,基于 iptables | systemctl enable ufw | 桌面、简单服务器 |
| nftables | iptables 的继任者,高效灵活 | systemctl enable nftables | 高级用户、现代 Linux 系统 |
6. 如何选择?
如果你需要精细控制规则,选择 iptables 或 nftables。
如果你是初学者或需要快速配置,选择 UFW。
如果你需要动态管理规则,选择 firewalld。
避免防火墙冲突
防火墙冲突通常发生在同时使用多个防火墙工具(如 iptables、firewalld、UFW 等)时,因为它们可能会修改相同的底层规则表(如 iptables 或 nftables),导致规则覆盖或不一致的行为。以下是避免防火墙冲突的方法:
1. 只使用一个防火墙工具
这是避免冲突的最简单和最有效的方法。选择一个适合你需求的工具,并禁用其他工具。
选择工具的建议
简单易用:选择 UFW(适合桌面用户或初学者)。
动态管理:选择 firewalld(适合服务器或需要频繁更新规则的场景)。
精细控制:选择 iptables 或 nftables(适合高级用户)。
2. 禁用其他防火墙工具
如果你决定使用某个工具,请确保禁用其他工具。
禁用 firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld
禁用 UFW
sudo ufw disable
禁用 iptables(如果使用 firewalld 或 UFW)
如果你使用
firewalld或UFW,通常不需要手动禁用iptables,因为它们会管理iptables规则。如果你直接使用
iptables,请确保没有其他工具干扰。
3. 检查当前使用的工具
检查 firewalld 是否运行
sudo systemctl status firewalld
检查 UFW 是否运行
sudo ufw status
检查 iptables 规则
sudo iptables -L -v -n
4. 避免手动修改底层规则
如果你使用
firewalld或UFW,尽量避免直接使用iptables或nftables修改规则,因为这可能导致冲突。如果你需要直接操作底层规则,请确保了解工具之间的交互方式。
5. 规则持久化
确保规则在重启后仍然有效,避免因规则丢失而导致的安全问题。
firewalld
- 使用
--permanent参数保存规则:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload
UFW
- 启用 UFW 并添加规则:
sudo ufw enable
sudo ufw allow ssh
iptables
- 使用
iptables-save保存规则:
sudo iptables-save > /etc/iptables/rules.v4
6. 示例:从 firewalld 切换到 UFW
如果你决定使用 UFW,可以按照以下步骤切换:
停止并禁用 firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld
启用 UFW
sudo ufw enable
添加规则
sudo ufw allow ssh
sudo ufw allow http
检查状态
sudo ufw status
7. 总结
只使用一个防火墙工具,避免同时启用多个工具。
禁用其他工具,确保规则不会被覆盖。
确保规则持久化,避免重启后丢失。
默认防火墙工具
| 发行版 | 默认工具 | 特点 | 其他支持工具 |
|---|---|---|---|
| Ubuntu | UFW | 简单易用,适合初学者 | iptables, firewalld, nftables |
| Debian | UFW | 简单易用,适合初学者 | iptables, firewalld, nftables |
| CentOS | firewalld | 动态管理,支持 zones 和 services | iptables, nftables |
| RHEL | firewalld | 动态管理,支持 zones 和 services | iptables, nftables |
| Fedora | firewalld | 动态管理,支持 zones 和 services | iptables, nftables |
| Arch Linux | 无默认工具 | 用户自行选择 | iptables, nftables, firewalld |
| openSUSE | SuSEfirewall2 / firewalld | 旧版使用 SuSEfirewall2,新版使用 firewalld | iptables, nftables |
理论上,大多数防火墙工具可以在所有 Linux 发行版上使用,但实际使用中可能会受到以下限制:
发行版的默认工具:不同发行版可能有自己的默认防火墙工具。
软件包管理器的支持:某些工具可能需要从源码编译安装,或者依赖特定的库。
兼容性问题:同时使用多个防火墙工具可能会导致规则冲突。
但是强烈建议就用默认的工具或者使用非默认的工具时一定要禁用其他工具,不要混用不同的防火墙工具,导致规则覆盖或不一致的行为!!!
前后端划分
✅ 后端(内核级防火墙工具):
这些直接与 Linux 内核的网络过滤框架交互,负责执行具体的包过滤和网络规则:
iptables(旧的内核防火墙后端,广泛使用多年)
nftables(iptables 的继任者,设计更现代,已成为新的内核防火墙框架)
✅ 前端(用户空间防火墙管理工具):
这些工具提供更简化或结构化的接口,帮助用户管理底层防火墙规则(调用 iptables 或 nftables 实际应用规则):
firewalld(基于 zone 和服务概念的高级防火墙管理器,可以使用 iptables 或 nftables 作为后端)
UFW(Uncomplicated Firewall)(Ubuntu 上常见的防火墙简化工具,主要基于 iptables,也在逐步支持 nftables)
总结对照表:
| 名称 | 类型 | 说明 |
|---|---|---|
| iptables | 后端 | 旧版 Linux 防火墙核心组件,低层次规则设置 |
| nftables | 后端 | 新一代内核防火墙系统,功能更强,替代 iptables |
| firewalld | 前端 | 支持动态规则和区域,默认使用 nftables(新系统) |
| UFW | 前端 | 面向用户简化命令行操作,默认基于 iptables(Ubuntu) |
防火墙和安全组
- 防火墙:
是一种网络安全系统,用于监控和控制进出网络的流量。
通常部署在单个服务器或网络边界(如路由器、网关)。
基于规则(如 IP 地址、端口、协议)来决定是否允许或拒绝流量。
安全组:
是一种虚拟防火墙,通常用于云计算环境(如 AWS、阿里云、腾讯云)。
作用于虚拟机实例(如云服务器)或网络接口。
基于规则(如 IP 地址、端口、协议)来控制进出实例的流量。
| 特性 | 防火墙 | 安全组 |
|---|---|---|
| 应用场景 | 物理服务器、网络边界 | 云计算环境中的虚拟机实例 |
| 实现方式 | 软件(如 iptables)或硬件 | 云计算平台的虚拟网络层 |
| 规则管理 | 静态,需手动保存 | 动态,修改后立即生效 |
| 部署位置 | 网络边界或单个主机 | 虚拟机实例或网络接口 |
| 性能 | 取决于硬件或软件实现 | 由云计算平台提供 |
| 管理复杂度 | 较高,适合高级用户 | 较低,适合普通用户 |
对于云服务器来说,安全组和防火墙相当于双重保障,在使用时如果发现某一端口开放了但是无法使用,就要查看安全组和防火墙是否都开放了该端口。
相关问题分析
多个防火墙工具导致冲突

**问题原因:**之前的这一次问题可能就是由于我在Ubuntu上安装了firewall-cmd,然后使用firewall-cmd进行了端口配置,导致其他工具(ufw)的配置被覆盖了,22端口(SSH服务)也被关闭了,所以无法进行远程连接。
**解决办法:**关闭和禁用其他防火墙服务,只保留一个防火墙工具,避免发生冲突。
防火墙服务没有开启

**问题原因:**由于防火墙服务(ufw)没有开启,重启之后端口的相关配置没有被加载(22端口未开启),所以无法进行远程连接。
**解决办法:**开启防火墙服务(开机自启动)。