开始使用软件定义的网络并使用ZeroTierOne创建VPN
介绍
如今,越来越多的软件项目是由其成员从不同的地理位置一起工作的团队构建的。 尽管此工作流程具有许多明显的优势,但在某些情况下,此类团队可能希望通过 Internet 将他们的计算机连接在一起,并将它们视为在同一个房间里。 例如,您可能正在测试 Kubernetes 等分布式系统或构建复杂的多服务应用程序。 有时,如果您可以将机器视为彼此相邻,那么它只会有助于提高生产力,因为您无需冒险将未完成的服务暴露在互联网上。 这种范式可以通过软件定义网络 (SDN) 实现,SDN 是一种相对较新的技术,可提供完全由软件组成的动态网络结构。
ZeroTier One 是一个开源应用程序,它使用 SDN 的一些最新发展,允许用户创建安全、可管理的网络,并将连接的设备视为位于同一物理位置。 ZeroTier 为客户端提供网络管理和端点软件的 Web 控制台。 这是一种加密的点对点技术,这意味着与传统的 VPN 解决方案不同,通信不需要通过中央服务器或路由器——消息直接从主机发送到主机。 因此,它非常高效并确保最小的延迟。 其他好处包括 ZeroTier 的简单部署和配置过程、简单的维护,以及它允许通过 Web 控制台集中注册和管理授权节点。
按照本教程,您将在一个简单的点对点网络中将客户端和服务器连接在一起。 由于软件定义网络不使用传统的客户端/服务器设计,因此无需安装和配置中央 VPN 服务器; 这简化了工具的部署和任何补充节点的添加。 建立连接后,您将有机会通过使用一些巧妙的 Linux 功能来利用 ZeroTier 的 VPN 功能,以允许流量从您的服务器离开您的 ZeroTier 网络,并指示客户端向该方向发送流量。
先决条件
在完成本教程之前,您需要以下资源:
- 运行 Ubuntu 16.04 的服务器。 在此服务器上,您还需要具有 sudo 权限的非 root 用户,可以使用我们的 Ubuntu 16.04 初始服务器设置指南进行设置。
- ZeroTier One 的帐户,您可以通过转到 My ZeroTier 进行设置。 就本教程而言,您可以使用该服务的免费版本,无需任何费用或承诺。
- 作为客户端加入您的 SDN 的本地计算机。 在本教程的示例中,服务器和本地计算机都运行 Ubuntu Linux,但 ZeroTier 下载页面 上列出的任何操作系统都可以在客户端上运行。
有了这些先决条件,您就可以为您的服务器和本地计算机设置软件定义的网络。
第 1 步 — 使用 ZeroTier One 创建软件定义的网络
ZeroTier 平台为您的软件定义网络提供中央控制点。 在那里,您可以授权和取消授权客户端,选择寻址方案,并创建一个网络 ID,您可以在设置客户端时将其定向到该网络 ID。
登录您的 ZeroTier 帐户,单击屏幕顶部的Networks,然后单击创建。 将出现一个自动生成的网络名称。 单击它以查看网络的配置屏幕。 记下黄色显示的 Network ID,因为您稍后需要参考。
如果您希望将网络名称更改为更具描述性的名称,请在屏幕左侧编辑名称; 如果您愿意,还可以添加描述。 您所做的任何更改都将自动保存和应用。
接下来,选择 SDN 将在哪个 IPv4 地址范围上运行。 在屏幕右侧,在标题为 IPv4 Auto-Assign 的区域中,选择您的节点将属于的地址范围。 出于本教程的目的,可以使用任何范围,但重要的是要勾选 Auto-Assign from Range 框。
确保左侧的 Access Control 保持设置为 Certificate (Private Network)。 这样可以确保只有经过批准的机器才能连接到您的网络,而不仅仅是碰巧知道您的网络 ID 的任何人!
完成后,您的设置应类似于以下内容:
至此,您已经成功构建了 ZeroTier 软件定义网络的基础。 接下来,您将在您的服务器和客户端计算机上安装 ZeroTier 软件,以允许它们连接到您的 SDN。
第 2 步 — 在您的服务器和本地计算机上安装 ZeroTier One 客户端
由于 ZeroTier One 是一款相对较新的软件,因此尚未包含在核心 Ubuntu 软件存储库中。 出于这个原因,ZeroTier 提供了一个安装脚本,我们将使用它来安装软件。 此命令是 GPG 签名的脚本,这意味着您下载的代码将被 ZeroTier 验证为已发布。 该脚本有四个主要部分,下面是对每个部分的逐个解释:
curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61'
- 从 MIT 导入 ZeroTier 公钥。gpg --import
- 该命令的这一部分将 ZeroTier 公钥添加到您的本地权限钥匙串中,以信任您尝试安装的软件包。 仅当 GPG 导入成功完成后才会执行该命令的下一部分if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z"
- 本节发生了一些事情,但它本质上转换为:“如果从 ZeroTier.com 下载的加密签名安装脚本通过 GPG 并且没有被拒绝为ZeroTier 未签名,将该信息粘贴到屏幕上。”sudo bash; fi
- 本节采用新验证的安装程序脚本并在结束例程之前实际执行它。
警告: 除非您确定它来自受信任的来源,否则您永远不应该从 Internet 下载某些内容并将其传送到另一个程序中。 如果您愿意,可以通过查看 项目的官方 GitHub 页面 上的源代码来检查 ZeroTier 软件。
使用 SSH 控制台连接到新创建的服务器并以普通用户身份运行以下命令(下面提供了命令说明)。 确保您 不要 以 root 身份运行它,因为该脚本会自动请求您的密码以提高其权限级别,并记住在您的浏览器中保持 ZeroTier 控制台打开,以便您可以在必要时与它进行交互。
curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi
脚本完成后,您将看到类似于下图的两行输出。 记下您的 ZeroTier 地址(不带方括号)和生成该地址的系统名称,稍后您将需要这两者:
Output*** Waiting for identity generation... *** Success! You are ZeroTier address [ 916af8664d ].
如果使用 Ubuntu,请在您的本地计算机上重复此步骤,或按照 ZeroTier 网站的 下载页面 上的操作系统的相关步骤进行操作。 同样,请务必记下 ZeroTier 地址和生成该地址的机器。 当您实际将服务器和客户端加入网络时,您将在本教程的下一步中需要此信息。
第 3 步 — 加入您的 ZeroTier 网络
现在服务器和客户端都运行了 ZeroTier 软件,您可以将它们连接到您在 ZeroTier Web 控制台中创建的网络。
使用以下命令指示您的客户端通过其平台请求访问 ZeroTier 网络。 客户的初始请求将被拒绝并挂起,但我们稍后会解决这个问题。 请务必将 NetworkID 替换为您之前在网络配置窗口中记下的网络 ID。
sudo zerotier-cli join NetworkID
Output200 join OK
您将收到 200 join OK
消息,确认您服务器上的 ZeroTier 服务已理解该命令。 如果不这样做,请仔细检查您输入的 ZeroTier 网络 ID。
由于您尚未创建世界上任何人都可以加入的公共网络,因此您现在需要授权您的客户。 转到 ZeroTier Web 控制台并向下滚动到 Members 部分所在的底部。 您应该发现两个标记为 Online 的条目,它们的地址与您之前记下的相同。
在标记为 Auth? 的第一列中,勾选复选框以授权他们加入网络。 Zerotier 控制器将在下次调用 SDN 时从您之前选择的范围内为服务器和客户端分配一个 IP 地址。
分配 IP 地址可能需要一些时间。 在等待期间,您可以在 Members 部分中为您的节点提供 Short Name 和 Description。
这样,您就可以将两个系统连接到您的软件定义网络。
到目前为止,您已经基本熟悉 ZeroTier 控制面板,使用命令行界面下载和安装 ZeroTier,然后将服务器和客户端都连接到该网络。 接下来,您将通过执行连接测试来检查所有内容是否已正确应用。
第 4 步 - 验证连接性
在这个阶段,重要的是验证两个主机实际上可以相互交谈。 即使主机声称已加入网络,它们也有可能无法通信。 通过现在验证连接,您不必担心以后可能会导致麻烦的基本互连问题。
查找每个主机的 ZeroTier IP 地址的一种简单方法是查看 ZeroTier Web 控制台的 Members 部分。 您可能需要在授权服务器和客户端后刷新它,然后才能显示它们的 IP 地址。 或者,您可以使用 Linux 命令行来查找这些地址。 在两台机器上使用以下命令——列表中显示的第一个 IP 地址是要使用的。 在下面显示的示例中,该地址是 203.0.113.0
。
ip addr sh zt0 | grep 'inet'
Outputinet 203.0.113.0/24 brd 203.0.255.255 scope global zt0 inet6 fc63:b4a9:3507:6649:9d52::1/40 scope global inet6 fe80::28e4:7eff:fe38:8318/64 scope link
要测试主机之间的连接性,请从一台主机运行 ping
命令,然后运行另一台主机的 IP 地址。 例如,在客户端:
ping your_server_ip
在服务器上:
ping your_client_ip
如果从对方主机返回回复(如下面的输出所示),则两个节点通过 SDN 成功通信。
OutputPING 203.0.113.0 (203.0.113.0) 56(84) bytes of data. 64 bytes from 203.0.113.0: icmp_seq=1 ttl=64 time=0.054 ms 64 bytes from 203.0.113.0: icmp_seq=2 ttl=64 time=0.046 ms 64 bytes from 203.0.113.0: icmp_seq=3 ttl=64 time=0.043 ms
通过重复上述 ZeroTier 安装和加入过程,您可以将任意数量的机器添加到此配置中。 请记住,这些机器不需要以任何方式彼此靠近。
既然您已经确认您的服务器和客户端能够相互通信,请继续阅读以了解如何调整网络以提供出口网关并构建您自己的 VPN。
第 5 步 — 启用 ZeroTier 的 VPN 功能
正如介绍中提到的,可以使用 ZeroTier 作为 VPN 工具。 如果您不打算将 ZeroTier 用作 VPN 解决方案,则无需执行此步骤,可以直接跳到第 6 步。
使用 VPN 可以隐藏您与 Internet 上网站的通信来源。 它允许您绕过您正在使用的网络上可能存在的过滤器和限制。 对于更广泛的互联网,您似乎正在从服务器的公共 IP 地址进行浏览。 为了将 ZeroTier 用作 VPN 工具,您需要对服务器和客户端的配置进行一些更改。
启用网络地址转换和 IP 转发
网络地址转换,通常称为“NAT”,是一种路由器在一个接口上接受数据包的方法,该接口上标有发送者的 IP 地址,然后将该地址换成路由器的地址。 此交换的记录保存在路由器的内存中,以便当返回流量以相反方向返回时,路由器可以将 IP 转换回其原始地址。 NAT 通常用于允许多台计算机在一个公开的 IP 地址后面运行,这对于 VPN 服务非常有用。 NAT 在实践中的一个示例是您的互联网服务提供商为您提供的家用路由器,用于将您家中的所有设备连接到互联网。 您的笔记本电脑、手机、平板电脑和任何其他支持互联网的设备似乎都与互联网共享相同的公共 IP 地址,因为您的路由器正在执行 NAT。
虽然 NAT 通常由路由器执行,但服务器也能够执行它。 在此步骤中,您将利用 ZeroTier 服务器中的此功能来启用其 VPN 功能。
IP 转发 是由路由器或服务器执行的一项功能,如果这些 IP 地址位于不同的区域中,它会将流量从一个接口转发到另一个接口。 如果路由器连接到两个网络,IP 转发允许它在它们之间转发流量。 这听起来很简单,但要成功实施却出奇地复杂。 但是,在本教程的情况下,只需编辑几个配置文件。
通过启用 IP 转发,来自 ZeroTier 网络中客户端的 VPN 流量将到达服务器的 ZeroTier 接口。 如果没有这些配置更改,Linux 内核将(默认情况下)丢弃任何不发往它们到达的接口的数据包。 这是 Linux 内核的正常行为,因为通常任何到达接口的具有另一个网络的目标地址的数据包都可能是由网络中其他地方的路由配置错误引起的。
将 IP 转发视为通知 Linux 内核可以接受在接口之间转发数据包是很有帮助的。 默认设置为 0
— 相当于“关”。 您将其切换为 1
— 相当于“开”。
要查看当前配置,请运行以下命令:
sudo sysctl net.ipv4.ip_forward
Outputnet.ipv4.ip_forward = 0
要启用 IP 转发,请修改服务器上的 /etc/sysctl.conf
文件并添加所需的行。 此配置文件允许管理员覆盖默认内核设置,并且将始终在重新启动后应用,因此您无需担心再次设置它。 使用 nano
或您喜欢的文本编辑器将以下行添加到文件底部。
sudo nano /etc/sysctl.conf
/etc/sysctl.conf
. . . net.ipv4.ip_forward = 1
保存并关闭文件,然后运行下一条命令触发内核采用新配置
sudo sysctl -p
服务器将采用文件中的任何新配置指令并立即应用它们,无需重新启动。 运行与之前相同的命令,您将看到 IP 转发已启用。
sudo sysctl net.ipv4.ip_forward
Outputnet.ipv4.ip_forward = 1
现在启用了 IP 转发,您将通过为服务器提供一些基本的路由规则来充分利用它。 由于 Linux 内核已经嵌入了网络路由功能,您所要做的就是添加一些规则来告诉内置防火墙和路由器它将看到的新流量是可接受的以及将其发送到哪里.
要从命令行添加这些规则,您首先需要知道 Ubuntu 分配给 Zerotier 接口和常规面向 Internet 的以太网接口的名称。 这些通常分别是 zt0
和 eth0
,尽管情况并非总是如此。
要查找这些接口的名称,请使用命令 ip link show
。 这个命令行实用程序是 iproute2
的一部分,它是一组用户空间实用程序,默认安装在 Ubuntu 上:
ip link show
在此命令的输出中,接口名称直接位于标识列表中唯一接口的数字旁边。 这些接口名称在以下示例输出中突出显示。 如果您的名称与示例中显示的名称不同,请在本指南中适当地替换您的接口名称。
Output1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 72:2d:7e:6f:5e:08 brd ff:ff:ff:ff:ff:ff 3: zt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether be:82:8f:f3:b4:cd brd ff:ff:ff:ff:ff:ff
有了这些信息,使用 iptables
启用网络地址转换和 IP 伪装:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
允许流量转发并跟踪活动连接:
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
接下来,允许从 zt0
到 eth0
的流量转发。 不需要反向规则,因为在本教程中,假设客户端始终通过服务器调用,而不是相反:
sudo iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT
请务必记住,您为服务器设置的 iptables 规则不会在重新启动之间自动保留。 您将需要保存这些规则以确保它们在服务器重新启动时重新生效。 在您的服务器上运行以下命令,按照屏幕上的简短说明保存当前的 IPv4 规则,不需要 IPv6。
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
运行 sudo netfilter-persistent save
后,可能值得重新启动服务器以验证 iptables 规则是否已正确保存。 一个简单的检查方法是运行 sudo iptables-save
,它会将内存中加载的当前配置转储到您的终端。 如果您在伪装、转发和 zt0
接口方面看到与以下类似的规则,则它们已正确保存。
sudo iptables-save
Output# Generated by iptables-save v1.6.0 on Tue Apr 17 21:43:08 2018 . . . -A POSTROUTING -o eth0 -j MASQUERADE COMMIT . . . -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i zt0 -o eth0 -j ACCEPT COMMIT . . .
既然这些规则已应用于您的服务器,它就可以在 ZeroTier 网络和公共 Internet 之间处理流量了。 但是,除非 ZeroTier 网络本身被告知服务器已准备好用作网关,否则 VPN 将无法运行。
使您的服务器能够管理全局路由
为了让您的服务器处理来自任何客户端的流量,您必须确保 ZeroTier 网络中的其他客户端知道将其流量发送给它。 可以通过在 ZeroTier 控制台中设置全局路由来做到这一点。 熟悉计算机网络的人也可以将其描述为默认路由。 这是任何客户端发送默认流量的地方,即 任何不应流向任何其他特定位置的流量。
转到您的 ZeroTier Networks 页面的右上角,并使用以下参数添加一个新路由。 您可以在 ZeroTier 网络配置页面的 Members 部分中找到服务器的 ZeroTier IP。 在 network/bits 字段中,输入 0.0.0.0/0
,在 (LAN) 字段中,输入您的 ZeroTier 服务器的 IP 地址。
详细信息到位后,单击“+”符号,您将看到一个新规则出现在现有规则下方。 里面会有一个橙色的地球,表示它确实是一条全球路线:
随着您的 ZeroTier 网络准备就绪,在 VPN 运行之前只需要进行一项配置:客户端的配置。
配置 Linux 客户端
注意:本节中的命令仅适用于 Linux 客户端。 下一节提供了配置 Windows 或 macOS 客户端的说明。
如果您的客户端运行的是 Linux,您需要手动更改其 /etc/sysctl.conf
文件。 需要此配置更改来改变内核对客户端流量可接受的返回路径的看法。 由于 ZeroTier VPN 的配置方式,从您的服务器返回到您的客户端的流量有时似乎来自与它发送到的地址不同的网络地址。 默认情况下,Linux 内核将这些视为无效并丢弃它们,因此有必要覆盖该行为。
在您的客户端计算机上打开 /etc/sysctl.conf
:
sudo nano /etc/sysctl.conf
然后添加以下行:
Output. . . net.ipv4.conf.all.rp_filter=2
保存并关闭文件,然后运行 sudo sysctl -p
以采用更改。
sudo sysctl -p
接下来,告诉 ZeroTier 客户端软件允许您的网络承载默认路由流量。 这会修改客户端的路由,因此被视为特权功能,这就是必须手动启用它的原因。 该命令将在输出中打印配置结构。 检查此项以确认它在顶部显示 allowDefault=1
:
sudo zerotier-cli set NetworkID allowDefault=1
如果在任何时候您希望停止使用 ZeroTier 作为 VPN 并通过它进行所有流量路由,请将 allowDefault
设置回 0
:
sudo zerotier-cli set NetworkID allowDefault=0
每次重新启动客户端上的 ZeroTier 服务时,allowDefault=1
值都会重置为 0,因此请记住重新执行它以激活 VPN 功能。
默认情况下,ZeroTier 服务设置为在 Linux 客户端和服务器启动时自动启动。 如果您不希望出现这种情况,可以使用以下命令禁用启动例程。
sudo systemctl disable zerotier-one
如果您想在您的 ZeroTier 网络上使用其他操作系统,请阅读下一部分。 否则,请跳至管理流程部分。
配置非 Linux 客户端
ZeroTier 客户端软件可用于许多系统,不仅适用于 Linux 操作系统,甚至支持智能手机。 客户端适用于 Windows、macOS、Android、iOS,甚至是 QNAP、Synology 和 WesternDigital NAS 系统等专用操作系统。
要将基于 macOS 和 Windows 的客户端加入网络,请启动 ZeroTier 工具(您在步骤 1 中安装)并在提供的字段中输入您的 NetworkID,然后单击 Join。 请记住在 ZeroTier 控制台中检查以勾选 Allow 按钮以授权新主机进入您的网络。
请务必勾选标记为 的复选框,通过 ZeroTier 路由所有流量。 如果您不这样做,您的客户端将连接到您的 ZeroTier 网络,但不会费心尝试通过它发送互联网流量。
使用 IP 检查工具(例如 ICanHazIP)来验证您的流量是否从您的服务器 IP 出现在互联网上。 要检查这一点,请将以下 URL 粘贴到浏览器的地址栏中。 该网站将显示其服务器(以及互联网的其余部分)看到您用于访问该网站的 IP 地址:
http://icanhazip.com
完成这些步骤后,您可以随心所欲地开始使用您的 VPN。 下一个可选部分介绍了 ZeroTier SDN 中内置的一种称为“流规则”的技术,但它们并不是 VPN 功能正常工作所必需的。
第 6 步 — 管理流程(可选)
软件定义网络的好处之一是集中式控制器。 对于 ZeroTier,集中控制器是位于整个 ZeroTier SDN 服务之上的 Web 用户界面。 从这个界面,可以编写称为 流规则 的规则,它指定网络上的流量可以或不可以做什么。 例如,您可以对通过网络传输流量的某些网络端口指定一揽子禁令,限制哪些主机可以相互通信,甚至重定向流量。
这是一个非常强大的功能,几乎可以立即生效,因为对流表所做的任何更改都会推送给网络成员并在几分钟后生效。 要编辑流规则,请返回 ZeroTier Web 用户界面,单击 Networking 选项卡,然后向下滚动,直到看到标题为 Flow Rules 的框(它可能已折叠并需要扩大)。 这将打开一个文本字段,您可以在其中输入您想要的任何规则。 在 ZeroTier 控制台的 Flow Rules 输入框下方的框中提供了完整的手册,标题为 Rules Engine Help。
以下是一些示例规则,可帮助您探索此功能。
要阻止任何发往 Google 的 8.8.8.8
DNS 服务器的流量,请添加以下规则:
drop ipdest 8.8.8.8/32 ;
要将发往 Google 公共 DNS 服务器的任何流量重定向到您的 ZeroTier 节点之一,请添加以下规则。 这对于覆盖 DNS 查找来说可能是一个很好的包罗万象:
redirect NetworkID ipdest 8.8.8.8/32 ;
如果您的网络有特殊的安全要求,您可以通过添加以下规则删除 FTP 端口、Telnet 和未加密 HTTP 上的任何活动:
drop dport 80,23,21,20 ;
添加完流规则后,点击Save Changes按钮,ZeroTier会记录你的更改。
结论
在本教程中,您已经迈出了进入软件定义网络世界的第一步,使用 ZeroTier 可以深入了解该技术的好处。 如果您遵循 VPN 示例,那么尽管初始设置可能与您过去可能使用的其他工具形成对比,但添加额外客户端的便利性可能是在其他地方使用该技术的一个令人信服的理由。
总而言之,您学习了如何将 ZeroTier 用作 SDN 提供商,以及如何配置节点并将其附加到该网络。 VPN 元素将使您更深入地了解此类网络中的路由如何运行,并且本教程中的任一路径都将允许您利用强大的流规则技术。
现在已经存在点对点网络,您可以将其与文件共享等其他功能结合使用。 如果您家中有 NAS 或文件服务器,您可以将其链接到 ZeroTier 并随时随地访问它。 如果您想与您的朋友分享,您可以向他们展示如何加入您的 ZeroTier 网络。 分布在大范围内的员工甚至可以链接回同一个中央存储空间。 要开始为这些示例中的任何一个构建文件共享,请查看 如何在 Ubuntu 16.04 上为小型组织设置 Samba 共享。