zerotier使用
# 专有名词
PLANET :行星服务器,Zerotier 根服务器
MOON :卫星服务器,用户自建的私有根服务器,起到代理加速的作用
LEAF :网络客户端,就是每台连接到网络节点。
# 我们本次搭建的就是 PLANET 行星服务器

# 防火墙开放端口 4000/3180 和 9993
git clone https://github.com/Jonnyan404/zerotier-planet
OR
git clone https://gitee.com/Jonnyan404/zerotier-planet
cd zerotier-planet
ls
# LICENSE
# README.md
# docker-compose.yml
# mkmoonworld-x86_64
# patch.sh
# 修改docker-compose的MYADDR为公网ip
docker-compose up -d
# 以下步骤为创建planet和moon
docker cp mkmoonworld-x86_64 ztncui:/tmp
docker cp patch.sh ztncui:/tmp
docker exec -it ztncui bash /tmp/patch.sh
# Your ZeroTier moon id is f7261acbc5, you could orbit moon using "zerotier-cli orbit f7261acbc5 f7261acbc5"
docker restart ztncui
# 然后浏览器访问 http://ip:4000 打开web控制台界面。
用户名: admin
密码: mrdoc.fun
# 浏览器访问 http://ip:3180 打开planet和moon文件下载页面(亦可在项目根目录的./ztncui/etc/myfs/里获取)
# 替换官方的planet文件
# windows: C:\ProgramData\ZeroTier\One
# linux: /var/lib/zerotier-one 需要先运行一次才会出现(sudo systemctl start zerotier-one.service), 进行替换
# 如果是alpine, 需要3.17才有包, 且加入之后手动配置获取的静态ip(netmask/gateway不用配置, 只要address配置为获取的ip即可)
# 官方包:
http://download.zerotier.com/
http://download.zerotier.com/debian/buster/pool/main/z/zerotier-one/
# android客户端: https://github.com/kaaass/ZerotierFix/releases
# 替换文件之后需要重启服务, linux使用命令, win在[服务]里面
# [web端]Add network 创建网络, 获取到一个前缀和moon id一致的网络ID, 如: f7261acbc52a8047
zerotier-cli join {网络id}
zerotier-cli join f7261acbc52a8047
# 离开
zerotier-cli listnetworks
zerotier-cli leave f7261acbc52a8047
# [web端] Easy setup 配置内网ip分配, [IP assignment]就会有内网ip
# [web端] network 开启[Authorized] [Active bridge]
# 查看状态
zerotier-cli peers
# 可以看到有一个 PLANTET 和 LEAF 角色,连接方式均为 DIRECT(直连)
# 到这里就加入网络成功了
# 最后可以通过[IP assignment]的ip进行访问了
配合adguard/adguardhome定义本地的域名dns, 就可以通过域名访问了
# 运行 adguard/adguardhome, 参考: docs/source/dir1/openwrt/配置openwrt国内源.md
# 增加[DNS 黑名单]策略文件
# 最后客户端使用dns服务器进行解析即可
docker-compose.yml
### date:2021年11月29日
### author: www.mrdoc.fun | jonnyan404
### 转载请保留来源
### update:2022年08月14日
version: '2.0'
services:
ztncui:
container_name: ztncui
restart: always
environment:
- MYADDR=1.1.1.1 #改成自己的服务器公网IP
- HTTP_PORT=4000
- HTTP_ALL_INTERFACES=yes
- ZTNCUI_PASSWD=mrdoc.fun
ports:
- '4000:4000' # web控制台入口
- '9993:9993'
- '9993:9993/udp'
- '3180:3180' # planet/moon文件在线下载入口,如不对外提供。可防火墙禁用此端口。
volumes:
- './zerotier-one:/var/lib/zerotier-one'
- './ztncui/etc:/opt/key-networks/ztncui/etc'
# 按实际路径挂载卷, 冒号前面是宿主机的, 支持相对路径
image: keynetworks/ztncui
patch.sh
#!/bin/sh
### date:2022年08月14日
### author: www.mrdoc.fun | jonnyan404
### 转载请保留来源
set -x
chmod 777 /tmp/mkmoonworld-x86_64
zerotier-idtool initmoon /var/lib/zerotier-one/identity.public > moon.json
chmod 777 moon.json
moonip="[\"${MYADDR}/9993\"]"
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"
官方docker使用
docker run -itd --name myzerotier \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN \
--device /dev/net/tun \
--restart=unless-stopped \
registry.cn-hangzhou.aliyuncs.com/jcleng/zerotier-zerotier:latest
docker exec myzerotier zerotier-cli join e3918db4831c3510
docker exec myzerotier zerotier-cli listnetworks
moon中转服务器搭建
# 端口[9993/9994]
docker run -itd \
--network=host \
--restart=always \
--name=moon \
registry.cn-hangzhou.aliyuncs.com/jcleng/zerotier-zerotier:latest
docker exec -it moon bash
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public >moon.json
# 记住id, 并修改stableEndpoints填写公网IP
exit
docker cp moon:/var/lib/zerotier-one/moon.json .
vi moon.json
"stableEndpoints": ["39.105.105.195/9993"]
# 如果有ipv6
"stableEndpoints": ["39.105.105.195/9993","2001:abcd:abcd::1/9993" ]
docker cp ./moon.json moon:/var/lib/zerotier-one/moon.json
# 创建 Moon 文件
docker exec -it moon bash
cd /var/lib/zerotier-one
zerotier-idtool genmoon moon.json
# wrote 000000xxxxxxxxxx.moon (signed world with timestamp 1721096139536)
mkdir moons.d
mv *.moon moons.d/
exit
docker restart moon
# 查看节点是否运行成功,以及状态
docker exec -it moon zerotier-cli info
# 200 info cfdd1ff1ac 1.14.0 ONLINE
docker exec -it moon zerotier-cli listmoons
# [客户端]加入: win和linux
# Moon 节点 ID 是 .moon 文件除去开头0
# zerotier-cli orbit <Moon 节点 ID> <Moon 节点 ID>
zerotier-cli orbit xxxxxxxxxx xxxxxxxxxx
# 客户端加入之后查看节点, 能看到刚刚的MOON服务器ip为正常
zerotier-cli listpeers|grep MOON
# 删除MOON节点
zerotier-cli deorbit 943775924f
# 端口, 视乎运行之后没次不一样
netstat -tulnp|grep zerotier
9993/56134/23467
# 检测客户端是否连接到了moon服务器, 125.xx.xx.222 是客户端的公网ip: https://ip.900cha.com/
# 客户端获取ip
curl cip.cc
# moon服务端查看IP
zerotier-cli listpeers|grep 125.xx.xx.222
# 安卓使用zerotierFix[入轨]输入两次xxxxxxxxxx
# 通过下载文件, 并中途停止moon服务器查看是否进行了中转
openwrt使用
vi /etc/config/zerotier
# enabled
config zerotier 'sample_config'
option enabled '1'
list join 'e3918db4831c3510'
option nat '0'
# 提交配置并重启
uci commit zerotier
/etc/init.d/zerotier restart
# 打开防火墙规则设置通过
使用openp2p组网
# 官方推荐使用在线WEBUI进行操作
https://github.com/openp2p-cn/openp2p/blob/master/README-ZH.md#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8
https://console.openp2p.cn
# 这里手动运行 https://github.com/openp2p-cn/openp2p/blob/master/USAGE-ZH.md
# node=名称, token=https://console.openp2p.cn/profile 获取的
# 初始运行加上node参数生成配置文件,二次运行不加,否则会出现多个名称
./openp2p -node workpc -sharebandwidth=1000 -token 712121xxxxxx9613
# 通过同目录的配置文件运行,注意多个json0的配置文件删除
./openp2p
# 配置文件
config.json
{
"network": {
"Token": 712121xxxxxx9613,
"Node": "workpc-fbYFsk0W",
"User": "jcleng888",
"ShareBandwidth": 1000,
"ServerHost": "api.openp2p.cn",
"ServerPort": 27183,
"UDPPort1": 27182,
"UDPPort2": 27183,
"TCPPort": 52056
},
"apps": null,
"LogLevel": 2
}
# 多台设备同样进行安装
组网方式1, 端口访问
# 需要进入到webui
A---访问-->B
# 进入A创建[P2P应用],指定[本地监听端口], [远程设备]选择B且对应的端口
# 如果有公网的中转设备,可以选择
# 在A访问本地端[本地监听端口]
curl http://127.0.0.1:23380
# 或者在network同级增加配置apps配置(安卓不支持)
组网方式2, 给网络地址, 类似zerotier
# 需要进入到webui
https://console.openp2p.cn/sdwan
# [网络成员]全部加入进去, 即可获得组网的ip地址
# 每个easytier服务既是服务器也是客户端
# 所以只需要第一个节点定义-i网段即可, 其他所有节点只-d使用dhcp的ip即可
# 都设置当前的节点为--private-mode私有
# 默认使用11010/11011/11012端口
# 第一个节点
NETWORK_NAME=jclengnet
WORK_SECRET=xxxx
MACHINE_ID=node_work1
docker run -d \
--name $MACHINE_ID \
--hostname $MACHINE_ID \
--privileged \
--restart unless-stopped \
--network host \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-e TZ=Asia/Shanghai \
--device /dev/net/tun:/dev/net/tun \
--entrypoint "" \
registry.cn-hangzhou.aliyuncs.com/jcleng/easytier-easytier:latest \
easytier-core \
--network-name $NETWORK_NAME \
--network-secret $WORK_SECRET \
--private-mode true \
--machine-id $MACHINE_ID \
--latency-first \
-i 10.10.11.1/24 \
-p tcp://public.easytier.cn:11010 \
-p tcp://et.nmg.a-rn.cn:11010
# 内网工作节点
MACHINE_ID=node_work2
docker run -d \
--name $MACHINE_ID \
--hostname $MACHINE_ID \
--privileged \
--restart unless-stopped \
--network host \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-e TZ=Asia/Shanghai \
--device /dev/net/tun:/dev/net/tun \
--entrypoint "" \
registry.cn-hangzhou.aliyuncs.com/jcleng/easytier-easytier:latest \
easytier-core \
--network-name $NETWORK_NAME \
--network-secret $WORK_SECRET \
--private-mode true \
--machine-id $MACHINE_ID \
--latency-first \
-i 10.10.11.22/24 \
-p tcp://public.easytier.cn:11010 \
-p tcp://et.nmg.a-rn.cn:11010
# 创建公共节点且支持转发
NETWORK_NAME=pub_test_net
MACHINE_ID=pub_test_net
docker run -d \
--name $MACHINE_ID \
--hostname $MACHINE_ID \
--privileged \
--restart unless-stopped \
--network host \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-e TZ=Asia/Shanghai \
--device /dev/net/tun:/dev/net/tun \
--entrypoint "" \
registry.cn-hangzhou.aliyuncs.com/jcleng/easytier-easytier:latest \
easytier-core --network-name $NETWORK_NAME \
--machine-id $MACHINE_ID \
--latency-first \
-p tcp://public.easytier.cn:11010 \
-l 11010
# 安卓客户端 astral;客户端运行都会创建vpn连接, 小米需要关闭MIUI优化重启才能运行
https://github.com/ldoubil/astral/releases/
https://github.com/EasyTier/EasyTier/releases/
内网加入一个服务
HISTFILE=/dev/null bash
export CONTAINERD_NAMESPACE=tt
export CONTAINERD_ADDRESS=unix:///run/containerd/containerd.sock
NETWORK_NAME=jcxxxxst
WORK_SECRET=jcxxxxst
MACHINE_ID=node_work_local
./nerdctl run -d \
--name $MACHINE_ID \
--hostname $MACHINE_ID \
--privileged \
--restart always \
--network host \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-e TZ=Asia/Shanghai \
--device /dev/net/tun:/dev/net/tun \
--entrypoint "" \
registry.cn-hangzhou.aliyuncs.com/jcleng/easytier-easytier:latest \
easytier-core \
--network-name $NETWORK_NAME \
--network-secret $WORK_SECRET \
--private-mode true \
--machine-id $MACHINE_ID \
--latency-first \
--disable-udp-hole-punching \
--disable-ipv6 \
--multi-thread \
-i 10.10.11.200/24 \
-p tcp://c.oee.icu:60006 \
-p tcp://47.96.28.190:9994 \
-p tcp://106.15.202.147:11010 \
-p tcp://ros.scpsl.com.cn:11010 \
-p tcp://103.184.47.79:11010 \
-p tcp://et.lidonglong.top:11010
openp2p 无须公网ip打洞
# 官网注册和登录: https://console.openp2p.cn jcleng888/a
./nerdctl run -d --privileged \
--cap-add=NET_ADMIN \
--device=/dev/net/tun \
--restart=always \
--net host \
--name openp2p-client \
-e OPENP2P_TOKEN=712xxxxxx13 \
registry.cn-hangzhou.aliyuncs.com/jcleng/openp2pcn-openp2p-client:3.25.7
# 先配置[设备名字]再[端口转发]不然映射会失败
# [A方案]直接组网,[虚拟网络]加入所有网络成员[保存即可], 会生成内网ip
# [B方案]本地端口映射
# 推荐设置:[设备名字]用[1-]数值开头;设置[端口转发]是就用[60101/62101]
# A--访问-->B 需要在A配置[端口转发]新建设置[本地端口],[目标设备]选择需要访问的设备; 访问A:60101即可访问到B的[目标端口]