软件开发者和爱好者的知识分享社区
海峰收银系统 关于本站 写文章 免费注册
首页 > 计算机技术 > 网络技术 > 组网技术

自己创建zerotier私有根服务器,实现SD-WAN内网穿透,远程组网

原创 lihf8515 2025年06月27日 16:36
来源:本站 阅读:64

SD-WAN内网穿透是通过软件定义广域网技术构建虚拟局域网,实现跨网络环境的安全高效远程访问,其核心优势在于智能路由、无需公网IP及多链路整合能力‌。


SD-WAN非常适合不同局域网的远程组网,使之成为一个虚拟的局域网,实现设备间如同一个局域网一样随意访问。并且,两个设备之间是相互直连通讯的,直接穿透局域网的路由器,不经过中转服务器,带宽可跑满,该技术可替代传统内网穿透工具,尤其适用于企业级远程办公、物联网设备接入等场景。‌‌


‌SD-WAN内网穿透的技术特性‌


‌虚拟化组网‌:

将分散在不同物理位置的设备整合到同一虚拟局域网,突破NAT限制,无需公网IP即可实现设备互访。‌‌‌‌

典型应用场景包括远程访问企业ERP/OA系统、私有NAS文件共享等。‌‌


‌性能优化机制‌:

智能流量调度:基于网络质量实时选择最优传输路径,降低延迟30%-50%。‌‌

多链路聚合:支持整合MPLS、4G/5G等多种网络线路,保障传输稳定性。‌‌


主流SD-WAN方案对比‌


方案

优势

局限性

适用场景

Zerotier

开源免费、私有化部署灵活

跨运营商延迟较高

小型团队/个人开发者

Tailscale

WireGuard协议加密、跨平台兼容

免费版节点数量受限

技术型用户私有化部署

蒲公英

国内网络优化、访问速度快

免费版仅支持3设备

中小企业商业应用

贝锐花生壳

合规资质完善、服务稳定性强

需付费解锁高阶功能

政企等强合规需求场景


我们这里选择zerotier,我们需要在自己的服务器上安装配置。实际使用时,两个需要通信的客户端只要安装客户端软件即可。一但两个客户端通过服务器取得联系,之后的流量都不经过服务器,而是客户端之间直接通信的。


一、安装zerotier-one

curl -s https://install.zerotier.com/ | sudo bash


二、下载ztncui安装包并安装

curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
sudo apt install ./ztncui_0.8.14_amd64.deb


三、生成ztncui的配置文件

sudo sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
sudo sh -c "echo ZT_ADDR=127.0.0.1:9993 >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"


四、

sudo chmod 400 /opt/key-networks/ztncui/.env
sudo chown ztncui.ztncui /opt/key-networks/ztncui/.env
sudo systemctl restart ztncui


五、阿里云或腾讯云服务器的web控制台防火墙和服务器自身的ufw防火墙都要放行3443/tcp,9993/udp,9993/tcp

然后浏览器使用 https://你的服务器公网ip:3443 即可访问,登录用户名 admin, 密码 password,登录后会要求修改密码。


六、如果您想您的zerotier服务器更安全,则需要做如下nginx反向代理的配置。

首先,阿里云或腾讯云服务器的web控制台防火墙和服务器自身的ufw防火墙不要放行3443/tcp,只放行9993/udp和9993/tcp。然后,nginx配置文件写入如下配置代码:

# zerotier系统配置信息
# 注意your_domain.com是您自己的域名。比如:baidu.com
server {
listen 80;
server_name zerotier.your_domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name zerotier.your_domain.com;

# SSL证书地址
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # pem文件的路径
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # key文件的路径
# ssl验证相关配置
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法

location / {
proxy_pass https://127.0.0.1:3443;
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;
}
}


重启nginx

sudo systemctl restart nginx


这里,你就可以使用形如:https://your_domain.com 来安全访问zerotier的后台管理了。


七、以下是建立自己完全独立的根服务器,请根据需要配置

1、如何建立根节点

首先,就需要创建自己的planet文件。这里我们不需要使用任何的第三方脚本,直接使用官方仓库自己编译就行。仓库地址:https://github.com/zerotier/ZeroTierOne

2、下载仓库并修改相关源码

git clone https://github.com/zerotier/ZeroTierOne
cd ZeroTierOne/attic/world
cat mkworld.cpp


可以看到在mkworld.cpp文件中配置有4个官方的根节点,分别位于洛杉矶、迈阿密、阿姆斯特丹和东京:

std::vector<World::Root> roots;
// Los Angeles
roots.push_back(World::Root());
roots.back().identity = Identity("3a46f1bf30:0:76e66fab33e28549a62ee2064d1843273c2c300ba45c3f20bef02dbad225723bb59a9bb4b13535730961aeecf5a163ace477cceb0727025b99ac14a5166a09a3");
roots.back().stableEndpoints.push_back(InetAddress("185.180.13.82/9993"));
roots.back().stableEndpoints.push_back(InetAddress("2a02:6ea0:c815::/9993"));
// Miami
roots.push_back(World::Root());
roots.back().identity = Identity("de8950a8b2:0:1b3ada8251b91b6b6fa6535b8c7e2460918f4f729abdec97d3c7f3796868fb02f0de0b0ee554b2d59fc3524743eebfcf5315e790ed6d92db5bd10c28c09b40ef");
roots.back().stableEndpoints.push_back(InetAddress("207.246.73.245/443"));
roots.back().stableEndpoints.push_back(InetAddress("2001:19f0:9002:5cb:ec4:7aff:fe8f:69d9/443"));
// Tokyo
roots.push_back(World::Root());
roots.back().identity = Identity("34e0a5e174:0:93efb50934788f856d5cfb9ca5be88e85b40965586b75befac900df77352c145a1ba7007569d37c77bfe52c0999f3bdc67a47a4a6000b720a883ce47aa2fb7f8");
roots.back().stableEndpoints.push_back(InetAddress("147.75.92.2/443"));
roots.back().stableEndpoints.push_back(InetAddress("2604:1380:3000:7100::1/443"));
// Amsterdam
roots.push_back(World::Root());
roots.back().identity = Identity("992fcf1db7:0:206ed59350b31916f749a1f85dffb3a8787dcbf83b8c6e9448d4e3ea0e3369301be716c3609344a9d1533850fb4460c50af43322bcfc8e13d3301a1f1003ceb6");
roots.back().stableEndpoints.push_back(InetAddress("195.181.173.159/443"));
roots.back().stableEndpoints.push_back(InetAddress("2a02:6ea0:c024::/443"));


我们需要做的就是将这4个节点注释掉,添加我们自己的planet节点,例如:

// 自建服务器
roots.push_back(World::Root());
roots.back().identity = Identity(""); //这里填identity.public文件的内容
roots.back().stableEndpoints.push_back(InetAddress("你的ZeroTier服务器公网IP/9993")); // 这里填公网ip和端口


其中,identity的值可以通过cat /var/lib/zerotier-one/identity.public命令查看


3、编译并生成planet文件

cd ZeroTierOne/attic/world
source ./build.sh && ./mkworld
# 此时会生成一个名为"world.bin"的文件,就是我们要的planet,将其重命名
mv world.bin planet


如果使用build.sh编译时报错:

In file included from ../../osdep/OSUtils.cpp:45:
../../osdep/OSUtils.hpp:46:10: fatal error: nlohmann/json.hpp: No such file or directory


则需要先将ZeroTierOne/ext/nlohmann复制到/usr/local/include/目录下再重新编译。


现在,我们只需要将planet文件发放到各个节点(包括planet节点、moon节点和leaf节点),替换原有的planet文件,并重启Zerotier-One服务即可。

sudo cp planet /var/lib/zerotier-one
sudo systemctl restart zerotier-one


再次查看节点情况:

sudo zerotier-cli peers


可以看到仅剩一个planet节点,且ip和端口都是我们刚刚自己配置的,说明操作成功了。


Copyright © 2025 海峰软件技术. All Rights Reserved.
中华人民共和国工业和信息化部ICP备案序号:皖ICP备2025073039号