介绍
DigitalOcean Cloud防火墙在网络层面提供强大的防火墙服务,让您的服务器可以自由地为您的应用程序提供服务并存储数据。 在本教程中,我们将调整双服务器Wordpress和MySQL设置以使用云防火墙,并展示该服务可提供的一些优势。 如果您在开始之前想要更多的防火墙服务背景,请阅读我们的DigitalOcean Cloud Firewall简介教程。
先决条件
在开始本教程之前,您需要创建如何设置远程数据库中概述的基础架构,以便在Ubuntu 16.04上使用MySQL优化站点性能 。 这将使您有两个服务器,一个安装了PHP和WordPress的Nginx Web服务器和一个独立的MySQL服务器。 在本教程中,我们将分别称之为这些服务器frontend-01和数据库 -01。
我们当前的防火墙情况
现在,我们的两台服务器都使用ufw
实用程序设置ufw
。 ufw
是围绕Linux iptables防火墙引擎的易于使用的包装。 现在登录两台服务器,我们来检查防火墙的状态:
首先,在web服务器上, frontend-01 :
sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80,443/tcp (Nginx Full) ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
在输出中,在Default:
之后Default:
我们显示防火墙在默认情况下拒绝所有传入连接并允许所有传出连接。 另外我们有四条规则允许输入IPv4和IPv6 TCP连接( ALLOW IN
)到端口22(SSH),80(HTTP)和443(HTTPS)。
我们在数据库服务器上做同样的事情, 数据库-01 :
sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
3306 ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
3306 (v6) ALLOW IN Anywhere (v6)
这个输出是相似的,除了我们交换了端口3306(这是标准的MySQL端口)的两个Nginx端口。 现在我们知道我们当前的设置,让我们来计划我们的更换。
我们的云端防火墙计划
虽然我们可以制作两个云防火墙,一个针对每个特定的服务器,并应用于前端-01而另一个到数据库-01 ,我们将采取更灵活的方式来组织我们的规则。
首先,我们希望为未来做好准备,我们可能需要为此系统(可能是缓存服务器)添加第三种类型的服务。 所以我们将根据角色来拆分我们的防火墙规则,而不是通过物理服务器。 我们可以将多个Cloud Firewall应用于每个Droplet,所以使这些防火墙的细粒度和模块化并不成问题。
注意:如果您想更深入地探索构建云端防火墙的最佳做法,请阅读如何组织DigitalOcean Cloud Firewalls 。
如果我们把事情弄坏了,我们注意到我们的这两台服务器实际上都有多个功能。 提供网页或数据库信息的主要功能,还有由SSH服务提供的管理功能。 我们创建管理防火墙, 前端防火墙和数据库防火墙是很有意义的 。
为了处理未来的情况,我们将Web或数据库服务扩展到多个主机,我们将使用DigitalOcean的标记功能来按角色组织我们的Droplet。 标签是简单的标签,我们可以应用于Droplet来对它们进行分类并同时对整组服务器进行寻址。 Cloud Firewall服务可以将防火墙规则应用于标签中的所有Droplet,从而可以轻松地使用已有的正确的防火墙规则来配置新的Droplet。
另外一个额外的好处 - 以及使用ufw
的动态方式将是ufw
- 云防火墙可以限制基于标签的入站访问。 因此,例如,我们的数据库服务器只需要从我们的前端服务器访问。 当前的ufw
设置使数据库对网络上的任何人都可以打开。 我们将锁定到只有我们的标有前端的Droplet。
我们用简单的语言总结我们需要设置的三个防火墙:
- 管理:允许来自任何主机的入站流量到TCP端口22
- 前端:允许来自任何主机的入站流量到TCP端口80和443
- 数据库:仅允许来自前端标记的服务器的入站流量到TCP端口3306
本教程中我们完全不会限制出站流量。 这不是一个坏主意,但是请确保您不要破坏底层操作系统的自动更新机制和其他关键功能。
现在我们有一个新的防火墙的计划,让我们开始吧。
第1步 - 标记我们的服务器
首先,我们将通过角色标记我们的“Droplet”,以准备我们的防火墙规则。 导航到DigitalOcean控制面板。 默认视图是您的“滴滴”列表。 点击前端01Droplet右侧的更多按钮,然后选择添加标签 :
将弹出一个文本框,您可以在此输入此Droplet的标签。 输入前端 ,然后点击添加标签按钮:
对您的数据库服务器执行相同操作,为其提供数据库标签。 标签将显示在您的Droplet列表中:
创建未来Droplet时,您可以在初始配置过程中应用这些标签。 然后,“Droplet”将自动继承相应的防火墙规则。
我们将在下一步中设置这些规则。
第2步 - 创建云防火墙
我们现在要建立我们的Cloud Firewall。 我们先做前端防火墙,然后再进行数据库 管理 。 这个订单不会导致您的网站访问者的服务中断,但我们将暂时失去创建新的SSH连接的功能。 这不会影响已建立的连接。
防火墙服务可在DigitalOcean控制面板的“ 网络”部分下载。 一旦在那里,单击防火墙选项卡,然后单击创建防火墙按钮开始。
创建前端防火墙
在“ 创建防火墙”页面上,我们需要填写一个名称 ,配置我们的“ 入站规则” ,并选择应用防火墙的哪个窗口。 我们将离开“ 出站规则”部分。
我们先创建前端防火墙,因此在“ 名称”字段中放置前端防火墙。
注意:我们将添加到我们的防火墙名称的末尾以消除它们的歧义。 虽然控制面板界面使用图标来区分资源类型,但如果您使用的是命令行或API,并且具有多个前端项目,则可能会令人困惑。
接下来,我们需要从“ 入站规则”部分删除默认的SSH规则。 我们将把这个规则放在管理防火墙中,实现灵活性。 使用页面右侧的删除链接即可删除SSH规则。
然后,单击新建规则下拉列表并选择HTTP 。 这将自动填充正确的协议(TCP)和端口(80),默认情况下允许来自所有IPv4和IPv6地址的流量。 这就是我们想要的
如果您启用了HTTPS,请重复上述过程以创建第二个规则,此时选择HTTPS 。 您的入站规则部分最终将如下所示:
最后,在“ 应用于Droplet”字段中,开始键入前端,然后在自动建议时选择前端标签。
单击创建防火墙按钮。 新的防火墙将被创建并应用到具有前端标签的任何Droplet。 您将返回到显示新防火墙的更新的防火墙摘要页面:
现在我们将创建数据库防火墙。
创建数据库防火墙
在“防火墙”页面上,再次单击“ 创建防火墙 ”。 这个过程大体上与前端防火墙相同。
在“ 名称”字段中键入database-fw 。
在入站规则中 ,删除默认的SSH规则。 然后,使用下拉列表创建一个新的规则,选择MySQL 。 将创建一个默认的MySQL规则,允许从所有IP访问端口3306。 从源字段中删除所有IPv4和所有IPv6 。 我们只希望我们的前端服务器能够访问数据库。 开始在“ 源 ”框中键入前端 ,并在自动建议时选择前端标签。 现在任何使用该标签的Droplet都将被允许访问数据库服务器。 所有其他IP被阻止。
离开出站规则原样。 在“应用于Droplet”下 ,将此防火墙应用于数据库标签,然后单击“ 创建防火墙” 。 再次,您将返回到防火墙摘要页面:
请注意,两个防火墙都显示它们应用于每个Droplet。 如果你加载你的网站,它应该仍然正确加载。 现在让我们通过SSH重新启用管理。
创建管理防火墙
最后一次点击创建防火墙 。 将管理员添加到名称字段。
默认的SSH规则就是这个防火墙所需要的。 这将允许任何IP连接到端口22。
或者,您可以将SSH规则的Sources字段更改为要连接的特定IP。 例如,如果您的办公室具有静态IP,并且要限制仅对来自办公室的连接的SSH访问,则将该IP置于“ 源”中 ,替换“ 所有IPv4”和“ 全部IPv6” 。 如果您的IP日后发生变化,则只需更新此规则即可恢复管理访问权限,另外还有一个优先规划,并将规则模块化。
在应用于Droplet下 ,添加前端和数据库标签,然后单击创建防火墙 。 我们来看看我们最终的防火墙总结:
在这一点上,我们的云防火墙应该是完全正常的,但是我们还是使用基于主机的ufw
防火墙。 我们禁用这些,然后测试我们的连接。
第3步 - 删除主机防火墙
我们需要在两台主机上禁用ufw
防火墙。 首先,在前端01 :
sudo ufw disable
OutputFirewall stopped and disabled on system startup
然后在数据库01上 :
sudo ufw disable
OutputFirewall stopped and disabled on system startup
这将停止当前防火墙,刷新所有规则,并防止在启动时重新启用规则。
在这一点上,我们所有的连接都应该恢复。 尝试创建一个新的SSH会话到其中一个服务器。 然后加载您的网站以验证Web服务器是否仍然连接到数据库并将网页返回到浏览器。
能够连接到我们所有的服务并不能证明防火墙正在运行。 我们再做一些更多的测试来验证我们的防火墙是否实际到位。
第4步 - 测试我们的防火墙
要测试我们的防火墙,我们将要登录到第三台服务器,并使用名为nmap
的实用程序来扫描我们的Web和数据库服务器。 nmap
是一个端口扫描器,将扫描我们的主机,并告诉我们哪些端口是打开,关闭或过滤的。
登录到与前端-01和数据库-01服务器位于同一区域的另一台Ubuntu 16.04服务器。 然后安装nmap
:
sudo apt-get update
sudo apt-get install nmap
然后,使用nmap
扫描Web服务器的公共IP:
nmap -Pn frontend-01_public_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:08 UTC
Nmap scan report for 203.0.113.11
Host is up (0.0022s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 4.54 seconds
注意关于filtered ports
的输出。 如果防火墙不起作用,这些将显示为closed ports
。 已过滤意味着nmap
甚至无法连接以确定端口是打开还是关闭。
还要注意,我们看到我们的SSH,HTTP和HTTPS端口是按预期打开的。
接下来,我们将扫描数据库服务器。 如果您已经设置好了,那么请务必使用Droplet的私有IP,就像MySQL数据库将要监听的那样:
nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:21 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0024s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 8.17 seconds
我们看到,像以前一样,大多数端口都被过滤。 但是,我们只看到SSH端口是开放的,没有MySQL端口可用。 回想一下,我们只限制数据库访问,只有那些标有前端的服务器。 切换到DigitalOcean控制面板,并将前端标签添加到您正在使用nmap
的服务器。 然后重新运行命令:
nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:22 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0033s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE
22/tcp open ssh
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 4.46 seconds
MySQL端口现在显示为open。 我们已经验证了我们的两台服务器现在都受到我们的Cloud Firewall规则的保护。 您现在可以通过返回到控制面板并删除Droplet的前端标签来恢复此测试服务器的原始防火墙设置。
结论
在本教程中,我们已经使用灵活而强大的基于网络的云防火墙配置来替代ufw
防火墙设置。 有关通过doctl
或DigitalOcean API使用Cloud Firewall的更多信息,请参阅以下文章: