介绍
DigitalOcean Cloud Firewalls 在网络层面提供强大的防火墙服务,让您的服务器可以自由地完成服务您的应用程序和存储您的数据的工作. 在本教程中,我们将调整两个服务器的Wordpress和MySQL设置,以使用云防火墙,并展示该服务可以提供的一些优势。
前提条件
在开始本教程之前,你需要创建在 如何设置远程数据库以优化网站性能与MySQL在Ubuntu 16.04中描述的基础设施。
目前的防火墙状况
现在,我们的两个服务器都使用ufw
实用程序设置了防火墙。ufw
是一个易于使用的围绕Linux的iptables防火墙引擎的包装程序。
首先,在 Web 服务器上, frontend-01 :
1sudo ufw status verbose
1[secondary_label Output]
2Status: active
3Logging: on (low)
4Default: deny (incoming), allow (outgoing), disabled (routed)
5New profiles: skip
6
7To Action From
8-- ------ ----
922/tcp (OpenSSH) ALLOW IN Anywhere
1080,443/tcp (Nginx Full) ALLOW IN Anywhere
1122/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
1280,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
在输出中,在Default:
之后,我们看到防火墙是,默认情况下,拒绝所有传入连接,并允许所有传出连接,此外,我们还有四个规则,允许传入IPv4和IPv6TCP连接(ALLOW IN
)到端口22(SSH)、80(HTTP)、443(HTTPS)。
让我们在数据库服务器上做同样的事情, database-01 :
1[environment second]
2sudo ufw status verbose
1[environment second]
2[secondary_label Output]
3Status: active
4Logging: on (low)
5Default: deny (incoming), allow (outgoing), disabled (routed)
6New profiles: skip
7
8To Action From
9-- ------ ----
1022/tcp (OpenSSH) ALLOW IN Anywhere
113306 ALLOW IN Anywhere
1222/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
133306 (v6) ALLOW IN Anywhere (v6)
这个输出类似,但我们已经为端口3306交换了两个Nginx端口,这是标准的MySQL端口。
我们的云防火墙计划
虽然我们可以制作两个云防火墙,一个适合每个特定服务器,并将一个应用于 frontend-01 和另一个应用于 ** database-01** ,但我们将采取更灵活的方法来组织我们的规则。
首先,我们希望为未来的未来做好准备,我们可能需要为这个系统添加第三种类型的服务(也许是缓存服务器)。
<$>[注] 注: 如果您想更深入地探索有关构建云防火墙的最佳实践,请阅读 如何组织数字海洋云防火墙。
如果我们把事情打破了一点,我们会注意到我们的两个服务器实际上有多个功能. 这里的主要功能是服务网页或数据库信息,还有由SSH服务提供的管理功能。
为了处理未来的情况,我们将我们的网络或数据库服务扩展到多个主机,我们将使用DigitalOcean的标记功能来根据角色组织我们的Droplets。
一个额外的奖励 - 以及使用ufw
以动态方式很难做到的事情 - 是云防火墙可以限制基于标签的入口访问,所以,例如,我们的 database 服务器只需要从我们的 ** frontend** 服务器访问。
让我们用简单的语言概括我们需要设置的三个防火墙:
- 管理: 允许从任何主机
- 前端: 允许从任何主机
- ** 数据库:** 允许从任何主机 和 TCP 端 80 和 443 的入口流量:** 只允许从 ** frontend** 标记的服务器 的入口流量到 TCP 端 3306
这不是一个坏主意,但它确实需要一些照顾,以确保你不会破坏自动更新机制和其它关键功能的底层操作系统。
现在我们有我们的新防火墙的计划,让我们开始。
步骤 1 - 标记我们的服务器
首先,我们将根据角色标记我们的Droplets,以准备我们的防火墙规则。 导航到DigitalOcean控制面板。 默认视图是您的Droplets列表。 点击您的Droplet右侧的 More 按钮,然后选择 ** 添加标签** :
将出现一个文本框,您可以输入此 Droplet 的标签。输入 frontend ,然后点击 ** Add Tags** 按钮:
对您的数据库服务器做同样的事情,给它一个 database 标签,标签将出现在您的Droplet列表中:
在创建未来的 Droplets 时,您可以在初始配置过程中应用这些标签,然后 Droplets 将自动继承相应的防火墙规则。
我们将在下一步中制定这些规则。
第2步:创建云防火墙
我们将先设置 frontend 防火墙,然后是 ** database** ,然后是 ** management** . 这项命令不会导致网站访问者的服务中断,但我们将暂时失去创建新的SSH连接的能力。
防火墙服务在DigitalOcean控制面板的网络
部分中可用,然后点击防火墙
选项卡,然后点击创建防火墙
按钮开始。
创建前端防火墙
在创建防火墙
页面上,我们需要填写一个名称
,配置我们的入口规则
,然后选择将防火墙应用于哪个Dropplets。
我们首先创建了 frontend 防火墙,所以将 ** frontend-fw** 放入 ** Name** 字段。
<$>[注] 注: 我们将添加 ** -fw** 到我们的防火墙名称的末尾,以使其不明确。虽然控制面板界面使用图标来区分资源类型,但如果您使用命令行或API并具有多个 ** frontend** 项目,例如。
接下来,我们需要从 Inbound Rules 部分删除默认 SSH 规则,我们将将此规则拆除到 ** management** 防火墙中,以提供灵活性,现在使用页面右侧的 ** Delete** 链接删除 SSH 规则。
然后,点击 新规则 下载并选择 ** HTTP** . 这将自动填写正确的协议(TCP)和端口(80),并默认允许来自所有IPv4和IPv6地址的流量。
如果您已启用 HTTPS,请重复上述过程以创建第二个规则,此时选择 HTTPS 。
最后,在 Apply to Droplets 字段中,开始键入 ** frontend** ,然后在自动建议时选择 ** frontend** 标签。
点击创建防火墙
按钮,新防火墙将创建并应用于任何带有 frontend 标签的 Droplet。
现在我们将创建数据库防火墙。
创建数据库防火墙
在防火墙页面上,单击 ** 再次创建防火墙 ** 过程将大多与我们的 ** frontend ** 防火墙相同。
将数据库-fw 键入到名称
字段中。
在 Inbound Rules 中,删除默认的SSH规则,然后使用下载设置创建一个新规则,选择 ** MySQL** 。将创建一个默认的MySQL规则,允许从所有IPs访问端口3306。从 ** Sources** 领域删除 ** All IPv4** 和 ** All IPv6** 。我们只希望我们的前端服务器能够访问数据库。开始键入 ** frontend** 到 ** Sources** 框,并在自动建议时选择 ** frontend** 标签。
在 ** 应用于 Droplets** 中,将此防火墙应用于 ** 数据库** 标签,然后单击 ** 创建防火墙** 。
請注意,兩個防火牆都顯示,它們每個都適用於一個Droplet。如果您加載您的網站,它仍然應該加載良好。
创建管理防火墙
单击创建防火墙
最后一次,在名字
字段中添加管理-fw
字段。
默认的SSH规则是这个防火墙所需的一切,这将允许任何IP连接到端口22。
例如,如果您的办公室有一个静态的 IP,并且您想限制 SSH 访问仅限于来自办公室的连接,将该 IP 放置在 Sources 中,取代 ** All IPv4** 和 ** All IPv6** 。
在 Apply to Droplets 下,添加 ** frontend** 和 ** database** 标签,然后单击 ** Create Firewall** 。
此时,我们的云防火墙应该是完全功能的,但我们仍然有基于主机的ufw
防火墙活跃。
步骤 3 – 放弃主机防火墙
我们需要在两个主机上禁用ufw
防火墙,首先在 frontend-01 上:
1sudo ufw disable
1[secondary_label Output]
2Firewall stopped and disabled on system startup
然后在 database-01 上:
1[environment second]
2sudo ufw disable
1[environment second]
2[secondary_label Output]
3Firewall stopped and disabled on system startup
这会阻止当前的防火墙,清除所有规则,并防止在启动时重新启用规则。
在此时,我们所有的连接都应该恢复。尝试创建一个新的SSH会话到您的服务器之一。然后加载您的网站,以验证Web服务器仍然连接到数据库并返回网页到浏览器。
能够连接到我们的所有服务并不实际证明防火墙正在运作,但让我们再做一些测试来验证我们的防火墙是否确实存在。
步骤4:测试我们的防火墙
为了测试我们的防火墙,我们将登录到第三方服务器,并使用一个名为nmap
的实用程序来扫描我们的网络和数据库服务器。
登录到另一个 Ubuntu 16.04 服务器,该服务器位于您 frontend-01 和 ** database-01** 服务器的同一区域。
1[environment third]
2sudo apt-get update
3sudo apt-get install nmap
然后,使用nmap
来扫描 Web 服务器的公共 IP:
1[environment third]
2nmap -Pn frontend-01_public_ip
1[environment third]
2[secondary_label Output]
3Starting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:08 UTC
4Nmap scan report for 203.0.113.11
5Host is up (0.0022s latency).
6Not shown: 997 filtered ports
7PORT STATE SERVICE
822/tcp open ssh
980/tcp open http
10443/tcp open https
11
12Nmap done: 1 IP address (1 host up) scanned in 4.54 seconds
如果防火墙不起作用,这些将显示为关闭的端口
。 Filtered 意味着nmap
甚至无法连接以确定端口是否打开或关闭。
请注意,我们看到我们的 SSH、HTTP 和 HTTPS 端口按预期开放。
接下来,我们将扫描数据库服务器. 请确保使用Droplet的私人IP,如果您已经这样设置了,因为这是MySQL数据库会听到的:
1[environment third]
2nmap -Pn database-01_private_ip
1[environment third]
2[secondary_label Output]
3Starting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:21 UTC
4Nmap scan report for 198.51.100.20
5Host is up (0.0024s latency).
6Not shown: 999 filtered ports
7PORT STATE SERVICE
822/tcp open ssh
9
10Nmap done: 1 IP address (1 host up) scanned in 8.17 seconds
我们看到大多数端口都是过滤的,就像以前一样。然而,我们只看到SSH端口是开放的,没有MySQL端口可用。 请记住,我们只限制数据库访问那些标记为 frontend 的服务器。
1[environment third]
2nmap -Pn database-01_private_ip
1[environment third]
2[secondary_label Output]
3Starting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:22 UTC
4Nmap scan report for 198.51.100.20
5Host is up (0.0033s latency).
6Not shown: 998 filtered ports
7PORT STATE SERVICE
822/tcp open ssh
93306/tcp open mysql
10
11Nmap done: 1 IP address (1 host up) scanned in 4.46 seconds
MySQL 端口现在显示为开放. 我们已经验证了我们的两个服务器现在都受到我们的云防火墙规则的保护. 您现在可以通过返回控制面板并删除 Droplet 的 **frontend ** 标签来恢复该测试服务器的原始防火墙设置。
结论
在本教程中,我们将ufw
防火墙设置替换为灵活而强大的基于网络的云防火墙配置。 有关通过doctl
或DigitalOcean API使用云防火墙的更多信息,请参阅以下文章: