ZeroTier软件原理与使用
ZeroTier软件原理与使用
内网穿透概述
内网,也称为局域网,是由路由器搭建的网络。在内网中,设备使用私有IP地址进行通信,这些IP地址无法在公网上直接访问。为了使内网设备能够被公网访问,需要进行NAT(网络地址转换)穿透。NAT穿透的目的是使具有特定源IP地址和源端口号的数据包不被NAT设备屏蔽,而是正确路由到内网主机。
内网穿透的四种常见手段
端口映射
端口映射是一种将公网IP地址和端口映射到局域网内一台计算机的指定端口上的技术。实现端口映射需要在路由器上进行配置,将路由器的公网IP地址和端口与内网中的计算机的IP地址和端口相映射。当公网用户请求这个IP地址和端口时,路由器会将请求转发到内网计算机的指定端口上,从而实现内网穿透。
反向代理
反向代理是一种将公网上的访问请求转发到局域网内一台计算机的指定端口上的技术。实现反向代理需要在公网服务器上部署一个代理服务器,在代理服务器上配置反向代理规则,将公网请求转发到内网服务器上的指定端口。从而实现内网穿透。
VPN
VPN(虚拟专用网络)是一种通过公用网络建立安全的、点对点连接的私人网络技术。VPN可以让远程用户或外部网络通过加密的方式连接到内部网络,实现内网穿透。VPN方案的优点是安全性较高,能够通过加密的方式保护数据的传输,同时也支持多种协议,比如PPTP、L2TP、SSTP、OpenVPN等。但是,VPN方案的缺点是需要在内网中部署VPN服务器,并且需要额外的软件支持,部署和维护较为复杂。
NAT穿透
NAT穿透通常通过以下两种方式实现:
UDP Hole Punching(UDP穿透)
UDP Hole Punching是通过UDP协议建立连接的NAT Traversal技术,它利用NAT路由器在UDP通信过程中开启的临时端口号,绕过NAT转换建立直接连接。其实现流程如下:
- 客户端向服务器发送UDP数据包,该数据包中包含了客户端的公网IP地址和临时端口号。
- 由于UDP数据包是无连接的,NAT路由器并不知道该数据包是要转发到哪个内网计算机上。因此,客户端需要在数据包中携带一个标识符,以便让服务器识别该数据包是由哪个客户端发送的。
- 服务器收到客户端发送的UDP数据包后,会回复一个数据包到客户端,该数据包中携带了服务器的公网IP地址和端口号。
- 客户端和服务器都会开启一个新的UDP数据包监听器,用于接收对方发送的数据包。由于NAT路由器会将第一个发送的UDP数据包的临时端口号映射到对应的内网计算机上,因此客户端和服务器都可以通过该端口号向对方发送数据包,建立连接。
TCP Hole Punching(TCP穿透)
TCP Hole Punching是通过TCP协议建立连接的NAT Traversal技术,它利用TCP三次握手建立连接的特点,通过同时向NAT路由器发送数据包,使得NAT路由器在建立连接时将数据包转发到对应的内网计算机上,从而实现NAT穿透。其实现流程如下:
- 客户端向服务器发送SYN数据包,该数据包中包含了客户端的公网IP地址和端口号。
- 服务器收到客户端发送的SYN数据包后,回复一个SYN+ACK数据包到客户端,该数据包中携带了服务器的公网IP地址和端口号。
- 客户端收到服务器的SYN+ACK数据包后,会回复一个ACK数据包到服务器,该数据包中携带了客户端的公网IP地址和端口号。
- 由于客户端和服务器都同时向对方发送了数据包,NAT路由器在记录连接信息时就会将客户端和服务器的信息都记录下来,并将对应的端口打开。此时,客户端和服务器就可以直接通过NAT路由器通信了。这个时候,NAT路由器其实就相当于一个交换机了,因为它只需要根据端口信息进行转发就可以了,不需要再进行IP地址转换。
- 需要注意的是,TCP Hole Punching的成功率比UDP Hole Punching要高,但是由于TCP协议的特点,它只能在客户端和服务器之间建立点对点的连接,无法实现多客户端之间的通信。另外,由于TCP协议在建立连接时需要进行三次握手,因此TCP Hole Punching的连接建立速度相对较慢,不适合需要快速建立连接的场景。
ZeroTier软件介绍
ZeroTier是一个开源的虚拟局域网软件,可以实现跨网络的设备互联。使用ZeroTier非常简单,只需要下载并安装客户端软件,然后通过Web界面创建虚拟网络并添加成员设备即可。
下载ZeroTier客户端软件
ZeroTier提供了多种操作系统下的客户端软件,包括Windows、Linux、macOS等。下载地址为:https://www.zerotier.com/download/
进入Web操作界面
ZeroTier Central是ZeroTier的Web管理界面,可以通过浏览器访问。在Basic设置中,可以创建新的虚拟网络:
在Advanced设置中,可以配置网络的IP地址、子网掩码等高级选项:
在成员管理页面,可以添加和管理网络中的设备:
搭建Moon服务器
为了提高网络连接速度,可以在自己的服务器上搭建ZeroTier的Moon服务器。Moon服务器相当于一个自定义的VPN节点,可以加速设备之间的连接。
基本概念
- Earth:整体的服务。
- Planet:官方提供的服务器节点。
- Moon:自定义的Planet,可以加速连接速度。
- Leaf:连接到网络上的设备。
搭建步骤
在服务器上安装ZeroTier客户端:
curl -s https://install.zerotier.com/ | sudo bash
启动ZeroTier服务:
sudo systemctl start zerotier-one.service sudo systemctl enable zerotier-one.service
加入虚拟网络:
sudo zerotier-one cli join 你的网络ID
生成Moon配置文件:
cd /var/lib/zerotier-one zerotier-idtool initmoon identity.public > moon.json
编辑moon.json文件,添加服务器的公网IP和端口:
["xxx.xxx.xxx.xxx/9993"]
生成Moon配置:
zerotier-idtool genmoon moon.json
将生成的moon文件移动到moons.d目录:
mkdir moons.d sudo mv 000000xxxxxxxxx.moon moons.d/
重启ZeroTier服务:
sudo systemctl restart zerotier-one
在其他设备上检查Moon服务器是否连接成功:
zerotier-cli listpeers
如果发现Moon服务器的IP地址显示为"----",说明端口被防火墙拦截,需要在服务器上放行9993端口。
参考资料
- 内网穿透:知乎
- ZeroTier官方文档:https://www.zerotier.com/
- ZeroTier知识库:https://confluence.atlassian.net/wiki/spaces/ZERO/pages/123456789/Getting+Started+with+ZeroTier