介绍
现在,越来越多的软件项目由团队成员组成,团队成员从不同的地理位置一起工作。 虽然这个工作流程有许多明显的优势,但有些情况下,这些团队可能希望通过互联网将他们的计算机连接在一起,并将他们视为在同一个房间中。 例如,您可能正在测试分布式系统(如Kubernetes)或构建复杂的多服务应用程序。 有时候,如果您可以将机器视为彼此相邻,那么它们只会提高生产力,因为您不需要冒险将未完成的服务暴露给互联网。 这种模式可以通过软件定义网络(SDN)来实现,SDN是一种相对较新的技术,可以提供动态网络结构,其存在完全由软件组成。
ZeroTier One是一个开源应用程序,它使用SDN中的一些最新开发,允许用户创建安全,可管理的网络,并将连接的设备视为处于相同的物理位置。 ZeroTier为客户提供网络管理和端点软件的Web控制台。 这是一种加密的点对点技术,这意味着与传统VPN解决方案不同,通信不需要通过中央服务器或路由器 - 消息直接从主机发送到主机。 因此它非常高效并且确保最小的延迟。 其他好处包括ZeroTier的简单部署和配置过程,简单的维护,并允许通过Web控制台集中注册和管理授权节点。
按照本教程,您将通过简单的点对点网络将客户端和服务器连接在一起。 由于软件定义网络不使用传统的客户端/服务器设计,因此不需要安装和配置中央VPN服务器; 这简化了工具的部署并添加了任何补充节点。 连接建立后,您将有机会利用ZeroTier的VPN功能,通过使用一些聪明的Linux功能,让流量从您的服务器离开您的ZeroTier网络,并指示客户端向该方向发送流量。
先决条件
在学习本教程之前,您需要以下资源:
运行Ubuntu 16.04的服务器。 在此服务器上,您还需要一个非root用户,并使用sudo权限,这可以使用我们针对Ubuntu 16.04的初始服务器设置指南进行设置 。
您可以通过转到My ZeroTier来设置ZeroTier One帐户。 为了本教程的目的,您可以使用免费版本的此服务,不附带任何费用或承诺。
本地计算机作为客户端加入您的SDN。 在本教程的示例中,服务器和本地计算机都运行Ubuntu Linux,但ZeroTier下载页面上列出的任何操作系统都将在客户端上运行。
有了这些先决条件,您就可以为您的服务器和本地机器设置软件定义的网络。
第1步 - 使用ZeroTier One创建软件定义的网络
ZeroTier平台为您的软件定义网络提供了控制的中心点。 在那里,您可以授权和取消授权客户端,选择寻址方案,并创建一个网络ID,您可以在设置它们时指导您的客户端。
登录到您的ZeroTier帐户,点击屏幕顶部的网络 ,然后点击创建 。 自动生成的网络名称将会出现。 点击它查看您的网络配置屏幕。 记下以黄色显示的网络ID ,因为您需要稍后参考。
如果您希望将网络名称更改为更具描述性的内容,请在屏幕左侧编辑名称; 如果你愿意,你也可以添加一个描述。 您所做的任何更改都将被保存并自动应用。
接下来,选择SDN将在哪个IPv4地址范围上运行。 在屏幕的右侧,在标题为“ IPv4自动分配 ”的区域中,选择您的节点将处于的地址范围。 为了本教程的目的,可以使用任何范围,但重要的是将自动分配范围框勾选。
确保左侧的访问控制保持设置为证书(专用网络) 。 这可以确保只有经过认可的机器才能连接到您的网络,而不仅仅是任何碰巧知道您的网络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'
-s'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61curl -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"
if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z"
- 本节中有几件事情发生,但它本质上转换为:“如果从ZeroTier.com下载的加密签名安装脚本通过GPG并且未被ZeroTier签名拒绝,则粘贴信息到屏幕上。“ -
sudo bash; fi
sudo bash; fi
- 此部分采用新验证的安装程序脚本,并在结束例程之前实际执行它。
警告:除非您确定它来自可信来源,否则绝不应从互联网上下载任何内容并将其传送到其他程序中。 如果您愿意,您可以通过查看项目官方GitHub页面上的源代码来检查ZeroTier软件。
使用SSH控制台连接到新创建的服务器,并以普通用户身份运行以下命令(以下提供了该命令的说明)。 确保你不要以根用户身份运行它,因为脚本会自动请求你的密码来提高它的权限级别,并记住在你的浏览器中保持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网络。 客户的初始请求将被拒绝并被搁置,但我们会立即解决。 请确保使用之前在网络配置窗口中记下的网络ID替换NetworkID 。
sudo zerotier-cli join NetworkID
Output200 join OK
您将收到200 join OK
消息,确认服务器上的ZeroTier服务已理解该命令。 如果您不这样做,请仔细检查您输入的ZeroTier网络ID。
由于您尚未创建任何世界上的任何人都可以加入的公共网络,因此您现在需要授权您的客户。 转到ZeroTier Web控制台并向下滚动到“ 会员”部分所在的底部。 您应该看到标有“ 在线”的两个条目,其中包含您之前提到的相同地址。
在标记为Auth的第一列中? ,勾选这些框以授权他们加入网络。 Zerotier控制器会在您下次调用SDN时从您之前选择的范围中为服务器和客户端分配一个IP地址。
分配IP地址可能需要一些时间。 在等待时,您可以在“ 成员”部分中为您的节点提供短名称和说明 。
这样,你就可以将两个系统连接到你的软件定义网络。
到目前为止,您已经对ZeroTier控制面板有了基本的了解,使用命令行界面下载并安装了ZeroTier,然后将服务器和客户端连接到该网络。 接下来,您将通过执行连接测试来检查是否正确应用了所有内容。
第4步 - 验证连接
在这个阶段,验证两台主机实际上可以相互交谈很重要。 即使主持人声称加入网络,他们也有可能无法沟通。 通过现在验证连通性,您将不必担心后面可能导致麻烦的基本互连问题。
查找每个主机的ZeroTier IP地址的简单方法是查看ZeroTier Web控制台的成员部分。 在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隐藏了与互联网上的网站通信的来源。 它允许您绕过您正在使用的网络上可能存在的过滤器和限制。 对于更广泛的互联网,您将看起来是从您的服务器的公共IP地址浏览。 为了将ZeroTier用作VPN工具,您需要对服务器和客户端的配置进行一些更改。
启用网络地址转换和IP转发
网络地址转换 ( Network Address Translation) ,通常被称为“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
. . .
net.ipv4.ip_forward = 1
保存并关闭文件,然后运行下一个命令来触发内核采用新配置
sudo sysctl -p
服务器将采用该文件中的任何新配置指令并立即应用它们,而不需要重新启动。 像以前一样运行相同的命令,您将看到IP转发已启用。
sudo sysctl net.ipv4.ip_forward
Outputnet.ipv4.ip_forward = 1
现在IP转发已启用,您可以通过向服务器提供一些基本路由规则来充分利用IP转发。 由于Linux内核内部已经具有网络路由功能,因此您只需添加一些规则即可告诉内置防火墙和路由器它将看到的新流量是可以接受的以及将它发送到哪里。
要从命令行添加这些规则,首先需要知道Ubuntu分配给Zerotier接口和常规的面向Internet的以太网接口的名称。 这些通常分别是zt0
和eth0
,但情况并非总是如此。
要查找这些接口的名称,请使用命令ip link show
。 这个命令行实用程序是iproute2
一部分, 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 netfilter-persistent save
可能是值得的。 一个简单的检查方法是运行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网络和公共互联网之间进行流量了。 但是,除非ZeroTier Network本身被告知服务器已准备好用作网关,否则VPN将不起作用。
启用您的服务器来管理全局路由
为了让您的服务器处理来自任何客户端的流量,您必须确保ZeroTier网络中的其他客户端知道将流量发送给它。 可以通过在ZeroTier控制台中设置全局路由来完成此操作。 熟悉计算机网络的人也可以将其描述为默认路由 。 这是任何客户端发送其默认流量的地方,即任何不应该流向任何其他特定位置的流量。
转到ZeroTier Networks页面的右上角,添加一个包含以下参数的新路线。 您可以在您的ZeroTier网络配置页面的成员部分找到您的服务器的ZeroTier IP。 在网络/位字段中,在(LAN)字段中输入0.0.0.0/0
,输入您的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。 请记住在ZeroTier控制台中检查以勾选允许按钮以授权新的主机进入您的网络。
务必勾选标记为通过ZeroTier路由所有流量的方框 。 如果你不这样做,你的客户将被连接到你的ZeroTier网络,但不会打扰尝试通过它发送它的互联网流量。
使用ICanHazIP等IP检查工具来验证您的流量是否从服务器的IP出现在互联网上。 要检查这一点,请将以下URL粘贴到浏览器的地址栏中。 本网站将显示其服务器(以及其他互联网)用来访问该站点的IP地址:
http://icanhazip.com
完成这些步骤后,您可以开始使用您的VPN。 下一个可选部分涵盖了被称为“流量规则”的ZeroTier SDN中内置的技术,但它们并不是VPN功能所必需的。
第6步 - 管理流程(可选)
软件定义网络的好处之一是集中控制器。 就ZeroTier而言,集中控制器是位于整体ZeroTier SDN服务之上的Web用户界面。 通过这个接口,可以编写规则,称为流规则 ,用于指定网络上的流量可以做什么或不可以做什么。 例如,您可以在通过网络传输流量的特定网络端口上指定一揽子禁止,限制哪些主机可以相互通信,甚至重定向流量。
这是一个非常强大的功能,几乎可以立即生效,因为对流表进行的任何更改都会推送给网络成员,并在短时间内生效。 要编辑流程规则,请返回到ZeroTier Web用户界面,单击网络选项卡,然后向下滚动,直到看到一个标题为“ 流量规则” (可能已折叠且需要扩展)的框。 这将打开一个文本字段,您可以输入任何您想要的规则。 在“ 流量规则”输入框下面的一个框中,ZeroTier控制台中提供了一个完整的手册,标题为“规则引擎帮助” 。
以下是帮助您探索此功能的一些示例规则。
要阻止任何绑定到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共享 。