介绍
DigitalOcean Cloud Firewalls在网络层面提供强大的防火墙服务,保护您的资源免受未经授权的流量。
虽然您可以通过DigitalOcean控制面板配置云防火墙,但当您有许多Dropplets来管理,需要脚本一个流程,或更喜欢从终端工作时,命令行界面可能是更好的选择。
在本教程中,我们将学习如何使用官方的 DigitalOcean Command-Line Client—为Web服务器创建和管理云防火墙。
前提条件
对于这个教程,你将需要:
*「doctl」版本 1.7.0 安装并通过遵循「doctl」 GitHub 存储库中的官方安装指示(https://github.com/digitalocean/doctl#installing-doctl)进行身份验证)。 (使用「doctl 版本」命令来验证您正在运行的「doctl」版本)
- 通过遵循「如何使用 SSH 密钥与 DigitalOcean Droplets」(https://andsky.com/tech/tutorials/how-to-use-ssh-keys-with-digitalocean-droplets)教程,向您的 DigitalOcean 帐户添加 SSH 密钥。
我们将创建一个单击的LAMP(Linux,Apache,MySQL,PHP)堆栈图像运行Ubuntu 16.04,在 nyc1区域,我们将把这个放在一个512MBDropplet上。
步骤 1 - 设置 Web 服务器
我们将在本教程中使用 nyc1,但您可以使用以下命令查看所有地区及其:
1[environment local]
2doctl compute region list
1[environment local]
2[secondary_label Output]
3Slug Name Available
4nyc1 New York 1 true
5sfo1 San Francisco 1 true
6ams2 Amsterdam 2 true
7sgp1 Singapore 1 true
8lon1 London 1 true
9nyc3 New York 3 true
10ams3 Amsterdam 3 true
11fra1 Frankfurt 1 true
12tor1 Toronto 1 true
13sfo2 San Francisco 2 true
14blr1 Bangalore 1 true
由于我们不希望通过网络发送密码,我们希望减少暴力攻击的可能性,我们将使用SSH密钥身份验证来保护我们的Web服务器。
要创建包含 SSH 密钥的 Droplet,‘doctl’需要 SSH 密钥的指纹,您可以通过命令获取:
1[environment local]
2doctl compute ssh-key list
1[environment local]
2[secondary_label Output]
3ID Name FingerPrint
49763174 sammy_rsa your_ssh_key_fingerprint
复制您想要与 Droplet 一起使用的 SSH 密钥的指纹。
现在,让我们把一切都汇集到一个单一的命令中,它将创建一个名为web-1的512MB Droplet在 nyc1区域,使用一个单击的LAMP堆栈图像运行Ubuntu 16.04与我们的SSH密钥。
1[environment local]
2doctl compute droplet create web-1 \
3 --region nyc1 \
4 --image lamp-16-04 \
5 --ssh-keys your_ssh_key_fingerprint \
6 --size 512mb
输出为我们提供了我们刚刚创建的Droplet的概述,包括Droplet的ID、名称、IPv4地址、内存等:
1[environment local]
2[secondary_label Output]
3ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
452059458 web-1 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
<$>[注]
注: 您需要等待几分钟才能完成提供过程. 一旦提供,Droplet 将具有 IPv4 地址和活跃
状态,而不是新
。
使用以下命令来检查您的Droplet的状态,如果完全提供,请记住ID,因为我们将在步骤 2中将防火墙分配给Droplet时需要它。
1[environment local]
2doctl compute droplet list web-1
1[environment local]
2[secondary_label Output]
3ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
452059458 web-1 203.0.113.1 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
接下来,使用doctl
登录到Droplet通过SSH,启用您的LAMP安装,并获得有关如何为生产使用准备服务器的额外说明。如果您收到一个连接被拒绝
错误消息,您的Droplet还没有准备好。
1[environment local]
2doctl compute ssh web-1
1[secondary_label Output]
2...
3-------------------------------------------------------------------------------
4Thank you for using DigitalOcean's LAMP Application.
5
6LAMP has now been enabled. You can access your LAMP instance at:
7Your web root is located at /var/www/html and can be seen from
8 http://203.0.113.1
9...
在为您的需求配置 Droplet 后,退出 SSH 会话。
1[environment]
2exit
最后,将您的 Web 浏览器指向 Droplet 的 IP 地址,以确保 LAMP 堆栈正常工作. 您应该看到默认的 DigitalOcean 单击 LAMP 堆栈登陆页面,该页面包含消息:请通过 SSH 登录您的 Droplet 来配置您的 LAMP 安装
。
由于我们已经完成了本教程所需的LAMP配置,我们已经准备好继续保护Droplet免受未经授权的流量。
步骤 2:为 Web 服务器创建防火墙
首先,我们将使用我们在步骤 1 中从doctl compute droplet list
命令中获得的Droplet ID创建一个名为web-firewall
的云防火墙,该防火墙允许在端口22
上的入口SSH连接以及所有出发的TCP、UDP和ICMP连接。
协议
字段是必需的,必须设置为tcp
,udp
或icmp
,并且您必须为所有协议包含一个端口
值,除了icmp
,它根据其 规格不需要一个。
如果您想允许来自所有 IPv4 地址的流量,请使用 0:0:0:0/0
,如果您想要允许来自所有 IPv6 地址的流量,请使用 ::0/0
。
最后,您创建的每个防火墙都必须至少有一个规则,无论是--inbound-rules
还是--outbound-rules
的旗帜下,所有值都必须输入为key:value
列表。
现在,使用创建
命令创建防火墙:
1[environment local]
2doctl compute firewall create --name web-firewall \
3 --droplet-ids your_droplet_id \
4 --inbound-rules "protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0" \
5 --outbound-rules "protocol:icmp,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0 protocol:udp,ports:all,address:0.0.0.0/0,address:::/0"
输出包含新的云防火墙的基本概述.请注意云防火墙的ID,因为您将在步骤 3 中使用它来添加额外的规则到防火墙。
1[environment local]
2[secondary_label Output]
3ID Name Status Created At Inbound Rules Outbound Rules Droplet IDs Tags Pending Changes
4c7b39b43-4fcc-4594-88f2-160a64aaddd4 web-firewall waiting 2017-06-17T21:20:38Z protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0 your_droplet_id droplet_id:your_droplet_id,removing:false,status:waiting
如果您需要指定端口范围,请使用以下格式:
1--inbound-rules "protocol:tcp,ports:8000-8080,address:0.0.0.0/0,address:::/0"
您还可以使用droplet_id
标志而不是地址
标志,这在涉及多个 Droplets 相互通信的设置中尤其有用。
1--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_droplet_id"
并且,您可以将多个地址
或droplet_id
字段合并为一个规则,例如:
1--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_first_droplet_id,droplet_id:your_second_droplet_id"
在此时,通过将您的 Web 浏览器指向 Droplet 的 IP 地址来确认云防火墙的正常工作,您应该看到一个信息,表明该网站不再可访问,如果您没有,请从之前的创建
命令中检查输出,以确保您没有错过任何错误消息。
最后,即使我们的入口规则已经允许SSH,我们将使用doctl
来验证它。
1[environment local]
2doctl compute ssh web-1
如果您无法连接到 Droplet,则 如何解决SSH教程系列将帮助您诊断问题。
一旦您成功连接到 Droplet,请退出 SSH 会话:
1[environment]
2exit
由于我们现在已经验证了云防火墙是否正常工作,我们将添加一个额外的规则来允许到 Web 服务器的流量。
步骤 3 – 添加额外的规则
使用我们从步骤 2 中的doctl 计算防火墙创建
命令中获得的防火墙 ID,我们现在将添加一个规则,允许在端口 `80 上为 Apache 输入 TCP 流量。
我们将使用add-rules
命令,这需要一个防火墙ID和至少一个规则。
1[environment local]
2doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0"
如果您需要 HTTPS,请在端口443
上允许入口 TCP 流量。
1[environment local]
2doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0"
如果成功,此命令将不会产生输出. 如果您收到错误消息,请遵循屏幕上的指示来诊断问题。
现在,重定向您的 Web 浏览器到您的 Droplet 的 IP 地址. 这一次,您应该再次看到默认的 DigitalOcean 单击 LAMP 堆栈定位页面. 如果您没有,双检查您是否正确地将您的 IP 地址复制到您的 Web 浏览器,然后重新跟踪之前的步骤。
如果您有其他想要保护的 Web 服务器,请继续到步骤 4 或者跳过步骤 5,我们将用标签管理云防火墙。
(可选)步骤 4 — 将滴滴添加到防火墙
如果您有多个Dropplets,您可以将相同的云防火墙应用到每一个。
使用add-droplets
命令将额外的 Droplets 添加到云防火墙中. 此命令需要 Cloud Firewall ID 作为参数,并使用droplet-ids
旗帜来确定将防火墙应用于哪些 Droplets。
如果您不知道云防火墙的 ID,请使用列表
命令:
1[environment local]
2doctl compute firewall list
1[environment local]
2[secondary_label Output]
3ID Name Status Created At Inbound Rules Outbound Rules Droplet IDs Tags Pending Changes
4c7b39b43-4fcc-4594-88f2-160a64aaddd4 web-firewall succeeded 2017-06-17T21:20:38Z protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0 52059458
您还可以使用列表
命令来获取Droplets ID:
1[environment local]
2doctl compute droplet list
1[environment local]
2[secondary_label Output]
3ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
451146959 test-1 203.0.113.1 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
552059458 web-1 203.0.113.2 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
使用以下doctl
命令,我们将test-1
Droplet 添加到Web服务器
防火墙中,该防火墙具有c7b39b43-4fcc-4594-88f2-160a64aaddd4
的ID:
1[environment local]
2doctl compute firewall add-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --droplet-ids 51146959
如果您没有收到任何输出,该命令成功了. 如果您收到错误消息,请遵循屏幕上的指示来诊断问题。
如果您要同时添加多个Dropplets,请使用字符串将它们分开,请注意两个ID之间没有间隙:
1--droplet-ids 51146959,52059458
现在,让我们使用标签来简化云防火墙的管理。
步骤5 - 使用标签
此时,我们已将单个 Droplets 添加到云防火墙中,但云防火墙还支持标签,以便更容易管理多个资源。
在此步骤中,我们将标记 Droplets,将标签添加到云防火墙,然后从防火墙中删除单个 Droplet ID,通过标签保持 Droplets 安全。
在我们可以使用doctl
添加一个标签到Droplet之前,我们需要先使用创建标签
命令创建标签:
1[environment local]
2doctl compute tag create web-servers
1[environment local]
2[secondary_label Output]
3Name Droplet Count
4web-servers 0
创建标签后,使用dropplet tag
命令将其应用到Dropplet,该命令将Dropplet ID作为参数,并从--tag-name
旗帜中获得标签名称。
1[environment local]
2doctl compute droplet tag 52059458 \
3 --tag-name "web-servers"
如果您想通过一个云防火墙保护多个 Droplets,请对每个 Droplet 重复上一个命令。
接下来,使用add-tags
命令将标签添加到云防火墙中,该命令将防火墙ID作为参数,并从--tag-names
旗帜中获取使用的标签名单:
1[environment local]
2doctl compute firewall add-tags c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --tag-names web-servers
如果您没有收到任何输出,该命令成功了. 如果您收到错误消息,请遵循屏幕上的指示来诊断问题。
如果您需要添加多个标签,请将其提供为单栏分隔列表:
1--tag-names web-servers,backend-servers
最后,我们可以从防火墙中删除Droplet的ID,因为Droplet是Web服务器
标签的一部分,而整个标签现在是受保护的。
1[environment local]
2doctl compute firewall remove-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --droplet-ids 52059458
重复之前的步骤,每一个您想要通过标记来保护的 Droplet。
金钱(警告)
**警告:**从云防火墙中删除未标记的滴滴将使滴滴不受未经授权的流量保护。
美元
您现在有一个完全配置的云防火墙,可以保护您的 Web 服务器免受未经授权的流量。
(可选)步骤 6 – 从防火墙中删除规则
如果您想从云防火墙中删除规则,请使用删除规则
命令。
删除规则
命令将防火墙 ID 作为其参数,并使用 - outbound-rules
和 - inbound-rules
旗帜指定规则。
1[environment local]
2doctl compute firewall remove-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
3 --inbound-rules protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0
如果您没有收到任何输出,该命令成功了. 如果您收到错误消息,请遵循屏幕上的指示来诊断问题。
结论
在本教程中,我们使用doctl
创建DigitalOcean云防火墙,向这些防火墙添加规则,向防火墙添加额外的Dropplets,使用标签管理防火墙,并从防火墙中删除规则。
有关使用云防火墙的其他方法,请参阅 如何组织数字海洋云防火墙。
要了解如何解决云防火墙问题,请访问 如何解决数字海洋防火墙。