软件定义网络入门和使用 ZeroTier One 创建 VPN

简介

如今,越来越多的软件项目是由来自不同地理位置的团队成员共同构建的。虽然这种工作流程有许多明显的优势,但在某些情况下,这些团队可能希望通过互联网将他们的计算机连接在一起,并将它们视为同一个房间。例如,您可能正在测试Kubernetes等分布式系统,或者正在构建复杂的多服务应用程序。有时候,如果你能把机器当作是紧挨着的,这会有助于提高生产力,因为你不需要冒险把你未完成的服务暴露在互联网上。这种模式可以通过软件定义网络(SDN)来实现,SDN是一种相对较新的技术,它提供了一种完全由软件组成的动态网络结构。

ZeroTier One是一个开源应用程序,它利用SDN中的一些最新发展,允许用户创建安全、可管理的网络,并将连接的设备视为处于相同的物理位置。ZeroTier为客户提供网络管理和终端软件的Web控制台。这是一种加密的点对点技术,这意味着与传统的VPN解决方案不同,通信不需要通过中央服务器或路由器-消息直接从主机发送到主机。因此,它非常高效,并确保最小延迟。其他好处包括ZeroTier简单的部署和配置过程、直接的维护,以及允许通过Web控制台对授权节点进行集中注册和管理。

通过学习本教程,您将在一个简单的点对点网络中将客户端和服务器连接在一起。由于软件定义网络不使用传统的客户端/服务器设计,因此不需要安装和配置中央VPN服务器;这简化了工具的部署和任何补充节点的添加。一旦建立了连接,您将有机会通过使用一些巧妙的Linux功能来利用ZeroTier的VPN功能,以允许流量从您的服务器离开您的ZeroTier网络,并指示客户端将其流量发送到该方向。

前提条件

在学习本教程之前,您需要以下资源:

  • 运行Ubuntu 16.04的服务器。在该服务器上,您还需要一个拥有sudo权限的非超级用户,该权限可以使用我们的Ubuntu 16.04.初始服务器设置指南]进行设置
  • ZeroTier一号账号,进入我的ZeroTier.)即可设置在本教程中,您可以使用该服务的免费版本,该版本没有任何费用或承诺。
  • 本地计算机作为客户端加入您的SDN。在本教程的所有示例中,服务器和本地计算机都运行Ubuntu Linux,但ZeroTier下载页面)上列出的任何操作系统都可以在客户机上运行。

有了这些先决条件,您就可以为您的服务器和本地计算机设置软件定义的网络了。

第一步-使用ZeroTier One创建软件定义网络

ZeroTier平台为您的软件定义网络提供中央控制点。在那里,您可以授权和取消授权客户端,选择寻址方案,并创建网络ID,在设置客户端时可以将其定向到该网络ID。

登录到您的ZeroTier帐户,单击屏幕顶部的[网络],然后单击[创建]。将出现自动生成的网络名称。单击它以查看您的网络的配置屏幕。请记下以黄色显示的网络ID ,因为您稍后将需要参考此信息。

如果您希望将网络名称更改为更具描述性的名称,请编辑屏幕左侧的名称;如果您愿意,也可以添加描述。您所做的任何更改都将自动保存和应用。

接下来,选择SDN将在哪个IPv4地址范围上运行。在屏幕右侧标题为IPv4自动分配 的区域中,选择您的节点所属的地址范围。出于本教程的目的,可以使用任何范围,但一定要选中** 自动分配范围** 框。

请确保左侧的[访问控制]设置为证书(内网) 。这可以确保只有经过批准的计算机才能连接到您的网络,而不是恰好知道您的网络ID的任何人!

完成后,您的设置应与以下内容类似:

零层设置configuration

至此,您已经成功构建了ZeroTier软件定义网络的基础。接下来,您将在服务器和客户端计算机上安装ZeroTier软件,以允许它们连接到您的SDN。

第二步-在您的服务器和本地计算机上安装ZeroTier One客户端

由于ZeroTier One是一个相对较新的软件,它还没有包含在核心的Ubuntu软件库中。出于这个原因,ZeroTier提供了一个安装脚本,我们将使用它来安装软件。该命令是GPG签名的脚本,这意味着您下载的代码将被验证为由ZeroTier发布。该脚本有四个主要部分,下面是对每个部分的详细说明:

  • curl-S‘https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61’-从麻省理工学院导入零层公钥。
  • gpg--port-命令的这一部分将ZeroTier公钥添加到您的本地授权密钥链中,以信任您尝试安装的包。只有在GPG导入成功完成时,才会执行该命令的下一部分
  • if z=$(cURL-S‘GPG|gpg);则回显$z``-本节中有一些事情发生,但它基本上翻译为:如果从ZeroTier.com下载的加密签名的安装脚本通过了https://install.zerotier.com/’,并且没有被ZeroTier拒绝为未签名,则将该信息粘贴到屏幕上。
  • sudo bash;fi-本节获取新验证的安装程序脚本,并在结束例程之前实际执行它。

<$>[警告] 警告: 除非您确定其来源可信,否则切勿从互联网下载内容并通过管道将其传输到其他程序。如果你愿意,你可以在项目官方GitHub page.]上查看ZeroTier软件的源代码 <$>

使用SSH控制台连接到新创建的服务器,并以普通用户身份运行以下命令(下面提供了对该命令的解释)。确保您不要 以超级用户身份运行它,因为该脚本会自动请求您的密码以提升其权限级别,并记住在您的浏览器中保持ZeroTier控制台打开,以便您可以在必要时与其交互。

1curl -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地址(不带方括号)和生成该地址的系统的名称,这两个名称稍后都会用到:

1[secondary_label Output]
2*** Waiting for identity generation...
3
4*** Success! You are ZeroTier address [ 916af8664d ].

如果使用Ubuntu,请在您的本地计算机上重复此步骤,或者按照ZeroTier网站上针对您的操作系统的相关步骤进行操作下载page.同样,请确保记下ZeroTier地址和生成该地址的机器。在本教程的下一步中,当您将服务器和客户端实际连接到网络时,您将需要此信息。

第三步-加入您的ZeroTier网络

既然服务器和客户端上都运行了ZeroTier软件,您就可以将它们连接到您在ZeroTier Web控制台中创建的网络。

使用以下命令指示您的客户通过其平台请求访问ZeroTier网络。客户的初始请求将被拒绝并挂起,但我们将稍后解决这一问题。请务必将NetworkID替换为您先前在网络的配置窗口中记录的网络ID。

1sudo zerotier-cli join NetworkID
1[secondary_label Output]
2200 join OK

您将收到一条`200 Join OK‘的消息,确认您服务器上的ZeroTier服务已经理解该命令。如果没有,请再次检查您输入的ZeroTier网络ID。

由于您尚未创建世界上任何人都可以加入的公共网络,因此您现在需要授权您的客户端。转到ZeroTier Web控制台,向下滚动到Members 部分的底部。您应该会看到两个标记为** Online** 的条目,它们的地址与您前面提到的地址相同。

在标有身份验证? 的第一列中,勾选方框以授权他们加入网络。下次服务器和客户端调用SDN时,Zerotier控制器将从您先前选择的范围中为服务器和客户端分配一个IP地址。

分配IP地址可能需要一段时间。在等待期间,您可以在成员 部分提供节点的** 简称** 和** 描述** 。

这样,您就可以将两个系统连接到软件定义的网络。

到目前为止,您已经基本熟悉了ZeroTier控制面板,使用命令行界面下载并安装了ZeroTier,然后将服务器和客户端连接到该网络。接下来,您将通过执行连通性测试来检查是否正确应用了所有内容。

第四步-验证连通性

在此阶段,重要的是验证两台主机是否可以相互通信。即使主机声称已加入网络,它们也有可能无法通信。通过现在验证连接性,您将不必担心可能会在以后造成麻烦的基本互连性问题。

找到每台主机的ZeroTier IP地址的简单方法是查看ZeroTier Web控制台的Members 部分。您可能需要在授权服务器和客户端之后刷新它,然后才会显示它们的IP地址。或者,您可以使用Linux命令行来查找这些地址。在两台计算机上使用以下命令-列表中显示的第一个IP地址是要使用的地址。在下面的示例中,该地址为203.0.113.0

1ip addr sh zt0 | grep 'inet'
1[secondary_label Output]
2inet 203.0.113.0/24 brd 203.0.255.255 scope global zt0
3inet6 fc63:b4a9:3507:6649:9d52::1/40 scope global
4inet6 fe80::28e4:7eff:fe38:8318/64 scope link

要测试主机之间的连通性,请从一台主机运行ping命令,然后输入另一台主机的IP地址。例如,在客户端上:

1[environment local]
2ping your_server_ip

在服务器上:

1ping your_client_ip

如果从对方主机返回回复(如下面的输出所示),则两个节点通过SDN成功通信。

1[secondary_label Output]
2PING 203.0.113.0 (203.0.113.0) 56(84) bytes of data.
364 bytes from 203.0.113.0: icmp_seq=1 ttl=64 time=0.054 ms
464 bytes from 203.0.113.0: icmp_seq=2 ttl=64 time=0.046 ms
564 bytes from 203.0.113.0: icmp_seq=3 ttl=64 time=0.043 ms

通过重复上面概述的ZeroTier安装和加入过程,您可以向此配置添加任意数量的计算机。请记住,这些机器不需要以任何方式彼此接近。

现在您已经确认您的服务器和客户端能够相互通信,请继续阅读,了解如何调整网络以提供出口网关并构建您自己的VPN。

第五步-开启ZeroTier的VPN能力

正如简介中提到的,可以将ZeroTier用作VPN工具。如果您不打算使用ZeroTier作为VPN解决方案,那么您不需要遵循此步骤,可以跳到步骤6。

使用VPN可以隐藏您与互联网上网站的通信来源。它允许您绕过您正在使用的网络上可能存在的过滤器和限制。对于更广泛的互联网,您将显示为从您的服务器的公共IP地址进行浏览。为了将ZeroTier用作VPN工具,您需要对服务器和客户端的配置进行一些更改。

开启网络地址转换和IP转发

网络地址转换,通常称为NAT,是一种方法,通过该方法,路由器在一个接口上接受标记有发送方IP地址的数据包,然后将该地址交换为路由器的地址。这种交换的记录保存在路由器的内存中,以便当返回流量以相反的方向返回时,路由器可以将IP转换回其原始地址。NAT通常用于允许多台计算机在一个公开的IP地址后面运行,这对于VPN服务来说很方便。NAT在实践中的一个例子是您的互联网服务提供商给您的家用路由器,用于将家中的所有设备连接到互联网。您的笔记本电脑,手机,平板电脑和任何其他支持互联网的设备似乎都共享相同的公共IP地址到互联网,因为您的路由器正在执行NAT。

虽然NAT通常由路由器执行,但服务器也能够执行NAT。在整个步骤中,您将在ZeroTier服务器中利用此功能来启用其VPN功能。

IP转发是路由器或服务器执行的一项功能,在该功能中,如果IP地址位于不同的区域,路由器或服务器会将流量从一个接口转发到另一个接口。如果路由器连接到两个网络,则IP转发允许它在这两个网络之间转发流量。这听起来可能很简单,但要成功实现它可能会令人惊讶地复杂。不过,在本教程中,只需编辑几个配置文件即可。

通过启用IP转发,来自ZeroTier网络中客户端的VPN流量将到达服务器的ZeroTier接口。如果没有这些配置更改,Linux内核将(默认情况下)丢弃不以它们到达的接口为目的地的任何包。这对于Linux内核来说是正常行为,因为通常情况下,到达具有另一个网络的目的地址的接口的任何包都可能是由网络中其他地方的路由错误配置引起的。

将IP转发视为通知Linux内核可以在接口之间转发数据包是很有帮助的。默认设置为0‘-相当于OFF。您可以将其切换为1--相当于开`。

要查看当前配置,请运行以下命令:

1sudo sysctl net.ipv4.ip_forward
1[secondary_label Output]
2net.ipv4.ip_forward = 0

要开启IP转发,请修改您服务器上的/etc/sysctl.conf文件,并添加所需的行。此配置文件允许管理员覆盖默认内核设置,并且将在重新启动后始终应用,因此您不必担心再次设置它。使用nan或您最喜欢的文本编辑器将以下行添加到文件的底部。

1sudo nano /etc/sysctl.conf
1[label /etc/sysctl.conf]
2. . .
3net.ipv4.ip_forward = 1

保存并关闭文件,然后运行下一个命令以触发内核采用新配置

1sudo sysctl -p

服务器将采用文件中的任何新配置指令,并立即应用它们,无需重新启动。运行与前面相同的命令,您将看到IP转发已启用。

1sudo sysctl net.ipv4.ip_forward
1[secondary_label Output]
2net.ipv4.ip_forward = 1

现在已经启用了IP转发,您可以通过为服务器提供一些基本的路由规则来充分利用它。由于Linux内核内部已经嵌入了网络路由功能,您所要做的就是添加一些规则来告诉内置防火墙和路由器它将看到的新流量是可接受的,以及将其发送到何处。

要从命令行添加这些规则,您首先需要知道Ubuntu为您的Zerotier接口和常规的面向互联网的以太网接口分配的名称。它们通常分别是zt0eth0,尽管情况并不总是如此。

要查找这些接口的名称,请使用命令ip link show。此命令行实用程序是iproute2的一部分,它是默认安装在Ubuntu上的用户空间实用程序集合:

1ip link show

在此命令的输出中,接口名称紧挨着标识列表中唯一接口的编号。这些接口名称在以下示例输出中突出显示。如果您的名称与示例中显示的名称不同,请在本指南中适当地替换您的接口名称。

1[secondary_label Output]
21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
3    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
42: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
5    link/ether 72:2d:7e:6f:5e:08 brd ff:ff:ff:ff:ff:ff
63: zt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
7    link/ether be:82:8f:f3:b4:cd brd ff:ff:ff:ff:ff:ff

有了这些信息,使用ipables启用网络地址转换和IP伪装:

1sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

允许流量转发并跟踪活动连接:

1sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

接下来,允许流量从zt0转发到eth0。不需要反向规则,因为在本教程中,假设客户端始终通过服务器调用,而不是通过服务器调用:

1sudo iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT

重要的是要记住,您为服务器设置的iptabes规则不会在两次重新启动之间自动保留。您需要保存这些规则,以确保它们在服务器重新启动时重新生效。在您的服务器上运行以下命令,按照屏幕上的简要说明保存当前的IPv4规则,不需要IPv6。

1sudo apt-get install iptables-persistent
1sudo netfilter-persistent save

在运行sudo netFilter-Persistent save之后,可能需要重新启动服务器以验证是否正确保存了iptabLes规则。一种简单的检查方法是运行sudo iptabLes-save,它会将内存中加载的当前配置转储到您的终端。如果您看到与下面关于伪装、转发和zt0接口的规则类似,则它们被正确保存。

1sudo iptables-save
 1[secondary_label Output]
 2# Generated by iptables-save v1.6.0 on Tue Apr 17 21:43:08 2018
 3. . .
 4-A POSTROUTING -o eth0 -j MASQUERADE
 5COMMIT
 6. . .
 7-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 8-A FORWARD -i zt0 -o eth0 -j ACCEPT
 9COMMIT
10. . .

现在,这些规则已经应用到您的服务器,它已经准备好在ZeroTier网络和公共互联网之间切换流量。然而,VPN将无法运行,除非ZeroTier网络本身被告知服务器已准备好用作网关。

让您的服务器管理全局路由

为了让您的服务器处理来自任何客户端的流量,您必须确保ZeroTier网络中的其他客户端知道将其流量发送到它。可以通过在ZeroTier控制台中设置全局路由来做到这一点。熟悉计算机网络的人也可以将其描述为_Default Route_。它是任何客户端发送其默认流量的地方,即任何不应该到达任何其他特定位置的流量。

转到ZeroTier Networks页面的右上角,并使用以下参数添加新的路由。您可以在ZeroTier网络配置页面的成员 部分找到您的服务器的ZeroTier IP。在** 网络/位** 字段中输入0.0.0.0/0,在** (局域网)** 字段中输入您的ZeroTier服务器的IP地址。

当详细信息准备就绪后,单击**+** 符号,您将看到一个新规则出现在现有规则的下方。它将有一个橙色的地球仪,以传达这确实是一条全球航线:

全局路由规则

随着您的ZeroTier网络准备就绪,在VPN运行之前只剩下一个配置:客户端的配置。

配置linux客户端

<$>[备注] 注意:本节中的命令仅适用于Linux客户端。配置Windows或MacOS客户端的说明将在下一节中提供。 <$>

如果您的客户端运行的是Linux,则需要手动更改其/etc/sysctl.conf文件。此配置更改是必需的,以改变内核对客户端流量的可接受返回路径的看法。由于ZeroTier VPN的配置方式,从您的服务器返回到您的客户端的流量有时看起来可能来自与其发送到的网络地址不同的网络地址。默认情况下,Linux内核会将它们视为无效并将其删除,因此有必要覆盖该行为。

在您的客户机上打开/etc/sysctl.conf

1[environment local]
2sudo nano /etc/sysctl.conf

然后添加以下行:

1[secondary_label Output]
2. . .
3
4net.ipv4.conf.all.rp_filter=2

保存并关闭文件,然后运行sudo sysctl-p以采用更改。

1[environment local]
2sudo sysctl -p

接下来,告诉ZeroTier客户端软件允许您的网络传输默认路由流量。这会修改客户端的路由,因此被视为特权功能,这就是为什么必须手动启用它。该命令将配置结构打印到输出。检查此选项以确认顶部显示AllowDefault=1

1[environment local]
2sudo zerotier-cli set NetworkID allowDefault=1

如果您希望在任何时候停止使用ZeroTier作为VPN,并且您的所有流量都通过它进行路由,请将AllowDefault设置回0

1[environment local]
2sudo zerotier-cli set NetworkID allowDefault=0

每次重新启动客户端上的ZeroTier服务时,AllowDefault=1值都会重置为0,所以请记住重新执行它才能激活VPN功能。

默认情况下,ZeroTier服务设置为在Linux客户端和服务器引导时自动启动。如果您不希望出现这种情况,可以使用以下命令禁用启动例程。

1[environment local]
2sudo systemctl disable zerotier-one

如果您想在您的ZeroTier网络上使用其他操作系统,请阅读下一节。否则,请跳到管理流程部分。

配置非linux客户端

ZeroTier客户端软件可用于许多系统,而不仅仅是Linux操作系统--甚至支持智能手机。Windows、MacOS、Android、iOS甚至QNAP、Synology和WestnDigital NAS系统等专业操作系统都有客户。

要将基于MacOS和Windows的客户端加入网络,请启动ZeroTier工具(您在步骤1中安装了该工具),并在提供的字段中输入您的网络ID,然后单击加入 。记得在ZeroTier控制台中勾选** 允许** 按钮,授权一台新主机进入您的网络。

一定要勾选标记为路由所有流量通过ZeroTier 的框。如果不这样做,您的客户端将连接到您的ZeroTier网络,但不会费心尝试通过该网络发送其互联网流量。

使用IP检查工具,如ICanHazIP),验证您的通信量是否显示为从您服务器的IP到Internet。要检查这一点,请将以下URL粘贴到浏览器的地址栏中。本网站将显示其服务器(和互联网的其他部分)看到您用来访问本网站的IP地址:

1http://icanhazip.com

完成这些步骤后,您可以开始随心所欲地使用VPN。下一个可选部分介绍了ZeroTier SDN中内置的一种称为流规则的技术,但它们不是VPN功能工作所必需的。

第六步-管理流程(可选)

软件定义网络的好处之一是集中式控制器。对于ZeroTier,集中式控制器是位于整个ZeroTier SDN服务之上的Web用户界面。从这个接口,可以编写称为_flow rules_的规则,这些规则指定网络上的流量可以或不能做什么。例如,您可以对通过网络传输流量的某些网络端口指定blanket-ban,限制哪些主机可以相互通信,甚至重定向流量。

这是一种非常强大的功能,几乎立即生效,因为对流表所做的任何更改都会推送到网络成员,并在几分钟后生效。要编辑流量规则,请返回ZeroTier Web用户界面,单击网络 选项卡,然后向下滚动,直到您看到一个名为** 流量规则** 的框(它可能已折叠,需要展开)。这将打开一个文本字段,您可以在其中输入任何您想要的规则。在ZeroTier控制台中的** 流规则** 输入框下方的一个框中可以找到完整的手册,标题为** 规则引擎帮助** 。

以下是一些示例规则,可帮助您探索此功能。

要拦截所有去往Google的8.8.8.8域名服务器的流量,请添加以下规则:

1drop
2    ipdest 8.8.8.8/32
3;

要将发往Google公共DNS服务器的任何流量重定向到您的ZeroTier节点之一,请添加以下规则。对于覆盖DNS查找,这可能是一个极好的统称:

1redirect NetworkID
2    ipdest 8.8.8.8/32
3;

如果您的网络有特殊的安全要求,您可以通过添加以下规则来丢弃在FTP端口、Telnet和未加密的HTTP上的任何活动:

1drop
2    dport 80,23,21,20
3;

添加完流程规则后,点击[保存更改]按钮,ZeroTier将记录您的更改。

结论

在本教程中,您已经迈出了软件定义网络世界的第一步,使用ZeroTier可以让您深入了解该技术的好处。如果您遵循VPN示例,那么尽管初始设置可能与YO过去可能使用的其他工具形成对比,但添加更多客户端的简便性可能是在其他地方使用该技术的一个令人信服的理由。

总之,您了解了如何将ZeroTier用作SDN提供程序,以及如何配置节点并将其连接到该网络。VPN元素将使您更深入地了解此类网络中的路由是如何运行的,本教程中的任一路径都将允许您利用强大的流规则技术。

现在已经存在点对点网络,您可以将其与另一种功能(如文件共享)相结合。如果您家里有NAS或文件服务器,您可以将其连接到ZeroTier,并在移动中访问它。如果你想与你的朋友分享,你可以向他们展示如何加入你的ZeroTier网络。分布在大范围内的员工甚至可以链接回相同的中央存储空间。要开始为这些示例构建文件共享,请查看How to Set up a Samba Share for A Small Organization on Ubuntu 16.04.

Published At
Categories with 技术
comments powered by Disqus