如何在Ubuntu14.04上使用UFW设置防火墙

来自菜鸟教程
跳转至:导航、​搜索

介绍

UFW 或简单防火墙是 iptables 的接口,旨在简化配置防火墙的过程。 虽然 iptables 是一个可靠且灵活的工具,但初学者可能很难学习如何使用它来正确配置防火墙。 如果您希望开始保护您的网络,并且不确定要使用哪种工具,那么 UFW 可能是您的正确选择。

本教程将向您展示如何在 Ubuntu 14.04 上使用 UFW 设置防火墙。

先决条件

在开始使用本教程之前,您应该在 Ubuntu 服务器上设置一个单独的非 root 超级用户帐户(具有 sudo 权限的用户)。 您可以通过至少完成 Initial Server Setup with Ubuntu 14.04 教程中的步骤 1-3 来了解如何执行此操作。

UFW 默认安装在 Ubuntu 上。 如果由于某种原因被卸载,您可以使用 apt-get 安装它:

sudo apt-get install ufw

将 IPv6 与 UFW 一起使用

如果您的 Ubuntu 服务器启用了 IPv6,请确保将 UFW 配置为支持 IPv6,以便除了 IPv4 之外,它还将管理 IPv6 的防火墙规则。 为此,请使用您喜欢的编辑器打开 UFW 配置。 我们将使用纳米:

sudo nano /etc/default/ufw

然后确保“IPV6”的值等于“是”。 它应该如下所示:

/etc/default/ufw 摘录

...
IPV6=yes
...

保存并退出。 点击 Ctrl-X 退出文件,然后点击 Y 保存您所做的更改,然后点击 ENTER 确认文件名。

启用 UFW 后,它将被配置为同时编写 IPv4 和 IPv6 防火墙规则。

本教程是在考虑 IPv4 的情况下编写的,但只要启用 IPv6,它就可以正常工作。

检查 UFW 状态和规则

您可以随时使用以下命令检查 UFW 的状态:

sudo ufw status verbose

默认情况下,UFW 处于禁用状态,因此您应该会看到如下内容:

Output:Status: inactive

如果 UFW 处于活动状态,输出将显示它处于活动状态,并且会列出所有设置的规则。 例如,如果防火墙设置为允许来自任何地方的 SSH(端口 22)连接,则输出可能如下所示:

Output:Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere

因此,如果您需要检查 UFW 如何配置防火墙,请使用 status 命令。

在启用 UFW 之前,我们需要确保您的防火墙配置为允许您通过 SSH 连接。 让我们从设置默认策略开始。

设置默认策略

如果您刚刚开始使用防火墙,首先要定义的规则是您的默认策略。 这些规则控制如何处理不明确匹配任何其他规则的流量。 默认情况下,UFW 设置为拒绝所有传入连接并允许所有传出连接。 这意味着任何试图访问您的云服务器的人都无法连接,而服务器内的任何应用程序都可以访问外部世界。

让我们将您的 UFW 规则设置回默认值,这样我们就可以确保您能够按照本教程进行操作。 要设置 UFW 使用的默认值,请使用以下命令:

sudo ufw default deny incoming
sudo ufw default allow outgoing

您可能已经猜到了,这些命令将默认设置为拒绝传入并允许传出连接。 这些防火墙默认设置本身可能足以满足个人计算机的需要,但服务器通常需要响应来自外部用户的传入请求。 我们接下来会研究这个。

允许 SSH 连接

如果我们现在启用我们的 UFW 防火墙,它将拒绝所有传入的连接。 这意味着如果我们希望我们的服务器响应这些类型的请求,我们将需要创建明确允许合法传入连接(例如 SSH 或 HTTP 连接)的规则。 如果您使用的是云服务器,您可能希望允许传入的 SSH 连接,以便您可以连接和管理您的服务器。

要将您的服务器配置为允许传入的 SSH 连接,您可以使用以下 UFW 命令:

sudo ufw allow ssh

这将创建防火墙规则,允许端口 22 上的所有连接,这是 SSH 守护程序侦听的端口。 UFW 知道“ssh”和其他一些服务名称的含义,因为它在 /etc/services 文件中被列为使用端口 22 的服务。

我们实际上可以通过指定 port 而不是服务名称来编写等效规则。 例如,此命令与上述命令的工作方式相同:

sudo ufw allow 22

如果您将 SSH 守护程序配置为使用不同的端口,则必须指定适当的端口。 例如,如果您的 SSH 服务器正在侦听端口 2222,则可以使用以下命令允许该端口上的连接:

sudo ufw allow 2222

现在您的防火墙已配置为允许传入的 SSH 连接,我们可以启用它。

启用 UFW

要启用 UFW,请使用以下命令:

sudo ufw enable

您将收到一条警告,指出“命令可能会破坏现有的 ssh 连接”。 我们已经设置了允许 SSH 连接的防火墙规则,因此应该可以继续。 使用 y 响应提示。

防火墙现在处于活动状态。 随意运行 sudo ufw status verbose 命令查看设置的规则。

允许其他连接

现在您应该允许服务器需要响应的所有其他连接。 您应该允许的连接取决于您的特定需求。 幸运的是,您已经知道如何编写允许基于服务名称或端口的连接的规则——我们已经为端口 22 上的 SSH 做到了这一点。

我们将展示一些您可能需要允许的非常常见的服务示例。 如果您有任何其他服务要允许所有传入连接,请遵循此格式。

HTTP—端口 80

使用以下命令可以允许 HTTP 连接,这是未加密的 Web 服务器使用的连接:

sudo ufw allow http

如果您更愿意使用端口号 80,请使用以下命令:

sudo ufw allow 80

HTTPS — 端口 443

可以使用以下命令允许 HTTPS 连接,这是加密 Web 服务器使用的连接:

sudo ufw allow https

如果您更愿意使用端口号 443,请使用以下命令:

sudo ufw allow 443

FTP—端口 21

用于未加密文件传输的 FTP 连接(您可能无论如何都不应该使用),可以使用以下命令来允许:

sudo ufw allow ftp

如果您希望使用端口号 21,请使用以下命令:

sudo ufw allow 21/tcp

允许特定的端口范围

您可以使用 UFW 指定端口范围。 一些应用程序使用多个端口,而不是单个端口。

例如,要允许使用端口 6000-6007 的 X11 连接,请使用以下命令:

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

使用 UFW 指定端口范围时,您必须指定规则应适用的协议(tcpudp)。 我们之前没有提到这一点,因为不指定协议只是允许两种协议,这在大多数情况下是可以的。

允许特定 IP 地址

使用 UFW 时,您还可以指定 IP 地址。 例如,如果要允许来自特定 IP 地址的连接,例如 15.15.15.51 的工作或家庭 IP 地址,则需要指定“from”,然后是 IP 地址:

sudo ufw allow from 15.15.15.51

您还可以通过添加“到任何端口”后跟端口号来指定允许 IP 地址连接的特定端口。 例如,如果要允许 15.15.15.51 连接到端口 22 (SSH),请使用以下命令:

sudo ufw allow from 15.15.15.51 to any port 22

允许子网

如果要允许 IP 地址的子网,可以使用 CIDR 表示法指定网络掩码。 例如,如果要允许从 15.15.15.115.15.15.254 的所有 IP 地址,可以使用以下命令:

sudo ufw allow from 15.15.15.0/24

同样,您也可以指定允许子网 15.15.15.0/24 连接的目标端口。 同样,我们将使用端口 22 (SSH) 作为示例:

sudo ufw allow from 15.15.15.0/24 to any port 22

允许连接到特定的网络接口

如果要创建仅适用于特定网络接口的防火墙规则,可以通过指定“allow in on”后跟网络接口名称来实现。

在继续之前,您可能需要查找网络接口。 为此,请使用以下命令:

ip addr
Output Excerpt:...
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”或“eth1”。

因此,如果您的服务器有一个名为 eth0 的公共网络接口,您可以使用以下命令允许 HTTP 流量(端口 80)到它:

sudo ufw allow in on eth0 to any port 80

这样做将允许您的服务器接收来自公共 Internet 的 HTTP 请求。

或者,如果您希望您的 MySQL 数据库服务器(端口 3306)侦听专用网络接口 eth1 上的连接,例如,您可以使用以下命令:

sudo ufw allow in on eth1 to any port 3306

这将允许您专用网络上的其他服务器连接到您的 MySQL 数据库。

拒绝连接

如果您尚未更改传入连接的默认策略,则 UFW 配置为拒绝所有传入连接。 通常,这通过要求您创建明确允许特定端口和 IP 地址通过的规则来简化创建安全防火墙策略的过程。 但是,有时您会希望根据源 IP 地址或子网拒绝特定连接,这可能是因为您知道您的服务器正在从那里受到攻击。 此外,如果您想将默认传入策略更改为 allow(出于安全考虑,不建议这样做),您需要为任何服务或 IP 地址创建 deny 规则您不想允许连接。

要编写 deny 规则,您可以使用我们上面描述的命令,但需要将“allow”替换为“deny”。

例如,要拒绝 HTTP 连接,您可以使用以下命令:

sudo ufw deny http

或者,如果您想拒绝来自 15.15.15.51 的所有连接,您可以使用以下命令:

sudo ufw deny from 15.15.15.51

如果您在编写任何其他 deny 规则时需要帮助,只需查看之前的 allow 规则并相应地更新它们。

现在让我们看看如何删除规则。

删除规则

知道如何删除防火墙规则与知道如何创建它们一样重要。 有两种不同的方式指定要删除的规则:通过规则编号或通过实际规则(类似于在创建规则时指定规则的方式)。 我们将从 按规则编号 删除方法开始,因为如果您是 UFW 新手,与编写要删除的实际规则相比,它更容易。

按规则编号

如果您使用规则编号来删除防火墙规则,那么您要做的第一件事就是获取防火墙规则列表。 UFW status 命令具有在每个规则旁边显示数字的选项,如下所示:

sudo ufw status numbered
Numbered Output:Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    15.15.15.0/24
[ 2] 80                         ALLOW IN    Anywhere

如果我们决定要删除规则 2,即允许端口 80 (HTTP) 连接的规则,我们可以在 UFW 删除命令中指定它,如下所示:

sudo ufw delete 2

这将显示一个确认提示,然后删除允许 HTTP 连接的规则 2。 请注意,如果您启用了 IPv6,您还需要删除相应的 IPv6 规则。

按实际规则

规则编号的替代方法是指定要删除的实际规则。 例如,如果你想删除“允许 http”规则,你可以这样写:

sudo ufw delete allow http

您还可以通过“允许 80”而不是服务名称来指定规则:

sudo ufw delete allow 80

此方法将删除 IPv4 和 IPv6 规则(如果存在)。

如何禁用 UFW(可选)

如果您决定出于某种原因不想使用 UFW,您可以使用以下命令禁用它:

sudo ufw disable

您使用 UFW 创建的任何规则都将不再有效。 如果您以后需要激活它,您可以随时运行 sudo ufw enable

重置 UFW 规则(可选)

如果您已经配置了 UFW 规则,但您决定要重新开始,您可以使用 reset 命令:

sudo ufw reset

这将禁用 UFW 并删除之前定义的任何规则。 请记住,如果您在任何时候修改默认策略,它们都不会更改为其原始设置。 这应该让您重新开始使用 UFW。

结论

您的防火墙现在应该配置为允许(至少)SSH 连接。 确保允许您的服务器的任何其他传入连接,同时限制任何不必要的连接,以便您的服务器正常运行且安全。

要了解更多常见的 UFW 配置,请查看本教程:UFW Essentials: Common Firewall Rules and Commands

祝你好运!