什么是Zerotier

有时候我们可能在自己家里部署了NAS或者自己的小型服务器,但因为没有公网IP,所以我们无法在外访问它们,这就让我们只能在家里享受这些设备。而zerotier是一款内网穿透工具,让我们没有公网IP的内网能在任意地方访问。

官网描述:ZeroTier 让您可以构建几乎任何类型的现代、安全的多点虚拟化网络。从强大的对等网络到多云网状基础设施,我们通过本地网络的简单性实现全球连接。

说白了,zerotier就是创建一个以太网上的局域网,让绑定的设备可以像在局域网里一样在任何地方互相访问。

zerotier网络体系中,有三个节点:

  • planet:根服务器(root server)被称为星球(planet
  • leaf:每一台联网设备都被称为叶子(leaf
  • moon:月亮(moon)是用来加速星球(planet)连接速度的,当星球(planet)无法连接或连接速度过慢时,会连接月亮(moon

使用Zerotier

使用Zerotier也非常的简单,只需要在官网注册登录,然后创建网络。在设备端去官网下载zerotier的程序连接创建的网络即可访问家中的局域网了。

但是因为zerotier官网提供的服务有数量限制,最多只有25个,并且一直在下调。并且因为zerotier的服务器是在国外,我们连接时会有很大的延时,我们可以创建moon,但其实使用下来,设备还是会去连接zerotier官方的planet,所以自建zerotier planet就可以解除限制,并且加快速度,愉快的访问家庭局域网了。

自建Zerotier planet

本次自建zerotier planet参考的是github上的项目,感谢github上的大佬们无私奉献。

github项目:ztncui
docker-compose部署:zerotier-planet
moonplanet文件:mkmoonworld

这次部署自建跟服务器使用的是dockerdocker-compose进行部署,主要参考了jonnyan大佬分享的方法,但因为我的服务器有nginx代理和域名,并且我想要指定zerotier的端口,所以做了一些修改。

获取所需文件

# 创建zerotier的目录
mkdir /data/zerotier-planet
cd /data/zerotier-planet

# 下载mkmoonworld
wget https://github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86_64

创建docker-compose.yml文件

version: '3.0'
services:
    ztncui:
        container_name: zerotier
        restart: always
        environment:
            - MYADDR=1.2.3.4  #改成自己的服务器公网IP
            - HTTP_PORT=4000  #填写容器内的端口号
            - ZERO_PORT=10010 #暴露出去的端口,ztncui在容器内还是会以9993启动
            - HTTP_ALL_INTERFACES=yes
            - ZTNCUI_PASSWD=your_password #你的登录密码
        ports:
            - '10086:4000'     # web控制台入口
            - '10010:9993'     # 用于zerotier通信
            - '10010:9993/udp' # 用于zerotier通信
            - '10000:3180'     # planet/moon文件在线下载入口
        volumes:
            - './zerotier-one:/var/lib/zerotier-one'
            - './ztncui/etc:/opt/key-networks/ztncui/etc'
            # 按实际路径挂载卷, 冒号前面是宿主机的, 支持相对路径
        image: keynetworks/ztncui

创建patch.sh脚本文件

#!/bin/sh
set -x
chmod 777 /tmp/mkmoonworld-x86_64
# 创建moon配置文件
zerotier-idtool initmoon /var/lib/zerotier-one/identity.public > moon.json
chmod 777 moon.json
#
# 根据容器启动时的环境变量,配置定义的ip和端口
moonip="[\"${MYADDR}/${ZERO_PORT}\"]"
# 替换IP
sed -i "s#127.0.0.1#${MYADDR}#g" moon.json
sed -i "s#\[\]#${moonip}#g" moon.json
#
#cat moon.json
zerotier-idtool genmoon moon.json
/tmp/mkmoonworld-x86_64 moon.json
#
mkdir /var/lib/zerotier-one/moons.d
cp *.moon /var/lib/zerotier-one/moons.d
mv world.bin planet
cp -f planet /var/lib/zerotier-one/planet
#
cp *.moon planet  /opt/key-networks/ztncui/etc/myfs
moon_id=$(cat /var/lib/zerotier-one/identity.public | cut -d ':' -f1)
echo -e "Your ZeroTier moon id is \033[0;31m$moon_id\033[0m, you could orbit moon using \033[0;31m\"zerotier-cli orbit $moon_id $moon_id\"\033[0m"

部署zerotier-planet

#启动容器
docker-compose up -d
#将mkmoonworld文件移入docker容器内
docker cp mkmoonworld-x86_64 zerotier:/tmp
#将patch脚本移入docker容器内
docker cp patch.sh zerotier:/tmp
#执行脚本
docker exec -it zerotier bash /tmp/patch.sh
#重启容器,这一步很重要,不要忘记了
docker restart zerotier

NGINX反向代理配置

配置域名和证书

下面是简单的步骤,详情可参考部署nginx及申请TLS证书这篇文章

  • 首先把域名做一条A记录,然后将域名指向服务器
  • 增加nginx配置
  • 使用certbot申请tls证书

nginx.conf配置文件

server {
		listen 80;
		listen [::]:80;
		server_name your_domain.com;
	
		# Let's Encrypt authentication (highest priority first)
		location ~ /.well-known {
			root /usr/share/nginx;
			allow all;
		}
	
		 rewrite ^(.*)$ https://$host$1 permanent; # http to https
}



# Settings for a TLS enabled server.
server {
        listen       443 ssl;
        listen       [::]:443 ssl;
        server_name  your_domain.com;

        ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
        ssl_protocols TLSv1.1 TLSv1.2; 

        ssl_session_cache shared:MozSSL:10m;
        ssl_session_timeout  5m; #会话过期时间5分钟
        ssl_session_tickets off; #会话票证,开启能节省TLS握手开销
        ssl_ciphers HIGH:!aNULL:!MD5; #nginx初始加密

        # Let's Encrypt authentication (highest priority first)
		location ~ /.well-known {
	            root /usr/share/nginx;
	            allow all;
	        }

		# zerotier
		location / {
	                proxy_pass http://127.0.0.1:10010;
	                #proxy_redirect off;
	                proxy_set_header HOST $host;
	                proxy_set_header X-Forwarded-Proto $scheme;
	                proxy_set_header X-Real-IP $remote_addr;
	                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	        }
}

Zerotier使用说明

配置zerotier-planet

  • 访问你的域名进入zerotier的登录页面,用户名为admin,密码是在docker-compose.yml中设置的。

  • 点击导航栏上的Add network,起一个名字然后点击Create Network按钮
    zerotier_create_network

  • 点击Easy setup按钮,进行配置
    zerotier_network_info

  • 设置一个网络地址范围,这块关于IP不清楚的可以自己查一下。设置完成后,开始和结束IP会自己出现,只需要点击一下输入框即可,然后点击Submit按钮。上方的括号内是你的网络Id,配置客户端的时候使用。
    zerotier_set_network

配置Zerotier-leaf

  • 在官网下载相应的客户端,这里以windows系统为例,官网地址:https://www.zerotier.com,按照自己的设备下载客户端,然后进行安装即可。

  • 获取服务器上planet文件。如果你指定了下载的域名,直接访问你的域名下载即可。如果没有指定,那么只需要进入/data/zerotier-planet/ztncui/etc/myfs目录,找到planet文件,将他放到自己的设备上即可。

  • 替换客户端planet文件,进入C:\ProgramData\ZeroTier\One目录中,把从服务器下载下来的planet文件放入该目录下进行替换,原文件可以自己备份一下。

  • 重启客户端zerotier服务,在windows搜索中搜索服务,然后找到Zerotier One服务,将它重启即可。configure_zerotier_client

  • 启动Zerotier,选择Add Network,然后将自己建立的`网络Id放入。

  • 成功加入网络后,还要去我们自建的zerotier planet去进行授权,点击自己的网络,然后在members列表中就会看到刚刚加入的设备了,勾选Authorized即可连接。zerotier_authorized

文章作者: Willxup
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Willxup
Linux Linux
喜欢就支持一下吧