内网穿透工具,自建私有Zerotier
什么是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
moon
转planet
文件:mkmoonworld
这次部署自建跟服务器使用的是docker
和docker-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
按钮
-
点击
Easy setup
按钮,进行配置
-
设置一个网络地址范围,这块关于IP不清楚的可以自己查一下。设置完成后,开始和结束IP会自己出现,只需要点击一下输入框即可,然后点击
Submit
按钮。上方的括号内是你的网络Id
,配置客户端的时候使用。
配置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
服务,将它重启即可。 -
启动
Zerotier
,选择Add Network
,然后将自己建立的`网络Id放入。 -
成功加入网络后,还要去我们自建的
zerotier planet
去进行授权,点击自己的网络,然后在members
列表中就会看到刚刚加入的设备了,勾选Authorized
即可连接。