如何使用 Droplan 自动防火墙拦截 DigitalOcean 私有网络接口

简介

DigitalOcean的 "私有网络 "功能为您的Droplets提供一个网络接口,只有位于同一数据中心的同一团队或账户中的其他Droplets可以访问

通过添加 iptables 防火墙规则,只允许来自同一数据中心其他 Droplet 的流量,"droplan "实用程序可帮助确保 Droplet 上专用网络接口的安全。 通过在每个 Droplet 上安装和运行该实用程序,您可以确保您的系统只接受来自彼此的本地流量。

本指南将介绍在单个 Droplet 上安装 droplan 、调度 cron 作业以定期运行它,以及确保在 Droplet 重启或断电时防火墙规则仍然存在。

先决条件

本指南假定您在同一区域有两个或更多 Linux Droplet,每个 Droplet 都配置了一个非 root 用户,该用户具有执行管理任务的 sudo 权限。 具体来说,它提供了最近的 Debian、Ubuntu 和 CentOS 版本的说明。 在 CentOS 系统上,它将禁用 firewalld,因此您应注意它可能会覆盖任何现有的防火墙配置。

读取只读个人访问令牌

droplan "实用程序 为了向API请求您的Droplets列表,"droplan "命令需要访问具有读取范围的个人访问令牌 。 访问DigitalOcean控制面板,点击顶部菜单中的** API** ,然后点击** 生成新令牌** 按钮,即可获取令牌。 在** 令牌名称** 字段中为新令牌输入一个描述性名称,如 "droplan readonly",并取消选中** 写(可选)** 框:

生成新令牌](assets/droplan/enter_name_small.png)

点击 生成令牌 ,然后将生成的令牌复制到本地计算机:

个人访问令牌](assets/droplan/display_token_small.png)

<$>[注] 注意 :请确保您保存了令牌的副本,否则您将不得不生成一个新的令牌。 第一次显示后,就无法从控制面板中找回。 <$>

有关此过程的更多详情以及API使用的基本知识,请参阅如何使用DigitalOcean API v2

安装 Droplan

安装 Debian 和 Ubuntu 的先决条件

如果您使用的是 Debian 或 Debian 衍生发行版(如 Ubuntu),请使用 apt-get 安装 unzip 软件包:

1sudo apt-get install unzip iptables-persistent

稍后我们在配置持久防火墙规则时会用到 iptables-persistent 。 安装程序可能会询问你是否要在安装时保存当前的防火墙规则。 说 "是 "应该没什么坏处。

安装 CentOS 的先决条件

如果使用 CentOS 7,请使用 yum 安装 unzipiptables-services 软件包:

1sudo yum install unzip iptables-services

稍后我们在配置持久防火墙规则时会用到 iptables-services

检索和提取档案

访问 GitHub 项目 droplan 上的 releases page,找到支持您的架构的最新版本的 URL。 复制 URL,登录到其中一个 Droplet,然后使用 wgetcurl 获取文件:

1wget https://github.com/tam7t/droplan/releases/download/v1.0.0/droplan_1.0.0_linux_amd64.zip

现在,使用 unzip 命令从发布存档中提取 droplan 二进制文件:

1unzip droplan_1.0.0_linux_amd64.zip

/opt 中为 droplan 创建一个目录,并将二进制文件移至该目录:

1sudo mkdir /opt/droplan
2sudo mv ./droplan /opt/droplan/

/opt "目录是安装软件的标准位置,这些软件来自发行版官方软件包仓库以外的其他来源。

创建 Iptables 规则

有了 droplan 二进制文件,你就可以用它来创建规则了。 在 sudo 下运行命令,将 DO_KEY 环境变量设置为你的令牌:

1sudo DO_KEY=personal_access_token /opt/droplan/droplan

现在,检查你的 iptables 规则:

1sudo iptables -L

假设您在同一区域还有两个 Droplet,您应该会看到类似下面的内容:

 1[secondary_label Output]
 2Chain INPUT (policy ACCEPT)
 3target prot opt source destination
 4droplan-peers all  --  anywhere anywhere
 5DROP all  --  anywhere anywhere
 6
 7Chain FORWARD (policy ACCEPT)
 8target prot opt source destination
 9
10Chain OUTPUT (policy ACCEPT)
11target prot opt source destination
12
13Chain droplan-peers (1 references)
14target prot opt source destination
15ACCEPT all  --  droplet_ip1 anywhere
16ACCEPT all  --  droplet_ip2 anywhere

要确认这些规则只应用于 eth1 ,可以添加 -v 选项,以获得更详细的输出,其中将包括接口:

1sudo iptables -L -v

持久的 Iptables 规则

目前,同一区域内的所有其他 Droplet 都可以连接到当前系统,而来自您无法控制的系统的流量则会被阻止。 不过,如果系统重启,iptables 规则就会消失。 此外,您还可能在未来某个时间创建新的 Droplet(或删除现有的 Droplet)。 为了解决这些问题,我们将确保规则在重启时持续存在,并安排 droplan 定期运行,对防火墙进行必要的更改。

Debian 或 Ubuntu 上的持续规则

防火墙规则保存在 /etc/iptables/rules.v4(ipv6 规则保存在 /etc/iptables/rules.v6)。 可以使用 iptables-save 命令生成该文件的新版本:

1sudo iptables-save | sudo tee /etc/iptables/rules.v4

CentOS 7 上的持续规则

CentOS 7 默认使用 firewalld 服务代替 iptables。 由于我们已经在上面安装了 iptables-services 软件包,因此可以使用 systemctl 停止该服务并屏蔽它,确保它不会被重启:

1sudo systemctl stop firewalld
2sudo systemctl mask firewalld

现在启用 iptables 服务:

1systemctl enable iptables

安装好 iptables 服务后,保存当前的防火墙规则:

1sudo service iptables save

测试规则的持久性

您可能需要重启系统,重新连接,并检查规则是否继续有效。 首先,重新启动:

1sudo reboot

现在,重新连接到 Droplet(这需要几秒钟),然后检查规则:

1sudo iptables -L

调度 Cron 作业以更新 Iptables 规则

最后一步,我们将确保 droplan 定期运行,以便捕捉 Droplet 集合中的变化。

首先,使用 nano(或你选择的编辑器)创建一个名为 /opt/droplan/refresh.sh的新脚本:

1sudo nano /opt/droplan/refresh.sh

粘贴以下内容,删除前面的 "# ``",取消对发行版相应行的注释:

 1[label /opt/droplan/refresh.sh]
 2#!/usr/bin/env bash
 3
 4/opt/droplan/droplan
 5
 6# Uncomment for Centos:
 7# service iptables save
 8
 9# Uncomment for Debian or Ubuntu:
10# iptables-save > /etc/iptables/rules.v4

退出并保存文件,然后标记为可执行:

1sudo chmod +x /opt/droplan/refresh.sh

接下来,在 /etc/cron.d/droplan 中创建一个新文件:

1sudo nano /etc/cron.d/droplan

在文件中添加以下一行,以便每 5 分钟以 root 的身份运行脚本:

1[label crontab]
2*/5 * * * * root PATH=/sbin:/usr/bin:/bin DO_KEY=personal_access_token /opt/droplan/refresh.sh > /var/log/droplan.log 2>&1

这将每 5 分钟运行一次 refresh.sh 脚本(如第一个字段中的 */5 所示),并将其最新输出记录到 /var/log/droplan.log

退出并保存文件。 现在可以使用 watch 命令,它每隔几秒钟就会显示另一条命令的输出,以确保脚本成功运行:

1sudo watch cat /var/log/droplan.log

脚本运行后,您应该会看到类似下面的输出:

1[secondary_label Sample CentOS Output]
2Every 2.0s: cat droplan.log Fri Mar 25 01:14:45 2016
3
42016/03/25 01:14:02 Added 2 peers to droplan-peers
5iptables: Saving firewall rules to /etc/sysconfig/iptables: [  OK  ]

在 Debian 衍生系统上,"systemctl iptables save "不会显示任何输出。

Ctrl-C 退出 "观看"。

<$>[注] 注意 :由于 API 有速率限制,如果您有很多 Droplet,可能需要调整更新频率。 您可以 阅读有关 cron 的更多信息API 本身。 <$>

结论和下一步措施

现在您已经在单个 Droplet 上配置了防火墙,您需要在基础设施的其他部分重复此过程。 如果 Droplet 数量较多,最简单的方法可能是自动执行此过程。 如果您使用 Hashicorp 的 Terraform 来配置系统,您可以找到 Droplan GitHub 项目上的示例模板。 有关类似自动化任务的广泛概述,请参阅配置管理简介

有关防火墙的更多详情,请参阅 什么是防火墙及其工作原理?

Published At
Categories with 技术
comments powered by Disqus