firewalld/ufw
Linux 下的防火墙管理是系统安全的重要组成部分。虽然底层机制(netfilter
、iptables
或 nftables
)是相似的,但不同的发行版通常会提供不同的前端工具来简化配置。Red Hat 系列(如 RHEL、CentOS、Fedora、AlmaLinux、Rocky Linux)倾向于使用 **firewalld
**,而 Debian 系列(如 Debian、Ubuntu、Linux Mint)则偏爱 **UFW
(Uncomplicated Firewall)**。
1. Red Hat 系列:Firewalld 详解
firewalld
是一个动态的防火墙管理工具,它通过 区域 (zones) 的概念来管理网络连接和接口的信任级别。它作为 iptables
或 nftables
的前端,提供了一个更高级别的接口,使得防火墙配置更直观、更灵活。
核心概念
- **区域 (Zones)**:这是
firewalld
最重要的概念。每个区域都代表一个信任级别,并可以分配给一个或多个网络接口或源 IP 地址。例如:public
:默认区域,适用于公共网络,信任度最低。home
:家庭网络,信任度较高。work
:工作网络,信任度较高。internal
:内部网络,信任度更高。trusted
:所有网络连接都被信任。drop
:所有传入的数据包都被丢弃,没有回复。block
:所有传入的数据包都被拒绝,并发送 ICMP 错误消息。
- **服务 (Services)**:
firewalld
预定义了许多常见服务的端口和协议,例如ssh
(22/tcp)、http
(80/tcp)、https
(443/tcp) 等。这使得开放端口变得非常简单。 - **端口 (Ports)**:除了服务,你也可以直接指定端口号和协议。
- **运行时配置 (Runtime Configuration)**:使用
firewall-cmd
命令添加或修改的规则会立即生效,但系统重启后会丢失。 - **永久配置 (Permanent Configuration)**:使用
--permanent
标志添加的规则会在/etc/firewalld/
目录下保存,系统重启后依然有效。每次修改永久配置后,需要运行sudo firewall-cmd --reload
来使其生效。 - **富规则 (Rich Rules)**:提供更细粒度的控制,可以定义源/目标 IP、源/目标端口、协议、动作(接受/拒绝/丢弃)、日志记录等。
常用 firewall-cmd
命令
- 查看服务状态:
1
sudo systemctl status firewalld
- 启动/停止/禁用/启用
firewalld
:1
2
3
4sudo systemctl start firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld # 禁用开机启动
sudo systemctl enable firewalld # 启用开机启动 - 查看默认区域:
1
firewall-cmd --get-default-zone
- 查看所有区域及其配置:
1
2firewall-cmd --get-zones
firewall-cmd --list-all-zones - 查看当前活动区域的配置:
1
firewall-cmd --list-all
- 将接口添加到区域:
1
2sudo firewall-cmd --zone=home --change-interface=enp0s3 --permanent
sudo firewall-cmd --reload - 开放服务 (SSH):
1
2
3sudo firewall-cmd --zone=public --add-service=ssh # 仅运行时生效
sudo firewall-cmd --zone=public --add-service=ssh --permanent # 永久生效
sudo firewall-cmd --reload # 重新加载永久配置 - 开放端口 (HTTP, TCP 协议):
1
2sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload - 开放端口范围:
1
2sudo firewall-cmd --zone=public --add-port=5000-6000/tcp --permanent
sudo firewall-cmd --reload - 移除服务/端口:
将add
替换为remove
即可。1
2
3sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent
sudo firewall-cmd --reload - 使用富规则 (Rich Rules): 允许来自特定 IP 的 SSH 连接
1
2sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="22" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload - 直接拒绝来自特定 IP 的连接:
1
2sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject' --permanent
sudo firewall-cmd --reload - 更改默认区域:
1
sudo firewall-cmd --set-default-zone=home
2. Debian 系列:UFW (Uncomplicated Firewall) 详解
UFW (Uncomplicated Firewall) 顾名思义,是一个简单易用的防火墙配置工具,作为 iptables
或 nftables
的用户友好型前端。它旨在简化复杂的防火墙规则设置,非常适合个人用户和中小型服务器。
核心概念
- 默认策略 (Default Policies):UFW 允许你设置传入、传出和路由流量的默认行为。通常,默认配置是拒绝所有传入连接,允许所有传出连接。
- **规则 (Rules)**:UFW 的规则语法非常直观,可以直接指定端口、服务名称、IP 地址、协议和方向。
- **应用配置文件 (Application Profiles)**:对于一些常见的应用程序(如 OpenSSH、Nginx),UFW 提供了预定义的应用配置文件,可以更方便地管理这些服务的端口。
- 状态管理:UFW 启用后,规则会立即生效并在系统重启后持久化。
常用 ufw
命令
- 安装 UFW:
1
2sudo apt update
sudo apt install ufw - 查看 UFW 状态:
1
2
3sudo ufw status # 简单状态
sudo ufw status verbose # 详细状态,显示默认策略和所有规则
sudo ufw status numbered # 显示带编号的规则,方便删除 - 启用/禁用 UFW:
警告: 如果通过 SSH 连接,请务必先允许 SSH 端口,否则启用 UFW 后你可能会被锁定!1
2
3sudo ufw enable # 启用防火墙
sudo ufw disable # 禁用防火墙
sudo ufw reload # 重新加载规则(通常在修改配置文件后) - 设置默认策略:
1
2
3
4sudo ufw default deny incoming # 默认拒绝所有传入连接 (推荐)
sudo ufw default allow outgoing # 默认允许所有传出连接 (常见)
# 或者如果你想更严格:
# sudo ufw default deny outgoing # 默认拒绝所有传出连接 - 允许 SSH (端口 22):
1
2sudo ufw allow ssh # 使用服务名
sudo ufw allow 22/tcp # 使用端口号和协议 - 允许 HTTP/HTTPS:
1
2
3
4
5sudo ufw allow http
sudo ufw allow https
# 或者
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp - 允许特定端口(例如自定义服务 8080):
1
2sudo ufw allow 8080/tcp
sudo ufw allow 8080/udp - 允许端口范围:
1
sudo ufw allow 5000:6000/tcp
- 允许/拒绝来自特定 IP 地址的连接:
1
2sudo ufw allow from 192.168.1.10 # 允许来自此IP的所有连接
sudo ufw deny from 1.2.3.4 # 拒绝来自此IP的所有连接 - 允许特定 IP 连接到特定端口:
1
sudo ufw allow from 192.168.1.10 to any port 22 proto tcp # 允许来自 192.168.1.10 的 SSH 连接
- 限制连接 (Limit): 阻止在短时间内多次尝试连接的 IP 地址 (例如防暴力破解)。
1
sudo ufw limit ssh # 限制SSH连接,超过一定尝试次数的IP将被暂时阻止
- 删除规则:
- 按规则内容删除:
1
sudo ufw delete allow 80/tcp
- 按规则编号删除 (先用
ufw status numbered
查看编号):1
2sudo ufw status numbered
sudo ufw delete 3 # 删除编号为3的规则
- 按规则内容删除:
- 重置 UFW (清除所有规则并禁用):警告: 这会清除所有 UFW 规则并禁用 UFW。除非你知道自己在做什么,否则请谨慎使用,以免服务器失去保护。
1
sudo ufw reset
两者底层都依赖 netfilter
(通过 iptables
或 nftables
实现),因此在功能上最终都能达到相同的目标,只是操作方式和哲学不同。选择哪一个取决于你使用的 Linux 发行版以及你对防火墙管理的需求和熟悉程度。在实际应用中,通常建议使用发行版默认提供的防火墙管理工具。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 满杯是幸福 空杯是自由!
评论