介绍
UFW(Uncomplicated Firewall)是一个简化的防火墙管理界面,它隐藏了诸如 iptables
和 nftables
等底层数据包过滤技术的复杂性。如果您想开始保护您的网络,但不确定要使用哪个工具,UFW可能是您的正确选择。
本教程将向您展示如何在Debian 11上使用UFW设置防火墙。
先决条件
要按照本教程进行操作,您将需要一个安装有Debian 11的服务器,具有一个使用 sudo
的非 root 用户。您可以通过按照 第1至3步 在 Debian 11初始服务器设置教程 中的说明进行设置。
第1步 – 安装UFW
Debian 默认不会安装 UFW。如果您按照整个初始服务器设置教程,您将已经安装并启用了 UFW。如果没有,请使用 `apt` 现在安装它:
- sudo apt install ufw
您将在以下步骤中设置 UFW 并启用它。
步骤 2 — 使用 IPv6 和 UFW(可选)
本教程是以 IPv4 为主要考虑对象编写的,但如果您启用了 IPv6,它也可以用于 IPv6。如果您的 Debian 服务器已启用 IPv6,您将希望确保 UFW 配置为支持 IPv6。这将确保 UFW 除了 IPv4 外还管理 IPv6 的防火墙规则。为此,使用 `nano` 或您喜欢的编辑器打开 UFW 配置文件 `/etc/default/ufw`:
- sudo nano /etc/default/ufw
在文件中定位 `IPV6` 并确保其值为 `yes`:
IPV6=yes
保存并关闭文件。如果您使用 `nano`,请按 `CTRL+X`,然后按 `Y`,然后按 `ENTER` 保存并退出文件。
现在,当 UFW 被启用时,它将被配置为编写 IPv4 和 IPv6 防火墙规则。然而,在启用 UFW 之前,您将希望确保您的防火墙已配置允许您通过 SSH 连接。从设置默认策略开始。
步骤 3 — 设置默认策略
如果您刚刚开始使用防火墙,首先要定义的规则是默认策略。这些规则处理那些不明确匹配其他规则的流量。默认情况下,UFW 被设置为拒绝所有传入连接并允许所有传出连接。这意味着任何试图访问您的服务器的人都无法连接,而服务器内的任何应用程序都可以连接到外部世界。
将UFW规则设置回默认值,以确保您能够按照本教程进行操作。要设置UFW使用的默认值,请使用以下命令:
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
您将收到类似以下的输出:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
这些命令将默认设置为拒绝传入连接并允许传出连接。这些防火墙默认设置可能足够用于个人电脑,但服务器通常需要响应来自外部用户的传入请求。您将在下一步中开始这个过程。
步骤 4 — 允许SSH连接
你现在还不能启用你的UFW防火墙,因为它会拒绝所有传入连接,包括你尝试访问服务器的连接。这意味着你需要创建规则,明确允许合法的传入连接 —— 比如SSH或HTTP连接 —— 如果你希望服务器响应这些类型的请求。如果你正在使用云服务器,你可能希望允许传入的SSH连接,这样你就可以连接到并管理你的服务器。
要配置你的服务器以允许传入的SSH连接,使用以下命令:
- sudo ufw allow ssh
这将创建防火墙规则,允许在默认情况下SSH守护程序监听的端口22
上的所有连接。UFW知道与allow ssh
相关联的端口是哪一个,因为它在/etc/services
文件中列为一个服务。
然而,你实际上可以通过指定端口而不是服务名来编写等效规则。例如,这个命令产生了与上面那个相同的结果:
- sudo ufw allow 22
如果你配置了SSH守护程序使用不同的端口,你将需要指定适当的端口。例如,如果你的SSH服务器正在监听端口2222
,你可以使用相同的命令,但将22
替换为2222
。
现在你的防火墙已经配置为允许传入的SSH连接,你可以启用它了。
第5步 —— 启用UFW
要启用UFW,使用以下命令:
- sudo ufw enable
您将收到一个警告,提示该命令可能会中断现有的SSH连接。您已经设置了允许SSH连接的防火墙规则,所以继续执行应该是安全的。请用y
回复该提示,并按ENTER
键。
防火墙现在已激活。要查看您设置的规则,请运行以下命令:
- sudo ufw status verbose
本教程的其余部分将详细介绍如何使用UFW,包括允许和拒绝不同类型的连接。
第6步 — 允许其他连接
此时,您应该允许服务器需要正常运行的所有其他连接。您应该允许的连接取决于您的具体需求。您已经知道如何编写根据服务名称或端口允许连接的规则;您已经为端口22
上的SSH执行了此操作。
您可以为端口80
上的HTTP执行此操作,这是非加密的网络服务器使用的端口。要允许此类流量,您可以键入:
- sudo ufw allow http
您还可以为端口443
上的HTTPS执行此操作,这是加密的网络服务器使用的端口。要允许此类流量,您可以键入:
- sudo ufw allow https
在这两种情况下,指定端口也会起作用,HTTP为80
,HTTPS为443
。例如:
- sudo ufw allow 80
除了指定端口或已知服务外,还有其他允许连接的方法。接下来会讨论这一点。
特定端口范围
您可以使用 UFW 指定端口范围。例如,一些应用程序使用多个端口而不是单个端口。
例如,要允许使用端口 6000
到 6007
的 X11
连接,请使用以下命令:
- sudo ufw allow 6000:6007/tcp
- sudo ufw allow 6000:6007/udp
在使用 UFW 指定端口范围时,必须指定规则应用的协议(tcp
或 udp
)。之前未提到这一点,因为不指定协议会自动允许两种协议,这在大多数情况下是可以的。
特定IP地址
在使用 UFW 时,您还可以指定 IP 地址。例如,如果要允许来自特定 IP 地址(例如工作或家庭 IP 地址 203.0.113.4
)的连接,您需要指定 from
,然后是 IP 地址:
- sudo ufw allow from 203.0.113.4
您还可以通过添加 to any port
后跟端口号来指定 IP 地址被允许连接的特定端口。例如,如果要允许 203.0.113.4
连接到端口 22
(SSH),请使用此命令:
- sudo ufw allow from 203.0.113.4 to any port 22
子网
如果您想允许一组 IP 地址的子网,则可以使用 CIDR 记法来指定网络掩码。例如,如果您想允许从 203.0.113.1
到 203.0.113.254
的所有 IP 地址,您可以使用以下命令:
- sudo ufw allow from 203.0.113.0/24
同样,您还可以指定子网 203.0.113.0/24
可连接到的目标端口。再次以端口 22
(SSH)为例:
- sudo ufw allow from 203.0.113.0/24 to any port 22
连接到特定网络接口
如果您想创建一个仅适用于特定网络接口的防火墙规则,则可以通过指定 allow in on
,后跟网络接口的名称来实现。
在继续之前,查找您的网络接口将会很有帮助。要执行此操作,请使用以下命令:
- ip addr
Output. . .
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .
突出显示的输出指示了网络接口名称。它们通常具有类似于 eth0
或 enp3s2
的名称。
例如,如果您的服务器有一个名为 eth0
的公共网络接口,您可以使用以下命令允许 HTTP 流量通过:
- sudo ufw allow in on eth0 to any port 80
这样做将允许您的服务器从公共互联网接收 HTTP 请求。
或者,如果您想让 MySQL 数据库服务器(端口3306
)在私有网络接口eth1
上监听连接,您可以使用以下命令:
- sudo ufw allow in on eth1 to any port 3306
这将允许私有网络上的其他服务器连接到您的 MySQL 数据库。
第7步 — 拒绝连接
如果您尚未更改传入连接的默认策略,UFW 已配置为拒绝所有传入连接。通常,通过要求您明确允许特定端口和 IP 地址通过的规则,这简化了创建安全防火墙策略的过程。
有时候,您会想要根据源 IP 地址或子网拒绝特定的连接,可能是因为您知道您的服务器正在遭受攻击。此外,如果您想要更改默认的传入策略为allow
(这是不推荐的),您需要为任何不希望允许连接的服务或 IP 地址创建deny
规则。
要编写deny
规则,您可以使用上面描述的命令,将allow
替换为deny
。
例如,要拒绝 HTTP 连接,您可以使用以下命令:
- sudo ufw deny http
或者如果您想要拒绝来自203.0.113.4
的所有连接,您可以使用以下命令:
- sudo ufw deny from 203.0.113.4
现在,您可以学习如何实施删除规则。
步骤 8 — 删除规则
了解如何删除防火墙规则与了解如何创建它们一样重要。有两种方法可以指定要删除的规则:按规则编号或按规则本身。这与创建规则时指定规则的方式类似。
按规则编号
如果您要使用规则编号删除防火墙规则,首先要做的是获取防火墙规则的列表。UFW status
命令具有 numbered
选项,该选项会在每个规则旁边显示编号:
- sudo ufw status numbered
OutputStatus: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
如果您决定要删除允许在端口 80
上进行 HTTP 连接的规则 2
,可以在以下 UFW delete
命令中指定:
- sudo ufw delete 2
这将显示一个确认提示,您可以用 y/n
回答。输入 y
将删除规则 2
。请注意,如果启用了 IPv6,您还需要删除相应的 IPv6 规则。
按实际规则
替代规则编号的方法是指定要删除的实际规则。例如,如果要删除allow http
规则,可以这样写:
- sudo ufw delete allow http
您还可以使用allow 80
指定规则而不是服务名称:
- sudo ufw delete allow 80
如果存在,此方法将删除IPv4和IPv6规则。
第9步-检查UFW状态和规则
您可以随时使用此命令检查UFW的状态:
- sudo ufw status verbose
如果UFW被禁用,这是默认设置,输出将是这样:
OutputStatus: inactive
如果UFW是活动的,如果您按照第3步操作,输出将显示它是活动的,并将列出您设置的任何规则。例如,如果防火墙设置为允许来自任何地方的SSH(端口22
)连接,输出可能会包含类似于这样的内容:
OutputStatus: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
如果要查看UFW如何配置防火墙,请使用status
命令。
第10步-禁用或重置UFW(可选)
如果您决定不使用UFW,可以使用此命令禁用它:
- sudo ufw disable
任何您使用UFW创建的规则都将不再生效。如果您需要稍后激活它,可以随时运行sudo ufw enable
。
如果您已经配置了UFW规则,但决定重新开始,可以使用重置命令:
- sudo ufw reset
这将禁用UFW并删除您以前定义的任何规则。请注意,如果您在任何时候修改了默认策略,则默认策略不会恢复到其原始设置。这应该让您以UFW的全新状态开始。
结论
您的防火墙现在已配置为允许(至少)SSH连接。确保允许服务器需要的任何其他传入连接,同时限制不必要的连接。这将确保您的服务器既功能正常又安全。
要了解更多常见的UFW配置,请查阅这篇关于UFW基础知识:常见防火墙规则和命令的教程。